/* ==========================================================================
   Papet du LS 2026 — tombola-papetduls.ch
   Theme "beaulieu-gala" : rideaux de scene, tapis d'honneur, podium.
   Toutes les couleurs sont declarees ici, dans :root, et nulle part ailleurs.
   ========================================================================== */

:root {
  /* === COULEURS === */
  --color-primary: #0031f5;
  --color-primary-light: #2e4cfa;
  --color-primary-dark: #0833bc;
  --color-primary-rgb: 0, 49, 245;
  --color-secondary: #001d7a;
  --color-accent: #009849;
  --color-accent-deep: #007f53;
  --color-accent-rgb: 0, 152, 73;

  --color-bg: #001d7a;
  --color-bg-alt: #000c33;
  --color-bg-card: #091130;
  --color-bg-rgb: 0, 29, 122;
  --color-bg-alt-rgb: 0, 12, 51;

  --color-text: #e3e6f0;
  /* Teinte verifiee >= 4.5:1 sur TOUS les fonds traverses :
     navy 10.5:1, tapis #0031f5 5.6:1, podium eclairci 4.6:1. */
  --color-text-muted: #d2dcf6;
  --color-text-heading: #ffffff;
  --color-text-on-primary: #ffffff;

  --color-text-contrast: #dfe6f7;

  --color-white: #ffffff;
  --color-white-rgb: 255, 255, 255;
  --color-stage: #7e94d9;
  --color-stage-shade: #2f4382;

  /* === TYPOGRAPHIE === */
  --font-heading: 'Playfair Display', 'Playfair Fallback', Georgia, 'Times New Roman', serif;
  --font-body: 'Inter', 'Inter Fallback', system-ui, -apple-system, 'Segoe UI', sans-serif;
  --font-size-base: 1rem;
  --line-height-base: 1.6;

  /* === FORMES === */
  --radius-sm: 6px;
  --radius-md: 12px;
  --radius-lg: 20px;
  --radius-xl: 32px;
  --radius-full: 9999px;

  /* === BORDURES === */
  --border-width: 1px;
  --border-color: rgba(var(--color-white-rgb), 0.18);
  --border-color-light: rgba(var(--color-white-rgb), 0.08);

  /* === OMBRES === */
  --shadow-sm: 0 2px 8px rgba(var(--color-bg-alt-rgb), 0.35);
  --shadow-md: 0 10px 30px rgba(var(--color-bg-alt-rgb), 0.45);
  --shadow-lg: 0 24px 60px rgba(var(--color-bg-alt-rgb), 0.55);
  --shadow-glow: 0 0 32px rgba(var(--color-primary-rgb), 0.35);

  /* === ANIMATIONS === */
  --transition-fast: 150ms;
  --transition-base: 300ms;
  --transition-slow: 600ms;
  --easing-default: cubic-bezier(0.4, 0, 0.2, 1);
  --easing-enter: cubic-bezier(0, 0, 0.2, 1);

  /* === GLASSMORPHISM === */
  --glass-bg: rgba(var(--color-white-rgb), 0.07);
  --glass-blur: 18px;
  --glass-border: rgba(var(--color-white-rgb), 0.16);

  /* === ESPACEMENT === */
  --section-padding-y: 96px;
  --section-padding-y-mobile: 56px;
  --container-max-width: 940px;
  --container-padding-x: 24px;

  /* === DECOR === */
  --curtain-width: clamp(58px, 15vw, 250px);
  --gutter-inline: clamp(20px, 4vw, 48px);
}

/* --------------------------------------------------------------------------
   Fallbacks de police calibres (anti-CLS)
   -------------------------------------------------------------------------- */
@font-face {
  font-family: 'Playfair Fallback';
  src: local('Georgia'), local('Times New Roman');
  size-adjust: 111.5%;
  ascent-override: 105%;
  descent-override: 32%;
  line-gap-override: 0%;
}
@font-face {
  font-family: 'Inter Fallback';
  src: local('Helvetica Neue'), local('Arial');
  size-adjust: 107.16%;
  ascent-override: 100%;
  descent-override: 25%;
  line-gap-override: 8%;
}

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

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

