/* ==========================================================================
   e-Medias Group — Design system
   Palette de marque : #02031F · #0A36F7 · #94F6FF · #F7FEFF
   Typographie : Manrope (variable, auto-hébergée)
   ========================================================================== */

/* ------------------------------------------------------------------ Fonts */
@font-face {
	font-family: 'Manrope';
	src: url('../fonts/Manrope-Variable.woff2') format('woff2-variations');
	font-weight: 200 800;
	font-style: normal;
	font-display: swap;
}

/* ----------------------------------------------------------------- Tokens */
:root {
	--bg: #f7feff;
	--bg2: #ffffff;
	--ink: #02031f;
	--ink2: rgba(2, 3, 31, .58);
	--ink3: rgba(2, 3, 31, .38);
	--line: rgba(2, 3, 31, .09);
	--accent: #0a36f7;
	--accent-ink: #f7feff;
	--cyan: #94f6ff;
	--navy: #00072c;
	/* Bordure encrée (et non blanche) : le verre reste lisible sur fond clair. */
	--glass: rgba(255, 255, 255, .58);
	--glass-brd: rgba(2, 3, 31, .12);
	--card: #ffffff;
	--shadow: 0 24px 80px -32px rgba(2, 3, 31, .18);
	--shadow-soft: 0 12px 40px -20px rgba(2, 3, 31, .16);
	--radius: 24px;
	--radius-lg: 32px;
	--container: 1440px;
	--gutter: 40px;
	--nav-h: 76px;
	--ease-out: cubic-bezier(.22, 1, .36, 1);
}

/* ------------------------------------------------------------------- Base */
*, *::before, *::after { box-sizing: border-box; }

html {
	scroll-behavior: smooth;
	-webkit-text-size-adjust: 100%;
}

body {
	margin: 0;
	background: var(--bg);
	color: var(--ink);
	font-family: 'Manrope', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
	font-size: 16px;
	line-height: 1.6;
	-webkit-font-smoothing: antialiased;
	text-rendering: optimizeLegibility;
	overflow-x: clip;
}

/* Transition de page (changement de langue / navigation) : voile doux au départ.
   Le header et l'UI fixe restent à l'écran (B4) : seul le contenu s'efface,
   comme si les pages défilaient sous une barre permanente. */
#emg-main, .emg-footer { transition: opacity .34s ease; }
html.emg-page-leaving #emg-main,
html.emg-page-leaving .emg-footer { opacity: 0; }

a { color: var(--accent); text-decoration: none; }
a:hover { color: var(--ink); }
img { max-width: 100%; height: auto; display: block; }
::selection { background: #0a36f7; color: #f7feff; }

h1, h2, h3, h4 { margin: 0; font-weight: 800; letter-spacing: -.03em; line-height: 1.1; text-wrap: balance; }
p { margin: 0; }

button { font-family: inherit; }

.screen-reader-text {
	position: absolute !important;
	width: 1px; height: 1px;
	overflow: hidden;
	clip: rect(1px, 1px, 1px, 1px);
	white-space: nowrap;
}

.emg-skip-link {
	position: fixed; top: -80px; left: 24px; z-index: 300;
	padding: 12px 20px; border-radius: 99px;
	background: var(--ink); color: var(--bg);
	font-weight: 700; font-size: 14px;
	transition: top .25s ease;
}
.emg-skip-link:focus { top: 16px; color: var(--bg); }

:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; border-radius: 4px; }

/* -------------------------------------------------- Scrollbar personnalisée
   Barre native masquée sur desktop précis ; pouce en verre géré par JS. */
@media (hover: hover) and (pointer: fine) and (min-width: 1024px) {
	/* :not(.emg-motion-off) : si main.js ne démarre pas (filet du <head>),
	   la barre native revient — la page ne reste jamais sans scrollbar. */
	html.emg-custom-scroll:not(.emg-motion-off) { scrollbar-width: none; }
	html.emg-custom-scroll:not(.emg-motion-off) body::-webkit-scrollbar,
	html.emg-custom-scroll:not(.emg-motion-off)::-webkit-scrollbar { width: 0; height: 0; }
}

.emg-scrollbar {
	position: fixed; top: 0; right: 5px; bottom: 0;
	width: 6px; z-index: 240;
	pointer-events: none;
	opacity: 0;
	transition: opacity .4s ease;
}
.emg-scrollbar.is-visible { opacity: 1; }
.emg-scrollbar-thumb {
	position: absolute; left: 0; right: 0;
	border-radius: 99px;
	background: color-mix(in srgb, var(--ink) 18%, transparent);
	border: 1px solid var(--glass-brd);
	backdrop-filter: blur(12px) saturate(1.4);
	-webkit-backdrop-filter: blur(12px) saturate(1.4);
	pointer-events: auto;
	cursor: grab;
	transition: background .25s ease, width .25s ease;
}
.emg-scrollbar:hover { width: 10px; }
.emg-scrollbar-thumb:hover,
.emg-scrollbar-thumb.is-dragging { background: color-mix(in srgb, var(--ink) 34%, transparent); cursor: grabbing; }

/* -------------------------------------------------------------- Structure */
.emg-container {
	max-width: var(--container);
	margin: 0 auto;
	padding-left: var(--gutter);
	padding-right: var(--gutter);
}

.emg-section { padding: 110px 0 40px; }
/* Une section qui prolonge directement la precedente : le plein souffle
   creusait un vide au milieu du propos. */
.emg-section.is-tight { padding-top: 44px; }

/* Révélations au scroll : état initial appliqué seulement si JS actif. */
/* L'état masqué ne s'applique que tant que le reveal n'est pas joué : une fois
   .is-revealed posée, plus aucune règle ne peut faire "retomber" l'élément. */
html.js [data-reveal]:not(.is-revealed) { opacity: 0; transform: translateY(44px); will-change: opacity, transform; }
html.js.emg-motion-off [data-reveal] { opacity: 1; transform: none; }

/* Chips du hero : masquées dès le premier rendu, révélées en cascade par
   GSAP (le style inline posé par l'animation reprend la main). */
html.js [data-chip] { opacity: 0; }
html.js.emg-motion-off [data-chip] { opacity: 1; }

/* ---------------------------------------------------------------- Eyebrow */
.emg-eyebrow {
	display: flex; align-items: center; gap: 10px;
	font-size: 12px; font-weight: 700; letter-spacing: .28em;
	color: var(--ink2);
	text-transform: uppercase;
}
.emg-eyebrow-line { width: 24px; height: 1px; background: var(--accent); flex: none; }
.emg-eyebrow.is-light { color: rgba(247, 254, 255, .65); }
.emg-eyebrow.is-light .emg-eyebrow-line { background: var(--cyan); }
.emg-eyebrow-flag { flex: none; border-radius: 30%; box-shadow: 0 1px 6px rgba(2, 3, 31, .28); }

/* ------------------------------------------------------------------- Nuit
   Section a fond sombre. Depuis que le site n'a plus qu'une interface claire,
   ce sont ces sections qui portent le contraste : elles rythment la page au
   lieu d'un aplat blanc du haut en bas.

   Ce n'est PAS un theme, c'est une PORTEE : les tokens sont redefinis sur la
   section elle-meme, donc tous les composants du site (boutons, cartes,
   verre, filets, eyebrows) s'y peignent juste, sans une seule regle en plus.
   L'accent passe au bleu clair : le #0a36f7 de marque s'eteint sur la nuit,
   et c'est deja la valeur qu'avait retenue l'ancien theme sombre.

   Le fond est un degrade fixe, toujours present ; la nappe animee (canvas
   WebGL, injectee par main.js) vient se poser par-dessus quand elle peut. Si
   WebGL manque, si le mouvement est refuse ou si le canvas sort du champ,
   il ne reste que ce degrade, qui se tient tout seul. */
.emg-night {
	position: relative;
	isolation: isolate;
	--bg: #02031f;
	--bg2: #061651;
	--ink: #f7feff;
	--ink2: rgba(247, 254, 255, .62);
	--ink3: rgba(247, 254, 255, .38);
	--line: rgba(247, 254, 255, .12);
	--accent: #4d6dff;
	--accent-ink: #f7feff;
	--glass: rgba(6, 22, 81, .42);
	--glass-brd: rgba(148, 246, 255, .18);
	--card: rgba(247, 254, 255, .05);
	--shadow: 0 24px 80px -32px rgba(0, 0, 0, .55);
	--shadow-soft: 0 12px 40px -20px rgba(0, 0, 0, .45);
	background-color: #02031f;
	background-image:
		radial-gradient(58% 68% at 16% 20%, rgba(10, 54, 247, .40) 0%, rgba(10, 54, 247, 0) 62%),
		radial-gradient(52% 62% at 84% 32%, rgba(148, 246, 255, .13) 0%, rgba(148, 246, 255, 0) 60%),
		radial-gradient(80% 70% at 52% 98%, rgba(6, 22, 81, .85) 0%, rgba(2, 3, 31, 0) 72%);
	color: var(--ink);
}
/* Bords francs, assumes : au banc, un raccord fondu entre la nuit et le blanc
   donnait une bouillie grise sur une centaine de pixels. La coupe nette se
   tient mieux, et c'est elle qui fait le rythme. */

.emg-night-canvas {
	position: absolute; inset: 0; width: 100%; height: 100%;
	display: block; z-index: 0; pointer-events: none;
	opacity: 0; transition: opacity 1.1s ease;
	/* z-index NEGATIF, et non un z-index 1 pose sur tous les enfants : cette
	   seconde solution forcait `position: relative` sur des decors qui etaient
	   en absolu (le filigrane EMGX, le logomark), les remettait dans le flux
	   et faisait tripler la hauteur du hero des pages services. Ici la nappe
	   se glisse entre le fond de la section et son contenu, et pas un seul
	   enfant n'a besoin d'etre touche. `isolation: isolate` sur la section
	   empeche ce -1 de passer derriere elle. */
	z-index: -1;
}
.emg-night-canvas.is-on { opacity: 1; }

/* Eyebrows et titres de section reprennent d'eux-memes le traitement clair :
   les pages n'ont pas a passer un drapeau de plus a emg_eyebrow(). */
.emg-night .emg-eyebrow { color: rgba(247, 254, 255, .62); }
.emg-night .emg-eyebrow-line { background: var(--cyan); }
/* Le bouton encre devient blanc sur nuit, sans quoi il disparait. */
.emg-night .emg-btn.is-ink { background: #f7feff; color: #02031f; }
.emg-night .emg-btn.is-ink:hover { background: var(--cyan); color: #02031f; }
.emg-night .emg-btn.is-glass { border-color: rgba(247, 254, 255, .28); color: #f7feff; }

/* Encart newsletter du pied de page : EXACTEMENT la matiere des capsules du
   rail lateral (demande Loris) — meme verre clair, meme flou, meme filet,
   meme arete interieure. C'est ce qui donne le meilleur contraste sur la nuit
   du pied de page, et cela evite d'inventer une troisieme matiere de verre.
   Le contenu repasse donc a l'encre sombre : les tokens du site sont restaures
   sur l'encart, comme .emg-night les inverse sur une section. */
.emg-night .emg-newsletter {
	--ink: #02031f;
	--ink2: rgba(2, 3, 31, .58);
	--ink3: rgba(2, 3, 31, .38);
	--line: rgba(2, 3, 31, .09);
	--bg: #f7feff;
	--accent: #0a36f7;
	--accent-ink: #f7feff;
	color: var(--ink);
	background: rgba(255, 255, 255, .72);
	border: 1px solid rgba(2, 3, 31, .10);
	backdrop-filter: blur(20px) saturate(1.5);
	-webkit-backdrop-filter: blur(20px) saturate(1.5);
	box-shadow:
		inset 0 1px 0 0 color-mix(in srgb, #fff 28%, transparent),
		0 10px 28px -14px rgba(2, 3, 31, .2);
}
/* Le champ suit la meme logique : blanc franc dans le verre, filet encre.
   (Le bouton d'inscription reprend le bleu d'accent : sur un panneau clair, un
   bouton blanc n'existe plus. Il etait blanc tant que l'encart etait sombre.) */
.emg-night .emg-newsletter-form input[type="email"] {
	background: rgba(255, 255, 255, .74);
	border-color: rgba(2, 3, 31, .14);
	color: var(--ink);
}
.emg-night .emg-newsletter-form input[type="email"]::placeholder { color: rgba(2, 3, 31, .45); }
.emg-night .emg-newsletter-form input[type="email"]:focus { border-color: var(--accent); }

/* RACCORD. Une bande sombre qui s'arrete net sur du blanc, c'est un bord brut.
   Le filet degrade accent -> cyan en fait un trait DESSINE — c'est deja
   l'idiome du haut de pied de page, il vaut pour toutes les bandes. */
.emg-night::after {
	content: '';
	position: absolute; left: 0; right: 0; bottom: 0; height: 1px; z-index: 2;
	pointer-events: none;
	background: linear-gradient(90deg,
		transparent 0%,
		color-mix(in srgb, #4d6dff 60%, transparent) 30%,
		color-mix(in srgb, var(--cyan) 62%, transparent) 70%,
		transparent 100%);
}
/* Le pied de page pose deja le sien en ::before, en haut. */
.emg-footer.emg-night::after { content: none; }

/* RESPIRATION. Le contenu clair qui suit une bande sombre demarrait a 110 px
   du raccord, soit moins que l'interligne d'un titre : il paraissait colle au
   bord. Une section qui succede a la nuit prend un demi-ecran de plus. */
.emg-night + .emg-section,
.emg-night + section { padding-top: clamp(62px, 6vw, 92px); }
/* Apres la zone sombre de la page web, davantage : la premiere carte de
   la methode est elle-meme bleu nuit, et collee au bas de la nuit elle
   donnait l'impression que les deux sections se chevauchaient. */
/* La section claire qui suit la nuit prend un vrai palier : on sort d'une
   sequence de plusieurs ecrans, il lui faut de quoi respirer avant de
   reprendre la parole. Rallonge du 2026-08-25 (retour Marino) : c'est aussi
   la piste d'elan avant l'empilement des cartes de la methode — trop courte,
   la deuxieme carte recouvrait la premiere a peine la section decouverte. */
.emg-webdark + .emg-section { padding-top: clamp(150px, 22vh, 270px); }
/* Et ce qui OUVRE cette section perd sa marge haute. Les grilles du site
   en portent une de 64 px, prevue pour se detacher du titre de section :
   quand il n'y a pas de titre, elle ne fait qu'ajouter du vide a celui
   que la section menage deja. */
.emg-night + .emg-section > .emg-container > :first-child,
.emg-night + section > .emg-container > :first-child { margin-top: 0; }

/* ---------------------------------------------------------------- Boutons */
.emg-btn {
	display: inline-flex; align-items: center; justify-content: center; gap: 10px;
	font-size: 15px; font-weight: 700;
	padding: 16px 30px;
	border-radius: 99px;
	border: 1px solid transparent;
	cursor: pointer;
	white-space: nowrap;
	transition: transform .25s var(--ease-out), box-shadow .25s ease, background .25s ease,
		color .25s ease, border-color .25s ease;
}
.emg-btn:hover { transform: translateY(-2px); }
.emg-btn:active { transform: translateY(0); }

.emg-btn.is-accent {
	background: var(--accent); color: var(--accent-ink);
	box-shadow: 0 16px 40px -14px rgba(10, 54, 247, .55);
}
.emg-btn.is-accent:hover { color: var(--accent-ink); }

.emg-btn.is-ink { background: var(--ink); color: var(--bg); }
.emg-btn.is-ink:hover { color: var(--bg); }

.emg-btn.is-glass {
	background: var(--glass); color: var(--ink);
	border-color: var(--line);
	backdrop-filter: blur(20px) saturate(1.5);
	-webkit-backdrop-filter: blur(20px) saturate(1.5);
}
.emg-btn.is-glass:hover { color: var(--ink); }

.emg-btn.is-white { background: #f7feff; color: #02031f; }
.emg-btn.is-white:hover { color: #02031f; }

.emg-btn.is-glass-dark {
	background: rgba(255, 255, 255, .1); color: #f7feff;
	border-color: rgba(247, 254, 255, .35);
	backdrop-filter: blur(24px) saturate(1.5);
	-webkit-backdrop-filter: blur(24px) saturate(1.5);
}
.emg-btn.is-glass-dark:hover { color: #f7feff; }

.emg-btn.is-outline { border-color: var(--line); color: var(--ink); background: transparent; }
.emg-btn.is-outline:hover { border-color: var(--accent); color: var(--accent); }

.emg-btn-row { display: flex; gap: 14px; flex-wrap: wrap; }

.emg-btn[disabled] { opacity: .6; pointer-events: none; }

/* ------------------------------------------------------------------- Logo */
.emg-logo-lockup { display: flex; align-items: center; gap: 13px; color: inherit; }
.emg-logomark {
	display: inline-block; flex: none;
	background: currentColor;
	-webkit-mask: url('../img/logomark.svg') center / contain no-repeat;
	mask: url('../img/logomark.svg') center / contain no-repeat;
	transition: transform .35s var(--ease-out);
}
a:hover .emg-logomark { transform: translateY(-2px); }
.emg-logo-sep { width: 1px; height: 26px; background: var(--line); }
/* Le pied de page portait un logo reduit ; Loris l'a voulu plus visible
   (2026-08-30). Il prend simplement la taille de celui du header : deux
   tailles pour un meme bloc n'apportaient rien. */
/* Logotype : le dessin du kit de marque (EMG_Logotype-Ext), pose en MASQUE
   comme le logomark juste au-dessus. Le fichier copie est la version noire,
   mais sa couleur ne sert a rien : un masque ne lit que l'opacite, et c'est
   currentColor qui peint. Une seule declinaison suffit donc pour le header
   blanc, le header en surimpression et le pied de page.
   Taille : le bloc de texte remplace mesurait 84.2 px de large, le logotype
   y tenait a 26 px de haut. Loris l'a voulu « un tout petit peu » plus grand
   (2026-08-30) : 28 px, soit 90 px de large. 3.2161 pour 1, c'est le rapport
   du viewBox — la boite le suit, sinon le dessin flotte dedans. */
.emg-logotype {
	display: inline-block; flex: none;
	width: 90px; height: 28px;
	background: currentColor;
	-webkit-mask: url('../img/logotype.svg') center / contain no-repeat;
	mask: url('../img/logotype.svg') center / contain no-repeat;
}

/* ---------------------------------------------------------------- Header */
.emg-header {
	position: fixed; top: 0; left: 0; right: 0; z-index: 100;
	transition: background .45s ease, border-color .45s ease, backdrop-filter .45s ease;
	border-bottom: 1px solid transparent;
}
.emg-header.is-scrolled {
	background: color-mix(in srgb, var(--bg) 74%, transparent);
	backdrop-filter: blur(26px) saturate(1.7);
	-webkit-backdrop-filter: blur(26px) saturate(1.7);
	border-bottom-color: var(--line);
	box-shadow: 0 14px 44px -24px rgba(2, 3, 31, .3);
}

/* Mode "au-dessus du hero sombre" : tout passe en clair. */
.emg-header.is-over {
	--ink: #f7feff;
	--ink2: rgba(247, 254, 255, .65);
	--ink3: rgba(247, 254, 255, .4);
	--bg: #02031f;
	--line: rgba(247, 254, 255, .15);
	--glass: rgba(255, 255, 255, .1);
	--glass-brd: rgba(255, 255, 255, .28);
	color: #f7feff;
}

.emg-header-inner {
	max-width: var(--container);
	margin: 0 auto;
	padding: 14px var(--gutter);
	display: flex; align-items: center; justify-content: space-between; gap: 24px;
	min-height: var(--nav-h);
}
.emg-header-brand { color: var(--ink); transition: opacity .25s ease; }
.emg-header-brand:hover { opacity: .78; color: var(--ink); }

.emg-nav { display: flex; align-items: center; gap: 34px; white-space: nowrap; }
.emg-nav-item {
	position: relative;
	display: flex; align-items: flex-start; gap: 5px;
	color: var(--ink);
	transition: color .25s ease, transform .25s ease;
	padding: 6px 0;
}
.emg-nav-item:hover { color: var(--accent); transform: translateY(-1px); }
.emg-nav-item.is-active { color: var(--accent); }
.emg-nav-num {
	font-size: 9px; font-weight: 300; color: var(--accent);
	font-variant-numeric: tabular-nums; line-height: 1.7;
}
.emg-header.is-over .emg-nav-num { color: var(--cyan); }
.emg-nav-label { font-size: 14.5px; font-weight: 700; letter-spacing: .02em; }

/* Méga menu Services (panneau glass : 5 prestations détaillées + visuel) */
.emg-nav-drop { position: relative; }
.emg-nav-panel {
	/* .emg-nav est en nowrap : on rétablit le retour à la ligne pour la
	   tagline du panneau. Fixe et centré sur la page, sous la barre —
	   pas ancré à gauche sous l'entrée Services. */
	white-space: normal;
	position: fixed; top: calc(var(--nav-h) + 10px); left: 50%;
	transform: translateX(-50%) translateY(14px) scale(.98);
	transform-origin: top center;
	width: min(960px, calc(100vw - 48px));
	padding: 16px;
	border-radius: 26px;
	background: color-mix(in srgb, var(--bg) 93%, transparent);
	border: 1px solid color-mix(in srgb, var(--accent) 16%, var(--line));
	backdrop-filter: blur(30px) saturate(1.7);
	-webkit-backdrop-filter: blur(30px) saturate(1.7);
	box-shadow:
		inset 0 1px 0 0 color-mix(in srgb, #fff 28%, transparent),
		0 42px 110px -28px rgba(2, 3, 31, .5),
		0 18px 44px -18px rgba(2, 3, 31, .35);
	opacity: 0; visibility: hidden;
	transition: opacity .32s var(--ease-out), transform .32s var(--ease-out), visibility 0s .32s;
}
/* Le panneau reste CLAIR même quand la barre est en mode « au-dessus du hero
   sombre » (demande Loris). C'est une surface posée SUR la page, pas un
   morceau de la barre : il n'a pas à suivre son inversion. Les tokens y
   reprennent les valeurs du site, donc tout son contenu — items, icônes,
   numéros, encart de droite — se repeint juste, sans une règle de plus. */
.emg-header.is-over .emg-nav-panel {
	--ink: #02031f;
	--ink2: rgba(2, 3, 31, .58);
	--ink3: rgba(2, 3, 31, .38);
	--bg: #f7feff;
	--bg2: #ffffff;
	--line: rgba(2, 3, 31, .09);
	--glass: rgba(255, 255, 255, .58);
	--glass-brd: rgba(2, 3, 31, .12);
	--card: #ffffff;
	--accent: #0a36f7;
	--accent-ink: #f7feff;
	color: var(--ink);
}
.emg-header.is-over .emg-nav-panel .emg-nav-num { color: var(--accent); }

/* Pont invisible : l'écart avec la barre ne referme pas le menu au survol. */
.emg-nav-panel::after {
	content: '';
	position: absolute; left: 0; right: 0; top: -26px; height: 26px;
}
.emg-nav-drop:hover .emg-nav-panel,
.emg-nav-drop:focus-within .emg-nav-panel {
	opacity: 1; visibility: visible;
	transform: translateX(-50%) translateY(0) scale(1);
	transition: opacity .32s var(--ease-out), transform .32s var(--ease-out);
}
/* Entrée en cascade discrète du contenu du panneau. */
.emg-nav-panel .emg-mega-item,
.emg-nav-panel .emg-mega-aside {
	opacity: 0; transform: translateY(7px);
	transition: opacity .3s ease, transform .3s var(--ease-out), background .2s ease;
}
.emg-nav-drop:hover .emg-mega-item,
.emg-nav-drop:focus-within .emg-mega-item,
.emg-nav-drop:hover .emg-mega-aside,
.emg-nav-drop:focus-within .emg-mega-aside {
	opacity: 1; transform: none;
}
.emg-nav-drop:hover .emg-mega-item:nth-child(2) { transition-delay: .04s; }
.emg-nav-drop:hover .emg-mega-item:nth-child(3) { transition-delay: .08s; }
.emg-nav-drop:hover .emg-mega-item:nth-child(4) { transition-delay: .12s; }
.emg-nav-drop:hover .emg-mega-item:nth-child(5) { transition-delay: .16s; }
.emg-nav-drop:hover .emg-mega-aside { transition-delay: .1s; }
.emg-mega-grid { display: grid; grid-template-columns: 1fr 300px; gap: 16px; }
.emg-mega-list { display: flex; flex-direction: column; }
/* Huit outils : deux colonnes, pour que le panneau garde la hauteur des
   autres. Sans cela le menu Outils serait deux fois plus haut que Services. */
.emg-mega-list.is-two {
	display: grid; grid-template-columns: 1fr 1fr;
	gap: 2px 8px;
	align-content: start;
}
.emg-mega-list.is-two .emg-mega-item { padding: 10px 12px; }
/* Pastille d'icône, même gabarit que le numéro qu'elle remplace. */
.emg-mega-ico {
	flex: none; width: 34px; height: 34px;
	display: grid; place-items: center;
	border-radius: 11px;
	background: color-mix(in srgb, var(--accent) 10%, transparent);
	color: var(--accent);
	transition: background .25s ease, transform .25s var(--ease-out);
}
.emg-mega-ico svg { width: 17px; height: 17px; }
.emg-mega-item:hover .emg-mega-ico { background: color-mix(in srgb, var(--accent) 18%, transparent); transform: scale(1.06); }
/* Tous les panneaux tiennent exactement la même hauteur : cinq entrées
   partout, et un plancher commun qui rattrape la grille d'outils (plus
   compacte car sur deux colonnes). */
.emg-mega-grid { height: 348px; }
.emg-mega-list.is-two { align-content: center; }
.emg-mega-list { justify-content: center; }
.emg-mega-item {
	display: flex; align-items: flex-start; gap: 12px;
	padding: 11px 14px;
	border-radius: 14px;
	color: var(--ink);
	transition: background .2s ease;
}
.emg-mega-item .emg-nav-num { line-height: 2; }
.emg-mega-body { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.emg-mega-name { font-size: 16px; font-weight: 700; letter-spacing: -.015em; transition: color .2s ease; }
/* Une seule ligne : le panneau est calibré pour, l'ellipse n'est qu'un filet. */
.emg-mega-desc {
	font-size: 12.5px; line-height: 1.5; color: var(--ink2); margin-top: 2px;
	white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
	max-width: 100%;
}
.emg-mega-go {
	margin-left: auto; align-self: center; color: var(--accent);
	opacity: 0; transform: translateX(-5px);
	transition: opacity .25s ease, transform .25s var(--ease-out);
}
.emg-mega-item:hover { background: color-mix(in srgb, var(--accent) 8%, transparent); }
.emg-mega-item:hover .emg-mega-name { color: var(--accent); }
.emg-mega-item:hover .emg-mega-go { opacity: 1; transform: none; }
.emg-mega-aside {
	position: relative; display: block; overflow: hidden;
	border-radius: 18px;
	min-height: 320px;
	background: var(--navy-2, #061651);
	isolation: isolate;
}
/* Image en background (et non <img>) : contenue par construction,
   impossible qu'elle déborde du panneau. */
.emg-mega-aside-bg {
	position: absolute; inset: 0; z-index: 0;
	background-size: cover; background-position: 62% 38%;
	transform: scale(1.01);
	transition: transform .7s var(--ease-out);
}
.emg-mega-aside:hover .emg-mega-aside-bg { transform: scale(1.07); }
/* Voile appuyé : le visuel de fond est clair par endroits et le titre blanc
   s'y perdait. Le dégradé démarre plus tôt et finit plus dense. */
.emg-mega-aside-scrim {
	position: absolute; inset: 0; z-index: 1;
	background: linear-gradient(180deg, rgba(2, 3, 31, .2) 0%, rgba(2, 3, 31, .62) 46%, rgba(2, 3, 31, .93) 100%);
}
/* Ancré en absolu : sa largeur est exactement celle de l'encart,
   le texte revient donc toujours à la ligne au lieu d'être rogné. */
.emg-mega-aside-body {
	position: absolute; z-index: 2;
	left: 0; right: 0; bottom: 0;
	display: flex; flex-direction: column; gap: 10px;
	padding: 20px;
}
/* Titre de l'encart : c'est lui qui annonce où mène le panneau. */
.emg-mega-aside-title {
	font-size: 25px; font-weight: 700; letter-spacing: -.025em; line-height: 1.12;
	color: #fff;
	text-wrap: balance;
}
.emg-mega-aside-text { font-size: 12.5px; line-height: 1.5; font-weight: 500; color: rgba(247, 254, 255, .85); }
.emg-mega-aside-cta {
	display: inline-flex; align-items: center; gap: 7px;
	font-size: 12.5px; font-weight: 700; color: var(--cyan);
}
.emg-mega-aside-cta .emg-arrow { transition: transform .25s var(--ease-out); }
.emg-mega-aside:hover .emg-mega-aside-cta .emg-arrow { transform: translateX(3px); }

.emg-header-tools { display: flex; align-items: center; gap: 14px; }

/* Sélecteur de langue */
.emg-lang {
	display: flex; gap: 2px; padding: 4px;
	border-radius: 99px;
	background: var(--glass);
	border: 1px solid var(--glass-brd);
	backdrop-filter: blur(20px) saturate(1.5);
	-webkit-backdrop-filter: blur(20px) saturate(1.5);
}
.emg-lang-item {
	font-size: 11px; font-weight: 600; letter-spacing: .02em;
	padding: 5px 9px; border-radius: 99px;
	color: var(--ink2);
	transition: background .3s ease, color .3s ease;
}
.emg-lang-item:hover { color: var(--ink); }
.emg-lang-item.is-active { background: var(--ink); color: var(--bg); font-weight: 800; }
.emg-lang-item.is-active:hover { color: var(--bg); }

/* Choix de langue compact (telephone). Un seul bouton qui porte la langue
   en cours, et un panneau qui s'ouvre au toucher : la pastille FR DE IT EN
   du bureau prend la place de trois boutons pour une action qu'on fait une
   fois. */
.emg-langpop { position: relative; display: none; }
.emg-langpop-btn {
	font-size: 12px; font-weight: 800; letter-spacing: .04em;
	font-family: inherit;
}
.emg-langpop-menu {
	/* Le header inverse ses jetons au-dessus d'un hero sombre. Ce panneau,
	   lui, est TOUJOURS clair : il redeclare sa propre portee, sinon son
	   texte devient blanc sur blanc en haut de page. Meme piege que les
	   mega-menus. */
	--ink: #02031f;
	--ink2: rgba(2, 3, 31, .58);
	--ink3: rgba(2, 3, 31, .38);
	--line: rgba(2, 3, 31, .09);
	color: var(--ink);
	position: absolute; top: calc(100% + 10px); right: 0; z-index: 20;
	min-width: 168px;
	padding: 6px;
	border-radius: 18px;
	background: var(--bg2, #fff);
	border: 1px solid var(--line);
	box-shadow: 0 24px 60px -22px rgba(2, 3, 31, .38);
	opacity: 0; visibility: hidden;
	transform: translateY(-6px) scale(.97);
	transform-origin: top right;
	transition: opacity .22s ease, transform .28s var(--ease-out), visibility 0s .28s;
}
.emg-langpop.is-open .emg-langpop-menu {
	opacity: 1; visibility: visible; transform: none;
	transition: opacity .22s ease, transform .28s var(--ease-out);
}
.emg-langpop-item {
	display: flex; align-items: center; gap: 11px;
	padding: 10px 12px; border-radius: 13px;
	font-size: 14px; font-weight: 600;
	color: var(--ink);
}
.emg-langpop-item.is-active { background: color-mix(in srgb, var(--accent) 9%, transparent); color: var(--accent); }
.emg-langpop-code {
	flex: none; width: 26px;
	font-size: 10px; font-weight: 800; letter-spacing: .08em;
	color: var(--ink3);
}
.emg-langpop-item.is-active .emg-langpop-code { color: var(--accent); }

/* Boutons ronds du header : recherche et thème, même capsule de verre. */
/* Meme gabarit que le burger : a 36 contre 40, la difference se lisait
   comme un defaut d'alignement vertical alors que c'etait un defaut de
   taille. Les deux capsules font desormais la meme hauteur. */
.emg-icon-btn {
	width: 40px; height: 40px;
	display: grid; place-items: center;
	border-radius: 99px;
	border: 1px solid var(--glass-brd);
	background: var(--glass);
	backdrop-filter: blur(20px) saturate(1.5);
	-webkit-backdrop-filter: blur(20px) saturate(1.5);
	cursor: pointer;
	color: var(--ink);
	transition: transform .25s var(--ease-out), color .25s ease, border-color .25s ease;
}
/* La loupe grossit légèrement au survol. */
.emg-search-btn:hover {
	transform: translateY(-1px) scale(1.06);
	color: var(--accent);
	border-color: color-mix(in srgb, var(--accent) 32%, var(--glass-brd));
}
/* Burger (mobile) */
.emg-burger {
	display: none;
	width: 40px; height: 40px;
	border: 1px solid var(--glass-brd);
	border-radius: 99px;
	background: var(--glass);
	backdrop-filter: blur(20px) saturate(1.5);
	-webkit-backdrop-filter: blur(20px) saturate(1.5);
	cursor: pointer;
	place-items: center;
	color: var(--ink);
}
.emg-burger span {
	display: block; width: 16px; height: 2px; border-radius: 2px;
	background: currentColor;
	position: relative;
	transition: transform .3s var(--ease-out), background .3s ease;
}
.emg-burger span::before, .emg-burger span::after {
	content: ''; position: absolute; left: 0;
	width: 16px; height: 2px; border-radius: 2px;
	background: currentColor;
	transition: transform .3s var(--ease-out), top .3s ease;
}
.emg-burger span::before { top: -5px; }
.emg-burger span::after { top: 5px; }
body.emg-menu-open .emg-burger span { background: transparent; }
body.emg-menu-open .emg-burger span::before { top: 0; transform: rotate(45deg); }
body.emg-menu-open .emg-burger span::after { top: 0; transform: rotate(-45deg); }

/* Menu mobile plein écran */
.emg-mobile-menu {
	position: fixed; inset: 0; z-index: 90;
	display: flex; flex-direction: column; justify-content: center;
	padding: calc(var(--nav-h) + 18px) var(--gutter) 26px;
	overflow-y: auto;
	/* Empêche le défilement de remonter jusqu'à la page derrière une fois
	   le haut ou le bas du panneau atteint (rebond fantôme sur iOS). */
	overscroll-behavior: contain;
	/* Opaque, et non un voile : le contenu de la page transparaissait
	   derriere les entrees et les rendait sales. */
	background: var(--bg);
	opacity: 0; visibility: hidden;
	transition: opacity .4s ease, visibility 0s .4s;
}
body.emg-menu-open .emg-mobile-menu {
	opacity: 1; visibility: visible;
	transition: opacity .4s ease;
}
/* margin auto plutot que justify-content: center : centre quand le menu
   est court, et laisse defiler sans rogner le haut quand un deplie le
   rend plus grand que l'ecran. */
.emg-mobile-nav { display: flex; flex-direction: column; gap: 0; margin: auto 0; width: 100%; }
/* Corps reduit d'un tiers : avec deux deplies au lieu d'un, l'ancienne
   echelle poussait les premieres entrees sous la barre du header. */
.emg-mobile-nav > a,
.emg-mobile-row > a {
	display: flex; align-items: center; gap: 14px;
	font-size: clamp(21px, 5.6vw, 27px);
	font-weight: 800; letter-spacing: -.03em;
	color: var(--ink);
	padding: 13px 0;
	transition: color .25s ease;
}
.emg-mobile-nav > a:hover,
.emg-mobile-row > a:hover { color: var(--accent); }
/* Une reglure sous chaque entree : la liste se lit comme un sommaire, et
   chaque ligne devient une cible franche. */
.emg-mobile-nav > a,
.emg-mobile-nav > .emg-mobile-group { border-bottom: 1px solid var(--line); }
.emg-mobile-nav > :last-child { border-bottom: 0; }
.emg-mobile-label { flex: 1 1 auto; min-width: 0; }
/* Toutes les entrees portent une affordance a droite : une fleche pour les
   liens, un chevron pour les deplies. Sans cela, seules deux lignes sur six
   avaient l'air cliquables. */
.emg-mobile-go {
	flex: none; display: grid; place-items: center;
	width: 30px; height: 30px;
	color: var(--ink3);
	transition: transform .3s var(--ease-out), color .25s ease;
}
.emg-mobile-nav > a:hover .emg-mobile-go { color: var(--accent); transform: translateX(3px); }
/* Page courante : le bleu et un point, pour se reperer sans lire. */
.emg-mobile-link.is-current { color: var(--accent); }
.emg-mobile-link.is-current .emg-nav-num { color: var(--accent); }
/* La cascade d'entrée porte sur les ENFANTS DIRECTS de la nav : le groupe
   « Services » (sa ligne et son dépliant) compte pour UN, sinon le dépliant
   hériterait d'une opacité et d'un délai qui ne le concernent pas. */
.emg-mobile-nav > a,
.emg-mobile-nav > .emg-mobile-group { opacity: 0; transform: translateY(18px); }
body.emg-menu-open .emg-mobile-nav > a,
body.emg-menu-open .emg-mobile-nav > .emg-mobile-group { animation: emg-menu-item .55s var(--ease-out) forwards; }
body.emg-menu-open .emg-mobile-nav > :nth-child(1) { animation-delay: .08s; }
body.emg-menu-open .emg-mobile-nav > :nth-child(2) { animation-delay: .14s; }
body.emg-menu-open .emg-mobile-nav > :nth-child(3) { animation-delay: .2s; }
body.emg-menu-open .emg-mobile-nav > :nth-child(4) { animation-delay: .26s; }
body.emg-menu-open .emg-mobile-nav > :nth-child(5) { animation-delay: .32s; }
body.emg-menu-open .emg-mobile-nav > :nth-child(6) { animation-delay: .38s; }
@keyframes emg-menu-item { to { opacity: 1; transform: translateY(0); } }
/* display: block explicite : une regle globale masque .emg-nav-num sous
   1160 px pour degager la barre du bureau, et elle emportait aussi les
   numeros du menu mobile. Deux classes suffisent a la battre. */
.emg-mobile-nav .emg-nav-num { display: block; font-size: 11px; flex: none; width: 20px; color: var(--ink3); }
/* Les sous-entrees, elles, restent nues : le filet d'accent et le retrait
   disent deja qu'elles dependent de la ligne du dessus. */
.emg-mobile-sub .emg-nav-num { display: none; }

/* ---- dépliant des services (menu plein écran) ---- */
.emg-mobile-row { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
.emg-mobile-row > a { flex: 1 1 auto; min-width: 0; }
.emg-mobile-chev {
	flex: 0 0 auto; display: grid; place-items: center;
	width: 34px; height: 34px; padding: 0;
	border: 1px solid var(--line); border-radius: 50%;
	background: transparent; color: var(--ink); cursor: pointer;
	-webkit-tap-highlight-color: transparent;
	transition: transform .42s var(--ease-out), background .25s ease, border-color .25s ease, color .25s ease;
}
.emg-mobile-chev:hover { border-color: var(--accent); color: var(--accent); }
.emg-mobile-chev[aria-expanded="true"] {
	transform: rotate(180deg);
	background: var(--accent); border-color: var(--accent); color: var(--accent-ink);
}
.emg-mobile-chev svg { display: block; }
/* 0fr -> 1fr : la seule façon d'animer vers la hauteur RÉELLE du contenu, sans
   plafond deviné (un max-height trop large donne une fin de course molle).
   Là où la grille ne s'anime pas, la bascule reste instantanée — jamais cassée. */
.emg-mobile-sub {
	display: grid; grid-template-rows: 0fr;
	transition: grid-template-rows .42s var(--ease-out);
}
.emg-mobile-sub.is-open { grid-template-rows: 1fr; }
.emg-mobile-sub-in { overflow: hidden; }
.emg-mobile-sub a {
	display: flex; align-items: center; gap: 12px;
	padding: 9px 0 9px 20px;
	margin-left: 4px;
	border-left: 1px solid color-mix(in srgb, var(--accent) 28%, var(--line));
	font-size: clamp(14px, 3.9vw, 17px); font-weight: 700; letter-spacing: -.02em;
	color: var(--ink2);
	opacity: 0; transform: translateY(8px);
	transition: color .25s ease, opacity .38s var(--ease-out), transform .38s var(--ease-out);
}
.emg-mobile-sub a:hover { color: var(--accent); }
.emg-mobile-sub.is-open a { opacity: 1; transform: none; }
.emg-mobile-sub.is-open a:nth-child(1) { transition-delay: .05s; }
.emg-mobile-sub.is-open a:nth-child(2) { transition-delay: .1s; }
.emg-mobile-sub.is-open a:nth-child(3) { transition-delay: .15s; }
.emg-mobile-sub.is-open a:nth-child(4) { transition-delay: .2s; }
.emg-mobile-sub.is-open a:nth-child(5) { transition-delay: .25s; }
@media (prefers-reduced-motion: reduce) {
	.emg-mobile-sub, .emg-mobile-sub a, .emg-mobile-chev { transition: none; }
}
.emg-mobile-menu-foot { margin-top: 24px; }
/* La recherche prend toute la largeur : elle est descendue du header, ou un
   rond de 40 px la coincait entre deux autres boutons. */
.emg-mobile-search {
	display: flex; align-items: center; gap: 11px;
	width: 100%; padding: 15px 18px;
	border-radius: 16px;
	border: 1px solid var(--line);
	background: var(--card);
	color: var(--ink2);
	font: inherit; font-size: 14.5px; font-weight: 600;
	cursor: pointer;
	transition: border-color .25s ease, color .25s ease;
}
.emg-mobile-search:hover { border-color: color-mix(in srgb, var(--accent) 35%, var(--line)); color: var(--ink); }
.emg-mobile-search-ico { display: grid; place-items: center; flex: none; color: var(--accent); }
body.emg-menu-open { overflow: hidden; }

/* ------------------------------------------------------------- Solutions */
/* Les systèmes déjà construits (à distinguer des pôles de service, qui sont
   des capacités). Tout reprend les composants existants — cartes, grille de
   fonctions, liste des inclus — pour ne pas inventer un troisième langage.
   Ne sont définis ici que les blocs qui n'existaient pas : la preuve, le
   modèle, le renvoi depuis les fiches et l'encart de menu en liste. */

/* ---- la preuve : les déploiements réels, juste sous le titre ---- */
.emg-sol-cases {
	display: grid; grid-template-columns: repeat(auto-fit, minmax(min(300px, 100%), 1fr));
	gap: clamp(16px, 2vw, 24px); margin-top: 40px;
}
.emg-sol-case {
	display: flex; flex-direction: column; gap: 10px;
	padding: clamp(24px, 3vw, 34px);
	border: 1px solid var(--line); border-radius: var(--radius);
	background: var(--card); color: var(--ink); text-decoration: none;
	box-shadow: var(--shadow-soft);
	transition: transform .35s var(--ease-out), box-shadow .35s ease, border-color .35s ease;
}
.emg-sol-case:hover {
	transform: translateY(-4px); box-shadow: var(--shadow);
	border-color: color-mix(in srgb, var(--accent) 35%, var(--line));
	color: var(--ink);
}
/* Deploiement sans fiche : la carte n'est pas un lien, elle ne doit donc pas
   se comporter comme tel. Elle garde son cadre — c'est bien une preuve — mais
   ne se souleve pas au survol, ce qui promettrait un clic qui n'existe pas. */
.emg-sol-case.is-plain,
.emg-sol-case.is-plain:hover { transform: none; box-shadow: var(--shadow-soft); border-color: var(--line); }
.emg-sol-case-eyebrow {
	font-size: 11px; font-weight: 700; letter-spacing: .18em; text-transform: uppercase;
	color: var(--accent);
}
.emg-sol-case h3 { margin: 0; font-size: clamp(19px, 2vw, 24px); font-weight: 800; letter-spacing: -.02em; }
.emg-sol-case p { margin: 0; font-size: 15px; line-height: 1.65; color: var(--ink2); }
.emg-sol-case-go {
	display: flex; align-items: center; gap: 8px; margin-top: auto; padding-top: 8px;
	font-size: 13px; font-weight: 700; color: var(--accent);
}
.emg-sol-case:hover .emg-sol-case-go svg { transform: translateX(4px); }
.emg-sol-case-go svg { transition: transform .3s var(--ease-out); }

/* ---- le modèle : une seule colonne de texte, volontairement étroite ---- */
.emg-sol-model-body { max-width: 68ch; margin-top: 28px; }
.emg-sol-model-body p { margin: 0; font-size: clamp(15px, 1.3vw, 17px); line-height: 1.75; color: var(--ink2); }
.emg-sol-model-link {
	display: inline-flex; align-items: center; gap: 8px; margin-top: 20px;
	font-size: 14px; font-weight: 700; color: var(--accent); text-decoration: none;
	border-bottom: 1px solid color-mix(in srgb, var(--accent) 35%, transparent);
	padding-bottom: 2px;
}
.emg-sol-model-link:hover { border-bottom-color: var(--accent); }

/* ---- hub : la preuve tient sur la carte, c'est elle qui fait la différence ---- */
.emg-hub-proof {
	display: block; margin-top: 10px;
	font-size: 12px; font-weight: 600; letter-spacing: .04em; color: var(--ink3);
}
/* Le renvoi vers le sur-mesure est devenu la derniere tuile de la grille
   (voir page-solutions.php) : la note sous la grille n'existe plus. */

/* ---- renvoi depuis une fiche réalisation vers la solution qu'elle prouve ---- */
.emg-sol-back-panel {
	display: flex; align-items: center; justify-content: space-between; gap: 24px; flex-wrap: wrap;
	padding: clamp(24px, 3vw, 34px);
	border: 1px solid var(--line); border-radius: var(--radius); background: var(--card);
}
.emg-sol-back-panel p { margin: 0; max-width: 56ch; font-size: 15px; line-height: 1.65; color: var(--ink2); }
.emg-sol-back-links { display: flex; flex-wrap: wrap; gap: 10px 22px; }
.emg-sol-back-links a {
	display: inline-flex; align-items: center; gap: 8px;
	font-size: 14px; font-weight: 700; color: var(--accent); text-decoration: none;
}
.emg-sol-back-links a:hover svg { transform: translateX(4px); }
.emg-sol-back-links svg { transition: transform .3s var(--ease-out); }

/* --------------------------------------------------------------- Loader */
/* Écran de chargement de l'accueil (template-parts/loader.php).
   Le logomark se dessine, puis la nuit se retire en lames diagonales — même
   axe bas-gauche vers haut-droite que les flares de la vidéo du hero et que
   le reflet des chips.

   Tout est en animations CSS, sans une ligne de JS : si le script n'arrive
   jamais, l'écran s'efface quand même. La seule chose que le JS fait, c'est
   décider de l'afficher (dans l'amorce de <head>) et lever le verrou de
   défilement à la fin. */
.emg-loader { display: none; }
html.emg-loading { overflow: hidden; }
html.emg-loading .emg-loader {
	display: block;
	position: fixed; inset: 0; z-index: 9999;
	pointer-events: none;
}

/* Les lames : un conteneur tourné à -45deg, six bandes horizontales dedans.
   Tournées, elles lisent « / ». Chacune sort en glissant le long de sa
   PROPRE longueur — le conteneur déborde largement pour qu'aucune extrémité
   n'entre jamais dans le cadre. Sens alternés : l'écran se déchire au lieu
   de s'ouvrir sagement. */
.emg-loader-slats {
	position: absolute; inset: -60%;
	transform: rotate(-45deg);
	display: flex; flex-direction: column;
}
.emg-loader-slats span {
	flex: 1 1 0;
	background: #02031f;
	/* Les hauteurs fractionnaires laissent des joints d'un sous-pixel entre
	   les lames : l'ombre les recouvre sans toucher a la mise en page. */
	box-shadow: 0 0 0 1px #02031f;
	will-change: transform;
	animation: emg-loader-slat-a .62s cubic-bezier(.7, 0, .2, 1) forwards;
	animation-delay: 1.02s;
}
.emg-loader-slats span:nth-child(even) { animation-name: emg-loader-slat-b; }
.emg-loader-slats span:nth-child(2) { animation-delay: 1.07s; }
.emg-loader-slats span:nth-child(3) { animation-delay: 1.12s; }
.emg-loader-slats span:nth-child(4) { animation-delay: 1.17s; }
.emg-loader-slats span:nth-child(5) { animation-delay: 1.22s; }
.emg-loader-slats span:nth-child(6) { animation-delay: 1.27s; }
@keyframes emg-loader-slat-a { to { transform: translate3d(102%, 0, 0); } }
@keyframes emg-loader-slat-b { to { transform: translate3d(-102%, 0, 0); } }

/* Le logomark : les deux tracés se dessinent, le remplissage vient ensuite,
   puis le tout s'efface juste avant que les lames ne partent — sinon il se
   ferait couper en deux par l'ouverture. */
.emg-loader-mark {
	position: absolute; top: 50%; left: 50%;
	width: auto; height: clamp(130px, 26vh, 260px);
	transform: translate(-50%, -50%);
	overflow: visible;
	animation: emg-loader-mark-out .3s ease-in forwards;
	animation-delay: .92s;
}
.emg-loader-mark path {
	fill: #f7feff; fill-opacity: 0;
	stroke: #94f6ff; stroke-width: 26;
	stroke-linejoin: round;
	stroke-dasharray: 1; stroke-dashoffset: 1;
	animation:
		emg-loader-draw .74s cubic-bezier(.65, 0, .35, 1) forwards,
		emg-loader-fill .26s ease-out forwards .62s;
}
.emg-loader-mark path:nth-child(2) { animation-delay: .12s, .74s; }
@keyframes emg-loader-draw { to { stroke-dashoffset: 0; } }
@keyframes emg-loader-fill { to { fill-opacity: 1; stroke-opacity: .25; } }
@keyframes emg-loader-mark-out { to { opacity: 0; transform: translate(-50%, -50%) scale(1.12); } }

/* Mouvement réduit : l'amorce de <head> ne pose alors jamais la classe, donc
   l'écran n'existe pas. Ce garde-fou couvre le cas où la préférence change
   après le chargement. */
@media (prefers-reduced-motion: reduce) {
	html.emg-loading { overflow: auto; }
	html.emg-loading .emg-loader { display: none; }
}

/* ------------------------------------------------------------------- Hero */
.emg-hero {
	position: relative;
	min-height: max(100vh, 680px);
	overflow: hidden;
	background: #02031f;
	display: flex;
	color: #f7feff;
}
.emg-hero-img {
	position: absolute; inset: -4% 0;
	width: 100%; height: 108%;
	object-fit: cover;
}
/* Même géométrie que l'image, au pixel près : la vidéo se substitue à elle
   en fondu, sans le moindre décalage. Elle reste invisible tant qu'elle ne
   joue pas — si l'autoplay est refusé, rien ne change à l'écran. */
.emg-hero-video {
	position: absolute; inset: -4% 0;
	width: 100%; height: 108%;
	object-fit: cover;
	opacity: 0; pointer-events: none;
	transition: opacity 1.1s var(--ease-out);
}
.emg-hero-video.is-on { opacity: 1; }
.emg-hero-grad-1 {
	position: absolute; inset: 0;
	background: linear-gradient(180deg, rgba(2, 3, 31, .5) 0%, rgba(2, 3, 31, .08) 34%, rgba(2, 3, 31, .16) 62%, rgba(2, 3, 31, .72) 100%);
}
.emg-hero-grad-2 {
	position: absolute; inset: 0;
	background: linear-gradient(100deg, rgba(2, 3, 31, .55) 0%, rgba(2, 3, 31, 0) 55%);
}
/* Le voile ne se renforce QUE si la vidéo tourne : une image fixe se lit
   sous un voile léger, une image qui bouge attire l'oeil et concurrence le
   texte. Plus dense à gauche, là où vivent le titre et les boutons. */
.emg-hero.has-video .emg-hero-grad-1 {
	background: linear-gradient(180deg, rgba(2, 3, 31, .58) 0%, rgba(2, 3, 31, .20) 34%, rgba(2, 3, 31, .32) 62%, rgba(2, 3, 31, .82) 100%);
}
/* Deux couches, et la radiale d'abord : le texte du hero vit en BAS À GAUCHE,
   pas sur toute la colonne de gauche. Une simple rampe latérale assombrissait
   donc aussi le haut, ou laissait le titre clair — celle-ci vise le coin. La
   lumière du logomark, elle, reste intacte en haut à droite. */
.emg-hero.has-video .emg-hero-grad-2 {
	background:
		radial-gradient(125% 95% at 0% 100%, rgba(2, 3, 31, .88) 0%, rgba(2, 3, 31, .52) 34%, rgba(2, 3, 31, .16) 58%, rgba(2, 3, 31, 0) 76%),
		linear-gradient(100deg, rgba(2, 3, 31, .70) 0%, rgba(2, 3, 31, .28) 40%, rgba(2, 3, 31, 0) 70%);
}
.emg-hero-inner {
	position: relative;
	max-width: var(--container);
	margin: 0 auto;
	width: 100%;
	padding: 130px var(--gutter) 0;
	display: flex; flex-direction: column; justify-content: flex-end;
}
.emg-hero-row {
	display: flex; align-items: flex-end; justify-content: space-between;
	gap: 48px;
	padding-bottom: clamp(48px, 7vh, 88px);
	flex-wrap: wrap;
}
.emg-hero-main { max-width: 900px; }
/* 23ch : la plus longue déclinaison du titre (IT) tient sur 2 lignes équilibrées.
   Pas de text-shadow : il donnait l'impression d'un fond sombre derrière le texte. */
.emg-hero-title {
	font-size: clamp(40px, 4.9vw, 78px);
	line-height: 1.1;
	letter-spacing: -.04em;
	margin: 26px 0 0;
	max-width: 23ch;
	text-wrap: balance;
}
.emg-hero-sub {
	font-size: 18px; font-weight: 400; line-height: 1.6;
	color: rgba(247, 254, 255, .78);
	max-width: 52ch;
	margin: 26px 0 0;
}
.emg-hero .emg-btn-row { margin-top: 36px; }
/* « Agence web & mobile » est plus court que l'ancien libellé : on peut se
   permettre un cran de plus sur l'eyebrow du hero (12px partout ailleurs). */
.emg-hero .emg-eyebrow { font-size: 13px; }

/* Mini bento : stat + avis côte à côte, bandeau pleine largeur dessous.
   Pas de flottement par cellule (il désalignerait la grille) : la vie
   vient du parallax souris, des reflets et de l'orbe. */
.emg-hero-chips {
	display: grid;
	grid-template-columns: 1.3fr 1fr;
	gap: 10px;
	width: min(390px, 100%);
	align-self: flex-end;
	padding-bottom: 6px;
}
.emg-chip.is-stat { grid-column: 1; grid-row: 1; min-width: 0; }
.emg-chip.is-rating { grid-column: 2; grid-row: 1; }
.emg-chip.is-since { grid-column: 1 / -1; grid-row: 2; justify-content: center; }

/* Reflet qui balaie périodiquement les chips — le verre "travaille".
   Il se DÉPLACE du haut-droite vers le bas-gauche. Une barre lumineuse se
   déplace toujours perpendiculairement à elle-même (le long de son propre
   axe, elle glisserait sans que rien ne bouge) : elle est donc orientée
   « \ », et un dégradé à 45° donne exactement cette orientation, ses bandes
   étant perpendiculaires à son axe. La translation suit ce même axe — seul
   son SENS a été inversé (demande Loris), pas l'orientation de la barre.
   Le voile déborde largement (inset -100%) pour que la barre traverse
   entièrement la chip sans jamais laisser voir son extrémité. */
.emg-chip { position: relative; overflow: hidden; }
.emg-chip::after {
	content: '';
	position: absolute; inset: -100%;
	background: linear-gradient(45deg,
		rgba(255, 255, 255, 0) 42%,
		rgba(255, 255, 255, .17) 50%,
		rgba(255, 255, 255, 0) 58%);
	transform: translate3d(32%, -32%, 0);
	pointer-events: none;
}
/* Sens INVERSE : la barre part du haut-droite et descend vers le bas-gauche
   (demande Loris). L'axe du degrade ne bouge pas — c'est l'orientation de la
   barre, pas son sens de marche —, seuls le depart et l'arrivee sont
   echanges. */
@keyframes emg-chip-sheen {
	0%, 72% { transform: translate3d(32%, -32%, 0); }
	90%, 100% { transform: translate3d(-32%, 32%, 0); }
}
html.js:not(.emg-motion-off) .emg-chip.is-floating::after { animation: emg-chip-sheen 7.5s ease-in-out infinite; }
html.js:not(.emg-motion-off) .emg-chip.is-rating.is-floating::after { animation-delay: 1.4s; }
html.js:not(.emg-motion-off) .emg-chip.is-stat.is-floating::after { animation-delay: 2.8s; }

/* Chip avis : 5 étoiles glacées, score 5/5 en grand, libellé dessous. */
/* justify-content: flex-end sur les deux : la pastille de gauche a deux
   lignes, celle de droite en a trois. Cales en haut ou au centre, leurs
   legendes tombaient a 14 px l'une de l'autre. Cales en bas, elles
   partagent la meme ligne. */
.emg-chip.is-rating { flex-direction: column; align-items: flex-start; justify-content: flex-end; gap: 0; padding: 20px 22px; border-radius: 20px; }
.emg-chip-value.is-score { font-size: 33px; margin-top: 9px; }
.emg-chip.is-rating .emg-chip-caption { white-space: nowrap; }
.emg-chip-stars {
	display: inline-flex; gap: 4px;
	color: var(--cyan);
	filter: drop-shadow(0 0 7px color-mix(in srgb, var(--cyan) 65%, transparent));
}
@keyframes emg-twinkle {
	0%, 100% { opacity: 1; transform: scale(1); }
	50% { opacity: .5; transform: scale(.88); }
}
html.js:not(.emg-motion-off) .emg-chip-stars svg:nth-child(2) { animation: emg-twinkle 3.6s ease-in-out infinite 1.1s; }
html.js:not(.emg-motion-off) .emg-chip-stars svg:nth-child(5) { animation: emg-twinkle 4.3s ease-in-out infinite .3s; }

/* Orbe lumineuse qui respire derrière les chips. */
.emg-hero-glow {
	position: absolute; right: 2vw; bottom: 12vh;
	width: 380px; height: 380px; border-radius: 50%;
	background: radial-gradient(circle, rgba(148, 246, 255, .2), rgba(10, 54, 247, .12) 45%, transparent 68%);
	filter: blur(46px);
	pointer-events: none;
}
@keyframes emg-glow-pulse {
	0%, 100% { opacity: .55; transform: scale(1); }
	50% { opacity: 1; transform: scale(1.14); }
}
html.js:not(.emg-motion-off) .emg-hero-glow { animation: emg-glow-pulse 9s ease-in-out infinite; }
.emg-chip {
	padding: 14px 20px;
	border-radius: 16px;
	background: rgba(2, 3, 31, .38);
	border: 1px solid rgba(247, 254, 255, .22);
	backdrop-filter: blur(28px) saturate(1.4);
	-webkit-backdrop-filter: blur(28px) saturate(1.4);
	display: flex; align-items: center; gap: 10px;
	color: #f7feff;
}
.emg-chip-dot {
	width: 7px; height: 7px; border-radius: 99px; flex: none;
	background: var(--cyan);
	box-shadow: 0 0 12px var(--cyan);
}
.emg-chip-label { font-size: 12px; font-weight: 600; letter-spacing: .1em; white-space: nowrap; }
.emg-chip.is-stat { flex-direction: column; align-items: flex-start; justify-content: flex-end; gap: 0; padding: 20px 26px; border-radius: 20px; min-width: 190px; }
.emg-chip-value {
	font-size: 44px; font-weight: 200; letter-spacing: -.02em; line-height: 1;
	font-variant-numeric: tabular-nums;
}
.emg-chip-caption { font-size: 11px; font-weight: 600; letter-spacing: .14em; margin-top: 8px; color: rgba(247, 254, 255, .72); }

.emg-hero-cue-wrap { display: flex; justify-content: center; padding-bottom: 26px; }
.emg-hero-cue {
	width: 1px; height: 44px;
	background: linear-gradient(180deg, rgba(247, 254, 255, .7), rgba(247, 254, 255, 0));
}

/* Hero interne (pages) */
.emg-page-hero { padding: calc(var(--nav-h) + 104px) 0 24px; }
/* Hero de page en nuit : c'est lui qui ouvre le contraste sur les pages
   internes. Il lui faut plus de fond sous le texte qu'à un hero clair, où la
   page continuait sans rupture — sinon la bande sombre se lit comme un
   bandeau posé, pas comme une ouverture. */
.emg-page-hero.emg-night { padding-bottom: clamp(72px, 8.5vw, 124px); }
/* Filigranes : les valeurs que l'ancien thème sombre avait retenues, elles
   restent justes sur nuit. */
.emg-night .emgx-watermark { opacity: .07; }
.emg-night .emg-page-logomark { opacity: .09; }

/* Fil d'Ariane : il occupe le haut de page, le hero se resserre d'autant. */
.emg-breadcrumb {
	position: relative; z-index: 1;
	padding: calc(var(--nav-h) + 36px) 0 0;
	font-size: 12.5px; color: var(--ink2);
}
.emg-breadcrumb ol {
	display: flex; flex-wrap: wrap; align-items: center; gap: 8px;
	margin: 0; padding: 0; list-style: none;
}
.emg-breadcrumb li { display: flex; align-items: center; gap: 8px; min-width: 0; }
.emg-breadcrumb li + li::before { content: '›'; opacity: .45; }
.emg-breadcrumb a { color: var(--ink2); transition: color .25s ease; }
.emg-breadcrumb a:hover { color: var(--accent); }
.emg-breadcrumb [aria-current] {
	color: var(--ink); font-weight: 600;
	overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
body.emg-has-crumb .emg-page-hero { padding-top: 30px; }
@media (max-width: 620px) {
	.emg-breadcrumb { padding-top: calc(var(--nav-h) + 24px); font-size: 12px; }
	body.emg-has-crumb .emg-page-hero { padding-top: 22px; }
}
.emg-page-hero .emg-page-title {
	font-size: clamp(40px, 5.4vw, 84px);
	letter-spacing: -.04em;
	margin: 24px 0 0;
	max-width: 18ch;
}
/* Variante centrée (pages légales) : titre au centre de la page. */
.emg-page-hero.is-centered { text-align: center; }
/* Ce hero centre ne sert qu'aux pages legales : son intro s'elargit avec le
   corps de la page, sinon elle paraitrait etriquee au-dessus. */
.emg-page-hero.is-centered .emg-page-intro { max-width: 70ch; }
.emg-page-hero.is-centered .emg-page-title { max-width: none; }
.emg-page-hero .emg-page-intro {
	font-size: 18px; line-height: 1.65;
	color: var(--ink2);
	max-width: 62ch;
	margin: 28px 0 0;
}

/* ---------------------------------------------------------------- Marquee */
.emg-marquee-section { padding: 72px 0 40px; }
.emg-marquee-label {
	text-align: center;
	font-size: 11px; font-weight: 700; letter-spacing: .3em;
	color: var(--ink2);
}
.emg-marquee {
	overflow: hidden;
	margin-top: 33px;
	-webkit-mask-image: linear-gradient(90deg, transparent, #000 15%, #000 85%, transparent);
	mask-image: linear-gradient(90deg, transparent, #000 15%, #000 85%, transparent);
}
.emg-marquee-track {
	display: flex; gap: 48px; width: max-content; align-items: center;
	animation: emg-marquee 34s linear infinite;
}
.emg-marquee:hover .emg-marquee-track { animation-play-state: paused; }
.emg-marquee-track span {
	font-size: 17px; font-weight: 800; letter-spacing: -.01em;
	opacity: .4; white-space: nowrap;
}
@keyframes emg-marquee { from { transform: translateX(0); } to { transform: translateX(-50%); } }

/* Logos clients (gérés dans l'admin) : toujours en niveaux de gris,
   couleur d'origine au survol ; taille équilibrée par --logo-scale.
   Le bandeau vit sur le fond du thème (contrairement aux tuiles de la
   page Références, qui restent blanches en permanence) ; en mode sombre,
   les logos foncés sont passés en blanc. */
.emg-marquee { display: block; }
/* Cases fixes : chaque logo défile dans une cellule aux dimensions
   identiques (190×64), contenu à l'intérieur — poids visuel homogène.
   L'indice de taille module la place occupée dans la case. */
.emg-marquee-logo {
	flex: none;
	width: 210px; height: 80px;
	display: flex; align-items: center; justify-content: center;
}
.emg-marquee-logo img {
	height: auto; width: auto;
	max-height: calc(90% * var(--logo-scale, 1));
	max-width: calc(92% * var(--logo-scale, 1));
	object-fit: contain;
	filter: grayscale(1) opacity(.55);
	transition: filter .35s ease;
}
/* Coins arrondis, a la demande (voir emg_logo_rounded, inc/logos.php).
   L'arrondi ne se justifie que sur un logo qui porte son propre fond : sur un
   dessin detoure il ne rogne rien et ne se voit pas. Il etait pose sur TOUS
   les logos, ce qui revenait a le laisser au hasard du format ; il est
   maintenant decide logo par logo, avec le format pour seul defaut. */
.emg-marquee-logo.is-round img,
.emg-ref-tile.is-round img { border-radius: 10px; }
/* Thème clair : couleur d'origine au survol ; logos négatifs inversés. */
.emg-marquee-logo:hover img { filter: none; }
.emg-marquee-logo.is-invert img { filter: invert(1) grayscale(1) opacity(.6); }
.emg-marquee-logo.is-invert:hover img { filter: invert(1) grayscale(1) opacity(.95); }
/* Bande de nuit : les logos fonces sont inverses en blanc (pas de passage
   couleur, les teintes inversees seraient fausses) ; les logos deja negatifs
   restent tels quels. */
.emg-night .emg-marquee-logo img { filter: invert(1) grayscale(1) opacity(.6); }
.emg-night .emg-marquee-logo:hover img { filter: invert(1) grayscale(1) opacity(.95); }
.emg-night .emg-marquee-logo.is-invert img { filter: grayscale(1) opacity(.6); }
.emg-night .emg-marquee-logo.is-invert:hover img { filter: grayscale(1) opacity(.95); }
.emg-marquee { pointer-events: auto; }
.emg-marquee-more {
	display: inline-flex; align-items: center; gap: 8px;
	margin-top: 30px;
	font-size: 13px; font-weight: 700;
	color: var(--ink2);
	transition: color .25s ease, gap .25s var(--ease-out);
}
.emg-marquee-more:hover { color: var(--accent); gap: 11px; }

/* ------------------------------------------------- Cadre de navigateur
   Une capture de site posée à plat se confond avec la page qui l'entoure,
   surtout quand les deux sont claires. Le cadre dit « ceci est un autre
   site », la barre d'adresse dit lequel. La hauteur de barre est une
   variable : le moteur du zoom la lit pour calculer sa cible, et l'arrivée
   sur la fiche la reçoit en propriété CSS. */
.emg-browser {
	--bar: 34px;
	/* display: block et non flex : les fiches projet posent ce cadre sur des
	   <span> a l'interieur de <figure>. La barre a une hauteur fixe et la
	   capture son propre rapport, donc le flux normal suffit. */
	display: block;
	position: relative; overflow: hidden;
	min-width: 0;
	border-radius: var(--radius);
	background: var(--card);
	border: 1px solid var(--line);
	box-shadow: var(--shadow);
	transition: transform .45s var(--ease-out), box-shadow .55s var(--ease-out);
}
.emg-browser-bar {
	flex: none;
	/* Trois colonnes plutot qu'une rangee flex : les pastilles a gauche, le
	   champ au CENTRE de la barre, une colonne vide a droite pour l'equilibre.
	   En flex, le champ s'etirait sur toute la place restante. */
	display: grid; grid-template-columns: 1fr auto 1fr;
	align-items: center; gap: 10px;
	height: var(--bar); padding: 0 12px;
	min-width: 0;
	background: color-mix(in srgb, var(--ink) 4%, var(--card));
	border-bottom: 1px solid var(--line);
}
/* Pastilles neutres et non tricolores : la barre est un repère, pas une
   citation de macOS, et le gris se tient à côté du bleu de marque. */
.emg-browser-dots { display: flex; gap: 6px; flex: none; justify-self: start; }
.emg-browser-dots i {
	width: 8px; height: 8px; border-radius: 50%; flex: none;
	background: color-mix(in srgb, var(--ink) 15%, transparent);
}
/* La roue vit A COTE du champ. Elle reste dans le flux : quand elle est au
   repos, sa place est deja reservee, donc rien ne bouge au moment ou elle
   apparait. Le champ se decale d'une dizaine de pixels a gauche du centre
   exact, ce qui ne se voit pas et evite tout debordement a droite. */
.emg-browser-addr {
	display: flex; align-items: center; gap: 10px;
	justify-self: center; min-width: 0; max-width: 100%;
}
.emg-browser-url {
	/* justify-self : sur les fiches projet il n'y a pas de roue, donc pas
	   d'enveloppe, et c'est le champ qui occupe directement la colonne du
	   milieu. Sans cette ligne il se calerait a gauche de sa colonne. */
	justify-self: center;
	display: flex; align-items: center; gap: 6px; min-width: 0;
	/* Largeur du contenu, avec un plancher pour qu'un domaine court ressemble
	   quand meme a un champ, et un plafond pour qu'un domaine long ne mange
	   pas la barre. En pixels et non en pourcentage : dans une colonne de
	   grille dimensionnee par son contenu, un pourcentage se resoudrait sur
	   lui-meme. */
	width: max-content;
	min-width: 148px; max-width: 320px;
	height: 20px; padding: 0 13px;
	border-radius: 99px;
	background: var(--bg2, #fff);
	border: 1px solid color-mix(in srgb, var(--ink) 6%, transparent);
	font-size: 11px; font-weight: 600; color: var(--ink3);
}
.emg-browser-url svg { flex: none; opacity: .5; }
/* Leçon de la grille : un texte en nowrap impose son min-content à tous ses
   parents. Sans min-width: 0 ici, l'adresse élargirait la carte entière. */
.emg-browser-host { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.emg-browser-spin {
	flex: none;
	width: 11px; height: 11px; border-radius: 50%;
	border: 1.5px solid color-mix(in srgb, var(--ink) 14%, transparent);
	border-top-color: var(--accent);
	opacity: 0;
	transition: opacity .18s ease;
}
/* Au clic, la page se charge vraiment : la roue le dit pendant que le cadre
   s'envole. Elle ne tourne jamais au repos. */
.emg-browser.is-loading .emg-browser-spin { opacity: 1; animation: emg-browser-spin .75s linear infinite; }
@keyframes emg-browser-spin { to { transform: rotate(360deg); } }
html.emg-motion-off .emg-browser.is-loading .emg-browser-spin { animation: none; }

/* La capture prend ce qui reste sous la barre. En flux normal c'est son
   16/9 qui commande ; dans le clone volant, dont la hauteur est imposée,
   c'est le flex qui reprend la main. */

/* Le cadre porte désormais le contour et l'ombre : le hero de la fiche les
   perd, sinon on aurait deux bordures imbriquées. */
.emg-single-hero-wrap .emg-browser > .emg-single-hero {
	border-radius: 0; box-shadow: none; overflow: hidden;
}
@media (max-width: 560px) {
	.emg-browser { --bar: 27px; }
	.emg-browser-bar { gap: 8px; padding: 0 9px; }
	.emg-browser-dots { gap: 5px; }
	.emg-browser-dots i { width: 6px; height: 6px; }
	.emg-browser-addr { gap: 8px; }
	.emg-browser-url { height: 17px; font-size: 10px; padding: 0 11px; min-width: 112px; max-width: 210px; }
	.emg-browser-spin { width: 9px; height: 9px; }
}

/* -------------------------------------------------- Page Références */
.emg-ref-grid {
	display: grid; grid-template-columns: repeat(4, 1fr);
	gap: 18px; margin-top: 64px;
}
/* Tuiles toujours blanches (même en mode sombre) : les logos vivent sur
   fond blanc quel que soit le thème. */
.emg-ref-tile {
	position: relative; overflow: hidden;
	display: grid; place-items: center;
	aspect-ratio: 4 / 3;
	/* Marge en pourcentage, pas en pixels : sur une tuile de 165 px de large,
	   20 px fixes mangeaient un quart de la case et le logo en sortait. */
	padding: clamp(10px, 6.6%, 20px);
	/* La case devient l'unite de mesure de son logo (voir plus bas). */
	container-type: size;
	border-radius: var(--radius);
	background: #fff;
	border: 1px solid rgba(2, 3, 31, .08);
	box-shadow: var(--shadow-soft);
	transition: transform .35s var(--ease-out), box-shadow .35s ease, border-color .35s ease;
}
/* Le logo occupe généreusement la tuile ; seul le passage en couleur
   signe le survol (pas de texte). L'arrondi, lui, ne se decide plus ici :
   il vient de la classe .is-round, posee logo par logo (voir
   emg_logo_rounded, inc/logos.php). Une regle aveugle trainait ici apres
   que celle du bandeau soit partie : tous les logos de la grille
   restaient arrondis, coche ou pas. */
.emg-ref-tile img {
	/* Hauteur exprimée dans l'unité de la CASE (cqh) et non en pixels : le
	   logo garde la même part de sa tuile à toute largeur d'écran, au lieu
	   de grossir quand la case rétrécit. Un simple pourcentage ne marche pas
	   ici : la rangée de la grille est dimensionnée PAR l'image, la valeur se
	   résoudrait sur elle-même et le navigateur l'ignore.
	   58.5 cqh = les 120 px d'origine sur une tuile de bureau ; le min()
	   empêche un --logo-scale généreux de faire sortir le logo du cadre. */
	max-height: min(100cqh, calc(58.5cqh * var(--logo-scale, 1)));
	max-width: 84%; width: auto; object-fit: contain;
	filter: grayscale(1) opacity(.6);
	transition: filter .4s ease, transform .4s var(--ease-out);
}
.emg-ref-tile:hover {
	transform: translateY(-5px);
	border-color: color-mix(in srgb, var(--accent) 26%, var(--line));
	box-shadow: var(--shadow);
}
.emg-ref-tile:hover img { filter: none; transform: scale(1.05); }
/* Négatif (logos blancs) : toujours foncés — le fond des tuiles est blanc
   dans les deux thèmes. */
.emg-ref-tile.is-invert img { filter: invert(1) grayscale(1) opacity(.65); }
.emg-ref-tile.is-invert:hover img { filter: invert(1) grayscale(1) opacity(.95); }
/* Pagination de la galerie (pilules). */
.emg-pagination { display: flex; justify-content: center; align-items: center; gap: 8px; margin-top: 56px; flex-wrap: wrap; }

/* Le pageur et la sortie vers les références partagent une rangée (demande
   Marino, 2026-08-30). Le lien est dans la rangée mais hors du <nav>, que le
   JS vide et reconstruit : il tient donc sa place quelle que soit la page, et
   même quand le pageur est masqué, où il se retrouve seul et centré. */
.emg-work-pager-row {
	margin-top: 56px;
	display: flex; justify-content: center; align-items: center;
	gap: clamp(14px, 2vw, 28px); flex-wrap: wrap;
}
.emg-work-pager-row .emg-pagination { margin-top: 0; }
.emg-work-refs-link {
	display: inline-flex; align-items: center; gap: 8px;
	height: 42px; padding: 0 20px;
	border-radius: 99px;
	border: 1px solid var(--line);
	color: var(--muted);
	font-weight: 700; font-size: 14px; text-decoration: none;
	transition: color .25s ease, border-color .25s ease, background .25s ease;
}
.emg-work-refs-link:hover {
	color: var(--accent); border-color: var(--accent);
	background: var(--card);
}
.emg-work-refs-link svg { transition: transform .25s var(--ease-out); }
.emg-work-refs-link:hover svg { transform: translateX(3px); }
.emg-page-link {
	display: grid; place-items: center;
	min-width: 42px; height: 42px; padding: 0 14px;
	border-radius: 99px;
	border: 1px solid var(--line);
	background: var(--card);
	color: var(--ink);
	font-weight: 700; font-size: 14px; font-variant-numeric: tabular-nums;
	transition: color .25s ease, border-color .25s ease, transform .25s var(--ease-out);
}
.emg-page-link:hover { color: var(--accent); border-color: color-mix(in srgb, var(--accent) 35%, var(--line)); transform: translateY(-2px); }
.emg-page-link.is-current { background: var(--accent); border-color: var(--accent); color: #f7feff; pointer-events: none; }

.emg-ref-empty {
	margin-top: 64px; padding: 56px;
	text-align: center; color: var(--ink2);
	border: 1px dashed var(--line); border-radius: var(--radius);
}
@media (max-width: 1160px) { .emg-ref-grid { grid-template-columns: repeat(3, 1fr); } }
@media (max-width: 760px) { .emg-ref-grid { grid-template-columns: 1fr 1fr; gap: 14px; } }

/* ------------------------------------------------------- Liste de services */
.emg-services-head { margin-bottom: 56px; }
.emg-section-title {
	font-size: clamp(36px, 4.6vw, 68px);
	letter-spacing: -.035em;
	margin: 22px 0 0;
	max-width: 20ch;
}
.emg-service-list { border-top: 1px solid var(--line); }
.emg-service-row {
	display: grid;
	grid-template-columns: 110px 1fr 1.1fr 48px;
	align-items: center; gap: 32px;
	padding: 38px 12px;
	border-bottom: 1px solid var(--line);
	color: var(--ink);
	transition: background .3s ease, padding .3s ease, color .3s ease;
}
.emg-service-row:hover { background: var(--card); color: var(--ink); }
/* Le glissement vers la droite repond au SURVOL. Sur un ecran tactile, le
   :hover reste colle apres le tap : la rangee se decalait et son texte
   partait hors cadre. On le reserve donc aux pointeurs fins. */
@media (hover: hover) and (pointer: fine) {
	.emg-service-row:hover { padding-left: 24px; }
}
/* Numéros en glyphes EMGX-α, bleus et bien visibles. */
.emg-service-num {
	font-size: 27px; font-weight: 200;
	font-variant-numeric: tabular-nums;
	color: var(--accent);
	display: flex; align-items: center;
}
.emg-service-name { font-size: clamp(24px, 2.6vw, 38px); font-weight: 700; letter-spacing: -.025em; }
.emg-service-desc { font-size: 15px; line-height: 1.55; color: var(--ink2); }
.emg-service-go {
	width: 44px; height: 44px; border-radius: 99px;
	border: 1px solid var(--line);
	display: grid; place-items: center;
	transition: background .3s ease, color .3s ease, border-color .3s ease, transform .3s var(--ease-out);
}
.emg-service-row:hover .emg-service-go {
	background: var(--accent); border-color: var(--accent); color: #f7feff;
	transform: translateX(4px);
}

/* Chiffres EMGX-α — filigranes, numéros de pôles, jalons.
   Hauteur commune .62em ; largeur calée sur le ratio réel de chaque glyphe
   (sinon `contain` rendait le 1 et le 3 plus grands que le 0). */
.emgx-num { display: inline-flex; align-items: center; gap: .07em; }
.emgx-digit {
	display: inline-block;
	width: .62em; height: .62em;
	background: currentColor;
	-webkit-mask-position: center; mask-position: center;
	-webkit-mask-repeat: no-repeat; mask-repeat: no-repeat;
	-webkit-mask-size: contain; mask-size: contain;
}
.emgx-d0, .emgx-d2, .emgx-d5, .emgx-d6, .emgx-d8, .emgx-d9 { width: .654em; }
.emgx-d1 { width: .391em; }
.emgx-d3, .emgx-d7 { width: .569em; }
.emgx-d4 { width: .642em; }
/* Le filigrane est tire d'une demi-gouttiere hors du cadre : c'est voulu,
   il doit mordre le bord. Mais rien ne le rognait, donc il elargissait le
   document de 12 px et la page pouvait glisser lateralement. Le hero le
   coupe maintenant a son bord (clip, et non hidden : pas de conteneur de
   defilement cree au passage). */
.emg-page-hero { overflow: clip; }
.emgx-watermark {
	position: absolute;
	right: calc(var(--gutter) * -0.5); top: 44%;
	transform: translateY(-50%);
	font-size: clamp(260px, 30vw, 460px);
	color: var(--accent);
	opacity: .05;
	pointer-events: none;
	user-select: none;
	z-index: 0;
}
.emg-page-hero { position: relative; }
.emg-page-hero .emg-container { position: relative; z-index: 1; }

/* Trame de précision : fine grille de points fondue dans le coin des heros
   de pages — clin d'œil "plan technique" à la précision suisse. */
.emg-page-hero::before {
	content: '';
	position: absolute; inset: 0;
	background-image: radial-gradient(color-mix(in srgb, var(--ink) 17%, transparent) 1px, transparent 1.4px);
	background-size: 27px 27px;
	-webkit-mask-image: radial-gradient(70% 85% at 26% 16%, #000 18%, transparent 76%);
	mask-image: radial-gradient(70% 85% at 26% 16%, #000 18%, transparent 76%);
	pointer-events: none;
}

/* Logomark plat en décor de hero : discret, teinté accent, à la place
   de l'ancienne image d'ambiance (jugée pas assez aboutie). */
.emg-page-logomark {
	position: absolute; top: clamp(80px, 12vw, 140px); right: calc(var(--gutter) * 1.5);
	width: clamp(170px, 21vw, 320px); aspect-ratio: 1 / 1;
	background: var(--accent);
	opacity: .055;
	-webkit-mask-repeat: no-repeat; mask-repeat: no-repeat;
	-webkit-mask-size: contain; mask-size: contain;
	-webkit-mask-position: center; mask-position: center;
	pointer-events: none; user-select: none;
}

/* Pills bleues : exemples concrets sous les noms de pôles. */
.emg-pills { display: flex; flex-wrap: wrap; gap: 7px; margin-top: 12px; }
.emg-pill {
	font-size: 11.5px; font-weight: 700; letter-spacing: .02em; line-height: 1;
	padding: 6px 12px; border-radius: 99px;
	color: var(--accent);
	background: color-mix(in srgb, var(--accent) 9%, transparent);
	border: 1px solid color-mix(in srgb, var(--accent) 22%, transparent);
	white-space: nowrap;
}

/* ------------------------------------------------------ Section chiffres */
/* Le fond vient de .emg-night (dégradé + nappe animée) : plus d'aplat navy
   ici, il le recouvrirait. Les deux orbes floutées restent, elles donnent de
   la profondeur sous la nappe. */
.emg-numbers { position: relative; overflow: hidden; margin-top: 110px; }
/* Orbes lumineuses : profondeur douce dans le panneau navy. */
.emg-numbers::before,
.emg-numbers::after {
	content: '';
	position: absolute; border-radius: 50%;
	pointer-events: none;
	filter: blur(72px);
}
.emg-numbers::before {
	width: 520px; height: 520px; right: -160px; top: -200px;
	background: radial-gradient(circle, rgba(10, 54, 247, .42), transparent 68%);
}
.emg-numbers::after {
	width: 400px; height: 400px; left: -140px; bottom: -180px;
	background: radial-gradient(circle, rgba(148, 246, 255, .14), transparent 68%);
}
/* Le raccourci `padding: 120px 0` annulait la gouttière que .emg-container
   pose ici : les chiffres partaient au ras du bord de l'écran, sans aucun
   alignement avec le reste de la page. Invisible tant que le fond était le
   même partout, criant depuis que la bande est sombre. */
.emg-numbers-inner { position: relative; z-index: 1; padding: 120px var(--gutter); }
.emg-numbers-grid {
	display: grid; grid-template-columns: repeat(4, 1fr);
	gap: 40px; margin-top: 64px;
}
.emg-number-value {
	font-size: clamp(56px, 6vw, 96px);
	font-weight: 200; letter-spacing: -.03em; line-height: 1;
	font-variant-numeric: tabular-nums;
	background: linear-gradient(120deg, #94f6ff, #4d6dff);
	-webkit-background-clip: text; background-clip: text;
	color: transparent;
}
.emg-number-label {
	font-size: 14px; font-weight: 500;
	color: rgba(247, 254, 255, .6);
	margin-top: 14px; padding-top: 14px;
	border-top: 1px solid rgba(247, 254, 255, .12);
}
.emg-numbers-claim {
	margin-top: 100px;
	display: grid; grid-template-columns: 1fr 1fr;
	gap: 64px; align-items: start;
}
.emg-numbers-claim h3 {
	font-size: clamp(30px, 3.4vw, 50px);
	font-weight: 700; letter-spacing: -.03em; line-height: 1.15;
}
.emg-numbers-claim p { font-size: 17px; line-height: 1.7; color: rgba(247, 254, 255, .65); }

/* ------------------------------------------------------------ Réalisations */
.emg-work-head {
	display: flex; align-items: flex-end; justify-content: space-between;
	gap: 32px; flex-wrap: wrap;
}
/* minmax(0, 1fr) et non 1fr : `1fr` vaut `minmax(auto, 1fr)`, et ce minimum
   `auto` est le min-content de la carte. Celle-ci en reclame 402 (titre 151 +
   categories en nowrap 235), soit plus que la grille sur un telephone : la
   colonne s'elargissait et la carte sortait de l'ecran. Le 0 rend la largeur
   a la place disponible. */
.emg-work-grid {
	display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: 32px; margin-top: 56px;
	/* Repere des cartes que le filtre sort du flux : elles s'effacent a leur
	   place pendant que les autres glissent (voir main.js). */
	position: relative;
}
/* Et l'element de grille lui-meme : sa taille minimale automatique reste le
   min-content tant qu'on ne l'a pas dite. Sans cette ligne, la colonne fait
   bien 342 px mais la carte en occupe 402 dedans. */
.emg-work-card { min-width: 0; }
.emg-work-card-link { display: block; color: var(--ink); }
/* Média des cartes : 16:9, le format normé des captures — rien n'est rogné.
   Le transform reste au tilt 3D (GSAP) : le survol joue sur l'ombre, un
   voile et le zoom de l'image, jamais sur le transform du conteneur. */
.emg-work-card-media {
	position: relative;
	overflow: hidden;
	aspect-ratio: 16 / 9;
	background: var(--card);
}
.emg-work-card-media::after {
	content: '';
	position: absolute; inset: 0;
	background: linear-gradient(to top, rgba(2, 3, 31, .42), transparent 52%);
	opacity: 0;
	transition: opacity .5s ease;
	pointer-events: none;
}
.emg-work-card-media img, .emg-card-placeholder {
	width: 100%; height: 100%;
	object-fit: cover; display: block;
	transition: transform .9s var(--ease-out);
}
.emg-card-placeholder { background: linear-gradient(135deg, var(--navy), #123498); }
.emg-work-card-link:hover .emg-browser {
	box-shadow:
		0 34px 70px -26px rgba(2, 3, 31, .45),
		0 12px 30px -16px rgba(2, 3, 31, .3);
}
.emg-work-card-link:hover .emg-work-card-media::after { opacity: 1; }
.emg-work-card-link:hover .emg-work-card-media img { transform: scale(1.05); }
.emg-work-card-meta {
	display: flex; justify-content: space-between; align-items: baseline;
	margin-top: 18px; gap: 16px;
	min-width: 0; /* la ligne ne peut jamais déborder de la carte. */
}
.emg-work-card-title { font-size: 20px; font-weight: 700; letter-spacing: -.02em; flex: 0 1 auto; min-width: 0; }
.emg-work-card-title::after {
	content: '→';
	display: inline-block;
	margin-left: 8px;
	opacity: 0;
	transform: translateX(-8px);
	transition: opacity .35s ease, transform .45s var(--ease-out);
}
.emg-work-card-link:hover .emg-work-card-title::after { opacity: 1; transform: none; }
.emg-work-card-cat {
	font-size: 12px; font-weight: 600; letter-spacing: .12em;
	color: var(--ink2); text-transform: uppercase;
	/* Quelle que soit la quantité de catégories : une seule ligne, tronquée
	   en « … » si la place manque — jamais de débordement sur la voisine. */
	white-space: nowrap;
	flex: 0 1 auto; min-width: 0;
	overflow: hidden; text-overflow: ellipsis;
	text-align: right;
}
.emg-work-card-link:hover .emg-work-card-title { color: var(--accent); }
/* Sur un ecran etroit, titre et categories se disputent une ligne de 342 px et
   les categories finissaient en « … » des la premiere carte. Empilees, elles
   tiennent entieres et la carte respire. */
@media (max-width: 560px) {
	.emg-work-card-meta { flex-direction: column; align-items: flex-start; gap: 5px; }
	.emg-work-card-cat { text-align: left; }
}

/* Filtres (archive réalisations) */
.emg-filters {
	display: flex; gap: 8px; flex-wrap: wrap;
	margin-top: 44px;
	padding: 6px;
	border-radius: 99px;
	background: var(--glass);
	/* var(--line) et non le verre : visible aussi en light (blanc sur blanc sinon). */
	border: 1px solid var(--line);
	backdrop-filter: blur(20px) saturate(1.5);
	-webkit-backdrop-filter: blur(20px) saturate(1.5);
	width: fit-content;
}
.emg-filter {
	border: 0; cursor: pointer;
	font-size: 13px; font-weight: 600;
	padding: 9px 18px; border-radius: 99px;
	background: transparent; color: var(--ink2);
	transition: background .3s ease, color .3s ease;
}
.emg-filter:hover { color: var(--ink); }
.emg-filter.is-active { background: var(--ink); color: var(--bg); font-weight: 700; }

/* -------------------------------------------------------------- Témoignage */
.emg-quote-section { max-width: 900px; margin: 0 auto; padding: 130px var(--gutter); text-align: center; }
.emg-quote-mark { font-size: 44px; color: var(--accent); line-height: 1; font-weight: 800; }
.emg-quote-stage { position: relative; min-height: 240px; }
.emg-quote-slide { position: absolute; inset: 0; opacity: 0; pointer-events: none; }
.emg-quote-slide.is-active { position: relative; opacity: 1; pointer-events: auto; }
.emg-quote-text {
	font-size: clamp(24px, 2.8vw, 36px);
	font-weight: 600; letter-spacing: -.02em; line-height: 1.4;
	margin: 18px 0 0;
	text-wrap: balance;
}
.emg-quote-author { margin-top: 28px; font-size: 14px; color: var(--ink2); }
.emg-quote-author strong { color: var(--ink); font-weight: 700; }
.emg-quote-dots { display: flex; gap: 8px; justify-content: center; margin-top: 36px; }
.emg-quote-dot {
	width: 7px; height: 7px; border-radius: 99px; border: 0; padding: 0;
	background: var(--line); cursor: pointer;
	transition: background .3s ease, transform .3s ease;
}
.emg-quote-dot.is-active { background: var(--accent); transform: scale(1.3); }

/* -------------------------------------------------------------- CTA panel */
.emg-cta-panel-wrap { padding: 0 0 100px; }
.emg-cta-panel {
	position: relative;
	border-radius: var(--radius-lg);
	overflow: hidden;
	background: var(--navy);
	color: #f7feff;
	box-shadow: var(--shadow);
}
.emg-cta-bg {
	position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover;
	opacity: .5; transition: opacity 1.1s var(--ease-out);
}
/* L'image s'efface quand la vidéo prend le relais. Sans cela les deux se
   superposent : à 50 % et 42 %, on voyait DEUX logomarks l'un sur l'autre.
   Elle reste en place tant que la vidéo ne joue pas — c'est elle le repli. */
.emg-cta-panel.has-video .emg-cta-bg { opacity: 0; }
/* Même géométrie que l'image : la vidéo la remplace en fondu, sans décalage.
   Plus dense que l'image fixe (.6 contre .5) : sous le voile, c'est le seul
   moyen qu'elle se voie vraiment. */
.emg-cta-video {
	position: absolute; inset: 0; width: 100%; height: 100%;
	object-fit: cover; opacity: 0; pointer-events: none;
	transition: opacity 1.1s var(--ease-out);
}
.emg-cta-video.is-on { opacity: .6; }
.emg-cta-overlay {
	position: absolute; inset: 0;
	background: linear-gradient(120deg, rgba(0, 7, 44, .92) 20%, rgba(0, 7, 44, .45));
}
/* Le voile ne s'applique QUE si la vidéo tourne : sans elle, le panneau reste
   exactement celui qui a été validé. Il reste dense à gauche — le titre et les
   boutons y vivent — et s'allège nettement à droite, où la vidéo doit se voir.
   .62 y étouffait le clip : combiné à l'opacité de la vidéo, il n'en restait
   qu'un cinquième environ de l'image finale. */
.emg-cta-panel.has-video .emg-cta-overlay {
	background: linear-gradient(120deg, rgba(0, 7, 44, .90) 18%, rgba(0, 7, 44, .40) 100%);
}
.emg-cta-content {
	position: relative;
	padding: clamp(64px, 8vw, 120px) clamp(40px, 6vw, 100px);
	display: flex; flex-direction: column; align-items: flex-start; gap: 32px;
}
.emg-cta-title {
	font-size: clamp(40px, 5.4vw, 84px);
	letter-spacing: -.04em; line-height: 1.02;
	max-width: 16ch;
}
.emg-cta-text { font-size: 18px; line-height: 1.6; color: rgba(247, 254, 255, .7); max-width: 44ch; }

/* Mobile : le panneau cesse d'être une carte flottante et devient une section
   pleine page. Les marges et l'arrondi coûtaient de la largeur sur un écran
   étroit, et l'ombre n'a plus de sens sans fond visible autour.
   100svh et non 100vh : sur mobile, vh se cale sur le viewport barre d'adresse
   RÉTRACTÉE, donc la section dépasserait au chargement. */
@media (max-width: 760px) {
	.emg-cta-panel-wrap { padding: 0; }
	.emg-cta-panel-wrap .emg-container { max-width: none; padding: 0; }
	.emg-cta-panel {
		border-radius: 0; box-shadow: none;
		min-height: 100vh; min-height: 100svh;
		display: flex; align-items: center;
	}
	.emg-cta-content { width: 100%; padding: clamp(72px, 14vh, 120px) clamp(20px, 6vw, 40px); }
}

/* ----------------------------------------------------------------- Footer */
.emg-footer { position: relative; }
/* Filet dégradé accent→cyan en lieu et place de la bordure plate. */
.emg-footer::before {
	content: '';
	position: absolute; top: 0; left: 0; right: 0; height: 1px;
	background: linear-gradient(90deg,
		transparent 0%,
		color-mix(in srgb, var(--accent) 55%, transparent) 30%,
		color-mix(in srgb, var(--cyan) 60%, transparent) 70%,
		transparent 100%);
}
/* Plus d'air autour de l'encart clair : pose sur la nuit, il a besoin de
   marge pour se lire comme un encart et non comme un trou. */
/* La gouttiÃ¨re est NOMMÃE, pas zÃ©ro : l'Ã©lÃ©ment porte aussi .emg-container,
   et un raccourci `padding: X 0` annule le padding horizontal qu'elle pose â
   l'encart partait alors d'un bord de l'Ã©cran Ã  l'autre pendant que la grille
   du pied de page, elle, restait dans la colonne. */
.emg-footer-newsletter { padding: clamp(72px, 8vw, 104px) var(--gutter) clamp(16px, 2vw, 28px); }
.emg-newsletter {
	display: grid; grid-template-columns: 1.2fr 1fr;
	gap: 40px; align-items: center;
	padding: 40px clamp(28px, 4vw, 56px);
	border-radius: var(--radius);
	background: var(--card);
	border: 1px solid var(--line);
	box-shadow: var(--shadow-soft);
}
.emg-newsletter-title { font-size: 24px; letter-spacing: -.02em; }
.emg-newsletter-text { color: var(--ink2); font-size: 15px; margin-top: 8px; }
.emg-newsletter-form { position: relative; display: flex; gap: 10px; flex-wrap: wrap; }
.emg-newsletter-form input[type="email"] {
	flex: 1; min-width: 220px;
	font: inherit; font-size: 15px;
	padding: 14px 20px;
	border-radius: 99px;
	border: 1px solid var(--line);
	background: var(--bg);
	color: var(--ink);
	transition: border-color .25s ease;
}
.emg-newsletter-form input[type="email"]:focus { outline: none; border-color: var(--accent); }
/* Consentement de la newsletter : sur toute la largeur du formulaire, sous le
   champ et le bouton, en petit. C'est une mention, pas un champ de saisie. */
.emg-newsletter-consent {
	flex: 1 1 100%;
	display: flex; align-items: flex-start; gap: 9px;
	/* Decalee de huit pixels (demande Loris) : le champ e-mail au-dessus a un
	   bord tres arrondi, et la case posee a zero tombait en dehors de cette
	   courbe — elle cassait l'arrondi au lieu de s'y ranger. */
	margin-top: 2px; padding-left: 8px;
	font-size: 11.5px; line-height: 1.45; color: var(--ink2);
	cursor: pointer;
}
.emg-newsletter-consent input[type="checkbox"] {
	/* La case fait 18 px, la boite du texte a cote n'en fait que 15 (11,5 px de
	   police) : posee en haut de la ligne, son centre tombe donc 2,5 px SOUS
	   celui du texte, et cela se voit. On la remonte d'autant. Mesure sur la
	   page, pas au juge — et la page de contact, dont le texte est plus grand,
	   tombait deja juste : c'est pour cela que le reglage est ici et pas dans
	   la regle commune. */
	margin: -1.5px 0 0;
}
.emg-newsletter-consent a { color: inherit; text-decoration: underline; text-underline-offset: 2px; }
.emg-newsletter-consent a:hover { color: var(--accent); }

.emg-newsletter.is-article { margin-top: 72px; }

.emg-hp { position: absolute !important; left: -9999px; width: 1px; height: 1px; opacity: 0; }

/* ---- Cases a cocher ----
   Elles s'en remettaient a `accent-color`, qui ne fait que TEINTER la case du
   systeme : le dessin reste celui de la plateforme — carre sur Windows, autre
   ailleurs — et rien ne s'anime. Ici la case est redessinee : `appearance:
   none` la vide de son apparence native, et le reste est a nous.

   La coche est tracee par un ::after — deux bords d'une boite, tournes de 45
   degres — plutot qu'une image : elle suit la couleur, elle s'anime, et elle
   ne demande aucun fichier. Elle est BLEUE sur un fond a peine teinte, et non
   blanche sur un aplat d'accent : la case vit aussi bien sur la page claire du
   contact que sur l'encart clair pose dans le pied de page sombre, et une
   seule paire de couleurs doit tenir aux deux endroits. Si un moteur refusait
   le pseudo-element sur un champ, la bordure d'accent dirait quand meme l'etat.

   Un seul selecteur pour les trois endroits ou une case s'affiche devant un
   visiteur — newsletter, contact, textes legaux. Les cases de l'administration
   gardent celles de WordPress, ce n'est pas notre interface. */
.emg-newsletter-consent input[type="checkbox"],
.emg-field .emg-consent input[type="checkbox"],
.emg-legal-check input[type="checkbox"],
.emg-legal-consent input[type="checkbox"] {
	appearance: none; -webkit-appearance: none;
	flex: none; display: inline-block; position: relative;
	width: 18px; height: 18px; min-width: 0; padding: 0;
	border: 1.5px solid color-mix(in srgb, var(--ink) 26%, transparent);
	border-radius: 6px;
	background: var(--card);
	cursor: pointer;
	transition: background .2s ease, border-color .2s ease, box-shadow .25s ease;
}
.emg-newsletter-consent input[type="checkbox"]:hover,
.emg-field .emg-consent input[type="checkbox"]:hover,
.emg-legal-check input[type="checkbox"],
.emg-legal-consent input[type="checkbox"]:hover {
	border-color: color-mix(in srgb, var(--accent) 55%, transparent);
}
.emg-newsletter-consent input[type="checkbox"]:focus-visible,
.emg-field .emg-consent input[type="checkbox"]:focus-visible,
.emg-legal-check input[type="checkbox"],
.emg-legal-consent input[type="checkbox"]:focus-visible {
	outline: none;
	border-color: var(--accent);
	box-shadow: 0 0 0 4px color-mix(in srgb, var(--accent) 18%, transparent);
}
.emg-newsletter-consent input[type="checkbox"]:checked,
.emg-field .emg-consent input[type="checkbox"]:checked,
.emg-legal-check input[type="checkbox"],
.emg-legal-consent input[type="checkbox"]:checked {
	background: color-mix(in srgb, var(--accent) 12%, #fff);
	border-color: var(--accent);
}
/* La coche. Elle part d'un rien, tournee et ecrasee, et se pose avec un leger
   depassement — c'est ce depassement qui fait qu'on la voit arriver. */
.emg-newsletter-consent input[type="checkbox"]::after,
.emg-field .emg-consent input[type="checkbox"]::after,
.emg-legal-check input[type="checkbox"],
.emg-legal-consent input[type="checkbox"]::after {
	content: '';
	/* left/top ne centrent pas d'eux-memes : la coche est une boite de 5 sur 9
	   TOURNEE de 45 degres, son encombrement une fois tournee vaut donc
	   (5+9)/racine(2), soit 9,9 dans les deux sens. Dans les 15 px de
	   l'interieur de la case, top:3 laisse 2,55 px au-dessus et autant en
	   dessous ; a top:1, elle en avait 0,55 et 4,55 — elle flottait en haut. */
	position: absolute; left: 5px; top: 3px;
	width: 5px; height: 9px;
	border: solid var(--accent); border-width: 0 2.2px 2.2px 0;
	transform: rotate(45deg) scale(.2);
	opacity: 0;
	transition: transform .26s cubic-bezier(.2, 1.5, .4, 1), opacity .16s ease;
}
.emg-newsletter-consent input[type="checkbox"]:checked::after,
.emg-field .emg-consent input[type="checkbox"]:checked::after,
.emg-legal-check input[type="checkbox"],
.emg-legal-consent input[type="checkbox"]:checked::after {
	transform: rotate(45deg) scale(1);
	opacity: 1;
}
/* Sur la nuit, la case vide doit rester visible : le fond de carte y est
   sombre et la bordure s'y perdait. */
/* :not(:checked) n'est pas une coquetterie. Sans lui, cette regle a le MEME
   poids que celle de l'etat coche et vient apres : elle l'emportait, la case
   restait blanche une fois cochee, et la coche blanche dessus ne se voyait
   plus du tout. */
.emg-night .emg-newsletter-consent input[type="checkbox"]:not(:checked) {
	border-color: rgba(2, 3, 31, .22);
	background: rgba(255, 255, 255, .8);
}

/* Consentement au traitement des données (nLPD) : la case précède le bouton.
   Sélecteurs renforcés — sans cela, `.emg-field label` et `.emg-field input`
   l'emportent et transforment la case à cocher en champ texte pleine largeur. */
.emg-field label.emg-consent {
	display: flex; align-items: flex-start; gap: 11px;
	font-size: 13.5px; font-weight: 400; letter-spacing: 0; line-height: 1.55;
	color: var(--ink2);
	cursor: pointer;
}
.emg-field .emg-consent input[type="checkbox"] {
	margin: 1px 0 0;
}
.emg-consent a { color: var(--accent); text-decoration: underline; text-underline-offset: 2px; }

.emg-form-feedback { flex-basis: 100%; font-size: 14px; font-weight: 600; min-height: 1.4em; margin-top: 4px; }
/* Dans la newsletter, le feedback sort du flux : le champ reste parfaitement
   centré face au texte de gauche (il ne réserve plus de hauteur fantôme). */
.emg-newsletter .emg-form-feedback { position: absolute; top: 100%; left: 0; margin-top: 6px; min-height: 0; }
.emg-form-feedback.is-ok { color: #0d9455; }
.emg-form-feedback.is-err { color: #d43c3c; }

/* Pied de page sur deux étages : marque + 4 colonnes, puis barre légale. */
/* Pied de page : quatre colonnes sur deux rangées, soit huit cases. La
   marque occupe la première et le contact la dernière ; les six du milieu
   portent les liens. */
.emg-footer-grid {
	max-width: var(--container);
	margin: 0 auto;
	padding: 72px var(--gutter) 52px;
	display: grid;
	grid-template-columns: repeat(4, minmax(0, 1fr));
	gap: 44px 40px;
}
/* Les deux rangées se distinguent : un trait court les sépare, tiré par la
   seconde rangée (les quatre cases 5 à 8 en portent chacune un morceau). */
.emg-footer-grid > *:nth-child(n + 5) {
	padding-top: 40px;
	border-top: 1px solid var(--line);
}
.emg-footer-brand { grid-column: span 1; }
.emg-footer-brand-text { font-size: 14px; line-height: 1.7; color: var(--ink2); max-width: 30ch; margin-top: 20px; }
.emg-footer-col { display: flex; flex-direction: column; gap: 11px; font-size: 14px; min-width: 0; }
.emg-footer-col-title {
	font-size: 11px; font-weight: 700; letter-spacing: .24em;
	color: var(--ink2); margin-bottom: 6px;
	text-transform: uppercase;
}
.emg-footer-col-title.is-social { margin-top: 22px; }
.emg-footer-col a { color: var(--ink); transition: color .2s ease; }
.emg-footer-col a:hover { color: var(--accent); }
.emg-footer-col a strong { font-weight: 700; }
.emg-footer-col address { font-style: normal; color: var(--ink2); line-height: 1.6; }
/* Réseaux sociaux : pastilles alignées sous les coordonnées. */
.emg-footer-social { display: flex; gap: 10px; margin-top: 2px; }
.emg-footer-social a {
	display: grid; place-items: center;
	width: 38px; height: 38px;
	border-radius: 50%;
	border: 1px solid var(--line);
	color: var(--ink);
	transition: transform .3s var(--ease-out), border-color .3s ease, color .3s ease, background .3s ease;
}
.emg-footer-social a:hover {
	transform: translateY(-2px);
	border-color: var(--accent);
	background: color-mix(in srgb, var(--accent) 8%, transparent);
	color: var(--accent);
}
/* Les réseaux vivent désormais sous la marque, qui n'est pas une colonne
   flex : le titre doit donc prendre sa ligne de lui-même. */
.emg-footer-brand .emg-footer-col-title { display: block; margin-top: 30px; margin-bottom: 14px; }

/* Certifications du pied de page : les logos en négatif, empilés.
   Chacun est un lien vers l'ancre qui les explique sur /a-propos/. Le lien
   ne porte qu'une image : le soulignement progressif des liens de colonne
   n'aurait rien à souligner et tracerait un trait sous le logo, on le coupe.
   Les dimensions viennent des attributs width/height écrits par
   emg_cert_logo(), donc la place est réservée avant même que l'image
   n'arrive. */
.emg-cert-logo { display: block; height: auto; max-width: 100%; }
.emg-footer-certs {
	display: flex; flex-direction: column; align-items: flex-start;
	gap: 20px; margin-top: 2px;
}
.emg-footer-cert {
	display: block;
	opacity: .85;
	transition: opacity .3s ease, transform .3s var(--ease-out);
}
.emg-footer-cert:hover, .emg-footer-cert:focus-visible { opacity: 1; transform: translateY(-2px); }
/* Le soulignement progressif des liens de colonne est declare bien plus bas
   dans ce fichier, avec une specificite superieure (.emg-footer-col a) : un
   simple background-image:none ici perdait, et un trait se tirait sous le
   logo au survol (vu par Marino, 2026-08-30). D'ou le selecteur double. */
.emg-footer-col a.emg-footer-cert { background-image: none; }
.emg-footer-bottom {
	max-width: var(--container);
	margin: 0 auto;
	padding: 26px var(--gutter) 36px;
	border-top: 1px solid color-mix(in srgb, var(--line) 60%, transparent);
	display: flex; justify-content: space-between; gap: 16px 24px; flex-wrap: wrap;
	font-size: 12px; color: var(--ink2);
}
.emg-footer-bottom a { color: var(--ink2); }
.emg-footer-bottom a:hover { color: var(--ink); }
.emg-footer-legal { display: flex; gap: 24px; flex-wrap: wrap; align-items: center; }
/* Le lien « Cookies » rouvre la bannière : bouton déguisé en lien. */
.emg-footer-legal button {
	padding: 0; border: 0; background: none;
	font: inherit; color: var(--ink2); cursor: pointer;
	transition: color .2s ease;
}
.emg-footer-legal button:hover { color: var(--ink); }

/* Page Outils : grille de cartes cliquables. */
.emg-tools-grid {
	display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
	gap: 20px; margin-top: 8px;
}
.emg-tool-card {
	position: relative;
	display: flex; flex-direction: column;
	padding: 32px 30px 28px;
	border-radius: var(--radius);
	background: var(--card);
	border: 1px solid var(--line);
	box-shadow: var(--shadow-soft);
	color: var(--ink);
	transition: transform .45s var(--ease-out), box-shadow .45s ease, border-color .35s ease;
}
.emg-tool-card:hover {
	transform: translateY(-4px);
	border-color: color-mix(in srgb, var(--accent) 35%, var(--line));
	box-shadow: var(--shadow);
}
.emg-tool-ico {
	display: grid; place-items: center;
	width: 48px; height: 48px;
	border-radius: 14px;
	background: color-mix(in srgb, var(--accent) 10%, transparent);
	color: var(--accent);
}
.emg-tool-badge {
	position: absolute; top: 26px; right: 26px;
	padding: 4px 12px;
	border-radius: 99px;
	font-size: 10.5px; font-weight: 700; letter-spacing: .07em; text-transform: uppercase;
	background: color-mix(in srgb, var(--accent) 12%, transparent);
	color: var(--accent);
}
.emg-tool-card h2 { margin-top: 20px; font-size: 20px; letter-spacing: -.02em; }
.emg-tool-card p { margin-top: 10px; font-size: 14px; line-height: 1.65; color: var(--ink2); }
.emg-tool-go {
	display: inline-flex; align-items: center; gap: 8px;
	margin-top: 22px;
	font-size: 13px; font-weight: 700; letter-spacing: .02em;
	color: var(--accent);
}
.emg-tool-go svg { transition: transform .35s var(--ease-out); }
.emg-tool-card:hover .emg-tool-go svg { transform: translateX(4px); }

/* ----------------------------------------------- Pages services / features */
.emg-feature-grid {
	display: grid; grid-template-columns: repeat(3, 1fr);
	gap: 24px; margin-top: 56px;
}
.emg-feature {
	position: relative; overflow: hidden;
	padding: 32px 28px;
	border-radius: var(--radius);
	background: var(--card);
	border: 1px solid var(--line);
	box-shadow: var(--shadow-soft);
	transition: transform .35s var(--ease-out), box-shadow .35s ease, border-color .35s ease;
}
.emg-feature::before {
	content: '';
	position: absolute; top: 0; left: 0; right: 0; height: 2px;
	background: linear-gradient(90deg, var(--accent), var(--cyan));
	transform: scaleX(0); transform-origin: left center;
	transition: transform .5s var(--ease-out);
}
.emg-feature:hover { transform: translateY(-4px); box-shadow: var(--shadow); border-color: color-mix(in srgb, var(--accent) 26%, var(--line)); }
.emg-feature:hover::before { transform: scaleX(1); }
.emg-feature h3,
.emg-feature h2 { font-size: 18px; font-weight: 700; letter-spacing: -.015em; }
.emg-feature p { font-size: 14.5px; line-height: 1.6; color: var(--ink2); margin-top: 10px; }
/* Intro de la section domaines (com360) : mesure bornée comme les intros de hero. */
.emg-domains-intro { font-size: 17px; line-height: 1.65; color: var(--ink2); max-width: 62ch; }
.emg-feature-index {
	display: inline-grid; place-items: center;
	min-width: 34px; height: 34px; padding: 0 10px;
	border-radius: 11px;
	font-size: 12.5px; font-weight: 600; color: var(--accent);
	font-variant-numeric: tabular-nums;
	background: color-mix(in srgb, var(--accent) 9%, transparent);
	border: 1px solid color-mix(in srgb, var(--accent) 20%, transparent);
	margin-bottom: 16px;
	transition: background .3s ease, color .3s ease;
}
.emg-feature:hover .emg-feature-index { background: var(--accent); color: #f7feff; }
/* Halo d'angle qui s'allume au survol. */
.emg-feature::after {
	content: '';
	position: absolute; top: -70px; right: -70px;
	width: 190px; height: 190px; border-radius: 50%;
	background: radial-gradient(circle, color-mix(in srgb, var(--accent) 14%, transparent), transparent 70%);
	opacity: 0; transition: opacity .4s ease;
	pointer-events: none;
}
.emg-feature:hover::after { opacity: 1; }

/* Notre approche : grandes cartes colorées qui s'empilent au scroll.
   Sticky pur CSS (pas de transform : il casserait le collage) — chaque
   carte se cale un peu plus bas que la précédente, effet de pile. */
/* Cartes empilées : ici le `gap` n'est PAS un espacement visuel, c'est la
   DISTANCE DE DÉFILEMENT pendant laquelle la carte épinglée reste seule avant
   que la suivante ne monte la recouvrir. À 26 px, une seule impulsion de
   molette sautait par-dessus une carte sans laisser le temps de la lire, et la
   deuxième était déjà à l'écran au moment où la première se collait (retour
   Marino, 2026-08-28). La marge du haut tient l'autre sas, celui entre la
   sortie du tunnel et la première carte : en remontant, il faut du chemin
   avant que le voile blanc ne reprenne la main. */
.emg-stack {
	margin-top: clamp(90px, 18vh, 200px);
	display: grid;
	gap: clamp(150px, 26vh, 300px);
}
.emg-stack-card {
	position: sticky;
	/* Collage plus centré à l'écran (et donc plus tôt au scroll). */
	top: calc(19vh + var(--stack-i, 0) * 22px);
	display: grid; grid-template-columns: 128px 1fr;
	gap: 28px; align-items: center;
	min-height: clamp(280px, 36vh, 400px);
	padding: clamp(30px, 4vw, 50px);
	border-radius: var(--radius);
	color: #f7feff;
	border: 1px solid rgba(247, 254, 255, .09);
	box-shadow: 0 -14px 44px -26px rgba(2, 3, 31, .5), var(--shadow);
}
.emg-stack-card:nth-child(5n+1) { background: linear-gradient(135deg, #061651, #0b2373); }
.emg-stack-card:nth-child(5n+2) { background: linear-gradient(135deg, #0b2373, #123498); }
.emg-stack-card:nth-child(5n+3) { background: linear-gradient(135deg, #123498, #0a36f7); }
.emg-stack-card:nth-child(5n+4) { background: linear-gradient(135deg, #0a36f7, #0b2373); }
.emg-stack-card:nth-child(5n+5) { background: linear-gradient(135deg, #02031f, #061651); }
/* Le numéro tient le rôle de repère visuel : il doit peser autant que le
   titre. Les glyphes EMGX se dimensionnent sur la font-size. */
.emg-stack-num {
	font-size: clamp(34px, 3.4vw, 46px); font-weight: 200; letter-spacing: .08em;
	color: var(--cyan); font-variant-numeric: tabular-nums;
	line-height: 1;
}
.emg-stack-card h3 { font-size: clamp(24px, 2.4vw, 34px); font-weight: 700; letter-spacing: -.02em; }
.emg-stack-card p { margin-top: 14px; font-size: 16px; line-height: 1.7; color: rgba(247, 254, 255, .8); max-width: 66ch; }
.emg-stack-card p + p { margin-top: 10px; }

/* Toujours inclus : panneau à bordure dégradée accent→cyan + halo. */
.emg-included {
	position: relative; overflow: hidden;
	margin-top: 72px;
	padding: 44px clamp(28px, 4vw, 56px);
	border-radius: var(--radius);
	background:
		linear-gradient(var(--card), var(--card)) padding-box,
		linear-gradient(120deg,
			color-mix(in srgb, var(--accent) 55%, transparent),
			color-mix(in srgb, var(--cyan) 60%, transparent)) border-box;
	border: 1px solid transparent;
	box-shadow: var(--shadow-soft);
}
.emg-included::after {
	content: '';
	position: absolute; right: -90px; top: -90px;
	width: 300px; height: 300px; border-radius: 50%;
	background: radial-gradient(circle, color-mix(in srgb, var(--accent) 15%, transparent), transparent 70%);
	filter: blur(28px);
	pointer-events: none;
}
.emg-included h2 { font-size: 24px; letter-spacing: -.02em; position: relative; }
.emg-included ul {
	list-style: none; margin: 24px 0 0; padding: 0;
	display: grid; grid-template-columns: 1fr 1fr; gap: 14px 32px;
	position: relative;
}
.emg-included li {
	position: relative;
	padding-left: 34px;
	font-size: 15px; color: var(--ink2);
	line-height: 1.55;
}
.emg-included li::before {
	content: '';
	position: absolute; left: 0; top: .05em;
	width: 21px; height: 21px; border-radius: 99px;
	background: color-mix(in srgb, var(--accent) 12%, transparent);
	border: 1px solid color-mix(in srgb, var(--accent) 30%, transparent);
}
.emg-included li::after {
	content: '';
	position: absolute; left: 5.5px; top: calc(.05em + 5.5px);
	width: 10px; height: 10px;
	background: var(--accent);
	-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%23000' stroke-width='2.6' stroke-linecap='round' stroke-linejoin='round' d='m2.5 8.5 3.5 3.5 7.5-8'/%3E%3C/svg%3E") center / contain no-repeat;
	mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%23000' stroke-width='2.6' stroke-linecap='round' stroke-linejoin='round' d='m2.5 8.5 3.5 3.5 7.5-8'/%3E%3C/svg%3E") center / contain no-repeat;
}

/* Bloc de partenariat créatif : intitulé et logo à gauche, texte et lien à
   droite (demande Marino, 2026-08-29). La colonne de gauche est bornée plutôt
   qu'automatique, pour que le logo puisse respirer sans manger le texte. */
.emg-partner-block {
	position: relative; overflow: hidden;
	margin-top: 72px;
	display: grid; grid-template-columns: minmax(180px, 250px) 1fr;
	gap: clamp(28px, 4vw, 56px); align-items: start;
	padding: 40px clamp(28px, 4vw, 56px);
	border-radius: var(--radius);
	background: var(--navy); color: #f7feff;
	box-shadow: var(--shadow);
}
/* Esperluette EMGX-α : clin d'œil « e-Medias & Piqo » en filigrane. */
.emg-partner-glyph {
	position: absolute; right: 28px; bottom: -34px;
	font-size: 200px;
	color: var(--cyan); opacity: .08;
	pointer-events: none; user-select: none;
}
.emg-partner-block > div { position: relative; }
.emg-partner-label {
	font-size: 11px; font-weight: 700; letter-spacing: .28em;
	color: var(--cyan);
}
.emg-partner-block p { margin-top: 14px; font-size: 15.5px; line-height: 1.7; color: rgba(247, 254, 255, .75); max-width: 70ch; }
/* Logo Piqo : toujours en blanc sur le panneau navy. Agrandi le 2026-08-29,
   la colonne de gauche est maintenant faite pour lui. */
.emg-partner-logo {
	display: block;
	width: clamp(130px, 14vw, 190px); height: auto;
	margin-top: 16px;
	filter: brightness(0) invert(1);
	opacity: .96;
}
.emg-partner-block a { color: var(--cyan); font-weight: 700; }
.emg-partner-block a:hover { color: #f7feff; }

/* Section « Certifications » de /a-propos/ : les quatre labels du pied de
   page, cette fois dans leurs vraies couleurs, chacun avec ce qu'il engage
   et un lien vers l'organisme qui le délivre. Le fond est clair ici, donc
   aucune déclinaison négative, et c'est tout l'intérêt de la section : le
   pied de page montre, cette page explique.
   Le bandeau de logo a une hauteur MINIMALE commune : les quatre lockups
   n'ont ni le même rapport ni le même nombre de lignes, et sans elle les
   titres des cartes ne s'aligneraient plus. */
.emg-certs-intro { margin-top: 22px; font-size: 16px; line-height: 1.75; color: var(--ink2); max-width: 62ch; }
.emg-certs-grid {
	display: grid; grid-template-columns: repeat(4, 1fr);
	gap: 22px; margin-top: 48px;
}
.emg-cert-card {
	display: flex; flex-direction: column;
	padding: 32px 28px 28px;
	border: 1px solid var(--line); border-radius: var(--radius);
	background: var(--card);
	transition: border-color .3s ease, box-shadow .3s ease, transform .3s var(--ease-out);
}
.emg-cert-card:hover {
	border-color: color-mix(in srgb, var(--accent) 34%, var(--line));
	box-shadow: var(--shadow-soft);
	transform: translateY(-3px);
}
.emg-cert-mark { display: flex; align-items: center; min-height: 52px; }
.emg-cert-card h3 { margin-top: 24px; font-size: 17px; letter-spacing: -.01em; }
.emg-cert-card p { margin-top: 12px; font-size: 14.5px; line-height: 1.68; color: var(--ink2); }
.emg-cert-go {
	margin-top: auto; padding-top: 24px;
	font-size: 13.5px; font-weight: 700; color: var(--accent);
	transition: color .2s ease;
}
.emg-cert-card:hover .emg-cert-go { color: var(--ink); }

/* Slider de réalisations des pages service : défilement libre (drag +
   snap), focus central (les cartes s'estompent en s'éloignant du centre),
   barre de progression + boutons de verre. */
.emg-svc-work { padding-bottom: 24px; }
.emg-svc-slider {
	margin-top: 52px;
	overflow-x: auto;
	scrollbar-width: none;
	-webkit-overflow-scrolling: touch;
	scroll-snap-type: x mandatory;
	cursor: grab;
}
.emg-svc-slider::-webkit-scrollbar { display: none; }
.emg-svc-slider.is-dragging { cursor: grabbing; scroll-snap-type: none; }
.emg-svc-track {
	display: flex; gap: 28px;
	width: max-content;
	padding: 10px max(var(--gutter), calc((100vw - var(--container)) / 2 + var(--gutter))) 18px;
}
.emg-svc-slide {
	width: min(560px, 84vw);
	flex: none;
	scroll-snap-align: center;
	/* transform seule : l'opacite n'est plus animee. */
	will-change: transform;
}
.emg-svc-slide .emg-work-card { user-select: none; }
.emg-svc-slide img { -webkit-user-drag: none; user-select: none; }
/* Flèches alignées avec le titre ; barre sur toute la largeur du contenu. */
.emg-svc-head {
	display: flex; align-items: flex-end; justify-content: space-between;
	gap: 32px; flex-wrap: wrap;
}
.emg-svc-head .emg-svc-nav { padding-bottom: 8px; }
.emg-svc-ui { margin-top: 30px; }
.emg-svc-progress {
	width: 100%; height: 2px; border-radius: 99px;
	background: var(--line);
	overflow: hidden;
}
.emg-svc-progress span {
	display: block; height: 100%; width: 0;
	border-radius: 99px;
	background: linear-gradient(90deg, var(--accent), var(--cyan));
}
.emg-svc-nav { display: flex; gap: 10px; }
.emg-svc-btn {
	display: grid; place-items: center;
	width: 46px; height: 46px; border-radius: 99px;
	border: 1px solid var(--glass-brd);
	background: var(--glass);
	backdrop-filter: blur(16px) saturate(1.5);
	-webkit-backdrop-filter: blur(16px) saturate(1.5);
	color: var(--ink);
	cursor: pointer;
	box-shadow:
		inset 0 1px 0 0 color-mix(in srgb, #fff 28%, transparent),
		0 10px 28px -14px rgba(2, 3, 31, .2);
	transition: color .25s ease, border-color .25s ease, transform .25s var(--ease-out);
}
.emg-svc-btn:hover { color: var(--accent); border-color: color-mix(in srgb, var(--accent) 35%, var(--glass-brd)); transform: translateY(-2px); }

.emg-crosslinks { margin-top: 100px; }
.emg-crosslinks-grid {
	display: grid; grid-template-columns: repeat(4, 1fr);
	gap: 16px; margin-top: 32px;
}
/* Cartes de renvoi (bas des pages de pole et de solution).
   Elles n'etaient qu'une bordure posee sur du vide, et se lisaient comme une
   note de bas de page plutot que comme une invitation (retour Loris,
   2026-08-30). Fond blanc et ombre douce, comme les tuiles de references : le
   site a deja ce langage, il n'y avait pas a en inventer un second. */
.emg-crosslink {
	position: relative;
	padding: 26px 24px 54px;
	border-radius: 18px;
	border: 1px solid rgba(2, 3, 31, .08);
	background: var(--bg2);
	box-shadow: var(--shadow-soft);
	color: var(--ink);
	display: flex; flex-direction: column; gap: 14px;
	transition: border-color .3s ease, transform .3s var(--ease-out), box-shadow .3s ease;
}
.emg-crosslink:hover {
	border-color: color-mix(in srgb, var(--accent) 40%, transparent);
	transform: translateY(-4px);
	box-shadow: var(--shadow);
}
/* La pastille du glyphe. Le trait suit currentColor : c'est la pastille qui
   passe a l'accent au survol, pas une seconde regle de couleur a tenir. */
.emg-crosslink-ico {
	width: 44px; height: 44px;
	display: grid; place-items: center;
	border-radius: 14px;
	background: color-mix(in srgb, var(--accent) 9%, transparent);
	color: var(--accent);
	transition: background .3s ease;
}
.emg-crosslink-ico svg { width: 22px; height: 22px; }
.emg-crosslink:hover .emg-crosslink-ico { background: color-mix(in srgb, var(--accent) 16%, transparent); }
/* Numero et glyphe sur une meme ligne, le glyphe a DROITE (demande Loris,
   2026-08-30). Le numero tenait la colonne de gauche tout seul : a 10 px il
   s'y perdait, il passe a 13. */
.emg-crosslink-top { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
/* Le numero est en glyphes EMGX (demande Loris, 2026-08-30) : ils se
   dimensionnent en em, donc par le corps du conteneur, et se peignent en
   currentColor. A corps egal ils lisent plus petit qu'un chiffre compose,
   d'ou les 16 px la ou le texte tenait a 13. */
.emg-crosslink-num { font-size: 16px; line-height: 1; color: var(--accent); }
.emg-crosslink-name { font-weight: 700; font-size: 16px; letter-spacing: -.01em; }
/* La fleche est ancree en bas a droite : les noms de poles n'ont pas tous la
   meme longueur, et une fleche qui suit le texte ne s'alignerait sur rien. */
.emg-crosslink-go {
	position: absolute; right: 22px; bottom: 20px;
	font-size: 17px; line-height: 1;
	color: var(--accent);
	opacity: .45;
	transition: opacity .3s ease, transform .3s var(--ease-out);
}
.emg-crosslink:hover .emg-crosslink-go { opacity: 1; transform: translateX(4px); }

/* ------------------------------------------------------------- Hub services */
.emg-hub-grid { display: grid; gap: 24px; margin-top: 64px; }
.emg-hub-card {
	display: grid; grid-template-columns: 96px 1fr 56px;
	align-items: center; gap: 32px;
	padding: clamp(28px, 4vw, 44px);
	border-radius: var(--radius);
	background: var(--card);
	border: 1px solid var(--line);
	color: var(--ink);
	box-shadow: var(--shadow-soft);
	transition: transform .35s var(--ease-out), box-shadow .35s ease, border-color .35s ease;
}
.emg-hub-card:hover { transform: translateY(-4px); box-shadow: var(--shadow); border-color: color-mix(in srgb, var(--accent) 35%, var(--line)); color: var(--ink); }
/* Numéros du hub en glyphes EMGX-α (l'usage signature de la charte). */
.emg-hub-num {
	font-size: 38px;
	font-weight: 200;
	font-variant-numeric: tabular-nums;
	color: var(--accent);
	opacity: .9;
	letter-spacing: .02em;
}
.emg-hub-card h2 { font-size: clamp(22px, 2.4vw, 32px); font-weight: 700; letter-spacing: -.025em; }
.emg-hub-card p { margin-top: 8px; font-size: 15px; color: var(--ink2); line-height: 1.6; }
.emg-hub-more { font-size: 13px; font-weight: 700; color: var(--accent); margin-top: 14px; display: inline-flex; align-items: center; gap: 7px; }

/* Produit annonce : meme tuile, mais elle ne se comporte pas comme un lien.
   Bordure tiretee et fond en retrait, aucun soulevement au survol : rien a
   cliquer, et l'oeil le voit avant la souris. */
.emg-hub-card.is-soon {
	background: color-mix(in srgb, var(--card) 52%, transparent);
	border-style: dashed;
	cursor: default;
}
.emg-hub-card.is-soon:hover { transform: none; box-shadow: var(--shadow-soft); border-color: var(--line); }
.emg-hub-card.is-soon .emg-hub-num { opacity: .5; }
/* Le rond de fleche vide se lisait comme un bouton casse : il disparait,
   sa colonne reste, les six tuiles gardent le meme alignement. */
.emg-hub-card.is-soon .emg-service-go { display: none; }
.emg-hub-card.is-soon h2 { color: var(--ink2); }
.emg-hub-badge {
	display: inline-flex; align-items: center; gap: 7px;
	margin-bottom: 12px; padding: 5px 12px;
	border-radius: 99px;
	font-size: 11px; font-weight: 700; letter-spacing: .12em; text-transform: uppercase;
	color: var(--accent);
	background: color-mix(in srgb, var(--accent) 10%, transparent);
	border: 1px solid color-mix(in srgb, var(--accent) 22%, transparent);
}
.emg-hub-badge::before {
	content: ''; width: 6px; height: 6px; border-radius: 50%;
	background: var(--accent);
}

/* Derniere tuile : la question ouverte. Meme grammaire que « Et si c'etait
   vous ? » dans l'equipe, parce que c'est la meme intention. */
.emg-hub-card.is-custom {
	border-style: dashed;
	border-color: color-mix(in srgb, var(--accent) 40%, var(--line));
	background: linear-gradient(150deg, color-mix(in srgb, var(--accent) 7%, var(--card)), var(--card) 62%);
}
.emg-hub-card.is-custom:hover { border-color: var(--accent); }
.emg-hub-num.is-mark {
	display: grid; place-items: center;
	width: 96px; height: 62px;
	color: var(--accent);
	opacity: 1;
}
.emg-hub-num.is-mark svg { width: 34px; height: 34px; }

/* ---------------------------------------------------------------- À propos */
.emg-story { position: relative; margin-top: 56px; border-left: 1px solid var(--line); padding-left: clamp(24px, 4vw, 48px); display: grid; gap: 44px; }
/* Trait de progression : se dessine au scroll (GSAP scrub) par-dessus la bordure. */
.emg-story-line {
	position: absolute; left: -1.5px; top: 0; bottom: 0;
	width: 2px; border-radius: 99px;
	background: linear-gradient(180deg, var(--cyan), var(--accent));
	transform: scaleY(0); transform-origin: top center;
	pointer-events: none;
}
.emg-story-item { position: relative; }
.emg-story-item::before {
	content: '';
	position: absolute; left: calc(-1 * clamp(24px, 4vw, 48px) - 4.5px); top: 8px;
	width: 8px; height: 8px; border-radius: 99px;
	background: var(--line);
	box-shadow: 0 0 0 4px transparent;
	transition: background .45s ease, box-shadow .45s ease, transform .45s var(--ease-out);
}
.emg-story-item.is-lit::before {
	background: var(--accent);
	box-shadow: 0 0 0 4px color-mix(in srgb, var(--accent) 18%, transparent);
	transform: scale(1.15);
}
html.emg-motion-off .emg-story-item::before {
	background: var(--accent);
	box-shadow: 0 0 0 4px color-mix(in srgb, var(--accent) 18%, transparent);
}
.emg-story-year { font-size: 12px; font-weight: 700; letter-spacing: .2em; color: var(--ink2); transition: color .45s ease; }
.emg-story-item.is-lit .emg-story-year { color: var(--accent); }
html.emg-motion-off .emg-story-year { color: var(--accent); }
.emg-story-item h3 { font-size: 22px; margin-top: 8px; }
.emg-story-item p { margin-top: 8px; color: var(--ink2); font-size: 15.5px; line-height: 1.65; max-width: 68ch; }

.emg-values-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 24px; margin-top: 56px; }

/* Valeurs : grandes cartes en défilement horizontal lié au scroll. */
/* Le bloc épinglé (titre + piste) est plus court que l'écran. Il se fige
   maintenant au MILIEU de la vue (voir main.js) : le vide se répartit
   au-dessus et en dessous au lieu de s'accumuler en bas, et la réserve
   en pied qui compensait n'a plus lieu d'être. */
[data-hpin] { padding-bottom: clamp(24px, 3vw, 48px); }
.emg-hscroll { overflow: hidden; margin-top: 48px; }
.emg-hscroll-track {
	display: flex; gap: 24px;
	width: max-content;
	padding-left: max(var(--gutter), calc((100vw - var(--container)) / 2 + var(--gutter)));
	padding-right: max(var(--gutter), calc((100vw - var(--container)) / 2 + var(--gutter)));
}
/* Cartes de la timeline (Notre histoire) : grandes, dégradés navy→accent. */
.emg-story-card {
	position: relative; overflow: hidden;
	width: min(520px, 82vw);
	flex: none;
	padding: clamp(34px, 3.4vw, 54px);
	border-radius: var(--radius);
	color: #f7feff;
	border: 1px solid rgba(247, 254, 255, .09);
	box-shadow: var(--shadow);
}
.emg-story-card:nth-child(4n+1) { background: linear-gradient(135deg, #061651, #0b2373); }
.emg-story-card:nth-child(4n+2) { background: linear-gradient(135deg, #0b2373, #123498); }
.emg-story-card:nth-child(4n+3) { background: linear-gradient(135deg, #123498, #0a36f7); }
.emg-story-card:nth-child(4n+4) { background: linear-gradient(135deg, #02031f, #0b2373); }
.emg-story-card-year {
	font-size: 13px; font-weight: 700; letter-spacing: .24em; text-transform: uppercase;
	color: var(--cyan);
}
.emg-story-card h3 { font-size: clamp(24px, 2.4vw, 32px); letter-spacing: -.02em; margin-top: 18px; }
.emg-story-card p { margin-top: 12px; font-size: 15.5px; line-height: 1.65; color: rgba(247, 254, 255, .8); }
.emg-story-card::after {
	content: '';
	position: absolute; right: -70px; bottom: -70px;
	width: 210px; height: 210px; border-radius: 50%;
	background: radial-gradient(circle, rgba(148, 246, 255, .14), transparent 70%);
	pointer-events: none;
}
@media (max-width: 1023px) {
	.emg-hscroll { overflow-x: auto; scroll-snap-type: x mandatory; scrollbar-width: none; }
	.emg-hscroll::-webkit-scrollbar { display: none; }
	.emg-story-card { scroll-snap-align: center; }
}
/* Indice de glissement : n'existe que la ou le defile se fait au doigt,
   c'est-a-dire sous 1024 px (au-dessus, il est lie au scroll vertical). */
.emg-hscroll-hint { display: none; }
@media (max-width: 1023px) {
	.emg-hscroll-hint {
		display: flex; align-items: center; justify-content: center; gap: 9px;
		margin: 18px 0 0;
		font-size: 12px; font-weight: 700; letter-spacing: .14em; text-transform: uppercase;
		color: var(--ink3);
	}
	.emg-hscroll-hint-ico { display: grid; place-items: center; color: var(--accent); }
	html.js:not(.emg-motion-off) .emg-hscroll-hint-ico { animation: emg-swipe 2.6s ease-in-out infinite; }
	@keyframes emg-swipe {
		0%, 100% { transform: translateX(-3px); }
		50% { transform: translateX(3px); }
	}
}
.emg-team-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 24px; margin-top: 56px; }
@media (max-width: 1160px) { .emg-team-grid { grid-template-columns: 1fr 1fr; } }
.emg-team-card {
	padding: 36px 32px;
	border-radius: var(--radius);
	background: var(--card);
	border: 1px solid var(--line);
	box-shadow: var(--shadow-soft);
}
.emg-team-avatar {
	display: grid; place-items: center;
	width: 58px; height: 58px; border-radius: 99px;
	margin-bottom: 20px;
	font-size: 18px; font-weight: 700; letter-spacing: .02em;
	color: #f7feff;
	background: linear-gradient(135deg, var(--navy-3, #0b2373), var(--accent));
	box-shadow: 0 6px 18px color-mix(in srgb, var(--accent) 30%, transparent),
		inset 0 1px 0 0 rgba(247, 254, 255, .25);
}
/* Portrait : meme rond que les initiales, un cran plus grand parce qu'un
   visage a besoin de place. Le liseré rattrape le fond blanc des photos,
   qui sinon se fondrait dans la carte. */
.emg-team-avatar.is-photo {
	width: 72px; height: 72px; padding: 0; overflow: hidden;
	background: color-mix(in srgb, var(--accent) 8%, #fff);
	box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--accent) 18%, var(--line));
}
.emg-team-avatar.is-photo img {
	width: 100%; height: 100%; object-fit: cover; border-radius: inherit;
	transition: transform .5s var(--ease-out);
}
.emg-team-card:hover .emg-team-avatar.is-photo img { transform: scale(1.06); }
.emg-team-name { font-size: 22px; font-weight: 800; letter-spacing: -.02em; }
.emg-team-role { font-size: 13px; font-weight: 700; letter-spacing: .06em; color: var(--accent); margin-top: 6px; }
.emg-team-desc { font-size: 14.5px; color: var(--ink2); margin-top: 14px; line-height: 1.6; }
/* Dernière carte de l'équipe : la place à prendre (lien vers les offres). */
.emg-team-card.is-join {
	display: flex; flex-direction: column;
	color: var(--ink);
	border-style: dashed;
	border-color: color-mix(in srgb, var(--accent) 40%, var(--line));
	background: linear-gradient(150deg, color-mix(in srgb, var(--accent) 6%, var(--card)), var(--card) 60%);
	transition: transform .45s var(--ease-out), border-color .3s ease, box-shadow .45s ease;
}
.emg-team-card.is-join:hover {
	transform: translateY(-4px);
	border-color: var(--accent);
	box-shadow: var(--shadow);
}
.emg-team-avatar.is-join {
	background: color-mix(in srgb, var(--accent) 12%, transparent);
	color: var(--accent);
	box-shadow: none;
}
.emg-team-join-go {
	display: inline-flex; align-items: center; gap: 8px;
	margin-top: auto; padding-top: 20px;
	font-size: 13.5px; font-weight: 700;
	color: var(--accent);
}
.emg-team-join-go svg { transition: transform .35s var(--ease-out); }
.emg-team-card.is-join:hover .emg-team-join-go svg { transform: translateX(4px); }

/* ----------------------------------------------------------------- Contact */
.emg-contact-grid {
	display: grid; grid-template-columns: 1.35fr 1fr;
	gap: clamp(40px, 6vw, 96px);
	margin-top: 64px;
	align-items: start;
}
.emg-form { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }
.emg-field { display: flex; flex-direction: column; gap: 8px; }
.emg-field.is-full { grid-column: 1 / -1; }
.emg-field label { font-size: 13px; font-weight: 700; letter-spacing: .04em; color: var(--ink2); }
.emg-field input, .emg-field select, .emg-field textarea {
	font: inherit; font-size: 15px;
	padding: 14px 18px;
	border-radius: 14px;
	border: 1px solid var(--line);
	background: var(--card);
	color: var(--ink);
	transition: border-color .25s ease, box-shadow .25s ease;
	width: 100%;
}
.emg-field textarea { min-height: 150px; resize: vertical; }
.emg-field input:focus, .emg-field select:focus, .emg-field textarea:focus {
	outline: none;
	border-color: var(--accent);
	box-shadow: 0 0 0 4px color-mix(in srgb, var(--accent) 14%, transparent);
}
.emg-form .emg-btn { justify-self: start; align-self: flex-start; }
.emg-field .emg-btn { align-self: flex-start; }
.emg-contact-aside {
	position: sticky; top: calc(var(--nav-h) + 32px);
	padding: 36px 32px;
	border-radius: var(--radius);
	background: var(--card);
	border: 1px solid var(--line);
	box-shadow: var(--shadow-soft);
	display: flex; flex-direction: column; gap: 18px;
	font-size: 15px;
}
.emg-contact-aside a { color: var(--ink); font-weight: 700; }
.emg-contact-aside a:hover { color: var(--accent); }
.emg-contact-aside address { font-style: normal; color: var(--ink2); line-height: 1.65; }
.emg-contact-row { display: flex; align-items: flex-start; gap: 12px; }
.emg-contact-ico {
	flex: none;
	display: grid; place-items: center;
	width: 34px; height: 34px; border-radius: 11px;
	color: var(--accent);
	background: color-mix(in srgb, var(--accent) 9%, transparent);
	border: 1px solid color-mix(in srgb, var(--accent) 18%, transparent);
	transition: background .25s ease, color .25s ease;
}
a.emg-contact-row:hover .emg-contact-ico { background: var(--accent); color: #f7feff; }
.emg-contact-row address { margin-top: 5px; }
a.emg-contact-row { align-items: center; }

/* -------------------------------------------------- Audit de site */
/* L'attribut hidden doit toujours gagner, même sur un bloc display:flex. */
[hidden] { display: none !important; }

.emg-audit-form { display: flex; gap: 12px; margin-top: 16px; max-width: 720px; }
.emg-audit-form input {
	flex: 1; min-width: 0;
	font: inherit; font-size: 16px;
	padding: 16px 24px;
	border-radius: 99px;
	border: 1px solid var(--line);
	background: var(--card);
	color: var(--ink);
	transition: border-color .25s ease, box-shadow .25s ease;
}
.emg-audit-form input:focus {
	outline: none;
	border-color: var(--accent);
	box-shadow: 0 0 0 4px color-mix(in srgb, var(--accent) 14%, transparent);
}
.emg-audit-disclaimer { margin-top: 14px; font-size: 12.5px; color: var(--ink2); }
/* Modale de progression : plein écran, fond voilé + carte verre. */
.emg-audit-modal {
	position: fixed; inset: 0; z-index: 400;
	display: grid; place-items: center;
	padding: 24px;
	background: color-mix(in srgb, #02031f 52%, transparent);
	-webkit-backdrop-filter: blur(14px) saturate(1.15);
	backdrop-filter: blur(14px) saturate(1.15);
}
.emg-audit-modal-card {
	width: min(540px, 100%);
	padding: 32px 34px 28px;
	border-radius: var(--radius);
	background: var(--card);
	border: 1px solid var(--line);
	box-shadow: var(--shadow);
}
.emg-audit-modal-head { display: flex; align-items: center; gap: 20px; }
.emg-audit-modal-head h2 { font-size: 19px; letter-spacing: -.015em; }
.emg-audit-modal-url {
	display: block; margin-top: 2px;
	font-size: 13.5px;
	color: var(--accent); font-weight: 700;
	word-break: break-all;
}
/* Mini-jeu d'attente (canvas) : sauter par-dessus les obstacles. */
.emg-audit-game {
	margin-top: 20px;
	padding: 8px 10px 10px;
	border: 1px solid color-mix(in srgb, var(--line) 75%, transparent);
	border-radius: 14px;
	background: color-mix(in srgb, var(--bg) 55%, transparent);
}
.emg-audit-game-scene { position: relative; }
.emg-audit-game canvas { display: block; width: 100%; touch-action: none; cursor: pointer; }
/* Écran d'accueil du jeu : « Cliquez pour commencer à jouer ». */
.emg-audit-game-start {
	position: absolute; inset: 0;
	display: grid; place-items: center;
	width: 100%;
	padding: 0; border: 0; background: transparent;
	font: inherit; cursor: pointer;
}
.emg-audit-game-start span {
	padding: 9px 18px;
	border-radius: 999px;
	font-size: 11.5px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase;
	color: var(--ink);
	background: color-mix(in srgb, var(--card) 84%, transparent);
	border: 1px solid var(--line);
	box-shadow: var(--shadow-soft);
	transition: transform .25s var(--ease-out), box-shadow .25s ease;
}
.emg-audit-game-start:hover span { transform: scale(1.04); box-shadow: var(--shadow); }
.emg-audit-game.is-playing .emg-audit-game-start { display: none; }
.emg-audit-game-bar {
	display: flex; align-items: baseline; justify-content: space-between;
	gap: 6px 14px; flex-wrap: wrap;
	margin-top: 4px;
	font-size: 11.5px; color: var(--ink2);
}
.emg-audit-game-score { font-weight: 700; letter-spacing: .04em; text-transform: uppercase; font-size: 10.5px; white-space: nowrap; }
.emg-audit-game-score b { font-size: 13px; color: var(--accent); font-variant-numeric: tabular-nums; }
.emg-audit-game-score em { font-style: normal; margin-left: 12px; color: var(--ink3); }
.emg-audit-game-score em b { color: var(--ink2); }
.emg-audit-game-hint { color: var(--ink3); }
/* Étapes réelles du rapport. */
.emg-audit-steps { list-style: none; margin: 20px 0 0; padding: 0; display: grid; gap: 10px; }
.emg-audit-steps li {
	display: flex; align-items: center; gap: 11px;
	font-size: 13.5px; font-weight: 600; color: var(--ink3);
	transition: color .3s ease;
}
.emg-audit-step-dot {
	width: 9px; height: 9px; border-radius: 50%; flex: none;
	background: var(--line);
	transition: background .3s ease;
}
.emg-audit-steps li.is-on { color: var(--ink); }
.emg-audit-steps li.is-on .emg-audit-step-dot { background: var(--accent); animation: emg-step-pulse 1.1s ease-in-out infinite; }
.emg-audit-steps li.is-done { color: var(--ink2); }
.emg-audit-steps li.is-done .emg-audit-step-dot { background: #0d9455; animation: none; }
@keyframes emg-step-pulse {
	50% { transform: scale(1.55); }
}
.emg-audit-pulse {
	position: relative; flex: none;
	width: 16px; height: 16px; border-radius: 50%;
	background: var(--accent);
	box-shadow: 0 0 18px color-mix(in srgb, var(--accent) 60%, transparent);
}
.emg-audit-pulse::after {
	content: '';
	position: absolute; inset: -11px;
	border-radius: 50%;
	border: 2px solid color-mix(in srgb, var(--accent) 45%, transparent);
	animation: emg-audit-ping 1.6s ease-out infinite;
}
@keyframes emg-audit-ping {
	0% { transform: scale(.45); opacity: 1; }
	100% { transform: scale(1.5); opacity: 0; }
}
.emg-audit-error {
	margin-top: 56px;
	display: flex; align-items: center; justify-content: space-between;
	gap: 24px; flex-wrap: wrap;
	padding: 28px clamp(24px, 3vw, 40px);
	border-radius: var(--radius);
	border: 1px solid color-mix(in srgb, #d43c3c 35%, var(--line));
	background: color-mix(in srgb, #d43c3c 5%, var(--card));
}
.emg-audit-error p { color: var(--ink); font-weight: 600; max-width: 56ch; }
.emg-audit-report { margin-top: 72px; }
.emg-audit-head { display: flex; align-items: center; justify-content: space-between; gap: 32px; flex-wrap: wrap; }
.emg-audit-for { font-size: 12px; font-weight: 700; letter-spacing: .2em; text-transform: uppercase; color: var(--ink2); }
.emg-audit-url { display: block; font-size: clamp(22px, 3vw, 34px); letter-spacing: -.025em; margin-top: 6px; word-break: break-all; }
.emg-audit-strategy { display: block; margin-top: 8px; font-size: 12.5px; color: var(--ink2); }
.emg-audit-gauges { display: grid; grid-template-columns: repeat(4, 1fr); gap: 20px; margin-top: 44px; }
.emg-audit-gauge {
	position: relative; text-align: center;
	padding: 28px 12px 22px;
	background: var(--card);
	border: 1px solid var(--line);
	border-radius: var(--radius);
	box-shadow: var(--shadow-soft);
}
.emg-audit-gauge svg { display: block; width: 118px; height: 118px; margin: 0 auto; transform: rotate(-90deg); }
.emg-gauge-track { fill: none; stroke: var(--line); stroke-width: 9; }
.emg-gauge-fill { fill: none; stroke-width: 9; stroke-linecap: round; }
.emg-gauge-value {
	position: absolute; left: 0; right: 0;
	top: calc(28px + 59px); transform: translateY(-50%);
	font-size: 30px; font-weight: 200;
	font-variant-numeric: tabular-nums;
}
.emg-gauge-label {
	display: block; margin-top: 12px;
	font-size: 12px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase;
	color: var(--ink2);
}
/* Scores ordinateur : rangée compacte sous les jauges mobiles. */
.emg-audit-devrow {
	display: flex; align-items: center; gap: 12px 26px; flex-wrap: wrap;
	margin-top: 16px;
	padding: 18px 26px;
	background: var(--card);
	border: 1px solid var(--line);
	border-radius: var(--radius);
	box-shadow: var(--shadow-soft);
}
.emg-audit-devlabel {
	font-size: 12px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase;
	color: var(--ink2);
	margin-right: 8px;
}
.emg-audit-devscore { display: inline-flex; align-items: baseline; gap: 8px; font-size: 13.5px; }
.emg-audit-devscore em { font-style: normal; color: var(--ink2); }
.emg-audit-devscore strong { font-size: 18px; font-variant-numeric: tabular-nums; }
/* Rapport freemium : détails floutés tant que l'e-mail n'est pas déposé. */
.emg-audit-locked { position: relative; margin-top: 24px; }
/* Rythme vertical homogène entre tous les blocs du rapport détaillé. */
.emg-audit-locked-content > * + * { margin-top: 24px; }
.emg-audit-locked-content { transition: filter .8s ease; }
.emg-audit-locked.is-locked .emg-audit-locked-content {
	filter: blur(11px) saturate(.85);
	pointer-events: none;
	user-select: none;
}
.emg-audit-unlock {
	position: absolute; inset: 0; z-index: 5;
	display: flex; justify-content: center; align-items: flex-start;
	padding: 24px;
	opacity: 0; visibility: hidden; pointer-events: none;
	transition: opacity .55s ease, visibility 0s linear .55s;
}
.emg-audit-locked.is-locked .emg-audit-unlock {
	opacity: 1; visibility: visible; pointer-events: auto;
	transition: opacity .55s ease;
}
.emg-audit-unlock-card {
	position: sticky; top: 24vh;
	width: min(470px, 100%);
	margin-top: clamp(24px, 6vh, 72px);
	text-align: center;
	padding: 38px 34px 34px;
	border-radius: var(--radius);
	background: color-mix(in srgb, var(--card) 84%, transparent);
	-webkit-backdrop-filter: blur(18px) saturate(1.35);
	backdrop-filter: blur(18px) saturate(1.35);
	border: 1px solid var(--line);
	box-shadow: var(--shadow);
}
.emg-audit-lock-ico {
	display: inline-grid; place-items: center;
	width: 46px; height: 46px; border-radius: 50%;
	background: color-mix(in srgb, var(--accent) 12%, transparent);
	color: var(--accent);
}
.emg-audit-unlock-card h2 { margin-top: 16px; font-size: 24px; letter-spacing: -.02em; line-height: 1.25; }
.emg-audit-unlock-card p { margin-top: 8px; color: var(--ink2); font-size: 14.5px; line-height: 1.6; }
/* Champ e-mail au-dessus du bouton, tous deux pleine largeur. */
.emg-audit-unlock-card form { display: grid; gap: 10px; margin-top: 22px; }
.emg-audit-unlock-card input {
	min-width: 0;
	padding: 13px 18px;
	font: inherit; font-size: 14.5px;
	color: var(--ink);
	background: var(--bg);
	border: 1px solid var(--line);
	border-radius: 999px;
	transition: border-color .3s ease, box-shadow .3s ease;
}
.emg-audit-unlock-card input:focus {
	outline: none;
	border-color: var(--accent);
	box-shadow: 0 0 0 4px color-mix(in srgb, var(--accent) 14%, transparent);
}
.emg-audit-unlock-err { margin-top: 12px; font-size: 13px; font-weight: 600; color: #d43c3c; }
/* Aperçus du site : ordinateur (large) + mobile (étroit) — visibles sans
   e-mail, en avant-goût du rapport complet. */
.emg-audit-visuals-block { margin-top: 24px; }
.emg-audit-visuals { display: flex; align-items: flex-start; gap: 24px; margin-top: 20px; }
.emg-audit-visuals figure { flex: 1; min-width: 0; margin: 0; }
.emg-audit-visuals figure.is-mobile { flex: 0 0 clamp(120px, 19%, 190px); }
.emg-audit-visuals img {
	display: block; width: 100%; height: auto;
	border-radius: 14px;
	border: 1px solid var(--line);
	box-shadow: var(--shadow-soft);
	background: #fff;
}
.emg-audit-visuals figcaption {
	margin-top: 10px; text-align: center;
	font-size: 12px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase;
	color: var(--ink2);
}
/* Le conteneur du rapport. Il n'avait AUCUNE regle : les tuiles, qui ne
   portent pas de marge, se touchaient donc bord a bord — le rapport paraissait
   d'un bloc. Une grille et un ecart, et chaque tuile redevient une tuile. La
   grille sert aussi le masquage : un bloc en `hidden` ne cree pas d'element de
   grille, donc pas d'ecart en trop. */
.emg-audit-details { display: grid; gap: 24px; margin-top: 24px; }
.emg-audit-cols { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; }
.emg-audit-block {
	padding: 30px 28px;
	background: var(--card);
	border: 1px solid var(--line);
	border-radius: var(--radius);
	box-shadow: var(--shadow-soft);
}
.emg-audit-block h2 { font-size: 18px; letter-spacing: -.015em; }
.emg-audit-note { margin-top: 6px; font-size: 12.5px; color: var(--ink3); }
.emg-audit-dot { width: 9px; height: 9px; border-radius: 50%; background: var(--line); flex: none; transition: background .4s ease; }
.emg-audit-mlabel { color: var(--ink2); }
/* Table des mesures : libellé + mobile + ordinateur. */
.emg-audit-table { margin-top: 20px; }
.emg-audit-trow {
	display: grid; grid-template-columns: minmax(0, 1fr) 104px 104px;
	gap: 12px; align-items: center;
	padding: 13px 0;
	border-top: 1px solid color-mix(in srgb, var(--line) 55%, transparent);
	font-size: 13.5px;
}
.emg-audit-trow:first-child { border-top: 0; padding-top: 0; }
.emg-audit-trow.is-head span { font-size: 10.5px; font-weight: 700; letter-spacing: .07em; text-transform: uppercase; color: var(--ink3); }
.emg-audit-mcell { display: flex; align-items: center; gap: 8px; min-width: 0; }
.emg-audit-mcell b { font-weight: 700; font-variant-numeric: tabular-nums; overflow-wrap: anywhere; }
/* Expérience réelle des visiteurs (CrUX). */
.emg-audit-crux { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; margin-top: 22px; }
.emg-audit-crux-item {
	display: grid; gap: 3px; align-content: start;
	padding: 15px 15px 13px;
	border: 1px solid var(--line);
	border-radius: 14px;
}
.emg-audit-crux-label { font-size: 11px; font-weight: 700; letter-spacing: .05em; text-transform: uppercase; color: var(--ink2); }
.emg-audit-crux-item strong { font-size: 23px; letter-spacing: -.01em; font-variant-numeric: tabular-nums; }
.emg-audit-crux-item em { font-style: normal; font-size: 12px; font-weight: 700; }
.emg-audit-crux-item.is-good strong, .emg-audit-crux-item.is-good em { color: #0d9455; }
.emg-audit-crux-item.is-mid strong, .emg-audit-crux-item.is-mid em { color: #f0a72d; }
.emg-audit-crux-item.is-low strong, .emg-audit-crux-item.is-low em { color: #d43c3c; }
/* Poids & requêtes par type de ressource. */
.emg-audit-cols > div:not(.emg-audit-block) { display: grid; gap: 24px; align-content: start; }
.emg-audit-res-head { display: flex; gap: 26px; margin-top: 12px; font-size: 14px; color: var(--ink2); }
.emg-audit-res-head b { font-size: 21px; font-weight: 800; letter-spacing: -.01em; color: var(--ink); margin-right: 3px; font-variant-numeric: tabular-nums; }
.emg-audit-res-bars { list-style: none; margin: 18px 0 0; padding: 0; display: grid; gap: 12px; }
.emg-audit-res-bars li { display: grid; grid-template-columns: 96px 1fr 66px; align-items: center; gap: 10px; font-size: 12.5px; }
.emg-audit-res-label { color: var(--ink2); }
.emg-audit-res-bar { height: 7px; border-radius: 99px; background: color-mix(in srgb, var(--line) 55%, transparent); overflow: hidden; }
.emg-audit-res-bar i { display: block; height: 100%; width: 0; border-radius: 99px; background: linear-gradient(90deg, #0a36f7, #35b3f7); transition: width .9s var(--ease-out); }
.emg-audit-res-bars b { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }
/* ---- Captures de l'interface d'une solution ----
   Le cadre de navigateur est le composant partage du site (.emg-browser) : la
   capture d'un logiciel se presente comme celle d'un site, et il n'y a qu'un
   seul cadre dans le theme. */
.emg-sol-shots { display: grid; gap: clamp(30px, 4vw, 52px); margin-top: 44px; }
/* L'image et sa legende se font FACE, et le cote s'inverse d'une capture a la
   suivante (.is-flip, pose par le helper) : cela donne un rythme la ou une
   colonne d'images ne donnait qu'un tas. */
.emg-sol-shot {
	margin: 0;
	/* Deux colonnes EGALES : la capture prend la moitie de la page (demande
	   Loris). Elle etait plafonnee a 440 px, ce qui la rendait anecdotique ;
	   la moitie lui donne sa place sans jamais l'etaler en pleine largeur, ce
	   que sa finesse ne supporterait pas. */
	display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
	gap: clamp(22px, 3vw, 44px); align-items: center;
}
.emg-sol-shot.is-flip .emg-browser { order: 2; }
.emg-sol-shot.is-flip figcaption { order: 1; }
.emg-sol-shot .emg-browser { display: block; }
.emg-sol-shot img { display: block; width: 100%; height: auto; }
.emg-sol-shot figcaption strong { display: block; font-size: 17px; letter-spacing: -.01em; }
.emg-sol-shot figcaption span { display: block; margin-top: 9px; font-size: 15px; line-height: 1.65; color: var(--ink2); }
@media (max-width: 860px) {
	/* Empilees, l'image d'abord : une legende qui precede son image ne veut
	   rien dire. L'ordre pose pour l'alternation est donc annule. */
	.emg-sol-shot,
	.emg-sol-shot.is-flip { grid-template-columns: minmax(0, 1fr); gap: 18px; }
	.emg-sol-shot.is-flip .emg-browser { order: 1; }
	.emg-sol-shot.is-flip figcaption { order: 2; }
}

/* Contrôles en échec par catégorie. */
.emg-audit-fails { display: grid; grid-template-columns: repeat(3, 1fr); gap: 30px; margin-top: 22px; }
.emg-audit-fail h3 { display: flex; align-items: center; gap: 9px; font-size: 12.5px; font-weight: 700; letter-spacing: .07em; text-transform: uppercase; color: var(--ink2); }
.emg-audit-fail h3 b { background: color-mix(in srgb, #d43c3c 12%, transparent); color: #d43c3c; font-size: 11px; border-radius: 99px; padding: 2px 9px; letter-spacing: 0; }
.emg-audit-fail ul { list-style: none; margin: 16px 0 0; padding: 0; display: grid; gap: 13px; }
.emg-audit-fail li { position: relative; padding-left: 15px; font-size: 13px; line-height: 1.5; color: var(--ink2); }
.emg-audit-fail li::before {
	content: '';
	position: absolute; left: 0; top: .48em;
	width: 6px; height: 6px; border-radius: 50%;
	background: #d43c3c; opacity: .7;
}
.emg-audit-fail li.is-ok::before { background: #0d9455; opacity: 1; }
.emg-audit-fail li.is-more { color: var(--ink3); font-weight: 600; }
.emg-audit-fail li.is-more::before { display: none; }
/* Rapport rédigé par l'IA. */
.emg-audit-ai {
	border-color: color-mix(in srgb, var(--accent) 28%, var(--line));
	background: linear-gradient(150deg, color-mix(in srgb, var(--accent) 6%, var(--card)), var(--card) 55%);
}
.emg-audit-ai-summary { margin-top: 14px; font-size: 16.5px; line-height: 1.65; font-weight: 600; letter-spacing: -.005em; }
.emg-audit-ai-cols { display: grid; grid-template-columns: 1fr 1fr; gap: 30px; margin-top: 24px; }
.emg-audit-ai h3 { font-size: 12.5px; font-weight: 700; letter-spacing: .07em; text-transform: uppercase; color: var(--accent); }
.emg-audit-ai-cols p { margin-top: 8px; font-size: 14px; line-height: 1.65; color: var(--ink2); }
.emg-audit-ai-actions-title { margin-top: 22px; }
.emg-audit-ai-actions { list-style: none; margin: 14px 0 0; padding: 0; counter-reset: emgai; display: grid; gap: 14px; }
.emg-audit-ai-actions li {
	counter-increment: emgai;
	position: relative; padding-left: 34px;
	font-size: 14px; line-height: 1.6; color: var(--ink2);
}
.emg-audit-ai-actions li::before {
	content: counter(emgai);
	position: absolute; left: 0; top: 0;
	width: 23px; height: 23px; border-radius: 50%;
	display: grid; place-items: center;
	background: color-mix(in srgb, var(--accent) 12%, transparent);
	color: var(--accent);
	font-size: 12px; font-weight: 800;
}
.emg-audit-ai-missnote { margin-top: 18px; font-size: 13px; font-style: italic; color: var(--ink3); }
.emg-audit-opps { list-style: none; margin: 20px 0 0; padding: 0; display: grid; gap: 16px; }
.emg-audit-opps li {
	display: flex; align-items: baseline; justify-content: space-between; gap: 14px;
	font-size: 14px; line-height: 1.5; color: var(--ink2);
	border-left: 2px solid color-mix(in srgb, var(--accent) 45%, transparent);
	padding-left: 12px;
}
.emg-audit-opps em { font-style: normal; font-weight: 700; color: var(--accent); white-space: nowrap; }
.emg-audit-verdict {
	margin-top: 24px; /* hors zone floutée : toujours lisible. */
	display: flex; align-items: center; justify-content: space-between;
	gap: 32px; flex-wrap: wrap;
	padding: 44px clamp(28px, 4vw, 56px);
	border-radius: var(--radius);
	background: var(--navy); color: #f7feff;
	box-shadow: var(--shadow);
}
.emg-audit-verdict h2 { font-size: clamp(24px, 2.6vw, 34px); letter-spacing: -.02em; }
.emg-audit-verdict p { margin-top: 10px; color: rgba(247, 254, 255, .78); max-width: 58ch; line-height: 1.65; }
/* Panneau promo (page Développement web). */
.emg-audit-promo {
	margin-top: 72px;
	display: flex; align-items: center; justify-content: space-between;
	gap: 32px; flex-wrap: wrap;
	padding: 40px clamp(28px, 4vw, 56px);
	border-radius: var(--radius);
	background: linear-gradient(120deg, #061651, #0a36f7);
	color: #f7feff;
	box-shadow: var(--shadow);
}
/* Sur une page de POLE, le panneau suit la pile de cartes du processus, qui
   se termine en position collante : sans ce sas il lui montait dessus
   (retour Loris, 2026-08-30). */
.emg-audit-promo.is-after-stack { margin-top: clamp(96px, 13vh, 150px); }
/* Sur Outils et Emplois, le meme panneau ferme la page. Il est seul dans sa
   section, qui porte deja son padding : la marge haute y ferait double
   emploi, et c'est EN DESSOUS qu'il manquait de l'air avant le pied de
   page. */
.emg-audit-promo.is-standalone { margin-bottom: clamp(32px, 6vh, 80px); }
.emg-audit-promo.is-standalone.is-flush { margin-top: 0; }
.emg-audit-promo h2 { font-size: 24px; letter-spacing: -.02em; }
.emg-audit-promo p { margin-top: 8px; color: rgba(247, 254, 255, .82); font-size: 15px; }
@media (max-width: 900px) {
	.emg-audit-gauges { grid-template-columns: 1fr 1fr; }
	.emg-audit-cols { grid-template-columns: 1fr; }
	.emg-audit-crux { grid-template-columns: 1fr 1fr; }
	.emg-audit-fails { grid-template-columns: 1fr; }
	.emg-audit-ai-cols { grid-template-columns: 1fr; }
}
@media (max-width: 700px) {
	.emg-audit-visuals { flex-direction: column; align-items: center; }
	.emg-audit-visuals figure { width: 100%; }
	.emg-audit-visuals figure.is-mobile { flex: none; width: min(230px, 72%); }
}
@media (max-width: 640px) {
	.emg-audit-form { flex-direction: column; }
	.emg-audit-devrow { gap: 10px 18px; }
	.emg-audit-trow { grid-template-columns: minmax(0, 1fr) 84px 84px; font-size: 12.5px; gap: 8px; }
	.emg-audit-res-bars li { grid-template-columns: 78px 1fr 60px; }
	.emg-audit-modal-card { padding: 24px 22px 22px; }
}
@media (max-width: 380px) {
	/* Deux colonnes de jauges (SVG 118 px + padding de carte) débordent en
	   dessous de 380 px : la grille repasse en colonne unique, sans rien
	   changer au-dessus. */
	.emg-audit-gauges { grid-template-columns: 1fr; }
}

/* Page Domaines : résultat principal + variantes d'extensions. */
.emg-domain-results { margin-top: 64px; }
.emg-domain-main {
	padding: 40px clamp(28px, 4vw, 52px) 44px;
	background: var(--card);
	border: 1px solid var(--line);
	border-radius: var(--radius);
	box-shadow: var(--shadow-soft);
}
.emg-domain-main-head { display: flex; align-items: center; gap: 10px 18px; flex-wrap: wrap; }
.emg-domain-name { font-size: clamp(24px, 3.4vw, 40px); letter-spacing: -.025em; overflow-wrap: anywhere; min-width: 0; }
.emg-domain-badge {
	flex: none;
	display: inline-block;
	padding: 6px 15px;
	border-radius: 999px;
	font-size: 12px; font-weight: 700; letter-spacing: .07em; text-transform: uppercase;
	background: color-mix(in srgb, var(--ink2) 11%, transparent);
	color: var(--ink2);
}
.emg-domain-badge.is-free { background: color-mix(in srgb, #0d9455 13%, transparent); color: #0d9455; }
.emg-domain-badge.is-taken { background: color-mix(in srgb, #d43c3c 11%, transparent); color: #d43c3c; }
.emg-domain-badge.is-wait { animation: emg-domain-blink 1.1s ease-in-out infinite; }
@keyframes emg-domain-blink {
	50% { opacity: .45; }
}
.emg-domain-main h2 { margin-top: 20px; font-size: clamp(22px, 2.6vw, 30px); letter-spacing: -.02em; }
.emg-domain-main > p { margin-top: 10px; color: var(--ink2); line-height: 1.65; max-width: 62ch; }
.emg-domain-detail { font-size: 14px; }
.emg-domain-main .emg-btn-row { margin-top: 26px; }
.emg-domain-alts-title { margin-top: 48px; font-size: 22px; letter-spacing: -.02em; }
.emg-domain-alts {
	display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
	gap: 14px; margin-top: 20px;
}
.emg-domain-alt {
	display: flex; align-items: center; justify-content: space-between; gap: 12px;
	padding: 17px 19px;
	background: var(--card);
	border: 1px solid var(--line);
	border-radius: 16px;
	box-shadow: var(--shadow-soft);
	transition: border-color .35s ease;
}
.emg-domain-alt.is-free { border-color: color-mix(in srgb, #0d9455 40%, var(--line)); }
.emg-domain-alt strong { min-width: 0; overflow-wrap: anywhere; font-size: 15px; font-weight: 700; letter-spacing: -.01em; }
.emg-domain-alt span {
	flex: none;
	padding: 4px 11px;
	border-radius: 99px;
	font-size: 10.5px; font-weight: 700; letter-spacing: .05em; text-transform: uppercase;
	background: color-mix(in srgb, var(--ink2) 10%, transparent);
	color: var(--ink2);
}
.emg-domain-alt span.is-free { background: color-mix(in srgb, #0d9455 13%, transparent); color: #0d9455; }
.emg-domain-alt span.is-taken { background: color-mix(in srgb, #d43c3c 11%, transparent); color: #d43c3c; }
.emg-domain-alt span.is-wait { animation: emg-domain-blink 1.1s ease-in-out infinite; }

/* Page Sécurité : note globale + contrôles par famille. */
.emg-secu-report { margin-top: 64px; display: grid; gap: 20px; }
.emg-secu-grade {
	display: flex; align-items: center; gap: clamp(24px, 4vw, 44px); flex-wrap: wrap;
	padding: clamp(28px, 4vw, 44px);
	border-radius: var(--radius);
	background: var(--card);
	border: 1px solid var(--line);
	box-shadow: var(--shadow-soft);
}
.emg-secu-letter {
	flex: none;
	display: grid; place-items: center;
	width: clamp(96px, 13vw, 132px); aspect-ratio: 1;
	border-radius: 28px;
	font-size: clamp(44px, 6vw, 62px); font-weight: 200; letter-spacing: -.04em;
	color: #fff;
	background: linear-gradient(140deg, #4a5568, #2d3748);
	box-shadow: var(--shadow);
}
.emg-secu-grade.is-good .emg-secu-letter { background: linear-gradient(140deg, #17b169, #0d7a45); }
.emg-secu-grade.is-mid .emg-secu-letter { background: linear-gradient(140deg, #f5b642, #d98613); }
.emg-secu-grade.is-low .emg-secu-letter { background: linear-gradient(140deg, #e8544c, #b4231c); }
.emg-secu-grade-body { flex: 1; min-width: 260px; }
.emg-secu-for { font-size: 12px; font-weight: 700; letter-spacing: .16em; text-transform: uppercase; color: var(--ink2); }
.emg-secu-for strong { color: var(--ink); overflow-wrap: anywhere; }
.emg-secu-score { display: flex; align-items: baseline; gap: 8px; margin-top: 8px; }
.emg-secu-score b { font-size: 34px; font-weight: 200; letter-spacing: -.03em; font-variant-numeric: tabular-nums; }
.emg-secu-score em { font-style: normal; font-size: 12.5px; color: var(--ink2); }
.emg-secu-grade-body h2 { margin-top: 12px; font-size: clamp(22px, 2.6vw, 30px); letter-spacing: -.02em; }
.emg-secu-grade-body > p { margin-top: 8px; color: var(--ink2); line-height: 1.65; max-width: 60ch; }
.emg-secu-grade-body .emg-btn-row { margin-top: 22px; }
.emg-secu-group h2 { font-size: 18px; letter-spacing: -.015em; }
.emg-secu-rows { margin-top: 6px; }
.emg-secu-row {
	display: grid; grid-template-columns: 26px minmax(0, 1fr) auto;
	align-items: start; gap: 14px;
	padding: 16px 0;
	border-top: 1px solid color-mix(in srgb, var(--line) 55%, transparent);
}
.emg-secu-row:first-child { border-top: 0; }
.emg-secu-ico {
	position: relative;
	width: 22px; height: 22px; border-radius: 50%;
	background: color-mix(in srgb, var(--ink2) 12%, transparent);
	margin-top: 1px;
}
.emg-secu-ico::after {
	content: '';
	position: absolute; left: 50%; top: 50%;
	width: 7px; height: 7px; margin: -3.5px 0 0 -3.5px;
	border-radius: 50%;
	background: var(--ink2);
}
.emg-secu-row.is-pass .emg-secu-ico { background: color-mix(in srgb, #0d9455 15%, transparent); }
.emg-secu-row.is-pass .emg-secu-ico::after { background: #0d9455; }
.emg-secu-row.is-warn .emg-secu-ico { background: color-mix(in srgb, #f0a72d 18%, transparent); }
.emg-secu-row.is-warn .emg-secu-ico::after { background: #f0a72d; }
.emg-secu-row.is-fail .emg-secu-ico { background: color-mix(in srgb, #d43c3c 13%, transparent); }
.emg-secu-row.is-fail .emg-secu-ico::after { background: #d43c3c; }
.emg-secu-txt strong { font-size: 14.5px; letter-spacing: -.01em; }
.emg-secu-txt p { margin-top: 4px; font-size: 13px; line-height: 1.55; color: var(--ink2); max-width: 68ch; }
.emg-secu-val { text-align: right; display: grid; gap: 3px; justify-items: end; max-width: 210px; }
.emg-secu-val b { font-size: 12px; font-weight: 600; color: var(--ink2); overflow-wrap: anywhere; }
.emg-secu-val em {
	font-style: normal; font-size: 10.5px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase;
	padding: 3px 10px; border-radius: 99px; white-space: nowrap;
	background: color-mix(in srgb, var(--ink2) 11%, transparent); color: var(--ink2);
}
.emg-secu-row.is-pass .emg-secu-val em { background: color-mix(in srgb, #0d9455 13%, transparent); color: #0d9455; }
.emg-secu-row.is-warn .emg-secu-val em { background: color-mix(in srgb, #f0a72d 16%, transparent); color: #c8820f; }
.emg-secu-row.is-fail .emg-secu-val em { background: color-mix(in srgb, #d43c3c 11%, transparent); color: #d43c3c; }

/* Emplois : liste des offres, culture, fiche détaillée. */
.emg-jobs-list { display: grid; gap: 14px; margin-top: 28px; }
.emg-job-card {
	display: flex; align-items: center; justify-content: space-between; gap: 24px; flex-wrap: wrap;
	padding: 28px clamp(24px, 3vw, 34px);
	border-radius: var(--radius);
	background: var(--card);
	border: 1px solid var(--line);
	box-shadow: var(--shadow-soft);
	color: var(--ink);
	transition: transform .4s var(--ease-out), border-color .3s ease, box-shadow .4s ease;
}
.emg-job-card:hover {
	transform: translateY(-3px);
	border-color: color-mix(in srgb, var(--accent) 35%, var(--line));
	box-shadow: var(--shadow);
}
.emg-job-card.is-closed { opacity: .62; }
.emg-job-card-main { min-width: 0; }
.emg-job-card h3 { margin-top: 10px; font-size: clamp(19px, 2.2vw, 24px); letter-spacing: -.02em; }
.emg-job-badge {
	display: inline-block;
	padding: 4px 12px;
	border-radius: 99px;
	font-size: 10.5px; font-weight: 700; letter-spacing: .07em; text-transform: uppercase;
}
.emg-job-badge.is-open { background: color-mix(in srgb, #0d9455 13%, transparent); color: #0d9455; }
.emg-job-badge.is-closed { background: color-mix(in srgb, var(--ink2) 12%, transparent); color: var(--ink2); }
.emg-job-facts { display: flex; flex-wrap: wrap; gap: 8px 18px; margin-top: 12px; }
.emg-job-facts span {
	position: relative;
	font-size: 13.5px; color: var(--ink2);
}
.emg-job-facts span + span::before {
	content: '·';
	position: absolute; left: -11px;
	color: var(--ink3);
}
.emg-job-card-go {
	flex: none;
	display: inline-flex; align-items: center; gap: 8px;
	font-size: 13.5px; font-weight: 700;
	color: var(--accent);
}
.emg-job-card-go svg { transition: transform .35s var(--ease-out); }
.emg-job-card:hover .emg-job-card-go svg { transform: translateX(4px); }
.emg-job-empty {
	margin-top: 28px;
	padding: 40px clamp(24px, 3vw, 40px);
	border-radius: var(--radius);
	border: 1px dashed var(--line);
	background: color-mix(in srgb, var(--card) 60%, transparent);
}
.emg-job-empty h3 { font-size: 20px; letter-spacing: -.02em; }
.emg-job-empty-go {
	display: inline-flex; align-items: center; gap: 8px;
	margin-top: 16px;
	font-size: 14px; font-weight: 700; color: var(--accent);
	transition: gap .25s var(--ease-out);
}
.emg-job-empty-go:hover { gap: 12px; }
.emg-job-empty p { margin-top: 8px; color: var(--ink2); line-height: 1.65; max-width: 62ch; }
/* « Travailler ici » : manifeste, pas grille de tuiles. La colonne de gauche
   tient pendant que les quatre points defilent a droite, et un filet d'accent
   se dessine a l'arrivee de chacun. Quatre cartes de plus auraient dit la
   meme chose que le reste du site. */
.emg-culture-split {
	display: grid;
	grid-template-columns: minmax(230px, .82fr) 1.18fr;
	gap: clamp(34px, 6vw, 96px);
	align-items: start;
}
.emg-culture-aside { position: sticky; top: clamp(104px, 15vh, 158px); }
.emg-culture-lead {
	margin-top: 18px; max-width: 32ch;
	font-size: 16px; line-height: 1.7; color: var(--ink2);
}
.emg-culture-list { display: grid; }
.emg-culture-row {
	position: relative;
	display: grid; grid-template-columns: clamp(54px, 5vw, 76px) 1fr;
	gap: clamp(16px, 2.2vw, 30px);
	padding: clamp(24px, 3vw, 36px) 0 clamp(24px, 3vw, 36px) 22px;
	border-top: 1px solid var(--line);
}
.emg-culture-row:first-child { border-top: 0; padding-top: 0; }
.emg-culture-row:last-child { padding-bottom: 0; }
/* Le filet se dessine quand la rangee entre dans le cadre : c'est la classe
   que pose le moteur de revelation, aucune ligne de JS de plus. */
.emg-culture-row::before {
	content: '';
	position: absolute; left: 0; top: clamp(24px, 3vw, 36px); bottom: clamp(24px, 3vw, 36px);
	width: 2px; border-radius: 2px;
	background: linear-gradient(var(--accent), color-mix(in srgb, var(--accent) 8%, transparent));
	transform: scaleY(0); transform-origin: top;
	transition: transform .85s var(--ease-out) .12s;
}
.emg-culture-row:first-child::before { top: 0; }
.emg-culture-row:last-child::before { bottom: 0; }
html.js [data-reveal].emg-culture-row.is-revealed::before,
html.emg-motion-off .emg-culture-row::before { transform: scaleY(1); }
.emg-culture-num .emgx-num { font-size: clamp(30px, 3.6vw, 46px); color: #061651; }
.emg-culture-body h3 { font-size: clamp(19px, 1.8vw, 23px); letter-spacing: -.02em; }
.emg-culture-body p { margin-top: 10px; font-size: 15px; line-height: 1.7; color: var(--ink2); max-width: 54ch; }
@media (max-width: 900px) {
	.emg-culture-split { grid-template-columns: 1fr; gap: 34px; }
	.emg-culture-aside { position: static; }
	.emg-culture-lead { max-width: none; }
}

.emg-jobs-culture { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 18px; margin-top: 28px; }
.emg-job-culture-card {
	padding: 28px 26px;
	border-radius: var(--radius);
	background: var(--card);
	border: 1px solid var(--line);
	box-shadow: var(--shadow-soft);
}
/* Le chiffre héritait de la taille du texte de carte : il se voyait à peine.
   Il devient un vrai repère, en bleu profond — et non le bleu d'accent, qui
   signale ailleurs ce qui est cliquable. */
.emg-job-culture-card .emgx-num { font-size: 34px; color: #061651; }
/* Sur une bande de nuit, ce bleu profond disparait dans le fond : le cyan
   prend le relais. Meme valeur que retenait l'ancien theme sombre — la
   regle etait juste, il lui manquait la bonne portee. */
.emg-night .emg-job-culture-card .emgx-num { color: var(--cyan); }
.emg-job-culture-card h3 { margin-top: 14px; font-size: 18px; letter-spacing: -.015em; }
.emg-job-culture-card p { margin-top: 8px; font-size: 14px; line-height: 1.65; color: var(--ink2); }
.emg-job-single-head { display: flex; align-items: center; gap: 16px; flex-wrap: wrap; margin-top: 18px; }
.emg-job-single-head .emg-job-facts { margin-top: 0; }
.emg-job-closed-note {
	padding: 18px 22px;
	border-radius: 16px;
	background: color-mix(in srgb, var(--ink2) 8%, transparent);
	color: var(--ink2);
	font-size: 14px; line-height: 1.6;
	margin-bottom: 24px;
}
.emg-job-sections-front { display: grid; gap: 20px; }
.emg-job-points { list-style: none; margin: 16px 0 0; padding: 0; display: grid; gap: 11px; }
.emg-job-points li {
	position: relative; padding-left: 22px;
	font-size: 14.5px; line-height: 1.6; color: var(--ink2);
}
.emg-job-points li::before {
	content: '';
	position: absolute; left: 0; top: .55em;
	width: 7px; height: 7px; border-radius: 50%;
	background: var(--accent);
}

/* Passage e-mail partagé : panneau « résultats prêts » dans la modale. */
.emg-gate-ready {
	margin-top: 22px;
	padding-top: 20px;
	border-top: 1px solid color-mix(in srgb, var(--line) 65%, transparent);
}
.emg-gate-ready h3 { font-size: 17px; letter-spacing: -.015em; }
.emg-gate-ready > p { margin-top: 6px; font-size: 13.5px; line-height: 1.55; color: var(--ink2); }
.emg-gate-ready form { display: grid; gap: 10px; margin-top: 16px; }
.emg-gate-ready input {
	padding: 13px 18px;
	font: inherit; font-size: 14.5px;
	color: var(--ink);
	background: var(--bg);
	border: 1px solid var(--line);
	border-radius: 999px;
	transition: border-color .3s ease, box-shadow .3s ease;
}
.emg-gate-ready input:focus {
	outline: none;
	border-color: var(--accent);
	box-shadow: 0 0 0 4px color-mix(in srgb, var(--accent) 14%, transparent);
}
.emg-gate-ready .emg-btn { justify-content: center; }
.emg-gate-err { margin-top: 10px; font-size: 13px; font-weight: 600; color: #d43c3c; }

/* --------------------------------------------------------------------------
   Palette de recherche — panneau de verre appelé depuis le header.
   Le fond de la page reste visible et flouté : c'est lui qui donne la
   matière au verre, d'où le voile très léger.
   -------------------------------------------------------------------------- */
.emg-palette {
	position: fixed; inset: 0; z-index: 200;
	display: grid; place-items: start center;
	padding: clamp(70px, 14vh, 150px) 20px 40px;
}
.emg-palette[hidden] { display: none; }
.emg-palette-veil {
	position: absolute; inset: 0;
	background: color-mix(in srgb, var(--navy) 34%, transparent);
	backdrop-filter: blur(7px) saturate(1.1);
	-webkit-backdrop-filter: blur(7px) saturate(1.1);
	opacity: 0;
	transition: opacity .38s var(--ease-out);
}
.emg-palette-panel {
	position: relative;
	width: min(660px, 100%);
	max-height: min(620px, calc(100vh - clamp(110px, 18vh, 190px)));
	display: flex; flex-direction: column;
	border-radius: 26px;
	border: 1px solid color-mix(in srgb, #fff 34%, var(--glass-brd));
	/* Verre : dégradé translucide + arrière-plan flouté + reflet interne. */
	background:
		linear-gradient(158deg,
			color-mix(in srgb, var(--card) 82%, transparent),
			color-mix(in srgb, var(--card) 62%, transparent));
	backdrop-filter: blur(34px) saturate(1.9);
	-webkit-backdrop-filter: blur(34px) saturate(1.9);
	box-shadow:
		inset 0 1px 0 0 color-mix(in srgb, #fff 55%, transparent),
		inset 0 -1px 0 0 color-mix(in srgb, #fff 10%, transparent),
		0 40px 100px -30px rgba(2, 3, 31, .45);
	overflow: hidden;
	opacity: 0;
	transform: translateY(14px) scale(.965);
	transition: opacity .34s var(--ease-out), transform .46s var(--ease-out);
}
/* Halo mobile qui suit l'ouverture : la lumière « coule » sur le verre. */
.emg-palette-panel::before {
	content: ''; position: absolute; inset: -40% -10% auto -10%; height: 70%;
	background: radial-gradient(60% 100% at 50% 0%, color-mix(in srgb, var(--accent) 22%, transparent), transparent 70%);
	pointer-events: none;
	opacity: .8;
}
.emg-palette.is-open .emg-palette-veil { opacity: 1; }
.emg-palette.is-open .emg-palette-panel { opacity: 1; transform: none; }
body.emg-palette-open { overflow: hidden; }

.emg-palette-field {
	position: relative;
	display: flex; align-items: center; gap: 12px;
	padding: 18px 18px 16px 20px;
	border-bottom: 1px solid color-mix(in srgb, var(--line) 70%, transparent);
}
.emg-palette-loupe { flex: none; color: var(--accent); }
.emg-palette-field input {
	flex: 1; min-width: 0;
	border: 0; background: none; outline: none;
	font-family: inherit; font-size: 17px; font-weight: 500; letter-spacing: -.01em;
	color: var(--ink);
}
.emg-palette-field input::placeholder { color: var(--ink2); font-weight: 400; }
.emg-palette-field input::-webkit-search-cancel-button { display: none; }
.emg-palette-x {
	flex: none; width: 28px; height: 28px;
	display: grid; place-items: center;
	border: 0; border-radius: 99px; cursor: pointer;
	background: color-mix(in srgb, var(--ink) 7%, transparent);
	color: var(--ink2);
	transition: background .25s ease, color .25s ease;
}
.emg-palette-x:hover { background: color-mix(in srgb, var(--ink) 12%, transparent); color: var(--ink); }

.emg-palette-body { overflow-y: auto; padding: 8px; flex: 1; }
.emg-palette-state {
	margin: 0; padding: 18px 12px;
	font-size: 14px; color: var(--ink2); text-align: center;
}
.emg-palette-list { display: flex; flex-direction: column; gap: 2px; }
.emg-palette-hit {
	display: flex; align-items: center; gap: 14px;
	padding: 11px 14px;
	border-radius: 14px;
	color: var(--ink);
	transition: background .2s ease;
}
.emg-palette-hit:hover,
.emg-palette-hit.is-active { background: color-mix(in srgb, var(--accent) 11%, transparent); }
.emg-palette-hit-body { flex: 1; min-width: 0; }
.emg-palette-hit strong {
	display: block;
	font-size: 14.5px; font-weight: 600; letter-spacing: -.01em;
	white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.emg-palette-hit strong mark {
	background: none; color: var(--accent); font-weight: 700;
}
.emg-palette-hit span {
	display: block; margin-top: 2px;
	font-size: 12.5px; color: var(--ink2);
	white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.emg-palette-hit em {
	flex: none; font-style: normal;
	font-size: 10.5px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase;
	color: var(--ink2);
	padding: 4px 9px; border-radius: 99px;
	background: color-mix(in srgb, var(--ink) 6%, transparent);
}
.emg-palette-hit.is-active em { color: var(--accent); background: color-mix(in srgb, var(--accent) 14%, transparent); }
.emg-palette-hit-go { flex: none; color: var(--accent); opacity: 0; transition: opacity .2s ease; }
.emg-palette-hit.is-active .emg-palette-hit-go { opacity: 1; }

.emg-palette-suggest { padding: 12px 14px 14px; }
/* Les pilules sont centrées sur la 404 ; ici elles listent des entrées,
   donc elles s'alignent à gauche comme les résultats juste au-dessus. */
.emg-palette-suggest .emg-search-shortcuts { justify-content: flex-start; }

.emg-palette-foot {
	display: flex; align-items: center; justify-content: space-between; gap: 16px;
	padding: 12px 18px;
	border-top: 1px solid color-mix(in srgb, var(--line) 70%, transparent);
	background: color-mix(in srgb, var(--ink) 3%, transparent);
}
.emg-palette-keys { font-size: 11.5px; color: var(--ink2); display: flex; align-items: center; gap: 5px; }
.emg-palette-keys kbd {
	font-family: inherit; font-size: 10.5px; line-height: 1;
	padding: 4px 6px; border-radius: 6px;
	border: 1px solid var(--line);
	background: var(--card);
	color: var(--ink);
}
/* Bouton plein : il n'apparaît qu'une fois une recherche lancée. */
.emg-palette-all {
	padding: 9px 18px;
	font-size: 12.5px;
	white-space: nowrap;
}
.emg-palette-all[hidden] { display: none; }
.emg-palette-all svg { transition: transform .3s var(--ease-out); }
.emg-palette-all:hover svg { transform: translateX(3px); }

@media (max-width: 620px) {
	.emg-palette { padding: 14px 14px 20px; place-items: start stretch; }
	.emg-palette-panel { max-height: calc(100vh - 34px); border-radius: 22px; }
	.emg-palette-field { padding: 15px 14px 13px 16px; }
	.emg-palette-field input { font-size: 16px; } /* < 16px : iOS zoome au focus */
	.emg-palette-keys { display: none; }
	.emg-palette-foot { justify-content: center; }
	/* Étroit : le badge de rubrique volait la place à la description, qui
	   se coupait après trois mots. Il remonte, elle passe sur deux lignes. */
	.emg-palette-hit { align-items: flex-start; gap: 10px; }
	.emg-palette-hit em { font-size: 9.5px; padding: 3px 7px; }
	.emg-palette-hit span {
		white-space: normal;
		display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
	}
	.emg-palette-hit-go { display: none; }
}
@media (prefers-reduced-motion: reduce) {
	.emg-palette-veil, .emg-palette-panel { transition-duration: .01ms; }
	.emg-palette-panel { transform: none; }
}

/* ------------------------------------------------------- Partenaires / presse
   Cartes de partenaire : le logo n'est affiché que s'il a été déposé dans
   assets/img/partners/ ; sinon l'initiale tient sa place. */
.emg-partners-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 22px; }
.emg-partner-card {
	display: flex; gap: 22px; align-items: flex-start;
	padding: 30px clamp(24px, 2.6vw, 34px);
	border-radius: var(--radius);
	background: var(--card);
	border: 1px solid var(--line);
	box-shadow: var(--shadow-soft);
	color: var(--ink);
	transition: transform .4s var(--ease-out), border-color .3s ease, box-shadow .4s ease;
}
a.emg-partner-card:hover {
	transform: translateY(-3px);
	border-color: color-mix(in srgb, var(--accent) 35%, var(--line));
	box-shadow: var(--shadow);
}
/* Le logo tient sur la ligne du nom, poussé à droite. Ces logos vont du
   carré au format 6:1 (Joset) : on normalise la HAUTEUR et la largeur suit,
   comme sur un mur de logos — les enfermer dans une même boîte réduisait les
   plus larges à une ligne illisible. */
.emg-partner-card { flex-direction: column; align-items: stretch; gap: 0; }
.emg-partner-head {
	display: flex; align-items: center; justify-content: space-between; gap: 20px;
	margin-top: 4px;
}
.emg-partner-head h2 { min-width: 0; }
.emg-partner-mark {
	flex: none; height: 28px; max-width: 45%;
	display: flex; align-items: center; justify-content: flex-end;
}
.emg-partner-mark img { height: 100%; width: auto; max-width: 100%; object-fit: contain; }
/* Sans logo déposé : l'initiale reprend une pastille. */
.emg-partner-mark span {
	display: grid; place-items: center;
	width: 34px; height: 34px;
	border-radius: 11px;
	background: color-mix(in srgb, var(--accent) 10%, transparent);
	font-size: 16px; font-weight: 700; color: var(--accent);
}
.emg-partner-body { min-width: 0; }
.emg-partner-role {
	display: block; margin-bottom: 6px;
	font-size: 10.5px; font-weight: 700; letter-spacing: .12em; text-transform: uppercase;
	color: var(--ink2);
}
.emg-partner-card h2 { font-size: 21px; letter-spacing: -.02em; }
.emg-partner-card p { margin-top: 10px; font-size: 14.5px; line-height: 1.65; color: var(--ink2); }
.emg-partner-go {
	display: inline-flex; align-items: center; gap: 7px; margin-top: 14px;
	font-size: 13px; font-weight: 600; color: var(--accent);
}
.emg-partner-go svg { transition: transform .3s var(--ease-out); }
a.emg-partner-card:hover .emg-partner-go svg { transform: translateX(3px); }

/* Charte de qualité : engagements numérotés. */
.emg-quality-list { display: grid; gap: 4px; }
.emg-quality-item {
	display: grid; grid-template-columns: 92px 1fr; gap: 24px; align-items: start;
	padding: 28px 0;
	border-bottom: 1px solid var(--line);
}
.emg-quality-item:first-child { border-top: 1px solid var(--line); }
.emg-quality-num { font-size: 30px; font-weight: 200; color: var(--accent); line-height: 1; padding-top: 4px; }
.emg-quality-item h2 { font-size: clamp(19px, 2vw, 24px); letter-spacing: -.02em; }
.emg-quality-item p { margin-top: 10px; font-size: 15.5px; line-height: 1.7; color: var(--ink2); max-width: 74ch; }

/* Presse : faits, encart à copier, fichiers téléchargeables. */
.emg-press-facts { display: grid; grid-template-columns: repeat(2, 1fr); gap: 2px 32px; margin: 0; }
.emg-press-facts > div { padding: 16px 0; border-bottom: 1px solid var(--line); }
.emg-press-facts dt {
	font-size: 10.5px; font-weight: 700; letter-spacing: .12em; text-transform: uppercase; color: var(--ink2);
}
.emg-press-facts dd { margin: 6px 0 0; font-size: 16px; }
.emg-press-boiler {
	margin-top: 16px; padding: 20px 22px;
	border-radius: 16px;
	background: color-mix(in srgb, var(--ink) 4%, transparent);
	border: 1px dashed var(--line);
	font-size: 15.5px; line-height: 1.7;
}
/* Kit presse : bouton de copie et aperçus sur fond sombre. */
.emg-press-boiler-foot {
	display: flex; align-items: center; gap: 16px; flex-wrap: wrap;
	margin-top: 16px;
}
.emg-press-copy { display: inline-flex; align-items: center; gap: 9px; padding: 11px 20px; font-size: 13.5px; }
.emg-press-copy.is-done { color: #0d9455; border-color: color-mix(in srgb, #0d9455 40%, var(--line)); }
.emg-press-hint { margin: 0; font-size: 13px; color: var(--ink2); }
.emg-press-asset-prev.is-dark { background: var(--navy, #02031f); }
.emg-press-assets { display: grid; grid-template-columns: repeat(3, 1fr); gap: 18px; }
.emg-press-asset {
	display: flex; align-items: center; gap: 16px;
	padding: 18px 20px; border-radius: 18px;
	background: var(--card); border: 1px solid var(--line);
	color: var(--ink);
	transition: transform .35s var(--ease-out), border-color .3s ease;
}
.emg-press-asset:hover { transform: translateY(-2px); border-color: color-mix(in srgb, var(--accent) 35%, var(--line)); }
.emg-press-asset-prev {
	flex: none; width: 52px; height: 52px; border-radius: 14px;
	display: grid; place-items: center;
	background: color-mix(in srgb, var(--ink) 6%, transparent);
}
.emg-press-asset-prev img { max-width: 60%; max-height: 60%; }
.emg-press-asset-body { min-width: 0; }
.emg-press-asset-body strong { display: block; font-size: 14px; letter-spacing: -.01em; }
.emg-press-asset-body span { font-size: 12px; color: var(--ink2); }

@media (max-width: 900px) {
	.emg-partners-grid { grid-template-columns: 1fr; }
	.emg-press-assets { grid-template-columns: 1fr; }
}
@media (max-width: 620px) {
	.emg-press-facts { grid-template-columns: 1fr; }
	.emg-quality-item { grid-template-columns: 1fr; gap: 10px; }
	.emg-quality-num { font-size: 24px; }
	/* Etroit : le logo passe sous le nom, sinon les deux se disputent la ligne. */
	.emg-partner-head { flex-direction: column; align-items: flex-start; gap: 12px; }
	.emg-partner-mark { max-width: 100%; height: 26px; justify-content: flex-start; }
}

/* Rail « Nos autres outils » en bas de chaque page d'outil. */
.emg-tools-rail-wrap { padding-top: 0; }
.emg-tools-rail-title { font-size: clamp(20px, 2.4vw, 26px); letter-spacing: -.02em; }
.emg-tools-rail {
	display: flex; gap: 14px;
	/* Un défilement horizontal force le navigateur à rogner aussi en
	   vertical : sans marge interne, l'ombre portée était coupée en bas et
	   le bord supérieur disparaissait au survol (translation de 3 px). Le
	   padding réserve la place, les marges négatives la reprennent pour
	   garder les cartes alignées sur le titre. */
	margin: 12px -10px -20px;
	padding: 10px 10px 36px;
	overflow-x: auto;
	scroll-snap-type: x proximity;
	scroll-padding-inline: 10px;
	scrollbar-width: none;
	-webkit-overflow-scrolling: touch;
}
.emg-tools-rail::-webkit-scrollbar { display: none; }
.emg-tool-mini {
	flex: 0 0 auto; scroll-snap-align: start;
	display: flex; align-items: center; gap: 14px;
	width: 260px;
	padding: 18px 20px;
	border-radius: 18px;
	background: var(--card);
	border: 1px solid var(--line);
	box-shadow: var(--shadow-soft);
	color: var(--ink);
	transition: transform .4s var(--ease-out), border-color .3s ease, box-shadow .4s ease;
}
.emg-tool-mini:hover {
	transform: translateY(-3px);
	border-color: color-mix(in srgb, var(--accent) 35%, var(--line));
	box-shadow: var(--shadow);
}
.emg-tool-mini .emg-tool-ico { width: 40px; height: 40px; border-radius: 12px; flex: none; }
.emg-tool-mini .emg-tool-ico svg { width: 20px; height: 20px; }
.emg-tool-mini strong { flex: 1; min-width: 0; font-size: 14.5px; letter-spacing: -.01em; }
.emg-tool-mini-go { flex: none; color: var(--accent); display: grid; place-items: center; }
.emg-tool-mini-go svg { transition: transform .35s var(--ease-out); }
.emg-tool-mini:hover .emg-tool-mini-go svg { transform: translateX(3px); }

/* Page Empreinte carbone : verdict chiffré, poids, hébergement, projection. */
.emg-carbon-report { margin-top: 64px; display: grid; gap: 20px; }
.emg-carbon-figure { display: flex; align-items: baseline; gap: 10px; margin-top: 10px; }
.emg-carbon-figure b { font-size: clamp(34px, 5vw, 52px); font-weight: 200; letter-spacing: -.03em; line-height: 1; }
.emg-carbon-figure em { font-style: normal; font-size: 13.5px; color: var(--ink2); }
.emg-carbon-cols { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }
.emg-carbon-weight { display: flex; align-items: baseline; gap: 10px; margin-top: 14px; }
.emg-carbon-weight b { font-size: 30px; font-weight: 200; letter-spacing: -.02em; }
.emg-carbon-weight span { font-size: 13px; color: var(--ink2); }
.emg-carbon-report .emg-audit-res-bars { margin-top: 18px; }
.emg-carbon-host { display: flex; align-items: center; gap: 13px; margin-top: 16px; }
.emg-carbon-leaf {
	display: grid; place-items: center; flex: none;
	width: 42px; height: 42px; border-radius: 50%;
	background: color-mix(in srgb, var(--ink2) 10%, transparent);
	color: var(--ink2);
}
.emg-carbon-host.is-green .emg-carbon-leaf { background: color-mix(in srgb, #0d9455 14%, transparent); color: #0d9455; }
.emg-carbon-host.is-grey .emg-carbon-leaf { background: color-mix(in srgb, #f0a72d 16%, transparent); color: #c8820f; }
.emg-carbon-host strong { font-size: 15.5px; letter-spacing: -.01em; }
.emg-carbon-provider { margin-top: 10px; font-size: 12.5px; font-weight: 600; color: var(--ink2); }
.emg-carbon-proj { display: flex; align-items: flex-end; gap: 28px; flex-wrap: wrap; margin-top: 16px; }
.emg-carbon-visits { display: grid; gap: 7px; }
.emg-carbon-visits span { font-size: 12.5px; font-weight: 600; color: var(--ink2); }
.emg-carbon-visits input {
	width: 160px;
	padding: 11px 15px;
	font: inherit; font-size: 15px; font-variant-numeric: tabular-nums;
	color: var(--ink);
	background: var(--bg);
	border: 1px solid var(--line);
	border-radius: 12px;
}
.emg-carbon-visits input:focus {
	outline: none; border-color: var(--accent);
	box-shadow: 0 0 0 4px color-mix(in srgb, var(--accent) 13%, transparent);
}
.emg-carbon-year { display: flex; align-items: baseline; gap: 9px; }
.emg-carbon-year b { font-size: clamp(28px, 4vw, 40px); font-weight: 200; letter-spacing: -.03em; }
.emg-carbon-year em { font-style: normal; font-size: 13px; color: var(--ink2); }
.emg-carbon-eq-title, .emg-carbon-method-title {
	margin-top: 28px;
	font-size: 12.5px; font-weight: 700; letter-spacing: .07em; text-transform: uppercase;
	color: var(--accent);
}
.emg-carbon-eq { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; margin-top: 16px; }
.emg-carbon-eq div {
	padding: 18px 20px;
	border: 1px solid var(--line);
	border-radius: 16px;
}
.emg-carbon-eq b { display: block; font-size: 24px; font-weight: 200; letter-spacing: -.02em; font-variant-numeric: tabular-nums; }
.emg-carbon-eq span { display: block; margin-top: 4px; font-size: 12.5px; color: var(--ink2); }
@media (max-width: 860px) {
	.emg-carbon-cols { grid-template-columns: 1fr; }
	.emg-carbon-eq { grid-template-columns: 1fr; }
}

/* Page Textes légaux : parcours en étapes + documents générés. */
.emg-legal-form { margin-top: 34px; display: grid; gap: 20px; }
/* Progression du parcours. */
.emg-legal-progress { display: flex; align-items: center; gap: 18px; }
.emg-legal-bar {
	flex: 1; height: 6px; border-radius: 99px; overflow: hidden;
	background: color-mix(in srgb, var(--line) 60%, transparent);
}
.emg-legal-bar i {
	display: block; height: 100%; width: 0;
	border-radius: 99px;
	background: linear-gradient(90deg, #0a36f7, #35b3f7);
	transition: width .5s var(--ease-out);
}
.emg-legal-count {
	flex: none;
	font-size: 11.5px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase;
	color: var(--ink2);
}
.emg-legal-step {
	margin: 0; padding: clamp(26px, 3.2vw, 38px);
	border: 1px solid var(--line);
	border-radius: var(--radius);
	background: var(--card);
	box-shadow: var(--shadow-soft);
}
.emg-legal-step legend {
	padding: 0 10px;
	font-size: 12px; font-weight: 700; letter-spacing: .14em; text-transform: uppercase;
	color: var(--accent);
}
.emg-legal-lead { margin: 2px 0 22px; font-size: 14px; line-height: 1.6; color: var(--ink2); max-width: 68ch; }
.emg-legal-step.is-gate { border-color: color-mix(in srgb, var(--accent) 30%, var(--line)); }
/* Navigation entre les étapes. */
.emg-legal-nav { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; }
.emg-legal-nav .emg-btn { min-width: 150px; justify-content: center; }
.emg-legal-docs { display: grid; grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); gap: 12px; }
.emg-legal-doc input { position: absolute; opacity: 0; pointer-events: none; }
.emg-legal-doc-card {
	display: grid; gap: 5px; height: 100%;
	padding: 18px 20px;
	border: 1px solid var(--line);
	border-radius: 16px;
	cursor: pointer;
	transition: border-color .3s ease, background .3s ease, transform .3s var(--ease-out);
}
.emg-legal-doc-card strong { font-size: 15px; letter-spacing: -.01em; }
.emg-legal-doc-card em { font-style: normal; font-size: 12.5px; line-height: 1.5; color: var(--ink2); }
.emg-legal-doc-card:hover { transform: translateY(-2px); }
.emg-legal-doc input:checked + .emg-legal-doc-card {
	border-color: var(--accent);
	background: color-mix(in srgb, var(--accent) 6%, transparent);
}
.emg-legal-doc input:focus-visible + .emg-legal-doc-card { outline: 2px solid var(--accent); outline-offset: 3px; }
.emg-legal-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
.emg-legal-grid > label, .emg-legal-area { display: grid; gap: 7px; min-width: 0; }
.emg-legal-grid > label.is-wide { grid-column: 1 / -1; }
.emg-legal-grid span, .emg-legal-area span, .emg-legal-sublabel {
	font-size: 12.5px; font-weight: 600; color: var(--ink2);
}
.emg-legal-form input[type=text], .emg-legal-form input[type=email], .emg-legal-form input[type=tel],
.emg-legal-form input[type=url], .emg-legal-form select, .emg-legal-form textarea {
	width: 100%;
	padding: 12px 16px;
	font: inherit; font-size: 14.5px;
	color: var(--ink);
	background: var(--bg);
	border: 1px solid var(--line);
	border-radius: 12px;
	transition: border-color .3s ease, box-shadow .3s ease;
}
.emg-legal-form textarea { border-radius: 16px; resize: vertical; }
.emg-legal-form input:focus, .emg-legal-form select:focus, .emg-legal-form textarea:focus {
	outline: none;
	border-color: var(--accent);
	box-shadow: 0 0 0 4px color-mix(in srgb, var(--accent) 13%, transparent);
}
.emg-legal-checks { display: flex; flex-wrap: wrap; gap: 10px; }
/* Inventaires : cases en colonnes, lisibles même nombreuses. */
.emg-legal-checks.is-grid {
	display: grid; grid-template-columns: repeat(auto-fill, minmax(230px, 1fr));
	gap: 12px 20px;
}
.emg-legal-checks.is-stack { display: grid; gap: 12px; }
.emg-legal-checks.is-grid .emg-legal-check,
.emg-legal-checks.is-stack .emg-legal-check { align-items: flex-start; }
.emg-legal-checks.is-grid span, .emg-legal-checks.is-stack span { line-height: 1.45; }
.emg-legal-check { display: inline-flex; align-items: center; gap: 9px; cursor: pointer; }

.emg-legal-check span { font-size: 13.5px; color: var(--ink); }
.emg-legal-subchecks { display: flex; flex-direction: column; gap: 9px; }
.emg-legal-consent { display: flex; align-items: flex-start; gap: 11px; margin-top: 18px; cursor: pointer; }
.emg-legal-consent input { margin-top: 2px; }
.emg-legal-consent span { font-size: 13.5px; line-height: 1.6; color: var(--ink2); }
.emg-legal-status { font-size: 13px; font-weight: 600; color: var(--accent); }
.emg-legal-err { margin-top: 12px; font-size: 13.5px; font-weight: 600; color: #d43c3c; }
.emg-legal-results { margin-top: 56px; }
.emg-legal-results-title { font-size: clamp(24px, 3vw, 32px); letter-spacing: -.025em; }
.emg-legal-doc-out {
	margin-top: 16px;
	padding: 24px clamp(20px, 3vw, 32px);
	border: 1px solid var(--line);
	border-radius: var(--radius);
	background: var(--card);
	box-shadow: var(--shadow-soft);
}
.emg-legal-doc-out summary { cursor: pointer; display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap; }
.emg-legal-doc-out summary strong { font-size: 18px; letter-spacing: -.015em; }
.emg-legal-doc-out summary em { font-style: normal; font-size: 13px; color: var(--ink2); }
.emg-legal-doc-body { margin-top: 18px; max-width: 78ch; }
.emg-legal-doc-body h3 { margin-top: 20px; font-size: 14.5px; letter-spacing: -.01em; }
.emg-legal-doc-body p { margin-top: 7px; font-size: 14px; line-height: 1.7; color: var(--ink2); white-space: pre-wrap; }
.emg-legal-doc-actions { display: flex; gap: 10px; flex-wrap: wrap; margin-top: 24px; }
.emg-legal-doc-err { margin-top: 14px; font-size: 13.5px; color: #d43c3c; }
@media (max-width: 760px) {
	.emg-legal-grid { grid-template-columns: 1fr; }
	.emg-secu-row { grid-template-columns: 22px minmax(0, 1fr); }
	.emg-secu-val { grid-column: 2; text-align: left; justify-items: start; max-width: none; }
}

/* Page Support : groupes de ressources en cartes cliquables. */
.emg-support-group { margin-top: clamp(40px, 5vw, 64px); }
.emg-support-group:first-child { margin-top: 0; }
.emg-support-title { font-size: 24px; letter-spacing: -.02em; }
.emg-support-text { color: var(--ink2); font-size: 15.5px; line-height: 1.65; margin-top: 10px; max-width: 62ch; }
.emg-support-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; margin-top: 28px; }
.emg-support-card {
	display: flex; align-items: flex-start; gap: 16px;
	padding: 26px 24px;
	border-radius: var(--radius);
	background: var(--card);
	border: 1px solid var(--line);
	box-shadow: var(--shadow-soft);
	color: var(--ink);
	transition: transform .35s var(--ease-out), border-color .35s ease, box-shadow .35s ease;
}
.emg-support-card:hover {
	transform: translateY(-4px);
	border-color: color-mix(in srgb, var(--accent) 26%, var(--line));
	box-shadow: var(--shadow);
	color: var(--ink);
}
.emg-support-body { display: flex; flex-direction: column; gap: 5px; min-width: 0; }
.emg-support-body strong { font-size: 16.5px; letter-spacing: -.01em; }
.emg-support-body span { font-size: 14px; line-height: 1.55; color: var(--ink2); }
.emg-support-cta {
	margin-left: auto; align-self: center; flex: none;
	font-size: 12.5px; font-weight: 700;
	color: var(--accent);
	white-space: nowrap;
}
/* Double action Windows / macOS des outils d'assistance. */
.emg-support-actions { margin-left: auto; align-self: center; flex: none; display: flex; gap: 8px; }
.emg-support-plat {
	font-size: 12px; font-weight: 700; line-height: 1;
	padding: 8px 13px; border-radius: 99px;
	color: var(--accent);
	background: color-mix(in srgb, var(--accent) 9%, transparent);
	border: 1px solid color-mix(in srgb, var(--accent) 22%, transparent);
	white-space: nowrap;
	transition: background .25s ease, color .25s ease;
}
.emg-support-plat:hover { background: var(--accent); color: #f7feff; }
.emg-support-help {
	margin-top: clamp(48px, 6vw, 72px);
	display: flex; align-items: center; justify-content: space-between;
	gap: 32px; flex-wrap: wrap;
	padding: 40px clamp(28px, 4vw, 56px);
	border-radius: var(--radius);
	background: var(--navy); color: #f7feff;
	box-shadow: var(--shadow);
}
.emg-support-help h2 { font-size: 24px; letter-spacing: -.02em; }
.emg-support-help p { margin-top: 10px; color: rgba(247, 254, 255, .75); font-size: 15px; line-height: 1.65; max-width: 52ch; }
@media (max-width: 760px) {
	.emg-support-grid { grid-template-columns: 1fr; }
	.emg-support-card { flex-wrap: wrap; }
	.emg-support-cta, .emg-support-actions { margin-left: 50px; }
}

/* Étapes « Et ensuite ? » : rassurer sur la suite, numéros EMGX. */
.emg-contact-next { margin-top: clamp(56px, 7vw, 96px); }
.emg-contact-steps {
	display: grid; grid-template-columns: repeat(3, 1fr);
	gap: 20px; margin-top: 36px;
}
.emg-contact-step {
	position: relative; overflow: hidden;
	padding: 30px 28px;
	border-radius: var(--radius);
	background: var(--card);
	border: 1px solid var(--line);
	box-shadow: var(--shadow-soft);
	transition: transform .35s var(--ease-out), border-color .35s ease;
}
.emg-contact-step:hover { transform: translateY(-4px); border-color: color-mix(in srgb, var(--accent) 24%, var(--line)); }
.emg-contact-step-num { display: block; font-size: 26px; color: var(--accent); }
.emg-contact-step h3 { font-size: 17.5px; font-weight: 700; letter-spacing: -.015em; margin-top: 16px; }
.emg-contact-step p { font-size: 14.5px; line-height: 1.6; color: var(--ink2); margin-top: 8px; }
@media (max-width: 760px) {
	.emg-contact-steps { grid-template-columns: 1fr; }
}

/* Carte (OpenStreetMap) — carte glass, stylée par thème. */
.emg-map-card {
	position: relative;
	margin-top: clamp(48px, 6vw, 80px);
	border-radius: var(--radius);
	overflow: hidden;
	border: 1px solid var(--line);
	box-shadow: var(--shadow-soft);
}
/* Carte statique : une image, pas un iframe (voir page-contact.php).
   Teinte bleutée de marque : désaturation complète puis re-teinte
   (sépia puis rotation bleue), plus aucun vert de la carte d'origine. */
.emg-map-view { position: relative; display: block; line-height: 0; }
.emg-map-view img {
	display: block; width: 100%; height: clamp(320px, 40vw, 440px);
	object-fit: cover; object-position: 50% 50%;
	filter: grayscale(1) sepia(.55) hue-rotate(190deg) saturate(2.2) brightness(1.03) contrast(.98);
}
/* Le repère est posé en HTML, donc hors de la teinte : il garde le bleu
   d'accent alors que le plan vire au bleu de marque. Sa POINTE tombe sur
   l'adresse, d'où le décalage d'une hauteur entière vers le haut. */
.emg-map-pin {
	position: absolute; left: 50%; top: 50%;
	transform: translate(-50%, -100%);
	color: var(--accent);
	filter: drop-shadow(0 4px 10px rgba(2, 3, 31, .35));
	pointer-events: none;
}
.emg-map-open { position: absolute; inset: 0; }
.emg-map-credit {
	position: absolute; right: 10px; top: 10px;
	padding: 3px 8px; border-radius: 8px;
	font-size: 10.5px; line-height: 1.6; letter-spacing: .01em;
	color: var(--ink2);
	background: color-mix(in srgb, var(--bg) 78%, transparent);
	backdrop-filter: blur(8px);
	-webkit-backdrop-filter: blur(8px);
}
.emg-map-credit:hover { color: var(--accent); }.emg-map-chip {
	position: absolute; left: 16px; bottom: 16px;
	display: flex; align-items: center; gap: 14px;
	max-width: calc(100% - 32px);
	padding: 13px 16px;
	border-radius: 18px;
	background: color-mix(in srgb, var(--bg) 76%, transparent);
	border: 1px solid var(--glass-brd);
	backdrop-filter: blur(20px) saturate(1.5);
	-webkit-backdrop-filter: blur(20px) saturate(1.5);
	box-shadow: var(--shadow-soft);
}
.emg-map-chip-text { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.emg-map-chip-text strong { font-size: 14px; letter-spacing: -.01em; }
.emg-map-chip-text span { font-size: 12.5px; color: var(--ink2); }
.emg-map-btn { padding: 10px 18px; font-size: 13px; flex: none; }
@media (max-width: 640px) {
	.emg-map-chip { flex-wrap: wrap; }
}
.emg-availability {
	display: inline-flex; align-items: center; gap: 9px;
	font-size: 13px; font-weight: 600; color: var(--ink2);
}
.emg-availability .emg-chip-dot { box-shadow: 0 0 10px var(--cyan); }

/* -------------------------------------------------------------------- Blog */
.emg-blog-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 32px; margin-top: 64px; }
.emg-post-card { display: flex; flex-direction: column; color: var(--ink); }
.emg-post-card-media {
	border-radius: var(--radius);
	overflow: hidden;
	aspect-ratio: 16 / 10;
	background: linear-gradient(135deg, var(--navy), #123498);
	box-shadow: var(--shadow-soft);
}
.emg-post-card-media img { width: 100%; height: 100%; object-fit: cover; transition: transform .7s var(--ease-out); }
.emg-post-card:hover .emg-post-card-media img { transform: scale(1.05); }
.emg-post-card-meta { display: flex; gap: 14px; font-size: 12.5px; color: var(--ink2); margin-top: 18px; font-weight: 600; }
.emg-post-card h2 { font-size: 21px; font-weight: 700; letter-spacing: -.02em; margin-top: 10px; line-height: 1.3; }
.emg-post-card:hover h2 { color: var(--accent); }
.emg-post-card-excerpt { font-size: 14.5px; color: var(--ink2); margin-top: 10px; line-height: 1.6; }

.emg-single { max-width: 780px; margin: 0 auto; }
/* ---- Pages legales : plus de place, sans allonger les lignes ----
   Le bloc etait a 780 px dans une page de 1440 : une colonne etroite perdue
   au milieu du vide, ce qui se lit comme du renferme (retour Loris). Mais la
   ligne y faisait DEJA 107 signes, mesures — l'elargir seul l'aurait poussee
   a 126, et une ligne de cette longueur se lit mal.

   Les deux vont donc ensemble : la colonne gagne 13 % et le corps du texte
   autant. Le rapport largeur / corps ne bouge pas, la ligne garde ses 107
   signes, et tout est plus grand. C'est ce « plus grand » qui fait le
   confort demande, pas la largeur seule. */
.emg-single.is-legal { max-width: 880px; }
.emg-single.is-legal .emg-prose { font-size: 18.5px; line-height: 1.72; }
.emg-single.is-legal .emg-prose h2 { font-size: 31px; }
.emg-single.is-legal .emg-prose h3 { font-size: 23px; }
.emg-single-hero { max-width: 980px; margin: 40px auto 0; }
.emg-single-hero img { border-radius: var(--radius-lg); box-shadow: var(--shadow); width: 100%; }
/* Hero des réalisations : cadre 16:9 pleine largeur de contenu — la cible
   exacte du zoom depuis la carte (R17). */
.emg-single-hero-wrap { margin-top: 36px; }
.emg-single-hero-wrap .emg-single-hero {
	max-width: none; margin: 0;
	aspect-ratio: 16 / 9;
	overflow: hidden;
	border-radius: var(--radius-lg);
	box-shadow: var(--shadow);
}
.emg-single-hero-wrap .emg-single-hero img {
	width: 100%; height: 100%; object-fit: cover;
	border-radius: 0; box-shadow: none;
}

/* Arrivée depuis le zoom : l'image persiste au même endroit dès le premier
   rendu (pseudo-élément piloté par variables CSS), le contenu attend. */
html.emg-arriving #emg-main,
html.emg-arriving .emg-footer { opacity: 0; }
/* La barre du cadre, dessinée en dur : au premier rendu de la fiche, le
   JS n'a pas encore démarré, et sans elle le cadre disparaîtrait juste
   avant de se poser. Trois pastilles en dégradés radiaux pour la gauche, et
   l'ADRESSE au centre — elle voyage en variable CSS depuis la carte de
   départ (--emgz-url, posée par l'amorce du <head>). Elle n'y était pas :
   l'adresse disparaissait pendant tout le zoom d'arrivée et ne revenait
   qu'avec le vrai cadre, à la fin (retour Loris, 2026-08-30).
   Un pseudo-élément n'a pas d'enfant : le champ arrondi qui l'entoure sur
   le vrai cadre ne peut pas être dessiné ici, seul le texte l'est. Sur
   quatre dixièmes de seconde, c'est l'adresse qui compte, pas sa pilule. */
html.emg-arriving::before {
	content: var(--emgz-url, '');
	position: fixed; z-index: 301;
	box-sizing: border-box;
	display: grid; place-items: center;
	/* Le pseudo-element pend a <html> et la pile de la marque est posee sur
	   <body> : sans cette ligne, l'adresse s'affiche en Times le temps de
	   l'arrivee, puis saute en Manrope quand le vrai cadre se pose. */
	font-family: 'Manrope', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
	font-size: 11px; font-weight: 600; color: var(--ink3);
	white-space: nowrap; overflow: hidden;
	left: var(--emgz-x, 50%); top: var(--emgz-y, 50%);
	width: var(--emgz-w, 0); height: var(--emgz-bar, 34px);
	border-radius: var(--radius) var(--radius) 0 0;
	border-bottom: 1px solid rgba(2, 3, 31, .09);
	background:
		radial-gradient(circle 4px at 16px 50%, rgba(2, 3, 31, .15) 98%, transparent 100%) no-repeat,
		radial-gradient(circle 4px at 30px 50%, rgba(2, 3, 31, .15) 98%, transparent 100%) no-repeat,
		radial-gradient(circle 4px at 44px 50%, rgba(2, 3, 31, .15) 98%, transparent 100%) no-repeat,
		linear-gradient(#f3f5f7, #f3f5f7);
	box-shadow: 0 44px 130px -32px rgba(2, 3, 31, .55);
}
html.emg-arriving::after {
	content: '';
	position: fixed; z-index: 300;
	left: var(--emgz-x, 50%); top: calc(var(--emgz-y, 50%) + var(--emgz-bar, 34px));
	width: var(--emgz-w, 0); height: calc(var(--emgz-h, 0) - var(--emgz-bar, 34px));
	background-image: var(--emgz-img);
	/* Ancré en haut : le raccord avec la fenêtre parallax (qui démarre sur
	   le haut de la capture) se fait sans saut. */
	background-size: cover; background-position: center top;
	border-radius: 0 0 var(--radius) var(--radius);
	box-shadow: 0 44px 130px -32px rgba(2, 3, 31, .55);
}

/* Clone volant du zoom carte → réalisation. C'est une copie conforme du
   cadre de navigateur : barre, adresse et roue de chargement partent avec
   l'image. Seule la position est reprise ici. */
.emg-work-zoom {
	position: fixed; z-index: 300;
	overflow: hidden;
	border-radius: var(--radius);
	box-shadow: 0 44px 130px -32px rgba(2, 3, 31, .55);
	background: var(--card);
	will-change: left, top, width, height;
}
.emg-work-zoom img { width: 100%; height: 100%; object-fit: cover; object-position: center top; display: block; }
.emg-single-meta { display: flex; gap: 16px; flex-wrap: wrap; font-size: 13px; font-weight: 600; color: var(--ink2); }
.emg-single-title { font-size: clamp(34px, 4.6vw, 60px); letter-spacing: -.035em; margin-top: 20px; }
.emg-single-chapo { font-size: 19px; line-height: 1.65; color: var(--ink2); margin-top: 24px; }

/* ---- pages légales : sommaire, bloc d'identité, renvois entre pages ---- */
.emg-legal-toc {
	margin-top: 48px;
	padding: clamp(22px, 3vw, 32px) clamp(20px, 3vw, 34px);
	border: 1px solid var(--line);
	border-radius: var(--radius);
	background: var(--card);
	box-shadow: var(--shadow-soft);
}
.emg-legal-toc-title {
	display: block;
	font-size: 11.5px; font-weight: 700; letter-spacing: .16em; text-transform: uppercase;
	color: var(--ink2);
}
.emg-legal-toc ol {
	margin: 16px 0 0; padding-left: 1.25em;
	display: grid; gap: 8px 28px;
	font-size: 15px;
}
/* Deux colonnes des qu'il y a la place : onze entrees sur une seule colonne
   repoussent le texte d'un demi-ecran. */
@media (min-width: 640px) { .emg-legal-toc ol { grid-template-columns: 1fr 1fr; } }
.emg-legal-toc a { color: var(--ink); text-decoration: none; }
.emg-legal-toc a:hover { color: var(--accent); text-decoration: underline; text-underline-offset: 3px; }

/* Identite de l'editeur : deux colonnes sur grand ecran, empilee au doigt. */
.emg-legal-ident { margin: 1.2em 0 0; display: grid; gap: 4px 28px; }
@media (min-width: 620px) {
	.emg-legal-ident { grid-template-columns: minmax(150px, max-content) 1fr; gap: 12px 28px; }
	.emg-legal-ident dt { grid-column: 1; }
	.emg-legal-ident dd { grid-column: 2; }
}
.emg-legal-ident dt {
	font-size: 12.5px; font-weight: 700; letter-spacing: .1em; text-transform: uppercase;
	color: var(--ink2); padding-top: 3px;
}
.emg-legal-ident dd { margin: 0 0 14px; }
@media (min-width: 620px) { .emg-legal-ident dd { margin-bottom: 0; } }

.emg-legal-siblings {
	margin-top: 3em; padding-top: 1.6em;
	border-top: 1px solid var(--line);
	display: flex; flex-wrap: wrap; align-items: baseline; gap: 10px 22px;
	font-size: 15px;
}
.emg-legal-siblings-title {
	font-size: 11.5px; font-weight: 700; letter-spacing: .16em; text-transform: uppercase;
	color: var(--ink3);
}

.emg-prose { margin-top: 56px; font-size: 16.5px; line-height: 1.75; }
.emg-prose > * + * { margin-top: 1.2em; }
.emg-prose h2 { font-size: 28px; letter-spacing: -.025em; margin-top: 2em; font-weight: 800; }
.emg-prose h3 { font-size: 21px; letter-spacing: -.02em; margin-top: 1.8em; font-weight: 700; }
.emg-prose a { font-weight: 600; text-decoration: underline; text-underline-offset: 3px; text-decoration-color: color-mix(in srgb, var(--accent) 45%, transparent); }
.emg-prose img { border-radius: var(--radius); box-shadow: var(--shadow-soft); }
.emg-prose blockquote {
	margin: 1.6em 0; padding: 4px 0 4px 24px;
	border-left: 2px solid var(--accent);
	font-weight: 600; color: var(--ink);
	font-size: 18px;
}
.emg-prose ul, .emg-prose ol { padding-left: 1.3em; }
.emg-prose li + li { margin-top: .5em; }
.emg-prose code {
	font-family: ui-monospace, 'SF Mono', Consolas, monospace;
	font-size: .88em;
	background: var(--card);
	border: 1px solid var(--line);
	border-radius: 6px;
	padding: .15em .4em;
}
.emg-prose pre {
	background: var(--navy); color: #dbe6ff;
	padding: 24px; border-radius: 16px;
	overflow-x: auto;
	font-size: 14px; line-height: 1.6;
}
.emg-prose pre code { background: none; border: 0; padding: 0; }

.emg-related { margin-top: 110px; }

/* -------------------------------------------------------- Single réalisation */
.emg-work-single-head { display: grid; grid-template-columns: 1.4fr 1fr; gap: 48px; align-items: end; }
.emg-work-facts {
	display: grid; grid-template-columns: 1fr 1fr;
	gap: 20px 32px;
	padding: 28px 32px;
	border-radius: var(--radius);
	background: var(--card);
	border: 1px solid var(--line);
}
.emg-fact-label { font-size: 11px; font-weight: 700; letter-spacing: .18em; color: var(--ink2); text-transform: uppercase; }
.emg-fact-value { font-size: 15px; font-weight: 700; margin-top: 5px; }
.emg-work-gallery { display: grid; gap: 24px; margin-top: 64px; }
.emg-work-gallery img { border-radius: var(--radius); box-shadow: var(--shadow); width: 100%; }
.emg-work-testimonial {
	margin-top: 72px;
	padding: 44px clamp(28px, 4vw, 56px);
	border-radius: var(--radius);
	background: var(--card);
	border: 1px solid var(--line);
}
.emg-work-testimonial blockquote { margin: 14px 0 0; font-size: 20px; font-weight: 600; line-height: 1.5; letter-spacing: -.01em; }
/* Avis Google lié : replié à trois lignes, déplié par le bouton (le JS ne
   montre le bouton que si le texte déborde, voir initReviewClamp). */
.emg-review-clamp {
	display: -webkit-box;
	-webkit-box-orient: vertical;
	-webkit-line-clamp: 3;
	overflow: hidden;
}
.emg-review-clamp.is-open { display: block; overflow: visible; }
.emg-review-more {
	display: inline-flex; align-items: center; gap: 6px;
	margin-top: 12px; padding: 0;
	border: 0; background: none; cursor: pointer;
	font: inherit; font-size: 13px; font-weight: 700;
	color: var(--accent);
}
.emg-review-more svg { transition: transform .25s var(--ease-out); }
.emg-review-more.is-open svg { transform: rotate(180deg); }
/* Auteur + source d'un avis Google : lien discret vers l'avis d'origine,
   il ne se signale qu'au survol. */
.emg-quote-source { color: inherit; text-decoration: none; transition: color .25s ease; }
.emg-quote-source:hover, .emg-quote-source:hover strong { color: var(--accent); }
.emg-service-tags { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 8px; }
.emg-tag {
	font-size: 12.5px; font-weight: 700;
	padding: 7px 14px; border-radius: 99px;
	border: 1px solid var(--line);
	color: var(--ink);
}
a.emg-tag:hover { border-color: var(--accent); color: var(--accent); }

/* --------------------------------------------------------------------- 404 */
/* Page 404 : le logomark part en vadrouille entre les deux chiffres. */
.emg-404 {
	min-height: 78vh;
	display: flex; flex-direction: column; align-items: center; justify-content: center;
	text-align: center;
	padding: 130px var(--gutter) 90px;
}
.emg-404-inner { display: flex; flex-direction: column; align-items: center; }
.emg-404-visual { display: flex; align-items: baseline; gap: clamp(2px, .5vw, 8px); }
.emg-404-digit {
	font-size: clamp(90px, 15vw, 190px);
	font-weight: 200; line-height: 1;
	background: linear-gradient(120deg, var(--accent), var(--cyan));
	-webkit-background-clip: text; background-clip: text;
	color: transparent;
	font-variant-numeric: tabular-nums;
}
.emg-404 h1 { margin-top: 26px; font-size: clamp(26px, 3.5vw, 44px); letter-spacing: -.025em; }
.emg-404-text { margin-top: 14px; color: var(--ink2); max-width: 54ch; line-height: 1.7; }
.emg-404-search { margin-top: 34px; width: min(520px, 100%); }
.emg-404-links-title {
	margin-top: 44px;
	font-size: 11px; font-weight: 700; letter-spacing: .2em; text-transform: uppercase;
	color: var(--ink2);
}
.emg-404-joke {
	margin-top: 46px;
	font-size: 12.5px; font-style: italic; color: var(--ink3);
}

/* Raccourcis en pilules (404 + recherche). */
.emg-search-shortcuts { display: flex; flex-wrap: wrap; justify-content: center; gap: 10px; margin-top: 18px; }
.emg-pill-link {
	padding: 9px 18px;
	border-radius: 999px;
	border: 1px solid var(--line);
	background: var(--card);
	font-size: 13.5px; font-weight: 600;
	color: var(--ink);
	transition: transform .3s var(--ease-out), border-color .3s ease, color .3s ease;
}
.emg-pill-link:hover { transform: translateY(-2px); border-color: var(--accent); color: var(--accent); }

/* FAQ : accordéons par thème. */
.emg-faq { display: grid; gap: clamp(36px, 5vw, 56px); }
.emg-faq-group-title { display: flex; align-items: center; gap: 14px; font-size: clamp(20px, 2.4vw, 26px); letter-spacing: -.02em; }
.emg-faq-group-title .emgx-num { font-size: 20px; }
.emg-faq-items { display: grid; gap: 12px; margin-top: 22px; }
.emg-faq-item {
	padding: 22px clamp(20px, 2.6vw, 30px);
	border-radius: var(--radius);
	background: var(--card);
	border: 1px solid var(--line);
	box-shadow: var(--shadow-soft);
	transition: border-color .3s ease;
}
.emg-faq-item[open] { border-color: color-mix(in srgb, var(--accent) 32%, var(--line)); }
.emg-faq-item summary {
	display: flex; align-items: center; justify-content: space-between; gap: 18px;
	cursor: pointer; list-style: none;
	font-size: clamp(15.5px, 1.7vw, 17.5px); font-weight: 700; letter-spacing: -.01em;
}
.emg-faq-item summary::-webkit-details-marker { display: none; }
.emg-faq-item summary i {
	position: relative; flex: none;
	width: 26px; height: 26px; border-radius: 50%;
	background: color-mix(in srgb, var(--accent) 10%, transparent);
}
.emg-faq-item summary i::before,
.emg-faq-item summary i::after {
	content: '';
	position: absolute; left: 50%; top: 50%;
	width: 11px; height: 1.8px; margin: -.9px 0 0 -5.5px;
	border-radius: 2px;
	background: var(--accent);
	transition: transform .35s var(--ease-out);
}
.emg-faq-item summary i::after { transform: rotate(90deg); }
.emg-faq-item[open] summary i::after { transform: rotate(0); }
.emg-faq-item p { margin-top: 14px; font-size: 15px; line-height: 1.75; color: var(--ink2); max-width: 78ch; }

/* Recherche : résultats groupés. */
.emg-search-form { max-width: 640px; margin-top: 28px; }
.emg-search-count { font-size: 14px; color: var(--ink2); }
.emg-search-count strong { color: var(--ink); }
.emg-search-group { margin-top: 40px; }
.emg-search-group-title {
	font-size: 12px; font-weight: 700; letter-spacing: .18em; text-transform: uppercase;
	color: var(--accent);
}
.emg-search-list { display: grid; gap: 10px; margin-top: 16px; }
.emg-search-hit {
	display: block;
	padding: 20px clamp(18px, 2.4vw, 26px);
	border-radius: 18px;
	background: var(--card);
	border: 1px solid var(--line);
	color: var(--ink);
	transition: transform .35s var(--ease-out), border-color .3s ease, box-shadow .35s ease;
}
.emg-search-hit:hover {
	transform: translateY(-2px);
	border-color: color-mix(in srgb, var(--accent) 35%, var(--line));
	box-shadow: var(--shadow-soft);
}
.emg-search-hit strong { font-size: 16.5px; letter-spacing: -.015em; }
.emg-search-hit p { margin-top: 6px; font-size: 14px; line-height: 1.6; color: var(--ink2); }
.emg-search-url { display: block; margin-top: 8px; font-size: 12px; color: var(--accent); overflow-wrap: anywhere; }
.emg-search-empty {
	padding: clamp(32px, 4vw, 52px);
	border-radius: var(--radius);
	border: 1px dashed var(--line);
	text-align: center;
}
.emg-search-empty h2 { font-size: clamp(20px, 2.4vw, 26px); letter-spacing: -.02em; }
.emg-search-empty p { margin: 10px auto 0; color: var(--ink2); max-width: 56ch; line-height: 1.65; }

/* --------------------------------------------------------- Mode maintenance
   Page autonome : elle ne charge ni le header ni main.js, donc tout ce dont
   elle a besoin doit tenir dans cette feuille. */
.emg-maint-body { min-height: 100vh; display: grid; place-items: center; padding: 28px; background: var(--bg); }
.emg-maint { width: min(560px, 100%); }
.emg-maint-card {
	padding: clamp(32px, 5vw, 54px);
	border-radius: var(--radius);
	background: var(--card);
	border: 1px solid var(--line);
	box-shadow: var(--shadow);
	text-align: center;
}
.emg-maint-mark { display: block; margin: 0 auto 22px; width: 44px; color: var(--ink); }
.emg-maint-badge {
	display: inline-block; margin-bottom: 16px;
	font-size: 10.5px; font-weight: 700; letter-spacing: .18em; text-transform: uppercase;
	color: var(--accent);
}
.emg-maint-card h1 { font-size: clamp(26px, 4vw, 38px); letter-spacing: -.03em; line-height: 1.15; }
.emg-maint-card > p { margin-top: 16px; font-size: 15.5px; line-height: 1.7; color: var(--ink2); }
.emg-maint-form { display: flex; gap: 10px; margin-top: 30px; flex-wrap: wrap; }
.emg-maint-form input {
	flex: 1 1 200px; min-width: 0;
	font: inherit; font-size: 15px;
	padding: 13px 18px; border-radius: 14px;
	border: 1px solid var(--line); background: var(--bg); color: var(--ink);
}
.emg-maint-form input:focus { outline: none; border-color: var(--accent); }
.emg-maint-error { margin-top: 12px; font-size: 13.5px; font-weight: 600; color: #d43c3c; }
.emg-maint-contact {
	margin-top: 28px; padding-top: 22px;
	border-top: 1px solid var(--line);
	font-size: 13.5px; color: var(--ink2);
	display: flex; gap: 10px; justify-content: center; flex-wrap: wrap;
}
.emg-maint-contact a { color: var(--ink2); }
.emg-maint-contact a:hover { color: var(--accent); }

/* ---------------------------------------------------------- Bannière cookies */
/* Bannière de consentement : carte de verre avec logomark, réglable en admin. */
.emg-cookie {
	position: fixed;
	bottom: 22px;
	z-index: 260;
	width: min(400px, calc(100vw - 32px));
	padding: 24px 26px 22px;
	border-radius: 22px;
	background: color-mix(in srgb, var(--bg) 78%, transparent);
	border: 1px solid var(--glass-brd);
	backdrop-filter: blur(30px) saturate(1.7);
	-webkit-backdrop-filter: blur(30px) saturate(1.7);
	box-shadow: var(--shadow);
	transform: translateY(26px) scale(.98); opacity: 0;
	transition: transform .55s var(--ease-out), opacity .45s ease;
}
.emg-cookie.is-left { left: 22px; }
.emg-cookie.is-right { right: 22px; }
.emg-cookie.is-center { left: 50%; transform: translate(-50%, 26px) scale(.98); }
.emg-cookie.is-visible { transform: translateY(0) scale(1); opacity: 1; }
.emg-cookie.is-center.is-visible { transform: translate(-50%, 0) scale(1); }
.emg-cookie-head { display: flex; align-items: center; gap: 12px; }
.emg-cookie-mark {
	display: grid; place-items: center; flex: none;
	width: 38px; height: 38px;
	border-radius: 12px;
	background: var(--navy);
	color: #f7feff;
}
.emg-cookie-mark svg { width: 15px; height: auto; }
.emg-cookie-title { font-size: 16px; letter-spacing: -.015em; }
.emg-cookie-text { margin-top: 12px; font-size: 13.5px; line-height: 1.6; color: var(--ink2); }
.emg-cookie-text a { font-weight: 600; color: var(--accent); white-space: nowrap; }
.emg-cookie-actions { display: flex; gap: 9px; margin-top: 18px; }
.emg-cookie-actions .emg-btn { flex: 1; justify-content: center; padding: 11px 16px; font-size: 13px; }
@media (max-width: 620px) {
	/* Mobile : pleine largeur, collée en bas — pouce accessible. */
	.emg-cookie {
		left: 12px; right: 12px; bottom: 12px;
		width: auto; max-width: none;
		padding: 20px 20px 18px;
	}
	.emg-cookie.is-center { left: 12px; transform: translateY(26px) scale(.98); }
	.emg-cookie.is-center.is-visible { transform: translateY(0) scale(1); }
	.emg-cookie-actions { flex-direction: column-reverse; }
}

/* ------------------------------------------------------------ Pagination */
/* Cette regle bat celle de la galerie de references (l.1481), meme selecteur
   a la racine : c'est elle qui peint les DEUX. D'ou le retour du flex-wrap,
   sans quoi une longue serie de numeros deborde sur telephone. */
.emg-pagination { display: flex; justify-content: center; align-items: center; gap: 8px; margin-top: 72px; flex-wrap: wrap; }
.emg-pagination .page-numbers {
	min-width: 42px; height: 42px;
	display: inline-flex; align-items: center; justify-content: center;
	padding: 0 14px;
	border-radius: 99px;
	border: 1px solid var(--line);
	color: var(--ink);
	font-weight: 700; font-size: 14px;
	transition: border-color .25s ease, color .25s ease, background .25s ease;
}
/* La grille des realisations pagine dans le navigateur : ses numeros sont des
   BOUTONS et non des liens. Un bouton n'herite ni de la police ni du fond, il
   faut les lui dire — le reste du dessin lui vient de la regle ci-dessus. */
.emg-pagination button.page-numbers {
	appearance: none; -webkit-appearance: none;
	background: transparent;
	font-family: inherit; line-height: 1;
	cursor: pointer;
}
.emg-pagination a.page-numbers:hover,
.emg-pagination button.page-numbers:hover { border-color: var(--accent); color: var(--accent); }
.emg-pagination .page-numbers.current { background: var(--ink); color: var(--bg); border-color: var(--ink); }
/* Les points de suspension ne sont pas une destination : ni cadre, ni survol. */
.emg-pagination .page-numbers.dots { border-color: transparent; color: var(--ink3); min-width: 0; padding: 0 2px; }
.emg-pagination .page-numbers.prev,
.emg-pagination .page-numbers.next { font-size: 20px; padding: 0 12px; }

/* ============================================================ Page web
   Trois sections ajoutees a la page « Creation de site internet », reprises
   des preversions mais reecrites dans le langage du theme. Aucun canvas,
   aucun flou, aucun modele 3D : tout ce qui bouge ici est une transform ou
   une opacite, c'est-a-dire ce que la carte graphique compose sans repeindre.
   ==================================================================== */

/* ---- 01 : trois prestations. Grille statique, rien de plus. ---- */
.emg-offers-head {
	display: flex; align-items: flex-end; justify-content: space-between;
	gap: clamp(20px, 3vw, 44px); flex-wrap: wrap;
	margin-bottom: clamp(34px, 4vw, 54px);
}
.emg-offers-head .emg-section-title { max-width: 15ch; }
.emg-offers-intro { max-width: 42ch; font-size: 15.5px; line-height: 1.7; color: var(--ink2); }
/* La derniere ligne claire ne colle plus au bord de la nuit. */
/* Palier avant la nuit : ce qui suit est une sequence de plusieurs ecrans,
   et les cartes ne doivent pas la toucher. Le blanc qui les separe est ce
   qui fait respirer l'entree (demande Loris). */
.emg-section.emg-offers { padding-bottom: clamp(134px, 17vh, 198px); }
.emg-offers-grid {
	display: grid; grid-template-columns: repeat(auto-fit, minmax(min(280px, 100%), 1fr));
	gap: clamp(16px, 2vw, 26px);
	align-items: stretch;
}
.emg-offer {
	display: flex; flex-direction: column; gap: 16px; min-width: 0;
	padding: clamp(26px, 3vw, 42px);
	border-radius: var(--radius);
	background: var(--bg2, #fff);
	border: 1px solid var(--line);
	transition: transform .38s var(--ease-out), border-color .3s ease, box-shadow .38s ease;
}
.emg-offer:hover {
	transform: translateY(-4px);
	border-color: color-mix(in srgb, var(--accent) 34%, var(--line));
	box-shadow: var(--shadow);
}
.emg-offer-top { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
.emg-offer-num { font-size: 12px; font-weight: 700; letter-spacing: .2em; color: var(--accent); }
.emg-offer h3 { font-size: clamp(20px, 2vw, 26px); font-weight: 800; letter-spacing: -.02em; line-height: 1.15; }
.emg-offer p { flex: 1; font-size: 15px; line-height: 1.65; color: var(--ink2); }
.emg-offer-tags { display: flex; flex-wrap: wrap; gap: 8px; list-style: none; margin: 0; padding: 0; }
.emg-offer-tags li {
	font-size: 11px; font-weight: 600; letter-spacing: .08em; text-transform: uppercase;
	color: var(--accent);
	border: 1px solid color-mix(in srgb, var(--accent) 25%, transparent);
	border-radius: 999px; padding: 6px 13px;
}
.emg-offer-go {
	display: inline-flex; align-items: center; gap: 8px;
	font-size: 14px; font-weight: 700; color: var(--accent);
	transition: gap .25s var(--ease-out);
}
.emg-offer:hover .emg-offer-go { gap: 12px; }

/* La troisieme carte porte seule la nuit : c'est la specialite, elle doit se
   detacher des deux autres sans que la section entiere change de camp. */
.emg-offer.is-hero {
	position: relative; overflow: hidden;
	color: #f7feff;
	background: linear-gradient(150deg, #061651 0%, #0a36f7 100%);
	border-color: rgba(148, 246, 255, .34);
	box-shadow: 0 18px 44px rgba(2, 3, 31, .28);
}
/* Un seul calque en mouvement, en translate : deux degrades radiaux qui
   derivent lentement. Le navigateur le compose, il ne le repeint pas. */
.emg-offer.is-hero::before {
	content: '';
	position: absolute; inset: -45%;
	pointer-events: none;
	background-image:
		radial-gradient(34% 30% at 30% 32%, rgba(148, 246, 255, .30) 0%, rgba(148, 246, 255, 0) 70%),
		radial-gradient(38% 34% at 72% 70%, rgba(10, 54, 247, .55) 0%, rgba(10, 54, 247, 0) 72%);
	will-change: transform;
}
html.js:not(.emg-motion-off) .emg-offer.is-hero::before { animation: emg-offer-drift 13s ease-in-out infinite alternate; }
@keyframes emg-offer-drift {
	from { transform: translate3d(-4%, -3%, 0); }
	to   { transform: translate3d(5%, 4%, 0); }
}
.emg-offer.is-hero > * { position: relative; }
.emg-offer.is-hero h3 { color: #f7feff; }
.emg-offer.is-hero p { color: rgba(207, 232, 255, .92); }
.emg-offer.is-hero .emg-offer-num { color: var(--cyan); }
.emg-offer.is-hero .emg-offer-tags li { color: var(--cyan); border-color: rgba(148, 246, 255, .4); }
.emg-offer.is-hero .emg-offer-go { color: #f7feff; }
.emg-offer-flag {
	font-size: 10px; font-weight: 700; letter-spacing: .14em; text-transform: uppercase;
	color: #02031f; background: var(--cyan);
	border-radius: 999px; padding: 6px 12px;
}

/* ---- La zone sombre qui porte les deux scenes. ---- */
/* La zone entre BLANCHE : elle renonce au fond que lui donnerait .emg-night,
   et c'est un calque colle a la fenetre qui l'allume au fil du defilement.
   Les jetons de couleur, eux, restent ceux de la nuit : le texte est deja
   clair, il apparait en meme temps que le fond s'assombrit. */
.emg-webdark {
	position: relative;
	background-color: transparent;
	background-image: none;
	/* De l'air aux deux bouts : sans elle, la nuit commencait au ras de la
	   derniere carte claire et se terminait au ras de la premiere, ce qui
	   donnait deux lignes de coupure franches au lieu de deux respirations. */
	padding: clamp(90px, 12vh, 150px) 0 clamp(110px, 15vh, 180px);
}
/* ABSOLU, et non colle. Un `margin-bottom: -100vh` sur un element sticky
   sert a lui faire occuper zero place, mais il etend aussi sa zone de
   collage vers le bas d'autant : l'element deborde alors de son conteneur
   et vient assombrir la section suivante. C'est ce qui posait les cartes
   « Comprendre » sur du bleu nuit. Un calque absolu couvre exactement la
   zone, ni plus ni moins.

   OPAQUE DES LE DEPART (decision Loris) : la zone ne s'assombrit plus au
   defilement, elle EST sombre. On arrive dessus, et le defile part. */
.emg-webdark-bg {
	position: absolute; inset: 0; z-index: 0;
	display: block;
	pointer-events: none;
	background-color: #02031f;
	/* Confine le calque a la zone SANS toucher a sa zone de collage. C'est
	   ce que le `margin-bottom: -100vh` de la premiere version faisait de
	   travers : il etendait le collage vers le bas et laissait la nuit
	   deborder sur la section suivante. */
	clip-path: inset(0);
}
/* Le fond fait la HAUTEUR D'UNE FENETRE et se colle en haut, exactement
   comme un hero : degrades ET nappe animee. Etale sur les 8000 px de la
   zone, les pourcentages des degrades donnaient des ovales de plusieurs
   milliers de pixels dont on ne voyait qu'une tranche, et la nappe aurait
   demande un tampon de la meme taille. A un ecran, les deux retrouvent
   l'image d'origine pour le cout d'origine. */
.emg-webdark-sky {
	position: sticky; top: 0;
	display: block; height: 100vh;
	isolation: isolate;
	background-color: #02031f;
	background-image:
		radial-gradient(58% 68% at 16% 20%, rgba(10, 54, 247, .40) 0%, rgba(10, 54, 247, 0) 62%),
		radial-gradient(52% 62% at 84% 32%, rgba(148, 246, 255, .13) 0%, rgba(148, 246, 255, 0) 60%),
		radial-gradient(80% 70% at 52% 98%, rgba(6, 22, 81, .85) 0%, rgba(2, 3, 31, 0) 72%);
}
.emg-webdark > .emg-belt,
.emg-webdark > .emg-tunnel { position: relative; z-index: 1; }

/* ---- 02 : le defile horizontal epingle. ---- */
.emg-belt-pin {
	height: 100vh; min-height: 560px;
	display: flex; flex-direction: column; justify-content: center;
	gap: clamp(22px, 3.4vh, 40px);
	padding: clamp(70px, 9vh, 100px) 0 clamp(40px, 6vh, 64px);
	overflow: hidden;
}
.emg-belt-kicker {
	display: flex; align-items: center; gap: 16px;
	font-size: 12px; font-weight: 700; letter-spacing: .2em; text-transform: uppercase;
	color: var(--cyan);
}
/* Filet qui se tire a l'entree. C'est lui qui donne le depart de la sequence :
   un trait qui part du sur-titre et file vers la droite. */
.emg-belt-kicker::after {
	content: ''; flex: none;
	height: 1px; width: 0;
	background: linear-gradient(90deg, var(--cyan), rgba(148, 246, 255, 0));
	transition: width 1.2s var(--ease-out);
}
.emg-belt-title {
	margin-top: 14px; max-width: 20ch;
	font-size: clamp(26px, 3.4vw, 46px); font-weight: 800;
	letter-spacing: -.03em; line-height: 1.08;
}
/* width: 100% explicite : .emg-container porte margin: 0 auto, et une marge
   auto sur l'axe transversal d'un conteneur flex empeche l'etirement et
   centre l'element sur sa largeur de contenu. Le titre se retrouvait a
   410 px du bord au lieu de la gouttiere. */
.emg-belt-head, .emg-belt-foot { width: 100%; }
/* Le FOND est la, sombre, des qu'on arrive dessus (decision Loris) : pas de
   bascule au defilement. Ce sont les TEXTES qui arrivent, l'un apres l'autre —
   c'est ce qui fait qu'on entre dans une sequence au lieu de tomber dedans.
   La scene s'efface en revanche sur sa fin de course, et le tunnel n'apparait
   qu'une fois en place : sans cela les deux se croisent a l'ecran. */
html.js:not(.emg-motion-off) .emg-tunnel-pin { opacity: 0; }

/* Pose de depart, portee par .is-prete que le JS ajoute : si GSAP ne se
   chargeait pas, la regle ne s'appliquerait pas et rien ne resterait invisible.
   Le titre se decouvre par un balayage plutot qu'un simple fondu ; le debord
   vertical du clip laisse passer jambages et accents. */
.emg-belt-pin.is-prete .emg-belt-kicker,
.emg-belt-pin.is-prete .emg-belt-title,
.emg-belt-pin.is-prete .emg-belt-view,
.emg-belt-pin.is-prete .emg-belt-foot {
	opacity: 0; transform: translateY(20px);
	transition: opacity .9s var(--ease-out), transform .9s var(--ease-out), clip-path 1.1s var(--ease-out);
}
.emg-belt-pin.is-prete .emg-belt-title { clip-path: inset(-.22em 100% -.32em 0); }
.emg-belt-pin.is-prete.is-entree .emg-belt-kicker,
.emg-belt-pin.is-prete.is-entree .emg-belt-title,
.emg-belt-pin.is-prete.is-entree .emg-belt-view,
.emg-belt-pin.is-prete.is-entree .emg-belt-foot { opacity: 1; transform: none; }
.emg-belt-pin.is-prete.is-entree .emg-belt-title { clip-path: inset(-.22em -.22em -.32em 0); }
.emg-belt-pin.is-prete.is-entree .emg-belt-kicker { transition-delay: .04s; }
.emg-belt-pin.is-prete.is-entree .emg-belt-kicker::after { width: min(240px, 24vw); transition-delay: .3s; }
.emg-belt-pin.is-prete.is-entree .emg-belt-title { transition-delay: .2s; }
.emg-belt-pin.is-prete.is-entree .emg-belt-view { transition-delay: .44s; }
.emg-belt-pin.is-prete.is-entree .emg-belt-foot { transition-delay: .62s; }

/* ---- Mode immersif : l'habillage recule ----
   Passe un certain point, la zone de nuit n'est plus une section de page mais
   une sequence. Le rail des sections et son bloc de contact s'effacent, le
   bouton de retour en haut aussi ; l'en-tete, lui, RESTE mais passe au sombre.
   Rien n'est supprime : tout revient a la sortie. Le drapeau est pose sur
   <html> par main.js. */
/* L'en-tete RESTE en place pendant la sequence (demande Loris) : c'est le seul
   moyen de sortir de la nuit sans revenir en arriere. Il s'assombrit pour ne
   pas la couper — les jetons clairs viennent de .is-over, que main.js lui
   ajoute, et il ne reste ici qu'a poser le fond et la ligne. */
html.emg-immersif .emg-header.is-scrolled {
	background: rgba(2, 3, 31, .52);
	border-bottom-color: rgba(247, 254, 255, .09);
	box-shadow: none;
}
/* Le translateY(-50%) est RECOPIE : le rail est centre par sa transformation,
   et une transformation qui n'en tient pas compte le ferait tomber d'une
   demi-hauteur en s'effacant. */
html.emg-immersif .emg-rail {
	opacity: 0; transform: translateY(-50%) translateX(-18px); pointer-events: none;
}
html.emg-immersif .emg-top {
	opacity: 0; transform: translateY(14px); pointer-events: none;
}
.emg-belt-view { overflow: hidden; }
.emg-belt-track {
	display: flex; gap: clamp(16px, 1.8vw, 26px);
	width: max-content;
	padding: 6px max(var(--gutter), calc((100vw - var(--container)) / 2 + var(--gutter)));
	will-change: transform;
}
.emg-belt-panel {
	flex: none; width: min(380px, 78vw);
	/* Hauteur commune : sans elle, six cartes de tailles differentes
	   flottent en haut d'un ecran aux trois quarts vide. */
	min-height: clamp(250px, 38vh, 340px);
	display: flex; flex-direction: column; gap: 14px;
	padding: clamp(24px, 2.6vw, 36px);
	border-radius: var(--radius);
	background: rgba(247, 254, 255, .05);
	border: 1px solid rgba(247, 254, 255, .12);
	/* Mise au point par l'opacite et l'echelle SEULEMENT. La preversion
	   floutait les panneaux inactifs : un filtre sur six cartes de 380 px
	   coute une passe de rendu a chaque image, pour un effet que ces deux
	   proprietes rendent presque aussi bien et sans repeindre. */
	opacity: .34;
	transform: scale(.94);
	transition: opacity .5s var(--ease-out), transform .5s var(--ease-out), border-color .5s ease;
}
.emg-belt-panel.is-near { opacity: .6; transform: scale(.97); }
.emg-belt-panel.is-on {
	opacity: 1; transform: none;
	border-color: rgba(148, 246, 255, .34);
}
/* Icone a gauche, numero a droite, sur une meme ligne. Les deux sont eteints
   sur les cartes de cote et s'allument avec celle du milieu : c'est la carte
   active qui porte la couleur, pas six a la fois. */
.emg-belt-top { display: flex; align-items: center; justify-content: space-between; gap: 14px; }
.emg-belt-icon {
	display: block;
	color: rgba(247, 254, 255, .34);
	transition: color .5s ease;
}
.emg-belt-icon svg { display: block; width: 28px; height: 28px; }
.emg-belt-panel.is-on .emg-belt-icon { color: var(--cyan); }
.emg-belt-idx {
	font-size: 12px; font-weight: 700; letter-spacing: .2em;
	color: rgba(247, 254, 255, .45);
	transition: color .5s ease;
}
.emg-belt-panel.is-on .emg-belt-idx { color: var(--cyan); }
/* Les deux marges automatiques CENTRENT le couple titre + texte dans la place
   qui reste sous l'en-tete de la carte, sans rien envelopper : une marge auto
   absorbe l'espace libre, et deux qui se font face le partagent a parts egales.
   L'en-tete, lui, reste en haut — c'est un en-tete. Les cartes n'ont pas toutes
   la meme longueur de texte, et sans cela les plus courtes laissaient un grand
   vide en bas. */
.emg-belt-panel h3 {
	margin-top: auto;
	font-size: clamp(19px, 1.9vw, 24px); font-weight: 800; letter-spacing: -.02em; line-height: 1.2;
}
.emg-belt-panel p {
	margin-bottom: auto;
	font-size: 14.5px; line-height: 1.65; color: rgba(247, 254, 255, .72);
}
.emg-belt-foot { display: flex; align-items: center; gap: 18px; }
.emg-belt-bar {
	flex: 1 1 auto; height: 3px; border-radius: 3px;
	background: rgba(247, 254, 255, .16);
	overflow: hidden;
}
.emg-belt-bar i {
	display: block; height: 100%; width: 100%;
	background: var(--cyan);
	transform: scaleX(0); transform-origin: left;
}

/* ---- 03 : le tunnel de statistiques. ---- */
/* PAS de marge negative ici. Elle avait ete posee pour resserrer les deux
   scenes, mais elles sont toutes deux EPINGLEES : faire remonter la seconde
   la fait demarrer alors que la premiere occupe encore l'ecran, et les deux
   se superposent. Elles se suivent, simplement. */
.emg-tunnel-pin {
	position: relative;
	height: 100vh; min-height: 560px;
	display: grid; place-items: center;
	overflow: hidden;
}
/* Le point de fuite. Il vit DANS la fenetre epinglee, donc il fait un ecran
   et pas la hauteur de la scene : un degrade etire sur plusieurs milliers de
   pixels ne dessinerait plus de couloir. */
/* Trainees d'etoiles projetees depuis le point de fuite. C'est le canvas de
   la preversion, repris tel quel : il peint par lots dans un tampon
   sous-echantillonne et allege son champ sur ecran tactile. Il ne tourne que
   pendant que la scene est a l'ecran. */
.emg-tunnel-stars {
	/* AU-DESSUS de la vignette : celle-ci noircit la peripherie a 80 ou 90 %
	   pour creuser le point de fuite, or c'est exactement la que vivent les
	   etoiles. Peintes dessous, elles disparaissaient. */
	position: absolute; inset: 0; z-index: 1;
	display: block; width: 100%; height: 100%;
	pointer-events: none; opacity: 0;
	transition: opacity .5s ease;
}
.emg-tunnel-glow {
	position: absolute; inset: 0; pointer-events: none; z-index: 0;
	/* Deplacee a chaque image pour suivre le fond du couloir (voir cale()
	   dans main.js) : c'est une transform, donc le compositeur la deplace
	   sans repeindre le degrade. */
	will-change: transform;
	/* PLUS DE VIGNETTE. Elle posait du sombre jusqu'aux bords du calque, meme
	   allegee : c'est de la couleur appliquee sur les cotes, donc une ligne de
	   separation nette avec la scene precedente, qui partage pourtant le meme
	   ciel. Il ne reste que la lueur centrale, et elle atteint la transparence
	   complete bien avant les bords.

	   Elle s'eteint vers un bleu d'alpha zero et non vers `transparent` : ce
	   dernier vaut rgba(0,0,0,0), et l'interpolation vers le noir laisse un
	   halo grisatre sur les valeurs intermediaires. */
	background-image:
		radial-gradient(40% 40% at 50% 50%, rgba(148, 246, 255, .26) 0%, rgba(10, 54, 247, .17) 36%, rgba(10, 54, 247, 0) 68%);
}
.emg-tunnel-kicker {
	position: absolute; z-index: 2; left: 50%; top: clamp(76px, 12vh, 124px);
	transform: translateX(-50%);
	white-space: nowrap;
	font-size: 12px; font-weight: 700; letter-spacing: .2em; text-transform: uppercase;
	color: var(--cyan);
}
.emg-tunnel-stat {
	position: absolute; left: 50%; top: 50%; z-index: 2;
	width: max-content; max-width: min(90vw, 720px);
	text-align: center;
	opacity: 0;
	transform: translate(-50%, -50%) scale(.3);
	will-change: transform, opacity;
	pointer-events: none;
}
.emg-tunnel-value {
	display: flex; align-items: flex-end; justify-content: center; gap: .04em;
	line-height: 1;
	/* Echelle de la bande de chiffres de l'accueil, et pas davantage : le
	   nombre doit se dissoudre AVANT de devenir un mur. */
	font-size: clamp(56px, 6vw, 96px);
	font-weight: 200; letter-spacing: -.03em;
	font-variant-numeric: tabular-nums;
	color: #f7feff;

	/* Extrusion : cinq ombres portees CHAINEES, chacune decalee du meme pas.
	   Chainees et non superposees — chaque passe ombre le resultat de la
	   precedente, ce qui donne un corps CONTINU et non cinq copies espacees.
	   Le pas est ecrit par main.js dans --ex / --ey, dirige du chiffre vers le
	   point de fuite : le nombre s'enfonce donc dans le couloir, et son flanc
	   suit son inclinaison. Comme le filtre s'applique avant la mise a
	   l'echelle de la scene, l'epaisseur du corps suit la taille du chiffre
	   sans qu'on ait a la calculer. */
	/* Le corps est GRIS et non bleu (demande Loris) : un flanc de lettre est
	   une face du meme materiau vue de biais, pas une couleur d'accent. Il part
	   NETTEMENT plus sombre que la face : un gris clair contre du blanc ne se
	   distinguait pas, et le nombre paraissait flou plutot qu'en relief. Il
	   s'assombrit encore le long de son parcours — les passes se chainant, la derniere
	   couleur se retrouve au bout du corps — ce qui suffit a le lire comme un
	   volume eclaire de face et non comme une ombre portee decalee. */
	--ex: 0; --ey: 2.3;
	filter:
		drop-shadow(calc(var(--ex) * 1px) calc(var(--ey) * 1px) 0 rgba(126, 141, 170, .98))
		drop-shadow(calc(var(--ex) * 1px) calc(var(--ey) * 1px) 0 rgba(101, 116, 145, .98))
		drop-shadow(calc(var(--ex) * 1px) calc(var(--ey) * 1px) 0 rgba(78, 92, 120, .98))
		drop-shadow(calc(var(--ex) * 1px) calc(var(--ey) * 1px) 0 rgba(56, 68, 95, .98))
		drop-shadow(calc(var(--ex) * 1px) calc(var(--ey) * 1px) 0 rgba(36, 46, 70, .98));
}
.emg-tunnel-value i { font-style: normal; font-size: .42em; color: var(--cyan); padding-bottom: .12em; }

/* ---- Compteurs en glyphes de la marque (EMGX) ----
   Le nombre n'est pas du texte mais un rouleau d'images SVG qui glisse d'un
   cran par unite, monte par main.js a l'approche de la scene. Deux pieges,
   tous deux vus et corriges sur les preversions :

   — la fenetre d'une colonne fait un PAS (1.16em) et non un glyphe (1em). A
     ras, la barre haute du chiffre suivant depassait d'un sous-pixel au moment
     ou la colonne s'arretait, et un trait blanc clignotait sous le nombre
     pendant l'incrementation. Les marges negatives ramenent la boite
     exterieure a 1em, pour que l'alignement sur le bas de la ligne — avec le
     « % » ou le « M » — ne bouge pas.
   — la cellule est un conteneur flex, et non un glyphe a marges : les marges
     verticales de deux blocs voisins FUSIONNENT, le pas serait tombe a 1.08em
     quand le moteur, lui, decale de 1.16, et les chiffres auraient derive d'un
     cran a chaque unite. */
.emg-tunnel-roll { display: flex; align-items: flex-end; gap: .05em; }
.emg-tunnel-col { display: block; width: 1.14em; height: 1.16em; margin: -.08em 0; overflow: hidden; }
.emg-tunnel-inner { display: block; will-change: transform; }
.emg-tunnel-cell { display: flex; align-items: center; justify-content: center; height: 1.16em; }
.emg-tunnel-cell img { display: block; height: 1em; width: auto; }
.emg-tunnel-count.is-glyph { display: block; }
/* Le nombre en texte reste dans le flux d'accessibilite, hors de vue. */
.emg-tunnel-count.is-glyph .emg-tunnel-txt {
	position: absolute; width: 1px; height: 1px;
	overflow: hidden; clip-path: inset(50%); white-space: nowrap;
}
.emg-tunnel-value i.is-glyph { display: block; }
.emg-tunnel-value i.is-glyph img { display: block; height: 1em; width: auto; margin-bottom: .06em; }
/* Seul texte sous le nombre depuis que la phrase de detail est retiree, donc
   nettement plus grand : c'est lui qui doit se lire d'un coup d'oeil pendant
   que le chiffre traverse. L'interlettrage se resserre a mesure qu'il grandit
   — a .16em, un libelle de vingt-cinq signes s'etalait sur toute la largeur. */
.emg-tunnel-label {
	display: block; margin-top: clamp(18px, 3vh, 34px);
	font-size: clamp(15px, 1.6vw, 22px); font-weight: 700;
	letter-spacing: .12em; text-transform: uppercase; color: #f7feff;
}

/* ---- Telephone et tablette ---- */
@media (max-width: 1023px) {
	/* Le defile reste epingle et pilote au scroll, telephone compris
	   (demande Loris) : l'experience est la meme partout, ce n'est pas un
	   decor reserve aux grands ecrans. Seules les proportions changent. */
	.emg-belt-pin { padding: clamp(64px, 9vh, 96px) 0 clamp(36px, 5vh, 56px); gap: clamp(18px, 3vh, 30px); }
	.emg-belt-panel { min-height: clamp(230px, 34vh, 300px); }
	.emg-tunnel-pin { min-height: 480px; }
}
@media (max-width: 560px) {
	.emg-belt-panel { width: min(320px, 82vw); }
}

/* Mouvement reduit : plus de scene, une liste. Ce qui etait un effet
   devient un contenu, et rien ne se perd. */
html.emg-motion-off .emg-belt-pin,
html.emg-motion-off .emg-tunnel-pin { height: auto; min-height: 0; display: block; }
html.emg-motion-off .emg-belt-panel { opacity: 1; transform: none; }
/* Sans le translate3d du moteur, la piste horizontale ne montrait que la
   première carte : en mouvement réduit (et si le JS ne charge pas, le filet
   de inc/assets.php pose la même classe), le défilé devient une pile
   verticale, rien ne se perd. */
html.emg-motion-off .emg-belt-view { overflow: visible; }
html.emg-motion-off .emg-belt-track { flex-direction: column; width: auto; padding: 6px var(--gutter); }
html.emg-motion-off .emg-belt-panel { width: auto; min-height: 0; }
html.emg-motion-off .emg-tunnel-pin { padding: clamp(70px, 9vh, 100px) 0; }
html.emg-motion-off .emg-tunnel-stat {
	position: static; opacity: 1; transform: none;
	margin: 0 auto clamp(40px, 6vh, 64px); max-width: 42ch;
}
html.emg-motion-off .emg-tunnel-kicker { position: static; transform: none; display: block; text-align: center; margin-bottom: 40px; }

/* ------------------------------------------------------------- Responsive */
@media (max-width: 1160px) {
	:root { --gutter: 24px; }
	.emg-nav { gap: 20px; }
	.emg-nav-num { display: none; }
	.emg-feature-grid { grid-template-columns: 1fr 1fr; }
	.emg-blog-grid { grid-template-columns: 1fr 1fr; }
	.emg-crosslinks-grid { grid-template-columns: 1fr 1fr; }
	.emg-values-grid { grid-template-columns: 1fr 1fr; }
	.emg-certs-grid { grid-template-columns: 1fr 1fr; }
	.emg-numbers-grid { grid-template-columns: 1fr 1fr; gap: 48px 32px; }
}

/* Le CTA du header disparaît tôt : avec 5 entrées de nav + langues, il
   provoquerait un débordement entre ~920 et 1080px. */
@media (max-width: 1080px) {
	.emg-header-cta { display: none; }
}

/* Bascule burger dès 920px : entre 881 et 920 px, la marque, les 5 entrées
   en nowrap et le sélecteur de langue serraient trop la barre (tablette
   portrait comprise) et pouvaient déborder. */
@media (max-width: 920px) {
	.emg-numbers-claim { grid-template-columns: 1fr; gap: 28px; }
	.emg-work-single-head { grid-template-columns: 1fr; gap: 32px; }
	.emg-contact-grid { grid-template-columns: 1fr; }
	.emg-contact-aside { position: static; }
	.emg-nav { display: none; }
	.emg-burger { display: grid; }
	.emg-header-tools > .emg-lang { display: none; }
	/* La loupe cede sa place au choix de langue : la recherche est descendue
	   dans le menu, ou elle a toute la largeur. */
	.emg-search-btn { display: none; }
	.emg-langpop { display: block; }
}

@media (max-width: 760px) {
	/* Le panneau CTA sombre etait suivi du pied de page sombre : deux nuits
	   collees. La newsletter devient la coupure claire, pleine largeur, tout
	   en haut du pied de page et sans marge autour. */
	.emg-footer-newsletter { padding: 0; max-width: none; }
	.emg-night .emg-newsletter {
		border: 0; border-radius: 0;
		/* var(--bg) et non var(--bg2) : dans .emg-night, --bg2 vaut le bleu
		   profond, alors que le bloc redefinit --bg en blanc casse pour
		   lui-meme. C'est le second qu'il faut lire. */
		background: var(--bg);
		backdrop-filter: none; -webkit-backdrop-filter: none;
		box-shadow: none;
		/* Rythme d'une VRAIE section (demande Loris) et non d'un encart : sur
		   telephone, la newsletter est la seule respiration claire entre le
		   panneau CTA sombre et le pied de page sombre, et a 40 px de part et
		   d'autre elle passait pour une bande coincee entre les deux. Le double
		   environ, et elle tient debout toute seule. Rien ne change au-dessus de
		   760 px : la regle vit dans la requete telephone. */
		padding: clamp(80px, 20vw, 104px) var(--gutter) clamp(72px, 18vw, 96px);
		gap: 32px;
	}
	/* Le formulaire s'empile : champ, consentement, bouton. Le consentement
	   passe AVANT le bouton — on lit ce qu'on accepte avant de valider. */
	.emg-newsletter-form { flex-direction: column; align-items: stretch; gap: 14px; }
	.emg-newsletter-form input[type="email"] {
		order: 1;
		/* 16 px : en dessous, iOS zoome sur le champ des qu'on le touche. */
		font-size: 16px;
		width: 100%;
	}
	.emg-newsletter-consent { order: 2; margin-top: 0; }
	.emg-newsletter-form button { order: 3; width: 100%; }
	.emg-newsletter-form .emg-form-feedback { order: 4; }
	/* Même règle des 16 px pour TOUS les autres champs de saisie : contact,
	   modale e-mail des outils, déverrouillage du rapport d'audit, écran de
	   maintenance. Aucun champ sous 16 px sur mobile (demande Marino). */
	.emg-field input, .emg-field select, .emg-field textarea,
	.emg-gate-ready input,
	.emg-audit-unlock-card input,
	.emg-maint-form input { font-size: 16px; }
	.emg-work-grid { grid-template-columns: minmax(0, 1fr); }
	.emg-blog-grid { grid-template-columns: 1fr; }
	.emg-newsletter { grid-template-columns: 1fr; gap: 24px; }
	.emg-footer-grid { grid-template-columns: 1fr 1fr; gap: 34px 30px; padding-top: 56px; }
	/* Deux colonnes : le trait n'aurait plus de sens rangée par rangée. */
	.emg-footer-grid > *:nth-child(n + 5) { padding-top: 0; border-top: 0; }
	.emg-footer-brand { grid-column: 1 / -1; }
	.emg-service-row { grid-template-columns: 40px 1fr; grid-template-rows: auto auto; gap: 8px 18px; padding: 28px 4px; }
	.emg-service-desc { grid-column: 2; }
	.emg-service-go { display: none; }
	.emg-hub-card { grid-template-columns: 1fr; gap: 16px; }
	.emg-hub-card .emg-service-go { display: none; }
	.emg-stack-card { grid-template-columns: 1fr; gap: 12px; }
	.emg-feature-grid { grid-template-columns: 1fr; }
	.emg-included ul { grid-template-columns: 1fr; }
	.emg-team-grid { grid-template-columns: 1fr; }
	.emg-values-grid { grid-template-columns: 1fr; }
	.emg-certs-grid { grid-template-columns: 1fr; }
	.emg-crosslinks-grid { grid-template-columns: 1fr; }
	.emg-partner-block { grid-template-columns: 1fr; }
	.emg-form { grid-template-columns: 1fr; }
	/* Hero mobile : moins haut, éléments resserrés. Il occupait deux écrans
	   avant qu'on atteigne le contenu — le décor reste, la place qu'il prend
	   se discute. */
	.emg-hero { min-height: max(86vh, 560px); }
	.emg-hero-inner { padding-top: 96px; }
	.emg-hero-row { gap: 26px; padding-bottom: clamp(26px, 4vh, 44px); }
	.emg-hero-title { font-size: clamp(31px, 8.4vw, 44px); margin-top: 16px; }
	.emg-hero-sub { font-size: 15px; line-height: 1.55; margin-top: 15px; max-width: 44ch; }
	/* Les deux boutons sur UNE ligne : empilés, ils coûtaient une soixantaine
	   de pixels de haut pour rien. Calé sur les libellés français (332 px de
	   texte pour 342 disponibles) : fr, de et en tiennent sur une ligne.
	   L'italien, nettement plus long (47 signes contre 36), passe à la ligne
	   — la rangée se casse proprement plutôt que de rogner un libellé. */
	.emg-hero .emg-btn-row { margin-top: 22px; gap: 10px; }
	.emg-hero .emg-btn { font-size: 13px; padding: 12px 14px; }
	/* Eyebrow : le trait décoratif saute et le corps descend, pour tenir sur
	   une ligne. Le texte reste ENTIER dans le document — l'ancrage « Jura »
	   n'est pas masqué, il est seulement plus discret. */
	.emg-hero .emg-eyebrow { font-size: 9px; letter-spacing: .08em; gap: 8px; }
	.emg-hero .emg-eyebrow-line { display: none; }
	.emg-hero-chips { width: 100%; max-width: 430px; align-self: flex-start; gap: 8px; padding-bottom: 0; }
	/* La pastille « Jura, Suisse — depuis 2020 » sort du hero mobile : son
	   contenu est déjà porté par l'eyebrow et le chapeau, elle ne coûtait que
	   de la hauteur. */
	.emg-hero-chips .emg-chip.is-since { display: none; }
	.emg-hero-chips .emg-chip.is-stat,
	.emg-hero-chips .emg-chip.is-rating { padding: 12px 16px; border-radius: 16px; }
	.emg-hero-chips .emg-chip.is-since { padding: 9px 16px; border-radius: 14px; }
	.emg-hero-chips .emg-chip-value { font-size: 27px; }
	.emg-hero-chips .emg-chip-value.is-score { font-size: 22px; margin-top: 6px; }
	.emg-hero-chips .emg-chip-caption { font-size: 10px; letter-spacing: .1em; margin-top: 5px; }
	.emg-hero-chips .emg-chip-label { font-size: 11px; letter-spacing: .08em; }
	/* ---- échelle mobile commune, calée sur le hero de l'accueil ----
	   Le hero donne le ton : titre ~33 px, chapeau 15 px, bouton 13 px.
	   Tout ce qui suit aligne le reste du site dessus. */

	/* Titre de page (h1 des pages internes) : même formule que le titre du
	   hero, à un cheveu près. Il valait 40 px fixes, soit PLUS que le titre
	   de l'accueil — l'inverse de la hiérarchie voulue. */
	.emg-page-hero .emg-page-title { font-size: clamp(30px, 8.2vw, 44px); margin-top: 16px; }
	/* Titre de section : un cran sous le titre de page, comme sur bureau. */
	.emg-section-title { font-size: clamp(26px, 7vw, 38px); margin-top: 14px; }
	/* Chapeaux et intros : le corps du chapeau du hero. */
	.emg-page-hero .emg-page-intro { font-size: 15px; line-height: 1.6; margin-top: 18px; }
	.emg-legal-lead { font-size: 15px; line-height: 1.6; }
	/* Boutons : le corps du hero (13 px). La gouttière reste plus large que
	   dans le hero — là-bas elle est serrée à 14 px pour tenir deux libellés
	   sur une ligne, ici 20 px garde une cible de 44 px de haut, le minimum
	   confortable au doigt. */
	.emg-btn { font-size: 13px; padding: 13px 20px; }
	/* Eyebrow : 12 px avec .28em de crénage débordait sur deux lignes dès
	   qu'un libellé était un peu long. Le hero descend à 9 px parce qu'il
	   porte la ligne la plus longue du site ; 10 px suffisent ailleurs. */
	.emg-eyebrow { font-size: 10px; letter-spacing: .16em; gap: 8px; }
	.emg-eyebrow-line { width: 16px; }
	/* Panneau CTA : son titre valait 40 px, soit plus que le h1 des pages.
	   Il vit maintenant en pleine page sur mobile, il garde donc le haut de
	   l'échelle — mais celle du titre de page, pas une échelle à lui. */
	.emg-cta-title { font-size: clamp(30px, 8.2vw, 44px); }
	.emg-cta-text { font-size: 15px; line-height: 1.6; }
	.emg-cta-content { gap: 22px; }
	/* Titre d'une fiche réalisation : c'est un h1, il suit donc l'échelle du
	   titre de page et non la sienne. */
	.emg-single-title { font-size: clamp(30px, 8.2vw, 44px); margin-top: 14px; }

	.emg-cookie { left: 12px; right: 12px; bottom: 12px; }
	.emg-quote-stage { min-height: 300px; }
	/* La barre de filtres passe sur 2 lignes : radius de carte, pas de pilule. */
	.emg-filters { border-radius: 22px; }
	/* Bandeau logos : cases et respiration réduites sur mobile. */
	.emg-marquee { padding: 14px 0; }
	.emg-marquee-track { gap: 30px; }
	.emg-marquee-logo { width: 168px; height: 62px; }
	/* Témoignages : rythme vertical allégé. */
	.emg-quote-section { padding: 84px var(--gutter); }
	/* Slider de réalisations : cartes et espacements adaptés. */
	.emg-svc-slider { margin-top: 36px; }
	.emg-svc-track { gap: 20px; }
	.emg-svc-slide { width: min(420px, 86vw); }
	.emg-svc-head .emg-svc-nav { padding-bottom: 2px; }
}

@media (max-width: 520px) {
	.emg-footer-grid { grid-template-columns: 1fr; }
	.emg-tools-grid { grid-template-columns: 1fr; }
	.emg-chip.is-stat { min-width: 0; }
	/* Colonne resserrée : la légende en capitales ("CLIENTI ACCOMPAGNATI")
	   se faisait rogner en nowrap. Elle peut revenir à la ligne, la ligne
	   de chips grandissant d'autant sans casser la grille. La légende dédiée
	   de l'avis (déjà nowrap plus haut, pour l'alignement des deux chips)
	   n'est pas concernée : sa règle est plus spécifique. */
	.emg-hero-chips .emg-chip-caption,
	.emg-hero-chips .emg-chip-label { white-space: normal; }
}

/* ------------------------------------------------------- Motion réduite */
@media (prefers-reduced-motion: reduce) {
	html { scroll-behavior: auto; }
	*, *::before, *::after {
		animation-duration: .01ms !important;
		animation-iteration-count: 1 !important;
		transition-duration: .01ms !important;
	}
	html.js [data-reveal] { opacity: 1; transform: none; }
	.emg-marquee-track { animation: none; flex-wrap: wrap; width: auto; justify-content: center; }
}

/* ------------------------------------------------------- Cibles tactiles */
/* Sous pointeur grossier (doigt), les zones de clic remontent au minimum
   confortable de 44 px. Pour les liens du pied de page, le padding est
   compensé par une marge négative égale : la zone cliquable grandit sans
   gonfler l'interligne visible entre les liens. */
@media (pointer: coarse) {
	.emg-filter { padding: 12px 18px; }
	.emg-footer-col > a { padding: 11px 0; margin: -11px 0; }
	.emg-icon-btn, .emg-burger { width: 44px; height: 44px; }
}

/* ==========================================================================
   Interactions & polish — micro-détails d'interface
   ========================================================================== */

* { -webkit-tap-highlight-color: transparent; }

/* Ancres : compenser la nav fixe. */
[id] { scroll-margin-top: calc(var(--nav-h) + 20px); }

/* Header : léger resserrement au scroll. */
.emg-header-inner { transition: min-height .4s var(--ease-out), padding .4s var(--ease-out); }
.emg-header.is-scrolled .emg-header-inner { min-height: 62px; padding-top: 9px; padding-bottom: 9px; }

/* Nav : soulignement animé sous le libellé. */
.emg-nav-label { position: relative; }
.emg-nav-label::after {
	content: '';
	position: absolute; left: 0; right: 0; bottom: -5px;
	height: 2px; border-radius: 2px;
	background: var(--accent);
	transform: scaleX(0);
	transform-origin: left;
	transition: transform .35s var(--ease-out);
}
.emg-nav-item:hover .emg-nav-label::after,
.emg-nav-item.is-active .emg-nav-label::after { transform: scaleX(1); }
.emg-header.is-over .emg-nav-label::after { background: var(--cyan); }
/* Sur fond sombre, l'entrée active et le survol passent au cyan, comme leur
   trait. Le mode « is-over » repeint tous les jetons en clair sauf
   `--accent` : le libellé actif restait donc en bleu profond #0A36F7 sur la
   nuit, illisible, avec un trait cyan par-dessus le marché (retour Marino,
   2026-08-28). */
.emg-header.is-over .emg-nav-item:hover,
.emg-header.is-over .emg-nav-item.is-active { color: var(--cyan); }

/* Boutons : sheen de verre au survol (CTA pleins uniquement). */
.emg-btn { position: relative; overflow: hidden; isolation: isolate; letter-spacing: .01em; }
.emg-btn:active { transform: translateY(0) scale(.98); }
.emg-btn.is-accent::before, .emg-btn.is-ink::before, .emg-btn.is-white::before {
	content: '';
	position: absolute; top: 0; bottom: 0; left: -80%;
	width: 55%; z-index: -1;
	background: linear-gradient(105deg, transparent, rgba(255, 255, 255, .35), transparent);
	transform: skewX(-20deg);
	transition: left .7s var(--ease-out);
	pointer-events: none;
}
.emg-btn.is-ink::before { background: linear-gradient(105deg, transparent, color-mix(in srgb, var(--bg) 30%, transparent), transparent); }
.emg-btn.is-accent:hover::before, .emg-btn.is-ink:hover::before, .emg-btn.is-white:hover::before { left: 125%; }

/* Éléments magnétiques : le JS pilote le transform — transition désactivée. */
[data-magnetic] { will-change: transform; }
[data-magnetic].emg-btn { transition: box-shadow .25s ease, background .25s ease, color .25s ease, border-color .25s ease; }

/* Reflet supérieur subtil sur les surfaces de verre. */
/* (le méga menu .emg-nav-panel définit son propre jeu d'ombres, reflet inclus)
   Reflet + ombre portée douce : le verre se détache aussi sur fond blanc. */
.emg-chip, .emg-lang, .emg-icon-btn, .emg-burger, .emg-cookie, .emg-filters {
	box-shadow:
		inset 0 1px 0 0 color-mix(in srgb, #fff 28%, transparent),
		0 10px 28px -14px rgba(2, 3, 31, .2);
}
.emg-cookie { box-shadow: inset 0 1px 0 0 color-mix(in srgb, #fff 28%, transparent), var(--shadow); }
.emg-nav-panel {
	box-shadow:
		inset 0 1px 0 0 color-mix(in srgb, #fff 28%, transparent),
		0 42px 110px -28px rgba(2, 3, 31, .5),
		0 18px 44px -18px rgba(2, 3, 31, .35);
}

/* Liens footer : soulignement progressif.
   Dans les colonnes (flex column), les liens sont étirés par défaut :
   align-self les ramène à la largeur du texte, sinon le trait file
   jusqu'au bout de la colonne. */
.emg-footer-col a { align-self: flex-start; }
.emg-footer-col a, .emg-footer-bottom a {
	background-image: linear-gradient(currentColor, currentColor);
	background-repeat: no-repeat;
	background-size: 0% 1px;
	background-position: 0 100%;
	transition: background-size .35s var(--ease-out), color .2s ease;
}
.emg-footer-col a:hover, .emg-footer-bottom a:hover { background-size: 100% 1px; }

/* Titre hero : reveal mot à mot (spans créés par le JS).
   Aucun masquage CSS par défaut : le titre est toujours visible sans JS. */
/* Réserve .18em sous la ligne : les descendantes (g, p, q…) ne sont plus
   rognées par le masque du reveal. */
.emg-word { display: inline-block; overflow: hidden; vertical-align: top; padding-bottom: .18em; margin-bottom: -.18em; }
.emg-word-inner { display: inline-block; will-change: transform; }

/* Cartes inclinables (tilt 3D subtil, desktop). */
[data-tilt] { transform-style: preserve-3d; will-change: transform; }
.emg-work-card-link { display: block; perspective: 900px; }

/* Témoignages : le point actif devient une pilule de progression. */
.emg-quote-dot { position: relative; overflow: hidden; transition: background .3s ease, width .45s var(--ease-out); }
.emg-quote-dot.is-active {
	width: 30px;
	background: color-mix(in srgb, var(--accent) 22%, var(--line));
	transform: none;
}
.emg-quote-dot.is-active::after {
	content: '';
	position: absolute; inset: 0;
	border-radius: 99px;
	background: var(--accent);
	transform-origin: left;
	transform: scaleX(0);
}
html.js:not(.emg-motion-off) .emg-quote-dot.is-active::after {
	animation: emg-quote-progress var(--emg-quote-interval, 7s) linear forwards;
}
/* Survol du carrousel : le minuteur JS est coupé (voir initQuotes), la
   barre de progression se fige avec lui. */
.emg-quote-section.is-paused .emg-quote-dot.is-active::after { animation-play-state: paused; }
@keyframes emg-quote-progress { from { transform: scaleX(0); } to { transform: scaleX(1); } }

/* Bouton retour en haut : pastille de verre. */
.emg-top {
	position: fixed;
	right: 24px; bottom: 24px;
	z-index: 230;
	width: 46px; height: 46px;
	display: grid; place-items: center;
	border-radius: 99px;
	border: 1px solid var(--glass-brd);
	background: var(--glass);
	backdrop-filter: blur(20px) saturate(1.5);
	-webkit-backdrop-filter: blur(20px) saturate(1.5);
	box-shadow: inset 0 1px 0 0 color-mix(in srgb, #fff 28%, transparent), var(--shadow-soft);
	color: var(--ink);
	cursor: pointer;
	opacity: 0; visibility: hidden;
	transform: translateY(14px);
	transition: opacity .4s ease, transform .4s var(--ease-out), visibility 0s .4s, color .25s ease;
}
.emg-top.is-visible {
	opacity: 1; visibility: visible; transform: translateY(0);
	transition: opacity .4s ease, transform .4s var(--ease-out), color .25s ease;
}
.emg-top:hover { color: var(--accent); }

/* Champs : lueur d'accent progressive au focus (renforce l'existant). */
.emg-newsletter-form input[type="email"]:focus {
	box-shadow: 0 0 0 4px color-mix(in srgb, var(--accent) 14%, transparent);
}

/* Sélecteur de langue : micro-lift. */
.emg-lang-item { transition: background .3s ease, color .3s ease, transform .25s var(--ease-out); }
.emg-lang-item:hover { transform: translateY(-1px); }

/* Numéro des lignes service : glissement de couleur. */
.emg-service-row .emg-service-num { transition: color .3s ease, transform .3s var(--ease-out); }
.emg-service-row:hover .emg-service-num { color: var(--ink); }
@media (hover: hover) and (pointer: fine) {
	.emg-service-row:hover .emg-service-num { transform: translateX(4px); }
}

/* Facts / tags : transitions cohérentes. */
.emg-tag { transition: border-color .25s ease, color .25s ease, transform .25s var(--ease-out); }
a.emg-tag:hover { transform: translateY(-1px); }

/* Eyebrow : le trait se déploie (piloté par GSAP). */
.emg-eyebrow-line { transform-origin: left center; }

/* Curseur liquid glass — disque de verre au survol des visuels projets. */
/* Liquid glass : centre parfaitement limpide (aucun flou), la réfraction
   et les reflets ne vivent que sur l'anneau — comme une lentille de verre. */

/* Tooltip de verre qui accompagne le curseur (curseur natif conservé). */
.emg-cursor-tip {
	position: fixed; left: 0; top: 0; z-index: 260;
	pointer-events: none;
	opacity: 0; transform: scale(.92);
	white-space: nowrap;
	padding: 9px 15px;
	border-radius: 99px;
	font-size: 11px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase;
	color: var(--ink);
	background: color-mix(in srgb, var(--bg) 55%, transparent);
	border: 1px solid var(--glass-brd);
	backdrop-filter: blur(14px) saturate(1.5);
	-webkit-backdrop-filter: blur(14px) saturate(1.5);
	box-shadow:
		inset 0 1px 0 0 color-mix(in srgb, #fff 28%, transparent),
		0 10px 28px -14px rgba(2, 3, 31, .25);
	will-change: transform;
}

/* Rail fixe à gauche (créé par le JS, desktop ≥ 1520px — en dessous, la
   gouttière du conteneur ne laisse pas la place et il chevauchait le
   texte) : capsules de
   verre au même langage que le sélecteur de langue — sections en haut,
   réseaux sociaux en dessous. */
.emg-rail {
	position: fixed; left: 22px; top: 50%; z-index: 90;
	transform: translateY(-50%);
	/* Le rail s'efface et revient avec le mode immersif (html.emg-immersif). */
	transition: opacity .42s var(--ease-out), transform .42s var(--ease-out);
	display: flex; flex-direction: column; align-items: center; gap: 12px;
}
.emg-rail-glass {
	/* Largeur commune aux deux capsules : elles s'alignent parfaitement. */
	width: 40px;
	display: flex; flex-direction: column; align-items: center; gap: 15px;
	padding: 17px 0;
	border-radius: 99px;
	background: var(--glass);
	border: 1px solid var(--glass-brd);
	backdrop-filter: blur(20px) saturate(1.5);
	-webkit-backdrop-filter: blur(20px) saturate(1.5);
	box-shadow:
		inset 0 1px 0 0 color-mix(in srgb, #fff 28%, transparent),
		0 10px 28px -14px rgba(2, 3, 31, .2);
	transition: background .4s ease, border-color .4s ease;
}
.emg-rail-glass.is-social { padding: 7px 0; gap: 3px; }
/* Zone repliée des réseaux : dépliée en douceur par la flèche. */
.emg-rail-more {
	display: grid; grid-template-rows: 0fr;
	transition: grid-template-rows .45s var(--ease-out);
}
.emg-rail-more > div {
	overflow: hidden;
	display: flex; flex-direction: column; align-items: center; gap: 3px;
}
.emg-rail-glass.is-open .emg-rail-more { grid-template-rows: 1fr; }
.emg-rail-glass.is-open .emg-rail-more > div { padding-top: 3px; }
.emg-rail-toggle {
	display: grid; place-items: center;
	width: 26px; height: 26px; border-radius: 99px;
	border: 0; padding: 0; cursor: pointer;
	background: transparent;
	color: var(--ink2);
	transition: color .25s ease, background .25s ease;
}
.emg-rail-toggle svg { transition: transform .35s var(--ease-out); }
.emg-rail-toggle:hover { color: var(--accent); background: color-mix(in srgb, var(--accent) 10%, transparent); }
.emg-rail-glass.is-open .emg-rail-toggle svg { transform: rotate(180deg); }
.emg-rail.is-over .emg-rail-toggle { color: rgba(247, 254, 255, .72); }
.emg-rail.is-over .emg-rail-toggle:hover { color: #fff; background: rgba(255, 255, 255, .14); }
.emg-rail-social.is-pending { opacity: .45; cursor: default; }
.emg-rail-social.is-pending:hover { color: var(--ink2); background: transparent; transform: none; }
.emg-rail.is-over .emg-rail-glass { background: rgba(255, 255, 255, .1); border-color: rgba(255, 255, 255, .26); }
.emg-rail-dot {
	position: relative;
	width: 8px; height: 8px; border-radius: 99px;
	border: 0; padding: 0; cursor: pointer;
	background: color-mix(in srgb, var(--ink) 26%, transparent);
	transition: background .3s ease, height .35s var(--ease-out);
}
.emg-rail-dot:hover { background: color-mix(in srgb, var(--ink) 52%, transparent); }
.emg-rail-dot.is-active { height: 26px; background: var(--accent); }
.emg-rail.is-over .emg-rail-dot { background: rgba(247, 254, 255, .34); }
.emg-rail.is-over .emg-rail-dot:hover { background: rgba(247, 254, 255, .62); }
.emg-rail.is-over .emg-rail-dot.is-active { background: var(--cyan); }
.emg-rail-social {
	display: grid; place-items: center;
	width: 26px; height: 26px; border-radius: 99px;
	color: var(--ink2);
	transition: color .25s ease, background .25s ease, transform .25s var(--ease-out);
}
.emg-rail-social:hover {
	color: var(--accent);
	background: color-mix(in srgb, var(--accent) 10%, transparent);
	transform: translateY(-1px);
}
.emg-rail.is-over .emg-rail-social { color: rgba(247, 254, 255, .72); }
.emg-rail.is-over .emg-rail-social:hover { color: #fff; background: rgba(255, 255, 255, .14); }
.emg-rail-label {
	position: absolute; left: 22px; top: 50%;
	transform: translateY(-50%) translateX(-6px);
	white-space: nowrap;
	font-size: 10px; font-weight: 700; letter-spacing: .16em; text-transform: uppercase;
	color: var(--ink);
	padding: 7px 13px; border-radius: 99px;
	background: color-mix(in srgb, var(--bg) 72%, transparent);
	border: 1px solid var(--glass-brd);
	backdrop-filter: blur(18px) saturate(1.5);
	-webkit-backdrop-filter: blur(18px) saturate(1.5);
	box-shadow: var(--shadow-soft);
	opacity: 0; pointer-events: none;
	transition: opacity .25s ease, transform .25s var(--ease-out);
}
.emg-rail-dot:hover .emg-rail-label,
.emg-rail-dot:focus-visible .emg-rail-label {
	opacity: 1;
	transform: translateY(-50%) translateX(0);
}
.emg-rail.is-over .emg-rail-label { color: #f7feff; background: rgba(6, 22, 81, .5); }

@media (max-width: 760px) {
	.emg-top { right: 14px; bottom: 14px; }
}

@media (prefers-reduced-motion: reduce) {
	.emg-quote-dot.is-active::after { animation: none; transform: scaleX(1); }
	.emg-btn::before { display: none; }
}

/* --------------------------------------------- Fiche projet : en-tête */

/* Lien retour façon eyebrow (remplace l'eyebrow, flèche vers la gauche). */
.emg-back-eyebrow {
	display: inline-flex; align-items: center; gap: 10px;
	font-size: 12px; font-weight: 700; letter-spacing: .28em;
	text-transform: uppercase;
	color: var(--ink2);
	transition: color .25s ease;
}
.emg-back-eyebrow .emg-arrow {
	transform: rotate(180deg);
	transition: transform .3s var(--ease-out);
}
.emg-back-eyebrow:hover { color: var(--accent); }
.emg-back-eyebrow:hover .emg-arrow { transform: rotate(180deg) translateX(3px); }

/* Catégories : pills accent sous le titre. */
.emg-cat-pills { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 22px; }
.emg-cat-pill {
	font-size: 12.5px; font-weight: 700; letter-spacing: .02em;
	padding: 7px 15px; border-radius: 99px;
	background: color-mix(in srgb, var(--accent) 10%, transparent);
	color: var(--accent);
	border: 1px solid color-mix(in srgb, var(--accent) 22%, transparent);
	transition: background .25s ease, color .25s ease, border-color .25s ease, transform .25s var(--ease-out);
}
.emg-cat-pill:hover {
	background: var(--accent);
	border-color: var(--accent);
	color: #f7feff;
	transform: translateY(-1px);
}

/* Action primaire du projet dans le hero. */
.emg-work-visit { margin-top: 30px; }
/* Le bouton « Voir le site » vit tout en bas du hero, et le hero est en
   `overflow: clip` — pose la pour empecher le filigrane de deborder sur la
   droite. Sa lueur portee, qui descend d'une quarantaine de pixels, se faisait
   donc trancher NET a huit pixels sous lui : une ligne horizontale en travers
   de la page, a la couture des deux sections. Elle est retiree plutot que
   raccourcie — il n'y a pas la place de la loger (decision Loris). La regle
   vise le hero et lui seul : ailleurs, la lueur du bouton d'accent a de quoi
   respirer et reste. */
.emg-page-hero .emg-btn.is-accent { box-shadow: none; }

/* Faits : la rangée Technologies occupe toute la largeur du box,
   pills compactes pour rester propre même avec beaucoup d'entrées. */
.emg-work-facts .is-full { grid-column: 1 / -1; }
.emg-work-facts .emg-tag { font-size: 11.5px; padding: 5px 11px; }

/* ==========================================================================
   Études de cas (fiches projet) — système éditorial réutilisable
   Rythme : sections alternées texte / visuel, largeurs unifiées.
   ========================================================================== */

.emg-cs-section { margin-top: clamp(72px, 9vw, 120px); }
.emg-cs-section:first-child { margin-top: 0; }

/* Bloc de texte : respiration généreuse, largeur de lecture maîtrisée. */
.emg-cs-text .emg-section-title {
	font-size: clamp(30px, 3.5vw, 46px);
	margin: 22px 0 0;
	max-width: 20ch;
}
.emg-cs-text p {
	font-size: 17px;
	line-height: 1.8;
	color: var(--ink2);
	max-width: 56ch;
	margin: 26px 0 0;
}

/* Liste à coches (points clés d'une section). */
.emg-cs-list { list-style: none; margin: 28px 0 0; padding: 0; display: grid; gap: 14px; }
.emg-cs-list li {
	position: relative;
	padding-left: 30px;
	font-size: 15.5px;
	line-height: 1.6;
	color: var(--ink2);
	max-width: 52ch;
}
.emg-cs-list li strong { color: var(--ink); font-weight: 700; }
.emg-cs-list li::before {
	content: '';
	position: absolute; left: 0; top: .34em;
	width: 15px; height: 15px;
	background: var(--accent);
	-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%23000' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round' d='m2.5 8.5 3.5 3.5 7.5-8'/%3E%3C/svg%3E") center / contain no-repeat;
	mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%23000' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round' d='m2.5 8.5 3.5 3.5 7.5-8'/%3E%3C/svg%3E") center / contain no-repeat;
}

/* Deux colonnes texte / visuel, alternables avec .is-flip. */
.emg-cs-split {
	display: grid;
	grid-template-columns: 1fr 1.15fr;
	gap: clamp(36px, 5vw, 80px);
	align-items: center;
}
.emg-cs-split.is-flip > :first-child { order: 2; }

/* Ce que les fiches projet ajoutent au cadre commun (defini plus haut) :
   le soulevement au survol de la figure, et l'image posee en direct. */
figure:hover > .emg-browser { transform: translateY(-4px); box-shadow: 0 32px 90px -36px rgba(2, 3, 31, .3); }
.emg-browser > img { display: block; width: 100%; height: auto; }
.emg-browser.is-crop img { aspect-ratio: 4 / 3; object-fit: cover; object-position: top; }

/* Cadre téléphone pour les captures mobiles (jamais recadrées),
   posé sur un halo lumineux discret. */
.emg-phone-wrap { position: relative; display: grid; place-items: center; }
.emg-phone-wrap::before {
	content: '';
	position: absolute;
	width: min(420px, 90%); aspect-ratio: 1;
	border-radius: 99em;
	background: radial-gradient(circle, color-mix(in srgb, var(--accent) 22%, transparent), transparent 68%);
	filter: blur(10px);
	pointer-events: none;
}
.emg-phone {
	position: relative;
	display: block;
	border-radius: 36px;
	overflow: hidden;
	border: 7px solid color-mix(in srgb, var(--ink) 16%, var(--card));
	box-shadow: var(--shadow);
	width: min(290px, 78%);
}
.emg-phone img { display: block; width: 100%; height: auto; }


/* Les deux films cote a cote : le 16/9 large, le vertical a sa droite. Ils
   s'alignent par le BAS, le pied de l'ecran et celui du telephone sur une
   meme ligne. */
.emg-cs-films {
	display: grid; grid-template-columns: minmax(0, 2.4fr) minmax(0, 1fr);
	gap: clamp(26px, 4vw, 56px); align-items: end;
}
/* Le telephone reste un TELEPHONE : plafonne, et non etire a sa colonne. A
   460 px de large a cote d'un moniteur de 810, il passait pour une tablette et
   la scene perdait son echelle. */
.emg-cs-films .emg-phone { width: min(300px, 100%); margin: 0 auto; }
/* Le cadre navigateur porte sa barre : la video vient dessous, et le cadre
   garde ses coins arrondis grace a son propre overflow. */
.emg-cs-films .emg-browser { display: block; }
@media (max-width: 860px) {
	.emg-cs-films { grid-template-columns: minmax(0, 1fr); gap: 44px; justify-items: center; }
	.emg-cs-films > figure { max-width: 420px; }
}

/* Vidéo dans un cadre navigateur (fiches projet). Le poster tient la place et
   reste seul quand le mouvement n'est pas permis : c'est lui qui donne sa
   hauteur au bloc, la vidéo se pose par-dessus et ne se montre qu'une fois
   qu'elle joue vraiment (initCaseVideos dans main.js). */
.emg-cs-video { position: relative; display: block; }
.emg-cs-video > img { display: block; width: 100%; height: auto; }
.emg-cs-video > video {
	position: absolute; inset: 0;
	width: 100%; height: 100%;
	object-fit: cover;
	opacity: 0;
	transition: opacity .6s ease;
}
.emg-cs-video > video.is-on { opacity: 1; }

/* Légendes discrètes. */
.emg-cs-caption { margin-top: 14px; font-size: 13px; color: var(--ink3); }

/* Bande de compteurs — panneau navy plein cadre : les chiffres en dégradé
   cyan→bleu y restent lisibles dans les deux thèmes. */
.emg-cs-counters {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
	gap: clamp(28px, 4vw, 48px);
}
.emg-cs-counters.is-panel {
	background: var(--navy);
	border-radius: var(--radius-lg);
	padding: clamp(40px, 5vw, 64px) clamp(28px, 4vw, 56px);
	box-shadow: var(--shadow);
}
.emg-cs-counters.is-panel .emg-number-label {
	color: rgba(247, 254, 255, .6);
	border-top-color: rgba(247, 254, 255, .12);
}

/* Avis client d'une fiche projet : un panneau de coupure, du même poids
   visuel que la bande de chiffres, posé juste avant le bloc de partenariat
   (demande Marino, 2026-08-29). Rendu par emg_realisation_review_panel() ;
   pas d'avis, pas de section, la question ne se pose donc jamais en CSS. */
.emg-cs-review {
	background: var(--navy);
	color: #f7feff;
	border-radius: var(--radius-lg);
	padding: clamp(40px, 5vw, 64px) clamp(28px, 4vw, 56px);
	box-shadow: var(--shadow);
	text-align: center;
}
.emg-cs-review-stars { display: inline-flex; gap: 4px; color: var(--cyan); }
.emg-cs-review-stars svg.is-off { opacity: .26; }
.emg-cs-review-label {
	display: block; margin-top: 14px;
	font-size: 11px; font-weight: 700; letter-spacing: .28em;
	text-transform: uppercase;
	color: rgba(247, 254, 255, .55);
}
.emg-cs-review blockquote {
	margin: 18px auto 0; max-width: 62ch;
	font-size: clamp(20px, 2.1vw, 27px); font-weight: 600;
	line-height: 1.45; letter-spacing: -.015em;
}
.emg-cs-review .emg-review-more { color: var(--cyan); }
.emg-cs-review-author { margin-top: 20px; font-size: 14px; color: rgba(247, 254, 255, .65); }
.emg-cs-review-author strong { color: #f7feff; }
.emg-cs-review .emg-quote-source { color: inherit; }
.emg-cs-review .emg-quote-source:hover,
.emg-cs-review .emg-quote-source:hover strong { color: var(--cyan); }

/* Visuel du haut des fiches projet : fenêtre panoramique courte.
   L'image garde sa hauteur naturelle 16:9 et démarre sur le HAUT du site
   capturé (elle déborde vers le bas) ; au scroll, le JS la fait remonter
   dans la fenêtre — la page intégrée défile à contre-courant. */
.emg-single-hero-wrap .emg-single-hero.is-crop {
	aspect-ratio: 3 / 1;
	max-height: 400px;
	width: 100%;
}
.emg-single-hero-wrap .emg-single-hero.is-crop img {
	height: auto;
	object-fit: unset;
	will-change: transform;
}
@media (max-width: 760px) {
	/* Sur mobile, la fenêtre reprend le 16:9 de la capture (pas de rognage,
	   parallax sans effet — débattement nul). */
	.emg-single-hero-wrap .emg-single-hero.is-crop { aspect-ratio: 16 / 9; max-height: none; }

	/* Fiche réalisation : le visuel arrive AU-DESSUS des infos (titre,
	   catégories, faits). Réordonné en flex sur le conteneur principal —
	   le DOM ne change pas, le zoom depuis la carte vise le même élément.
	   Le décalage sous le header fixe passe du bloc d'infos au visuel. */
	.single-realisation #emg-main { display: flex; flex-direction: column; }
	.single-realisation #emg-main > * { min-width: 0; }
	.single-realisation .emg-single-hero-wrap {
		order: -1;
		margin-top: calc(var(--nav-h) + 20px);
	}
	.single-realisation .emg-page-hero { padding-top: 30px; }
}

@media (max-width: 920px) {
	.emg-cs-split { grid-template-columns: 1fr; }
	.emg-cs-split.is-flip > :first-child { order: 0; }
}

/* ------------------------------------------------------------------ Print */
@media print {
	.emg-header, .emg-footer, .emg-cookie, .emg-scrollbar, .emg-top, .emg-rail, .emg-cta-panel-wrap { display: none !important; }
	body { background: #fff; color: #000; }
}

/* Emblème en verre 3D du tunnel de statistiques : il dérive DERRIÈRE les
   traînées et les chiffres, sur toute la fenêtre épinglée. Son opacité est
   pilotée par le module lui-même (voir emblem-3d.js). */
.emg-tunnel-emblem {
	position: absolute; inset: 0;
	width: 100%; height: 100%;
	display: block; opacity: 0;
	pointer-events: none;
	z-index: 0;
}

/* Équipe : les deux associés alternent en tête d'une visite à l'autre. Le
   serveur rend toujours le même ordre ; la classe est posée avant le premier
   rendu par un compteur tenu dans le navigateur (voir page-a-propos.php), et
   seules les deux premières cases échangent leur place. Le reste de la
   grille suit son ordre naturel. */
/* nth-of-type et non nth-child : le petit script du compteur est lui aussi
   un enfant de la grille et décalerait la numérotation. Les deux associés
   sont les deux premiers <article> ; la case « nous rejoindre » est un <a>,
   elle n'entre donc pas dans le compte. */
.emg-team-grid.is-swapped > * { order: 3; }
.emg-team-grid.is-swapped > article.emg-team-card:nth-of-type(1) { order: 2; }
.emg-team-grid.is-swapped > article.emg-team-card:nth-of-type(2) { order: 1; }

/* Sortie du tunnel sur le blanc : le voile occupe la fenêtre épinglée et
   monte sur la fin de la scène, en même temps que l'emblème fonce vers la
   caméra. Au bout, l'écran est blanc et la section suivante, blanche elle
   aussi, prend le relais sans coupure. */
.emg-tunnel-white {
	/* ABSOLU dans la fenêtre épinglée, et non fixé à l'écran : un
	   `position: fixed` sous un ancêtre transformé (la scène garée par
	   GSAP après l'épinglage) se rabat sur cet ancêtre, et le voile ne
	   couvrait plus l'écran en remontée : la nuit paraissait à nu
	   (retour Marino, mobile). Pendant l'épinglage, la fenêtre EST
	   l'écran : la couverture est la même, sans le piège. */
	position: absolute; inset: 0; z-index: 5;
	display: block; pointer-events: none;
	background: #f7feff;
	opacity: 0;
	will-change: opacity;
}
/* Plus d'air sous le tunnel : la zone sombre s'arrête où le blanc commence,
   sinon il fallait traverser une bande de nuit avant la section suivante
   (demande Marino). L'air du haut, lui, reste. */
.emg-webdark { padding-bottom: 0; }
/* Mouvement réduit : la scène est dépliée et statique, un voile absolu y
   recouvrirait les chiffres. */
html.emg-motion-off .emg-tunnel-white { display: none; }

/* Le tunnel REMONTE sur la fin du défilé. Sans cela, sa section entre par le
   bas et doit parcourir un écran entier de défilement avant de toucher le
   haut et de s'épingler : une longue descente pour rien entre deux scènes
   qui partagent le même ciel (demande Marino). Elles se chevauchent
   maintenant, et le décor du tunnel monte en fondu sur ce chevauchement :
   quelques crans de molette suffisent pour passer de l'une à l'autre. */
.emg-webdark > .emg-tunnel { margin-top: -62vh; }

/* Et la section suivante COLLE à la fin de l'épinglage : elle remonte
   d'exactement une hauteur de fenêtre (la même formule que la hauteur du
   pin), si bien que la scène garée par GSAP est entièrement recouverte et
   que la fin de la traversée est la première image de la section. Pendant
   l'épinglage, la zone passe au-dessus (is-epinglee, posée par main.js) :
   la section arrive DERRIÈRE la scène, sous le blanc, et l'échange de
   plans à la libération est invisible puisque le voile et le fond de la
   section ont la même couleur. Plus de saut de position ni de zone morte :
   la remontée rejoue la séquence à l'envers par construction. Réservé au
   parcours animé : sans JavaScript ou en mouvement réduit, la scène est
   dépliée et la marge négative la ferait recouvrir. */
html.js:not(.emg-motion-off) .emg-webdark + .emg-section {
	position: relative; z-index: 1;
	background: var(--bg);
	margin-top: calc(0px - max(100vh, 560px));
}
@media (max-width: 1023px) {
	html.js:not(.emg-motion-off) .emg-webdark + .emg-section { margin-top: calc(0px - max(100vh, 480px)); }
}
.emg-webdark.is-epinglee { z-index: 2; }

/* Naissance de la section qui suit le tunnel : déjà en place à la fin de
   l'épinglage, elle paraît en fondu remontant par-dessus le voile blanc
   resté plein sous elle. Les deux classes sont retirées une fois l'entrée
   jouée. */
.emg-nait { opacity: 0; transform: translateY(34px); }
.emg-nait.emg-nait-va {
	opacity: 1; transform: none;
	/* Un peu plus longue qu'avant (retour Marino) : à 0,85 s l'entrée se
	   sentait encore pressée. */
	transition: opacity 1.05s var(--ease-out) .1s, transform 1.05s var(--ease-out) .1s;
}

/* ---- fond media du hero des pages de pôle (essai, page web) -----------
   Poster en premier rendu et repli, boucle vidéo par-dessus une fois
   qu'elle joue vraiment, voile pour le contraste du texte. Le tout vit
   sous le contenu grâce au contexte d'empilement de la section. */
.emg-hero-media { position: absolute; inset: 0; z-index: -1; overflow: hidden; }
.emg-hero-media img,
.emg-hero-media video {
	position: absolute; inset: 0;
	width: 100%; height: 100%;
	object-fit: cover; object-position: center;
}
.emg-hero-media video { opacity: 0; transition: opacity .9s ease; }
.emg-hero-media video.is-on { opacity: 1; }
.emg-hero-media::after {
	content: ""; position: absolute; inset: 0;
	background:
		linear-gradient(90deg, rgba(2, 3, 31, .86) 0%, rgba(2, 3, 31, .52) 46%, rgba(2, 3, 31, .22) 100%),
		linear-gradient(180deg, rgba(2, 3, 31, .35) 0%, rgba(2, 3, 31, 0) 42%, rgba(2, 3, 31, .74) 100%);
}

/* ---- réglages du hero à média (essai page web) -------------------------
   Sans la trame de points (le clin d'oeil "plan technique" brouillait la
   vidéo, PC comme mobile), et à 90 pour cent de l'écran : le média cadre
   l'ouverture, la suite affleure dessous. Le contenu se centre dans cette
   hauteur, padding du haut réduit d'autant. */
.emg-page-hero.has-media::before { content: none; }
.emg-page-hero.has-media {
	min-height: 100vh;
	min-height: 100svh;
	display: flex; align-items: center;
	padding-top: calc(var(--nav-h) + 24px);
}
.emg-page-hero.has-media .emg-container { width: 100%; }

/* (Essai d'affichage entier de la vidéo sur mobile retiré : rendu jugé
   moins bon que le recadrage plein cadre, qu'on assume.) */

/* Intro sous le H1 des pages web et ecom : un cran plus petite et plus
   étroite que l'intro standard, pour dégager le visuel derrière (demande
   Marino, dans l'esprit de l'intro resserrée de la page app). */
.emg-page-hero.is-web .emg-page-intro,
.emg-page-hero.is-ecom .emg-page-intro { font-size: 16px; max-width: 54ch; }

/* Hero des pages de pôle, mobile : le recadrage plein cadre vise la
   DROITE de la vidéo, c'est là que vit le sujet (demande Marino, étendu
   à la page web le 2026-08-25). La boutique en ligne vise un peu plus à
   droite : son sujet est plus au bord que sur les deux autres. */
@media (max-width: 760px) {
	/* Contraste du texte sur le média (mesuré le 2026-08-28, page web) :
	   le voile du média est un dégradé HORIZONTAL, pensé pour le desktop où
	   le texte vit à gauche, sous la partie la plus sombre. Sur téléphone le
	   texte prend toute la largeur et sort du voile : dans la traînée
	   lumineuse du visuel, le fond montait à 167 sur 255, et le H1 comme
	   l'intro tombaient à 2,3:1, sous les seuils WCAG de 3:1 et 4,5:1. On
	   ajoute donc un voile UNIFORME, qui ne dépend plus de la position du
	   texte, et on remonte l'encre de l'intro. Mesuré après : 5,9:1 pour le
	   H1 et 4,8:1 pour l'intro dans le pire pixel.
	   Allege deux fois le 2026-08-31, Marino trouvant la video trop effacee
	   sur telephone : .45 puis .36, enfin .26. Chaque etape remesuree a la
	   meme methode, texte masque et luminance relevee la ou il se trouvait.

	   La seconde baisse a demande de changer de levier. A .85 d'opacite,
	   l'intro bornait tout : elle passait sous 4,5:1 des .30, alors que le
	   H1 avait encore de la marge. Son encre est donc passee au blanc plein,
	   ce qui lui rend du contraste sans toucher au voile, et la contrainte
	   s'est deplacee sur le H1. Etat mesure : 3,4:1 pour le H1 (seuil 3,0,
	   grand titre) et 5,4:1 pour l'intro (seuil 4,5, texte courant).

	   C'est le H1 qui borne desormais : sous .22, il passerait sous 3,0:1.
	   Rappel de methode : le fond mesure est le PIRE pixel sous le texte,
	   la moyenne etant trois fois plus sombre. */
	.emg-page-hero.has-media .emg-hero-media::after {
		background:
			linear-gradient(90deg, rgba(2, 3, 31, .86) 0%, rgba(2, 3, 31, .52) 46%, rgba(2, 3, 31, .22) 100%),
			linear-gradient(180deg, rgba(2, 3, 31, .35) 0%, rgba(2, 3, 31, 0) 42%, rgba(2, 3, 31, .74) 100%),
			rgba(2, 3, 31, .26);
	}
	.emg-page-hero.has-media .emg-page-intro { color: #f7feff; }

	.emg-page-hero.is-app .emg-hero-media img,
	.emg-page-hero.is-app .emg-hero-media video,
	.emg-page-hero.is-web .emg-hero-media img,
	.emg-page-hero.is-web .emg-hero-media video { object-position: 74% 50%; }
	.emg-page-hero.is-ecom .emg-hero-media img,
	.emg-page-hero.is-ecom .emg-hero-media video { object-position: 80% 50%; }
	.emg-page-hero.is-business .emg-hero-media img,
	.emg-page-hero.is-business .emg-hero-media video { object-position: 70% 50%; }
	/* Communication 360 : la zone importante vit à droite de la boucle,
	   le recadrage mobile la privilégie (demande Marino 2026-08-27). */
	.emg-page-hero.is-com360 .emg-hero-media img,
	.emg-page-hero.is-com360 .emg-hero-media video { object-position: 78% 50%; }
	/* Et l'intro réduite garde un cran d'avance sur celle du mobile
	   standard (15 px), sinon la règle ci-dessus, plus spécifique, la
	   ferait au contraire grossir ici. */
	.emg-page-hero.is-web .emg-page-intro,
	.emg-page-hero.is-ecom .emg-page-intro { font-size: 14px; }
}

/* ==========================================================================
   Visionneuse d'images des fiches projet
   Ouverture au clic sur toute capture d'une étude de cas (.emg-browser,
   .emg-phone) : image à sa taille utile, légende reprise, navigation entre
   toutes les images de la fiche. Vidéos, poster vidéo, logo partenaire et
   visuel d'arrivée du zoom (grille → fiche) restent en dehors (initCaseViewer,
   main.js). Fond assombri uni, pas de flou : la photo doit rester nette.
   ========================================================================== */

/* Curseur natif (décision Loris) : simple indication visuelle, aucun disque
   personnalisé. Décalage négatif de l'anneau de focus clavier : les cadres
   .emg-browser / .emg-phone sont en overflow hidden, un anneau en dehors de
   l'image y disparaîtrait. */
[data-case-viewer-scope] img[data-viewer-index] { cursor: zoom-in; }
[data-case-viewer-scope] img[data-viewer-index]:focus-visible { outline-offset: -3px; }

.emg-viewer { position: fixed; inset: 0; z-index: 500; }
.emg-viewer[hidden] { display: none; }

.emg-viewer-veil {
	position: absolute; inset: 0;
	background: color-mix(in srgb, var(--navy) 94%, transparent);
	opacity: 0;
	transition: opacity .3s var(--ease-out);
}
.emg-viewer.is-open .emg-viewer-veil { opacity: 1; }

/* Le panneau couvre tout l'écran mais reste invisible aux clics : seuls ses
   enfants (image, légende, boutons) reçoivent le pointeur. Cliquer entre eux
   revient donc à cliquer le fond, sans JS dédié à cette zone. */
.emg-viewer-panel {
	position: absolute; inset: 0;
	display: flex; flex-direction: column; align-items: center; justify-content: center;
	gap: 16px;
	padding: clamp(64px, 11vh, 110px) clamp(56px, 9vw, 120px);
	pointer-events: none;
	opacity: 0;
	transform: scale(.97);
	transition: opacity .3s var(--ease-out), transform .34s var(--ease-out);
}
.emg-viewer-panel > * { pointer-events: auto; }
.emg-viewer.is-open .emg-viewer-panel { opacity: 1; transform: none; }

body.emg-viewer-open { overflow: hidden; }

.emg-viewer-figure { margin: 0; min-height: 0; display: flex; flex-direction: column; align-items: center; gap: 14px; max-width: 100%; }
/* L'image REMPLIT la place disponible au lieu de s'afficher a sa taille
   d'origine. Avec `height: auto`, une capture de telephone de 390 px de large
   restait minuscule au milieu d'un ecran de 1920 : ouvrir une image en grand
   doit la montrer en grand. La hauteur commande, la largeur suit, et les deux
   plafonds gardent les captures larges dans le cadre. */
.emg-viewer-figure img {
	display: block;
	height: 78vh;
	width: auto;
	max-width: min(92vw, 1600px);
	max-height: 78vh;
	object-fit: contain;
	border-radius: 10px;
	transition: opacity .25s ease;
}
.emg-viewer-figure img.is-loading { opacity: .35; }

.emg-viewer-caption {
	font-size: 14px; line-height: 1.5; text-align: center;
	color: color-mix(in srgb, #f7feff 82%, transparent);
	max-width: 62ch;
}
.emg-viewer-caption[hidden] { display: none; }

.emg-viewer-count {
	font-variant-numeric: tabular-nums; letter-spacing: .04em;
	font-size: 12.5px;
	color: color-mix(in srgb, #f7feff 55%, transparent);
}
.emg-viewer-count[hidden] { display: none; }

.emg-viewer-close,
.emg-viewer-nav {
	position: absolute;
	display: grid; place-items: center;
	width: 44px; height: 44px;
	border: 1px solid color-mix(in srgb, #f7feff 20%, transparent);
	border-radius: 99px;
	background: color-mix(in srgb, var(--navy) 55%, transparent);
	color: #f7feff;
	cursor: pointer;
	transition: background .2s ease, border-color .2s ease;
}
.emg-viewer-close:hover,
.emg-viewer-nav:hover {
	background: color-mix(in srgb, var(--navy) 78%, transparent);
	border-color: color-mix(in srgb, #f7feff 38%, transparent);
}
.emg-viewer-close { top: clamp(14px, 3vh, 28px); right: clamp(14px, 3vw, 28px); }
.emg-viewer-nav.is-prev { left: clamp(10px, 3vw, 28px); top: 50%; transform: translateY(-50%); }
.emg-viewer-nav.is-next { right: clamp(10px, 3vw, 28px); top: 50%; transform: translateY(-50%); }
.emg-viewer-nav[hidden] { display: none; }

/* Sur fond sombre, l'anneau de focus reprend le cyan (même règle que le
   header au-dessus d'un hero de nuit) : le bleu d'accent s'y lit mal. */
.emg-viewer :focus-visible { outline-color: var(--cyan); }

@media (max-width: 640px) {
	.emg-viewer-panel { padding: 56px 18px 44px; gap: 12px; }
	.emg-viewer-figure img { max-height: 58vh; }
	.emg-viewer-nav.is-prev { left: 8px; }
	.emg-viewer-nav.is-next { right: 8px; }
}

@media (pointer: coarse) {
	.emg-viewer-close, .emg-viewer-nav { width: 46px; height: 46px; }
}

@media (prefers-reduced-motion: reduce) {
	.emg-viewer-veil, .emg-viewer-panel, .emg-viewer-figure img { transition-duration: .01ms; }
	.emg-viewer-panel { transform: none; }
}