body {
  margin: 0;
  min-height: 100svh;
  font-family: var(--font-body);
  font-size: var(--font-size-base);
  line-height: var(--line-height-base);
  color: var(--color-text);
  background-color: var(--color-bg);
}

img {
  display: block;
  max-width: 100%;
}

a {
  color: var(--color-text-heading);
  text-decoration-color: rgba(var(--color-white-rgb), 0.4);
  text-underline-offset: 3px;
  transition: text-decoration-color var(--transition-base) var(--easing-default);
}

a:hover {
  text-decoration-color: var(--color-accent);
}

:focus-visible {
  outline: 2px solid var(--color-white);
  outline-offset: 3px;
  border-radius: var(--radius-sm);
}

.sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
  border: 0;
}

/* Le contenu place SOUS l'overlay garde sa place mais n'est pas peint : zero CLS. */
body.has-countdown > main,
body.has-countdown > footer {
  visibility: hidden;
}

/* ==========================================================================
   1. Overlay d'attente
   ========================================================================== */

.countdown-overlay {
  position: fixed;
  inset: 0;
  height: 100svh;
  height: 100dvh;
  z-index: 100;
  display: flex;
  flex-direction: column;
  overflow-x: hidden;
  overflow-y: auto;
  /* Safe-area iOS (encoches / coins arrondis, viewport-fit=cover en tete) :
     le rideau lateral ne doit jamais passer sous l'encoche en paysage.
     Hauteur explicite (100svh puis 100dvh) : un `position:fixed` se
     dimensionne sinon sur le large viewport (barre d'URL masquee) et
     deborde sous la barre navigateur mobile -> chiffres du countdown
     coupes en bas. svh = repli sur la plus petite hauteur garantie.
     overflow-y: auto en SECOURS uniquement, jamais le mode normal :
     aux tailles couvertes par la compression du §8 (l'immense majorite,
     verifie a 320x568 -> 414x896 portrait), le contenu tient exactement
     dans la hauteur reelle du viewport -> scrollHeight == clientHeight,
     donc aucune barre de defilement ne s'affiche, aucun comportement
     visible different d'un `overflow: hidden`. Reste utile pour les
     rares gabarits extremes (telephone en paysage tres bas, ex. 844x390,
     item-008 de la demande 2026-09-25-1108) ou meme apres compression
     maximale le compte a rebours + le pied de page legal ne tiennent pas
     simultanement : plutot que de les rendre definitivement inaccessibles
     (un `overflow: hidden` les aurait rendus invisibles ET inatteignables,
     regression mesuree via CDP avant ce correctif), l'utilisateur peut
     toujours faire defiler pour les atteindre. overflow-x reste hidden :
     jamais de defilement horizontal (rideaux lateraux).
     Miroir exact de la regle equivalente dans le CSS critique inline
     (<head><style>) : garder les deux synchronisees (anti-CLS). */
  padding: env(safe-area-inset-top) calc(var(--curtain-width) + env(safe-area-inset-right)) env(safe-area-inset-bottom)
    calc(var(--curtain-width) + env(safe-area-inset-left));
  /* Les deux gradients restent (quasi) opaques : ils portent le rendu
     critique inline (voir <head>). La photo d'ambiance n'est qu'un
     rehaussement charge par ce fichier externe -> elle ne peut jamais
     provoquer de flash ni de CLS a l'arrivee du CSS. */
  background:
    radial-gradient(ellipse 120% 70% at 50% 8%, rgba(var(--color-primary-rgb), 0.38) 0%, transparent 62%),
    linear-gradient(
      180deg,
      rgba(var(--color-bg-rgb), 0.88) 0%,
      rgba(var(--color-bg-rgb), 0.88) 58%,
      rgba(var(--color-bg-alt-rgb), 0.93) 100%
    ),
    url('./img/event/ambience-timer.aa240abeb6.webp') center / cover no-repeat;
  background-color: var(--color-bg);
  opacity: 1;
  transition: opacity 1.2s var(--easing-default);
}

.countdown-overlay.is-hidden {
  opacity: 0;
  pointer-events: none;
}

/* --- Decor ornemental ---------------------------------------------------- */

.deco {
  position: fixed;
  inset: 0;
  overflow: hidden;
  pointer-events: none;
  contain: layout paint style;
}

/* Voile central : assombrit la zone de lecture sans eteindre le decor. */
.deco::after {
  content: '';
  position: absolute;
  inset: 0;
  background: radial-gradient(
    ellipse 62% 54% at 50% 48%,
    rgba(var(--color-bg-alt-rgb), 0.62) 0%,
    rgba(var(--color-bg-alt-rgb), 0.38) 45%,
    transparent 76%
  );
}

.deco__defs {
  position: absolute;
  width: 0;
  height: 0;
  overflow: hidden;
}

/* Palette du decor. Les formes clonees par <use> ne recoivent que des
   proprietes HERITEES (fill / stroke / color), posees sur l'element hote :
   c'est le seul canal fiable pour styler le contenu d'un <use>. */
.deco .f-stage {
  fill: var(--color-stage);
}
.deco .f-deep {
  fill: var(--color-bg-alt);
}
.deco .f-green {
  fill: var(--color-accent);
}
.deco .f-floor {
  fill: url(#gFloor);
}
.deco .f-carpet {
  fill: url(#gCarpet);
}
.deco .rail {
  fill: var(--color-white);
  stroke: var(--color-accent-deep);
  color: var(--color-stage-shade);
}
.deco .g-deep {
  stop-color: var(--color-bg-alt);
}
.deco .g-royal {
  stop-color: var(--color-primary);
}
.deco .g-dark {
  stop-color: var(--color-primary-dark);
}
.deco .g-navy {
  stop-color: var(--color-bg);
}
.deco .g-stage {
  stop-color: var(--color-stage-shade);
}

.deco__curtain {
  position: absolute;
  top: -2%;
  height: 104%;
  width: var(--curtain-width);
  fill: url(#gCurtain);
  stroke: var(--color-bg-alt);
  color: var(--color-primary-light);
}

.deco__curtain--left {
  left: 0;
}

.deco__curtain--right {
  right: 0;
  transform: scaleX(-1);
}

.deco__stage {
  position: absolute;
  left: 50%;
  bottom: -2%;
  width: min(1240px, 168%);
  opacity: 0.85;
  transform: translateX(-50%);
}

.deco__sparks {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
}

.spark {
  fill: var(--color-white);
  transform-box: fill-box;
  transform-origin: center;
  animation: spark-twinkle 5.5s var(--easing-default) infinite;
  opacity: 0.55;
}

.spark--b {
  animation-duration: 7s;
  animation-delay: -2.4s;
}

.spark--c {
  animation-duration: 6.2s;
  animation-delay: -4.1s;
}

.spark--d {
  animation-duration: 8s;
  animation-delay: -1.2s;
}

@keyframes spark-twinkle {
  0%,
  100% {
    opacity: 0.18;
    transform: scale(0.68) rotate(0deg);
  }
  50% {
    opacity: 0.85;
    transform: scale(1) rotate(45deg);
  }
}

/* --- Colonne de contenu -------------------------------------------------- */

.countdown__inner {
  position: relative;
  z-index: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: clamp(18px, 2.6vh, 30px);
  width: 100%;
  max-width: var(--container-max-width);
  margin: auto;
  padding: clamp(28px, 5vh, 64px) var(--gutter-inline);
  text-align: center;
}

/* ==========================================================================
   2. Bandeau partenaires
   ========================================================================== */

.partners {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 14px;
}

.partners__label {
  font-size: 0.6875rem;
  font-weight: 500;
  letter-spacing: 0.34em;
  text-transform: uppercase;
  color: var(--color-text-muted);
}

.partners__list {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: clamp(10px, 2vw, 18px);
  margin: 0;
  padding: 0;
  list-style: none;
}

.partners__item {
  display: flex;
  padding: 5px;
  background: var(--color-white);
  border: 2px solid var(--color-accent);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-sm);
}

.partners__logo {
  width: 76px;
  height: 56px;
  object-fit: contain;
}

/* ==========================================================================
   3. Lockup evenement
   ========================================================================== */

.eyebrow {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 14px;
  margin: 0;
  font-size: clamp(0.625rem, 1.6vw, 0.75rem);
  font-weight: 600;
  letter-spacing: 0.4em;
  text-indent: 0.4em;
  text-transform: uppercase;
  color: var(--color-text);
}

.eyebrow::before,
.eyebrow::after {
  content: '';
  width: clamp(18px, 6vw, 56px);
  height: 1px;
  background: linear-gradient(90deg, transparent, var(--color-accent));
}

.eyebrow::after {
  background: linear-gradient(90deg, var(--color-accent), transparent);
}

.lockup {
  display: grid;
  grid-template-columns: auto auto auto;
  align-items: center;
  justify-content: center;
  gap: clamp(10px, 2.4vw, 34px);
  margin: 0;
  /* Taille de reference du h1 (unite fluide, cf. layer-site-common.md §5.5) :
     les enfants (annee / nom) ont chacun leur propre echelle en valeur
     absolue pour le rendu du lockup, mais le h1 porte lui-meme une taille
     fluide coherente avec le reste du site (fallback si un enfant venait a
     heriter de font-size, ex. via un futur contenu additionnel). */
  font-size: clamp(2.2rem, 6vw, 4rem);
  font-family: var(--font-heading);
  font-weight: 700;
  color: var(--color-text-heading);
}

.lockup__year {
  font-weight: 400;
  /* min(vw, vh) : le lockup respire aussi sur les ecrans bas. */
  font-size: clamp(1.6rem, min(6.4vw, 7.6vh), 4.4rem);
  line-height: 1;
  letter-spacing: 0.01em;
  color: rgba(var(--color-white-rgb), 0.92);
}

.lockup__name {
  display: block;
}

.lockup__name b {
  display: block;
  font-weight: 700;
  font-size: clamp(2.5rem, min(10.4vw, 12.5vh), 6.25rem);
  line-height: 0.94;
  letter-spacing: 0.015em;
  text-transform: uppercase;
}

.tagline {
  max-width: 34ch;
  margin: 0;
  font-size: clamp(1.02rem, 2.4vw, 1.375rem);
  line-height: 1.45;
  text-wrap: balance;
  color: var(--color-text-heading);
}

.subline {
  max-width: 46ch;
  margin: 0;
  font-size: clamp(0.875rem, 1.8vw, 0.9375rem);
  line-height: 1.65;
  text-wrap: pretty;
  color: var(--color-text-muted);
}

/* ==========================================================================
   4. Date de rendez-vous
   ========================================================================== */

.date-plate {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: 8px 12px;
  margin: 0;
  padding: 11px clamp(16px, 3vw, 28px);
  font-size: clamp(0.6875rem, 1.9vw, 0.8125rem);
  font-weight: 600;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--color-text-heading);
  background: var(--glass-bg);
  -webkit-backdrop-filter: blur(var(--glass-blur));
  backdrop-filter: blur(var(--glass-blur));
  border: var(--border-width) solid var(--glass-border);
  border-radius: var(--radius-full);
}

.date-plate__sep {
  color: var(--color-accent);
}

.date-plate sup {
  font-size: 0.7em;
  letter-spacing: 0;
}

/* ==========================================================================
   5. Compte a rebours
   ========================================================================== */

.timer {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: clamp(8px, 1.6vw, 16px);
  width: 100%;
  max-width: 560px;
  margin-top: clamp(2px, 1vh, 10px);
}

.timer__unit {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 6px;
  padding: clamp(12px, 2.4vw, 20px) 4px clamp(10px, 2vw, 16px);
  background: var(--glass-bg);
  -webkit-backdrop-filter: blur(var(--glass-blur));
  backdrop-filter: blur(var(--glass-blur));
  border: var(--border-width) solid var(--glass-border);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-md);
  contain: layout style paint;
}

.timer__value {
  display: block;
  width: 100%;
  font-family: var(--font-body);
  font-weight: 600;
  font-size: clamp(2.125rem, 8vw, 3.75rem);
  line-height: 1;
  font-variant-numeric: tabular-nums lining-nums;
  font-feature-settings: 'tnum' 1, 'lnum' 1;
  text-align: center;
  color: var(--color-text-heading);
}

.timer__label {
  font-size: clamp(0.5625rem, 1.5vw, 0.6875rem);
  font-weight: 600;
  letter-spacing: 0.24em;
  text-indent: 0.24em;
  text-transform: uppercase;
  color: var(--color-text-muted);
}

.timer__done {
  grid-column: 1 / -1;
  margin: 0;
  padding: clamp(12px, 2.4vw, 20px) 4px;
  font-size: clamp(1.02rem, 2.4vw, 1.375rem);
  line-height: 1.45;
  color: var(--color-text-heading);
}

/* ==========================================================================
   6. Mention partenaire technique
   ========================================================================== */

.tech-note {
  margin: clamp(6px, 2vh, 18px) 0 0;
  font-size: 0.75rem;
  letter-spacing: 0.08em;
  color: var(--color-text-muted);
}

.tech-note a {
  color: var(--color-text);
}

/* ==========================================================================
   6bis. Pied de page de l'overlay (mentions legales, partenaires, contact)
   L'overlay masque le <footer> de la page complete (cf. regle
   `body.has-countdown > footer { visibility: hidden }`) : il porte donc
   lui-meme le minimum legal/institutionnel. Flex item du 2nd niveau de
   .countdown-overlay (voir flex-direction: column ci-dessus) : les marges
   auto de .countdown__inner absorbent l'espace libre au-dessus ET en
   dessous, ce qui pousse ce pied de page tout en bas de la vue quand il y a
   de la hauteur disponible, sans jamais chevaucher le contenu si l'espace
   manque (l'ensemble redevient alors defilable, comme avant).
   ========================================================================== */

.overlay-footer {
  position: relative;
  z-index: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  flex-shrink: 0;
  gap: 10px;
  width: 100%;
  max-width: var(--container-max-width);
  margin: 0 auto;
  padding: 16px var(--gutter-inline) clamp(14px, 3vh, 24px);
  font-size: 0.75rem;
  line-height: 1.6;
  text-align: center;
  color: var(--color-text-muted);
  border-top: var(--border-width) solid var(--border-color-light);
}

.overlay-footer p {
  margin: 0;
  max-width: 56ch;
}

.overlay-footer a {
  color: var(--color-text);
}

.overlay-footer__logos {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 12px;
  margin: 0;
  padding: 0;
  list-style: none;
}

.overlay-footer__logo-item img {
  display: block;
  width: 38px;
  height: auto;
  padding: 3px;
  background: var(--color-white);
  border-radius: var(--radius-sm);
  opacity: 0.85;
  transition: opacity var(--transition-base) var(--easing-default);
}

/* Cible tactile >= 44x44px (WCAG 2.5.5) : seul le logo LS est cliquable
   (cf. docs/SITE.md, "A traiter ensuite" #7) ; le visuel du logo reste
   petit, la zone de clic/tap est agrandie sans deborder sur ses voisins
   (le gap de 12px de la liste laisse la marge necessaire). */
.overlay-footer__logo-item a {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 44px;
  min-height: 44px;
  border-radius: var(--radius-md);
}

.overlay-footer__logo-item a:hover img,
.overlay-footer__logo-item a:focus-visible img {
  opacity: 1;
}

/* ==========================================================================
   7. Contenu de repli (revele a la fin du compte a rebours)
   ========================================================================== */

.fallback {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 82svh;
  padding: var(--section-padding-y-mobile) calc(var(--container-padding-x) + env(safe-area-inset-right, 0px))
    var(--section-padding-y-mobile) calc(var(--container-padding-x) + env(safe-area-inset-left, 0px));
  text-align: center;
  background-color: var(--color-bg);
  overflow: hidden;
}

/* Fond photo (visuel cle, reduit a une texture d'ambiance abstraite -- voir
   commentaire de generation : le visuel porte son propre texte, il ne doit
   jamais rester lisible sous le texte HTML reel de cette section). */
.fallback__bg {
  position: absolute;
  inset: 0;
  z-index: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

/* Voile de lisibilite : memes tons que le fond de l'overlay, pour que le
   passage overlay -> repli ne produise aucune rupture de teinte. */
.fallback__scrim {
  position: absolute;
  inset: 0;
  z-index: 0;
  background:
    radial-gradient(ellipse 70% 55% at 50% 42%, transparent 0%, rgba(var(--color-bg-alt-rgb), 0.55) 72%),
    linear-gradient(180deg, rgba(var(--color-bg-rgb), 0.55) 0%, rgba(var(--color-bg-alt-rgb), 0.88) 100%);
}

.fallback__content {
  position: relative;
  z-index: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 20px;
  max-width: var(--container-max-width);
}

.fallback__title {
  margin: 0;
  font-family: var(--font-heading);
  font-weight: 700;
  font-size: clamp(2rem, 7vw, 3.5rem);
  line-height: 1;
  letter-spacing: 0.015em;
  text-transform: uppercase;
  color: var(--color-text-heading);
}

.fallback__lead {
  max-width: 52ch;
  margin: 0;
  color: var(--color-text);
}

/* Bandeau d'ambiance (salle, lumieres bleues) : vraie photo, non abstraite
   -- elle vit dans sa propre carte, jamais derriere du texte. */
.fallback__banner {
  width: 100%;
  max-width: 640px;
  height: auto;
  margin-top: 4px;
  border: var(--border-width) solid var(--glass-border);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-md);
}

.site-footer {
  padding: 24px var(--container-padding-x) calc(32px + env(safe-area-inset-bottom, 0px));
  font-size: 0.75rem;
  text-align: center;
  color: var(--color-text-muted);
  border-top: var(--border-width) solid var(--border-color-light);
}

/* ==========================================================================
   8. Responsive
   Mobile-first : le socle (regles hors media query, plus haut) est pense
   pour le petit ecran ; les media queries `min-width` ci-dessous ne font
   qu'ENRICHIR l'affichage a mesure que l'espace grandit (jamais l'inverse).
   Points de repere `layer-site-common.md` §5.5, verifies presents ici :
   769 (desktop), 768 (tablette portrait), 640 (grand mobile), 480 (petit
   mobile). Le timer passe de 4 colonnes a 2x2 des 480px et reste lisible
   en dessous (chiffres tabulaires, pas de troncature).
   ========================================================================== */

@media (min-width: 769px) {
  .fallback {
    padding: var(--section-padding-y) calc(var(--container-padding-x) + env(safe-area-inset-right, 0px))
      var(--section-padding-y) calc(var(--container-padding-x) + env(safe-area-inset-left, 0px));
  }
}

/* Tablette portrait : palier intermediaire entre le rideau large du bureau
   et le rideau resserre du mobile, pour eviter un saut visuel brutal. */
@media (max-width: 768px) {
  :root {
    --curtain-width: clamp(40px, 10vw, 120px);
  }
}

@media (max-width: 640px) {
  :root {
    --curtain-width: clamp(34px, 12vw, 70px);
    --glass-blur: 14px;
  }

  /* Haies d'honneur retirees : trop serrees sous la colonne de texte. */
  .deco .rail {
    display: none;
  }

  /* Bandeau partenaires du haut masque sur mobile : redondant avec
     .overlay-footer__logos (memes 3 logos), qui reste seul visible et
     porte le lien LS cliquable. */
  .partners {
    display: none;
  }

  .partners__logo {
    width: 62px;
    height: 46px;
  }

  .partners__item {
    padding: 4px;
    border-width: 1.5px;
  }

  /* Filets de l'eyebrow retires : la ligne tient alors sur un seul niveau. */
  .eyebrow {
    letter-spacing: 0.28em;
  }

  .eyebrow::before,
  .eyebrow::after {
    display: none;
  }

  /* Plaque de date empilee, sans separateurs orphelins. */
  .date-plate {
    flex-direction: column;
    gap: 3px;
    padding: 13px 20px;
    letter-spacing: 0.13em;
    border-radius: var(--radius-lg);
  }

  .date-plate__sep {
    display: none;
  }

  /* Marges resserrees pour recuperer quelques pixels sur les petits
     ecrans : le contenu (mentions legales) n'est jamais retire, voir
     §8 (regle @media (max-height: 780px)) pour le meme principe. */
  .overlay-footer {
    gap: 6px;
    padding-block: 10px clamp(12px, 3vh, 20px);
  }

  .overlay-footer__logo-item img {
    width: 28px;
  }

  /* Accroche secondaire masquee sur mobile : doublon semantique du
     compte a rebours (le timer dit deja que l'ouverture se fait a sa
     fin), et occupe 3-4 lignes sur les ecrans les plus etroits. Le
     paragraphe reste dans le DOM (tablette/bureau, SEO) : simplement
     non peint ici. */
  .subline {
    display: none;
  }

  /* Mention technique masquee sur mobile : doublon exact de
     .overlay-footer__meta (« Propulse par GoTombola »), quelques centaines
     de pixels plus bas sur le meme ecran. L'attribution reste visible via
     le pied de page overlay. */
  .tech-note {
    display: none;
  }
}

/* Petit mobile : l'unite "Secondes" (deja aria-hidden="true" dans le markup,
   §8) est masquee visuellement sans perte d'info pour l'a11y, et le timer
   reste sur une seule ligne de 3 colonnes (jamais de 2x2, qui double la
   hauteur du bloc precisement ou la place manque le plus). Le lockup
   resserre son entrejambe annee/nom. */
@media (max-width: 480px) {
  .timer__unit[aria-hidden='true'] {
    display: none;
  }

  .timer {
    grid-template-columns: repeat(3, minmax(0, 1fr));
  }

  .timer__value {
    /* Plafond abaisse vs la regle de base (§8) pour que 3 colonnes tiennent
       sans jamais tronquer les chiffres (tabular-nums deja en place). */
    font-size: clamp(1.75rem, 7.5vw, 3.75rem);
  }

  .lockup {
    gap: 8px;
  }
}

/* Ecrans bas, mobile compris : rythme vertical resserre pour que l'ecran
   d'attente tienne sans defilement. Le "min-width: 641px" d'origine
   excluait a tort tous les telephones, pourtant les plus contraints en
   hauteur utile — c'est desormais un simple `max-height`. */
@media (max-height: 780px) {
  .countdown__inner {
    gap: clamp(11px, 1.7vh, 22px);
    padding-block: clamp(18px, 3vh, 40px);
  }

  .partners__label {
    display: none;
  }

  .timer__unit {
    padding-block: clamp(10px, 1.8vh, 20px) clamp(8px, 1.4vh, 16px);
  }

  .tech-note {
    margin-top: 2px;
  }

  /* Les mentions legales (§7.1) restent toujours visibles : on ne
     resserre que les marges, jamais le contenu. */
  .overlay-footer {
    gap: 6px;
    padding-block: 10px 14px;
  }
}

/* Palier intermediaire (paysage tablette/portable, largeur >= 641px) :
   reduction de logo dediee a ce seul cas. En dessous de 641px, le bloc
   `@media (max-width: 640px)` applique deja une reduction plus marquee
   (62x46) : la fusionner ici l'aurait agrandie a 66x49 pour les mobiles,
   soit une regression contraire a l'objectif de resserrement. */
@media (max-height: 780px) and (min-width: 641px) {
  .partners__logo {
    width: 66px;
    height: 49px;
  }
}

/* Ecrans TRES bas (item-008, demande 2026-09-25-1108) : les planchers de
   `@media (max-height: 780px)` ci-dessus restent bloques a leur minimum
   (`clamp(11px, 1.7vh, 22px)` etc.) des 650px de haut deja, faute de
   marge supplementaire a rogner avec un simple vh. Verifie par mesure
   DOM (getBoundingClientRect vs innerHeight, Chrome headless/CDP) a
   320x568 et 360x640 : le pied de page legal depassait encore le
   viewport de 150px, resp. 40px, malgre `overflow: hidden` (§1) — donc
   invisible et inatteignable. Planchers encore abaisses ici, sans
   jamais retirer de contenu (mentions legales toujours completes). */
@media (max-height: 650px) {
  .countdown__inner {
    gap: clamp(6px, 1vh, 11px);
    padding-block: clamp(10px, 2vh, 18px);
  }

  .timer__unit {
    padding-block: clamp(6px, 1.2vh, 10px) clamp(5px, 1vh, 8px);
  }

  .overlay-footer {
    gap: 4px;
    padding-block: 6px clamp(8px, 1.5vh, 10px);
  }
}

/* Paysage telephone (largeur "confortable" mais hauteur minimale) : les
   memes elements deja consideres redondants en portrait etroit (§6,
   `max-width: 640px`) le sont ici aussi, car ce n'est pas la largeur qui
   manque mais la hauteur. Sans ce retrait, mesure a 844x390 (item-008),
   le compte a rebours ET le pied de page legal depassaient entierement
   du viewport (jusqu'a 391px de troncature) — completement invisibles
   derriere `overflow: hidden`. Seuil 480px : capte le paysage telephone
   (~360-430px de haut usuels) sans toucher au paysage tablette/portable
   (>= 500px de haut), qui a la place d'afficher ces elements. */
@media (max-height: 480px) {
  .partners {
    display: none;
  }

  .subline {
    display: none;
  }

  .tech-note {
    display: none;
  }

  .timer__unit[aria-hidden='true'] {
    display: none;
  }

  .timer {
    grid-template-columns: repeat(3, minmax(0, 1fr));
  }
}

/* ==========================================================================
   9. Preferences utilisateur
   Bloc `prefers-reduced-motion` obligatoire et non negociable
   (layer-theme-common.md §9.4) : neutralise TOUTES les animations
   decoratives (scintillements du decor) et le fondu de bascule de
   l'overlay (`.countdown-overlay.is-hidden`, transition opacity 1.2s)
   d'un seul coup, via la regle universelle ci-dessous.
   ========================================================================== */

@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }

  /* Scintillement neutralise explicitement (et non laisse a la merci d'un
     `!important` universel) : etat fixe, sans a-coup. */
  .spark {
    animation: none;
    opacity: 0.8;
  }
}

@media (prefers-contrast: more) {
  :root {
    --color-text-muted: var(--color-text-contrast);
    --glass-bg: rgba(var(--color-bg-alt-rgb), 0.72);
    --glass-border: rgba(var(--color-white-rgb), 0.45);
  }
}

/* ==========================================================================
   10. Interactions transverses — fx-motion / fx-static
   `script.js` detecte `prefers-reduced-motion`, le pointeur grossier
   (tactile) et le petit ecran, puis pose `fx-static` ou `fx-motion` sur
   `<html>`. `fx-static` retire les effets les plus couteux (glassmorphism
   `backdrop-filter`, budget "Eleve/Eleve" — layer-theme-common.md §14.1 —
   et scintillement) au lieu de se limiter au seul signal OS de
   `prefers-reduced-motion`, pour les appareils d'entree de gamme /
   ecrans tactiles ou le rendu est le plus couteux. Fonctionne meme sans
   JS : `fx-motion`/`fx-static` absents -> le socle CSS ci-dessus
   (glassmorphism, scintillement) reste actif par defaut. */

.fx-static .spark {
  animation: none;
  opacity: 0.35;
}

.fx-static .timer__unit,
.fx-static .date-plate {
  background: rgba(var(--color-bg-alt-rgb), 0.65);
  -webkit-backdrop-filter: none;
  backdrop-filter: none;
}
