
@import url("klaro.min.css");
@import url('https://fonts.googleapis.com/css2?family=Klee+One:wght@400;600&family=Nunito:wght@400;600&family=Russo+One&display=swap');
:root {
  --beige: #FAF8F4;
  --peach: #ffa07a;
  --peach-deep: #e07a4f;
  --peach-soft: #ffd9c4;
  --text: #4a3b33;
  --text-light: #fdf6f0;
}

* { box-sizing: border-box; }

html, body {
  margin: 0;
  overscroll-behavior: none;
  overflow-x: clip;
}

body {
  font-family: "Klee One", sans-serif;
  font-weight: 400;
  color: #4a3b33;
  background: #FAF8F4;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  user-select: none;
  -webkit-user-select: none;
  min-width: 860px;
}

/* Touch phones / small tablets (≤600px): horizontal-leak clipping MUST use
   `overflow-x: clip`, never `hidden`. `hidden` is not in the visible/clip set, so
   per CSS it forces the other axis (overflow-y) to compute to `auto`, turning
   <html>/<body> into a SCROLL CONTAINER. On Chromium-Android that root scroll
   container silently breaks single-finger vertical touch scroll — it is handed to
   the visual viewport, so only two-finger pinch-pan still moves the page — even
   though scrollHeight ≫ innerHeight the whole time. Confirmed on a 533px tablet:
   html/body computed `hidden auto`, scrollHeight 3126 vs innerHeight 784, scroll
   dead. `clip` clips the same horizontal overflow but, being in the visible/clip
   set, leaves overflow-y `visible`, so <html> stays the normal viewport scroller and
   native single-finger scrolling works. The base `html, body { overflow-x: clip }`
   already does this; here we only reset <body>'s min-width and re-assert `clip`.
   DO NOT revert to `hidden`: the old reason (Firefox reportedly leaking a hairline of
   horizontal scroll through `clip` past transformed/sticky descendants — the carousel
   cards) is already contained at section level (.carousel / #s2). Restoring scroll on
   every touch browser outweighs a possible Firefox-Android cosmetic leak; if that leak
   resurfaces, clip a WRAPPER element, never the document scroller. */
@media (pointer: coarse) and (max-width: 600px) {
  /* Téléphones tactiles : on ANNULE le plancher min-width:860px de <body> (posé plus
     haut pour la barre de défilement horizontale du DESKTOP étroit). Sur un téléphone
     (ex. 375px) ce plancher forçait toute la page à 860px de large → mise en page
     mobile cassée. min-width:0 rend à <body> sa largeur de viewport. Les tablettes
     (coarse ≥601px) conservent le plancher 860px + la barre horizontale (règles
     ci-dessous) → inchangé ; desktop (pointer: fine) inchangé. overflow-x reste `clip`
     (hérité du bloc de base) — surtout PAS `hidden` (voir la note ci-dessus). */
  body { min-width: 0; }
  /* <html> garde explicitement overflow-x: clip — NE PAS repasser en `hidden`, qui en
     ferait un conteneur de défilement et casserait le scroll tactile à un doigt.
     `clip` bloque la fuite horizontale ; overflow-y reste `visible`, donc <html> reste
     le scroller du viewport et window.scrollY (dont dépend le JS du carrousel) marche. */
  html { overflow-x: clip; }
}

/* Below 860px the min-width: 860px on <body> must surface a NATIVE horizontal
   scrollbar. Setting overflow-x: visible on html/body does NOT work: the root's
   overflow is propagated to the viewport, and a `visible` viewport doesn't
   reliably produce a scrollbar for an over-wide child (and the base `clip`
   suppresses it outright). The robust cross-browser fix is to make <html> an
   explicit horizontal SCROLL CONTAINER — a scroll container always shows a
   native scrollbar when its content overflows, with no propagation involved.
     - On <html> (the document element), NOT <body>: making <body> a scroll
       container would break window.scrollY / window 'scroll' events that the
       carousel JS depends on; <html> stays the document scroller so those work.
     - <body> keeps its base overflow-x: clip (carousel transformed-card leak
       protection) — it's still 860px wide via min-width and overflows <html>,
       which now scrolls to reveal it.
   Scoped to <860px AND (fine pointer OR coarse tablet ≥601px); coarse phones
   (≤600px) keep their responsive overflow-x: clip from the block above, and
   ≥860px keeps the base `clip` (no scrollbar when the layout fits). */
@media (pointer: fine) and (max-width: 859px),
       (pointer: coarse) and (min-width: 601px) and (max-width: 859px) {
  html { overflow-x: auto; }
}

/* Large tablets (coarse, ≥860px): body's min-width:860 now fits the viewport, but the base
   html{overflow-x:clip} still LEAKS horizontal scroll on transformed/sticky/fixed descendants
   (the carousel track), exactly as on phones. Harden <html> with `hidden` (honoured where
   `clip` leaks). Disjoint from the 768–859px range above — whose overflow-x:auto scrollbar is
   intentional — and never matches pointer:fine desktop, so neither is affected. Touch, so no
   mouse wheel for `hidden` to swallow. */
@media (pointer: coarse) and (min-width: 860px) {
  html { overflow-x: hidden; }
}

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

body.page-loading * { transition: none; }

.nav-trigger {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 20vh;
  z-index: 99;
  background: transparent;
  pointer-events: auto;
}

.site-header {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  min-height: 66px;
  z-index: 100;
}

.nav-inner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  min-height: 66px;
  padding: 0 clamp(1rem, 4vw, 2.5rem);
  background: transparent;
  color: #ffffff;
  -webkit-backdrop-filter: blur(0);
  backdrop-filter: blur(0);
}

.logo {
  font-family: "Klee One", Georgia, serif;
  font-weight: 600;
  font-size: clamp(1.1rem, 4vw, 1.9rem);
  color: inherit;
  text-decoration: none;
  letter-spacing: 0.01em;
  white-space: nowrap;
  text-shadow: 4px 2px 6px rgba(0,0,0,0.9);
  user-select: none;
}

.nav-list {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: clamp(0.4rem, 1.5vw, 1.1rem);
  margin: 0;
  padding: 0;
  list-style: none;
  justify-content: flex-end;
}

.nav-item {
  font-family: "Klee One", sans-serif;
  font-weight: 500;
  -webkit-text-stroke: 0.1px currentColor;
  font-size: 0.98rem;
  letter-spacing: 0.04em;
  color: inherit;
  background: transparent;
  border: 0;
  padding: 0.35em 0.4em;
  cursor: pointer;
  white-space: nowrap;
  text-shadow: 4px 2px 4px rgba(0,0,0,0.9);
}

.btn-lang {
  background: var(--peach);
  color: var(--text-light);
  font-size: 0.98rem;
  border-radius: 2em;
  padding: 0.3em 0.9em;
  min-width: 7rem;
  text-shadow: none;
}

.page-blog .site-header:not(.is-scrolled) #btn-lang {
  background: #FAF8F4;
  color: #ffa07a;
}

@media (hover: hover) {
.nav-inner {
    background: transparent;
    box-shadow: none;
    -webkit-backdrop-filter: blur(0);
    backdrop-filter: blur(0);
transition: background-color 600ms ease, color 600ms ease,
            backdrop-filter 600ms ease, -webkit-backdrop-filter 600ms ease,
            box-shadow 600ms ease;
  }

  .nav-trigger:hover ~ .site-header .nav-inner,
  .site-header:hover .nav-inner {
    opacity: 0.92;
    background: #FAF8F4;
    color: var(--text);
    -webkit-backdrop-filter: blur(8px);
    backdrop-filter: blur(8px);
    box-shadow: 0 4px 14px rgba(74, 59, 51, 0.10);
  }

  .nav-item:hover { color: var(--peach-deep); }

  .btn-lang:hover { color: var(--text-light); background: var(--peach-deep); }
}

/* ── Desktop bar height lock ──────────────────────────────────────────────────
   On desktop the full nav row (VOYAGE, HÉBERGEMENT, … + Langues) is visible. The
   base .nav-list is flex-wrap:wrap and .site-header/.nav-inner use min-height (not a
   fixed height), so a row that does not fit wraps to a second line and the min-height
   box grows past 66px. Lock the bar to exactly 66px and forbid wrapping: the row stays
   single-line and shrinks (the clamp gap closes, flex items give up width) — and if it
   still cannot fit it overflows horizontally rather than wrapping or growing taller.
   We deliberately do NOT add overflow:hidden anywhere in the nav chain: .nav-item is
   overflow:visible !important and .nav-dropdown is absolutely positioned off each <li>,
   so clipping would also clip the dropdown menus. Scoped to (min-width:1251px) to mirror
   the (max-width:1250px) block that display:none's these items on mobile/tablet, so the
   mobile layout (and its 120px/110px/101px bars) is untouched. */
@media (hover: hover) and (min-width: 1251px) {
  .site-header,
  .nav-inner { height: 66px !important; }
  .nav-list {
    flex-wrap: nowrap;   /* never wrap to a second line */
    min-width: 0;        /* let the list shrink within .nav-inner instead of forcing growth */
  }
  .nav-item { min-width: 0; flex-shrink: 1; } /* allow items to give up width before overflowing */
}

/* ── Touch-tablet-landscape bar height lock ───────────────────────────────────
   Counterpart to the desktop lock above, for touch tablets in landscape. At this
   breakpoint the block near line ~4581 already RE-shows the full single-row nav
   (not the hamburger) and already sets .nav-list flex-wrap:nowrap — but nothing
   locks the bar height, so the leftover min-height rules keep it tall with the row
   floating in wasted space: min-height:101px @601–1200px coarse (line ~2057) and
   min-height:120px @≤1250px (line ~2002). height alone can NOT fix this — per the
   box model min-height always wins over height (used height = max(min-height,height)),
   and !important doesn't change that because they're different properties. So we must
   ALSO drop min-height to 66px; both need !important to beat those (normal-specificity)
   min-height rules. Same no-overflow:hidden reasoning as the desktop lock (dropdowns
   hang absolutely off each <li>, so 66px doesn't clip them). Uses the project's standard
   tablet-landscape query. */
@media (pointer: coarse) and (hover: none) and (orientation: landscape) and (min-height: 450px) {
  .site-header,
  .nav-inner {
    height: 66px !important;
    min-height: 66px !important;   /* REQUIRED: height alone can't override the 101px/120px min-heights */
  }
  .nav-list { flex-wrap: nowrap; } /* never wrap to a second line (reinforces the ~4581 block) */
}

@media (hover: none) {
  .nav-inner {
    opacity: 0.90;
    background: #FAF8F4;
    color: var(--text);
    -webkit-backdrop-filter: blur(8px);
    backdrop-filter: blur(8px);
    box-shadow: 0 4px 14px rgba(74, 59, 51, 0.10);
  }
  .nav-trigger { display: none; }
  .nav-item { text-shadow: none; }
  .logo { text-shadow: none; }
}

.site-header.is-scrolled .nav-inner {
  opacity: 0.90;
  background: #FAF8F4;
  color: var(--text);
  -webkit-backdrop-filter: blur(8px);
  backdrop-filter: blur(8px);
  box-shadow: 0 4px 14px rgba(74, 59, 51, 0.10);
}
.site-header.is-scrolled .nav-item,
.site-header.is-scrolled .logo,
.site-header.is-scrolled .btn-menu-mobile {
  text-shadow: none;
}
.site-header.is-scrolled .btn-menu-mobile {
  color: #4a3b33;
  --dash-color: #ffa07a;
  background: transparent;
}

.site-header.is-scrolled.is-on-peach .nav-inner {
  background: transparent !important;
  box-shadow: none !important;
  backdrop-filter: blur(0) !important;
  -webkit-backdrop-filter: blur(0) !important;
  color: var(--text-light) !important;
}
.site-header.is-scrolled.is-on-peach .nav-item,
.site-header.is-scrolled.is-on-peach .logo,
.site-header.is-scrolled.is-on-peach .btn-menu-mobile {
  color: var(--text-light) !important;
  text-shadow: 0 1px 6px rgba(0, 0, 0, 0.3);
}
.site-header.is-scrolled.is-on-peach .btn-menu-mobile {
  --dash-color: #FAF8F4;
}

.site-header.is-on-peach #btn-lang {
  background: #FAF8F4;
  color: #ffa07a !important;
}

@media (hover: hover) {
  .nav-trigger:hover ~ .site-header.is-scrolled.is-on-peach .nav-inner,
  .site-header.is-scrolled.is-on-peach:hover .nav-inner {
    background: #FAF8F4 !important;
    color: var(--text) !important;
    box-shadow: 0 4px 14px rgba(74, 59, 51, 0.10) !important;
    -webkit-backdrop-filter: blur(8px) !important;
    backdrop-filter: blur(8px) !important;
  }
  .nav-trigger:hover ~ .site-header.is-scrolled.is-on-peach .nav-item,
  .nav-trigger:hover ~ .site-header.is-scrolled.is-on-peach .logo,
  .nav-trigger:hover ~ .site-header.is-scrolled.is-on-peach .btn-menu-mobile,
  .site-header.is-scrolled.is-on-peach:hover .nav-item,
  .site-header.is-scrolled.is-on-peach:hover .logo,
  .site-header.is-scrolled.is-on-peach:hover .btn-menu-mobile {
    color: var(--text) !important;
    text-shadow: none !important;
  }
  .nav-trigger:hover ~ .site-header.is-scrolled.is-on-peach .btn-menu-mobile,
  .site-header.is-scrolled.is-on-peach:hover .btn-menu-mobile {
    --dash-color: #ffa07a;
  }
}

.nav-list > li { position: relative; overflow: visible; }
.nav-item {
  position: relative;
  overflow: visible !important;
}

.nav-dropdown {
  position: absolute;
  top: calc(100% + 15px);
  left: 0;
  z-index: 99;
  overflow: visible;
  min-width: 190px;
  margin: 0;
  padding: 18px 0 0.4rem 0;
  list-style: none;
  background: rgba(255, 255, 255, 0.95);
  -webkit-backdrop-filter: blur(38px);
  backdrop-filter: blur(8px);
  border-radius: 0 0 12px 12px;
  box-shadow: 0 10px 22px rgba(74, 59, 51, 0.14);

  opacity: 0;
  transform: translateY(-8px);
  pointer-events: none;
  transition: opacity 200ms ease, transform 200ms ease;
}

.nav-dropdown::before {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  bottom: 100%;
  height: 18px;
  background: transparent;
}

@media (hover: hover) {
  .nav-list > li:hover > .nav-dropdown,
  .nav-list > li.is-open > .nav-dropdown,
  .nav-list > li > .nav-dropdown:hover {
    opacity: 1;
    transform: translateY(0);
    pointer-events: auto;
  }
}

.nav-list > li:focus-within:not(:hover) > .nav-dropdown {
  opacity: 1;
  transform: translateY(0);
  pointer-events: auto;
}

.dropdown-item {
  position: relative;
  display: block;
  width: 100%;
  text-align: left;
  font-family: "Klee One", sans-serif;
  font-weight: 400;
  font-size: 1rem;
  letter-spacing: 0.02em;
  color: var(--text);
  background: transparent;
  border: 0;
  padding: 0.6em 1.15em;
  cursor: pointer;
  white-space: nowrap;
}

@media (hover: hover) {
  .dropdown-item:hover {
    color: var(--peach-deep);
    background: rgba(255, 160, 122, 0.10);
  }
}

/* ── Blog page, transparent nav (over the peach section) ──────────────────────
   When the nav is transparent (.page-blog body, header without .is-scrolled),
   the default near-white blurred dropdown reads as a washed-out box and its dark
   peach text vanishes. Make the dropdown a solid peach panel with light text so
   it matches the transparent bar. Scoped to .page-blog + :not(.is-scrolled) only,
   so every other dropdown (scrolled blog, homepage, etc.) is untouched. */
.page-blog .site-header.is-on-peach .nav-dropdown {
  background: #e8956f;
  -webkit-backdrop-filter: none;
  backdrop-filter: none;
  box-shadow: 0 12px 16px 4px rgba(255,255,255,0.28);
}
.page-blog .site-header.is-on-peach .dropdown-item {
  color: #FAF8F4;
  text-shadow: none;
}
@media (hover: hover) {
  .page-blog .site-header.is-on-peach .dropdown-item:hover {
    color: #ffffff;
    background: rgba(255, 255, 255, 0.18);
  }
}

@media (hover: hover) {
  .page-blog .site-header:not(.is-scrolled):not(.is-on-peach) .btn-menu-mobile {
    background: transparent;
  }
}


.lang-dropdown {
  right: 0;
  left: auto;
  min-width: 160px;
  overflow: visible;
}

@media (hover: hover) and (min-width: 1251px) {
  .lang-dropdown {
    display: grid;
    grid-template-columns: 1fr 1fr 1fr;
    column-gap: 0.5rem;
  }
  .lang-dropdown .lang-flag {
    font-size: 1.8em;
    line-height: 1;
    vertical-align: middle;
  }
}

.connexion-dropdown {
  min-width: 140px;
}

.voyage-dropdown {
  min-width: 160px;
}

.lang-item {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.6rem;
  text-decoration: none;
  color: var(--text);
}

.lang-currency {
  color: var(--peach-deep);
  font-size: 0.82rem;
  font-weight: 500;
}

.lang-separator {
  height: 1px;
  background: rgba(74, 59, 51, 0.15);
  margin: 0.4rem 1rem;
  pointer-events: none;
}

.lang-lang-item.is-selected {
  color: var(--peach-deep);
  font-weight: 600;
}

/* Les drapeaux du menu langue sont des emoji « regional indicator » (🇫🇷, 🇬🇧 …).
   Windows ne possède pas ces glyphes -> Chrome/Edge les affichent en lettres
   (« FR », « GB »…). On charge la police Mozilla « Twemoji Country Flags » LIMITÉE
   aux codepoints drapeaux (unicode-range U+1F1E6–1F1FF) et on la met en TÊTE de la
   pile de .lang-dropdown .lang-lang-item : les drapeaux rendent via cette police sur
   Windows, le reste du texte (noms de langue) garde « Klee One » (police effective
   héritée de .dropdown-item/body, hors plage unicode). Même correctif que la page
   map. (0,2,0) > .dropdown-item (0,1,0) ; seul font-family est posé. */
@font-face {
  font-family: "Twemoji Country Flags";
  unicode-range: U+1F1E6-1F1FF;
  src: url("https://cdn.jsdelivr.net/npm/country-flag-emoji-polyfill@0.1/dist/TwemojiCountryFlags.woff2") format("woff2");
  font-display: swap;
}
.lang-dropdown .lang-lang-item {
  font-family: "Twemoji Country Flags", "Klee One", sans-serif;
}

.lang-currency-item.is-selected {
  color: var(--peach-deep);
  font-weight: 600;
}

.lang-arrow { display: none; }

.lang-dropdown.is-locked {
  opacity: 1 !important;
  transform: translateY(0) !important;
  pointer-events: auto !important;
}

.lang-arrow-curved {
  position: absolute;
  top: calc(100% + 8px);
  right: clamp(1.5rem, 5vw, 4rem);
  width: 60px;
  height: 80px;
  overflow: visible;
  pointer-events: none;
  z-index: 3;
  opacity: 0;
  transition: opacity 150ms ease;
}

.lang-arrow-curved.is-visible {
  opacity: 1;
}

.lang-arrow-curved path {
  fill: none;
  stroke: #ffa07a;
  stroke-linecap: round;
  stroke-linejoin: round;
}

@keyframes langBlink {
  0%, 100% { opacity: 1; }
  50%       { opacity: 0.35; }
}

.btn-lang.is-blinking {
  animation: langBlink 800ms ease 3;
}

.stabilo {
  position: absolute;
  top: -9px;
  left: -10px;
  width: calc(100% + 20px);
  height: calc(100% + 18px);
  overflow: visible;
  pointer-events: none;
}

.stabilo path {
  fill: none;
  stroke: #ffa07a;
  stroke-width: 5;
  stroke-linecap: round;
  stroke-linejoin: round;
}

.stabilo-underline {
  position: absolute;
  bottom: -5px;
  left: 0;
  width: auto;
  height: 12px;
  overflow: visible;
  pointer-events: none;
}

.stabilo-underline path {
  fill: none;
  stroke: #ffa07a;
  stroke-width: 5;
  stroke-linecap: round;
  stroke-linejoin: round;
}

@media (hover: hover) {
  .cursor-heart-overlay {
    position: fixed;
    inset: 0;
    z-index: 9998;
    pointer-events: none;
  }

  .cursor-heart-svg {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    overflow: visible;
    pointer-events: none;
  }

  #cursor-heart {
    fill: none;
    stroke: #ffa07a;
    stroke-width: 2.8;
    stroke-linecap: round;
    stroke-linejoin: round;
  }
}

.carousel-section {
  width: 100%;
  height: 100vh;
  background: transparent;
  position: relative;
  z-index: 3;
  /* Cards in #carousel-track are translateX'd across (and past) the edges;
     hidden contains that horizontal travel so it can't create page-wide
     horizontal scroll on Firefox. The expand panel sits inside this box. */
  overflow-x: hidden; /* Safari < 16 fallback: clip not supported */
  overflow-x: clip;
  overflow-y: visible;
}

#carousel-track {
  position: absolute;
  inset: 0;
}

.carousel-card-wrapper {
  position: absolute;
  top: 65%;
  width: clamp(260px, 21vw, 270px);
  height: clamp(338px, 27.3vw, 350px);
  border-radius: 16px;
  box-shadow: -6px 10px 28px rgba(0, 0, 0, 0.55);
  cursor: pointer;
  will-change: transform;
}

.carousel-card {
  position: relative;
  width: 100%;
  height: 100%;
  border-radius: 16px;
  overflow: hidden;
  transform: translateZ(0);
  backface-visibility: hidden;
}

.carousel-card-inner {
  position: relative;
  z-index: 2;
  width: 100%;
  height: 100%;
  display: flex;
  align-items: flex-end;
  justify-content: center;
  padding-bottom: 40px;
  font-family: "Klee One", sans-serif;
  font-size: 1.2rem;
  color: #fff;
  text-shadow: 0 1px 6px rgba(0, 0, 0, 0.5);
}

.card-img {
  position: absolute;
  top: 8%;
  left: 8%;
  width: 84%;
  height: 67%;
  z-index: 1;
  object-fit: cover;
  object-position: center center;
  border-radius: 0px;
  pointer-events: none;
}

@media (max-width: 600px) {
  #carousel-panel {
    width: 55% !important;
    padding: clamp(0.5rem, 2vw, 1rem) !important;
  }
}

#glitter-canvas {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  pointer-events: none;
  z-index: 0;
  transition: opacity 600ms ease;
}

#peach-wash {
  position: absolute;
  inset: 0;
  z-index: 0;
  background: #ffa07a;
  opacity: 0;
  pointer-events: none;
}

#carousel-title {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 35vh;
  z-index: 4;
  box-sizing: border-box;
  padding: var(--nav-h, 66px) 1rem 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-align: center;
  font-family: "Klee One", sans-serif;
  font-weight: 600;
  font-size: clamp(0.8rem, 4vw, 3rem);
  color: #4a3b33;
}
#carousel-title-text { margin: 0; white-space: normal; position: relative; }

@media (pointer: coarse) and (orientation: portrait),
(pointer: coarse) and (orientation: landscape) and (min-height: 450px) {
  #carousel-title-text { white-space: nowrap; }
}

  #stabilo-svg {
  position: absolute;
  left: -30px;
  top: 0;
     width: calc(100% + 60px);
  height: 100%;
  z-index: -1;
  pointer-events: none;
  overflow: visible;
  clip-path: inset(0 100% 0 0);
}
#stabilo-poly { fill: #ffa07a; opacity: 0.42; }
#stabilo-svg.is-drawn {
  clip-path: inset(0 0 0 0);
  transition: clip-path 600ms ease-out;
}

#s3 {
  position: relative;
}

/* #amazon-title est desormais en FLUX (plus en position:absolute) : il occupe sa
   propre place au-dessus du widget. Plus besoin de pousser le widget de 35vh ; le
   flux les enchaine naturellement. */
#s3 .s3-viator-wrap {
  margin-top: 0;
  display: flex;
  justify-content: center;
  width: 100%;
}
/* The Viator widget sizes its card grid to the width of its container. As a
   flex item the partner div would otherwise shrink to its content (1 card), so
   give it the full row width (capped) to fit 4 cards side by side. */
#s3 div[data-vi-partner-id] {
  width: 100%;
  max-width: 1100px;
}

#amazon-title {
  /* En FLUX normal entre le widget Travelpayouts (au-dessus) et le widget Viator
     (en dessous) ; on garde position:relative (et non static) car le surligneur
     #amazon-stabilo-svg est position:absolute, height:100% et doit rester cale sur
     ce titre. Plus de top/left/right/height/margin imposes -> le flux le place. */
  position: relative;
  z-index: 4;
  box-sizing: border-box;
  padding: 1rem;
  padding-top: 45px;
  padding-bottom: 25px;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-align: center;
  font-family: "Klee One", Georgia, serif;
  font-weight: 600;
  font-size: clamp(0.8rem, 4vw, 3rem);
  color: #FAF8F4;
}
#amazon-title-text { margin: 0; white-space: nowrap; position: relative; }
@media (pointer: coarse) and (orientation: landscape) and (min-height: 450px) {
  #amazon-title { font-size: clamp(0.8rem, 2.8vw, 2rem); }
}
#amazon-title-text span {
  display: inline-block;
  opacity: 0;
  white-space: pre;
}
#amazon-title-text span.is-popped {
  animation: letterPop 0.5s cubic-bezier(0.34, 1.56, 0.64, 1) both;
}
#amazon-stabilo-svg {
  position: absolute;
  left: -30px;
  top: 0;
  width: calc(100% + 60px);
  height: 100%;
  z-index: -1;
  pointer-events: none;
  overflow: visible;
  clip-path: inset(0 100% 0 0);
}
#amazon-stabilo-poly { fill: #e07a4f; opacity: 0.7; }
#amazon-stabilo-svg.is-drawn {
  clip-path: inset(0 0 0 0);
  transition: clip-path 600ms ease-out;
}

#dest-outer {
  height: 100vh;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  padding-top: 0vh;
  padding-bottom: 200px;
  box-sizing: border-box;
  opacity: 0;
  transform: translateY(80px);
  transition: opacity 2s ease-out, transform 2s ease-out;
  overflow: hidden;
}

@media (pointer: coarse) and (min-width: 601px) and (max-width: 1250px) {

  .blog-s1 {
    padding-top: calc(66px + 2.5rem + 40px) !important;
  }
  /* L'ecart AU-DESSUS du titre ne peut PAS se faire via #amazon-title : son
     parent #s3 a margin-top:-20vh (bloc @media 601-1024px, ligne ~1114) qui le
     remonte par-dessus le widget Travelpayouts, et un margin-top sur le titre se
     "collapse" a travers #s3 (sans bordure/padding). On corrige donc sur #s3
     lui-meme. Selecteur .page-blog #s3 (1,1,0) > #s3 (1,0,0) -> bat le -20vh sans
     !important, et NE touche PAS le #s3 de l'accueil. */
  .page-blog #s3 {
    margin-top: 50px;
  }
  /* Ecart EN DESSOUS du titre (vers le widget Viator) : interne a #s3, non
     affecte par le -20vh -> il fonctionne directement. */
  #amazon-title {
    margin-bottom: 50px;
  }
}

#dest-outer.is-visible {
  opacity: 1;
  transform: translateY(0);
}

#dest-track {
  display: flex;
  flex-direction: row;
  gap: 20px;
  padding: 0 40px;
  will-change: transform;
}

.dcard {
  flex: 0 0 410px;
  height: clamp(396px, calc(100vh - 460px), 541px);
  border-radius: 16px;
  overflow: hidden;
  cursor: pointer;
  background-size: cover;
  background-position: center;
  position: relative;
}
.dcard::before {
  content: "";
  position: absolute;
  inset: 0;
  background-image: inherit;
  background-size: cover;
  background-position: center;
  transform: scale(1);
  transition: transform 0.8s ease;
  z-index: 0;
}
.dcard:hover::before {
  transform: scale(1.05);
}

.dcard-overlay {
  position: absolute;
  inset: 0;
  background: linear-gradient(to top, rgba(0, 0, 0, 0.35) 0%, transparent 25%);
}

.dcard-info {
  position: absolute;
  bottom: 18px;
  left: 18px;
}

.dcity {
  display: block;
  color: white;
  font-size: 22.8px;
  font-weight: 700;
  font-family: Quicksand, sans-serif;
}

.dregion {
  display: block;
  color: rgba(255, 255, 255, 0.75);
  font-size: 14.4px;
  margin-top: 2px;
  font-family: Quicksand, sans-serif;
}

.dprice {
  display: inline-block;
  margin-top: 8px;
  background: #E07A4F;
  color: white;
  font-weight: 700;
  font-size: 13px;
  padding: 5px 12px;
  border-radius: 20px;
  font-family: Quicksand, sans-serif;
  transition: transform 0.3s ease;
  transform-origin: left center;
}

.dcard:hover .dprice {
  transform: scale(1.15);
}

/* #blog-widget-overlay reuses the destination-dialog shell verbatim (fixed,
   full-screen blue translucent backdrop + blur, flex-centered). It is hidden by
   default via inline display:none and opened by setting display:flex. */
#destDialog,
#blog-widget-overlay {
  position: fixed;
  inset: 0;
  background: rgba(26, 58, 92, 0.30);
  backdrop-filter: blur(2px);
  -webkit-backdrop-filter: blur(2px);
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 9999;
  border: none;
  padding: 24px 12px;
  overflow-y: auto;
  box-sizing: border-box;
}

/* Keep the fixed nav OUT of #destDialog's backdrop-filter blur.
   backdrop-filter blurs everything painted behind the element: .site-header
   (z-index:100) paints before #destDialog (z-index:9999), so it lands in the
   dialog's backdrop and gets blurred along with the page. While the dialog is
   open, lift the header above the blur layers so it is no longer part of the
   backdrop — 10000 is above the dialog (9999) and its overlay (9998) but below
   the in-dialog language list (10001), which must stay on top.
   Scoped by :has(#destDialog[style*="display: flex"]) — main.js toggles the
   dialog via inline display:none/flex — so this matches ONLY the homepage (the
   sole page with #destDialog) and ONLY while it is open. Blog pages and
   .compose-modal have no #destDialog, and the homepage mobile drawer
   (z-index:1000/1001, a body sibling of the header) is never covered because
   the lift applies only when the destination dialog itself is open. */
body:has(#destDialog[style*="display: flex"]) .site-header {
  z-index: 10000;
}

#destDialog .dest-box,
#blog-widget-overlay .dest-box {
  max-width: 450px;
  width: 90%;
  background: #FAF8F4;
  border-radius: 20px;
  padding: 32px 28px;
  font-family: Quicksand, sans-serif;
  display: flex;
  flex-direction: column;
  gap: 12px;
}
#destDialog .dest-box h2 {
  font-size: 20px;
  font-weight: 700;
  color: #4a3b33;
  margin: 0;
  text-align: center;
}
#destDialog .dest-box p {
  font-size: 14px;
  color: #7a6b63;
  margin: 0;
  text-align: center;
}
#destDialog .dest-box p strong {
  color: #E07A4F;
}
#destDialog .dest-btns {
  display: flex;
  gap: 10px;
  margin-top: 8px;
  justify-content: center;
}

.dest-btn-cancel {
  background: transparent;
  border: 1.5px solid #ffa07a;
  border-radius: 12px;
  padding: 12px 29px;
  cursor: pointer;
  font-family: Quicksand, sans-serif;
  font-size: 17px;
}

.dest-btn-go {
  background: #E07A4F;
  color: white;
  font-weight: 700;
  border: none;
  border-radius: 12px;
  padding: 12px 29px;
  cursor: pointer;
  font-family: Quicksand, sans-serif;
  font-size: 17px;
}

.dest-btn-cancel:hover {
  background: #f2e8de;
  border-color: #a89888;
}

.dest-btn-go:hover {
  background: #c05a2f;
}

/* Language picker inside the destination popup. Custom dropdown so the option
   list renders inside the popup with a controllable z-index and is never clipped
   by the popup container. */
#destDialog .dest-box { overflow: visible; }
#destDialog .dest-lang-label {
  display: none;
}
#destDialog .dest-lang {
  position: relative;
  width: 100%;
}
#destDialog .dest-lang-trigger {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  width: 100%;
  font-family: Quicksand, sans-serif;
  font-size: 16px;
  color: #4a3b33;
  background: #FAF8F4;
  border: 1.5px solid #ffa07a;
  border-radius: 12px;
  padding: 11px 14px;
  cursor: pointer;
  text-align: left;
}
#destDialog .dest-lang-trigger:focus {
  outline: none;
  border-color: #E07A4F;
}
#destDialog .dest-lang-caret {
  color: #ffa07a;
  font-size: 13px;
  transition: transform 0.18s ease;
}
#destDialog .dest-lang.is-open .dest-lang-caret {
  transform: rotate(180deg);
}
#destDialog .dest-lang-list {
  position: fixed;
  top: auto;
  left: 0;
  margin: 0;
  padding: 6px;
  list-style: none;
  background: #FAF8F4;
  border: 1.5px solid #ffa07a;
  border-radius: 12px;
  box-shadow: 0 12px 30px rgba(74, 59, 51, 0.18);
  max-height: 260px;
  overflow-y: auto;
  z-index: 10001;
  display: none;
  scrollbar-width: auto;
  scrollbar-color: #ffa07a transparent;
}
#destDialog .dest-lang-list::-webkit-scrollbar {
  width: 18px;
}
#destDialog .dest-lang-list::-webkit-scrollbar-track {
  background: transparent;
}
#destDialog .dest-lang-list::-webkit-scrollbar-thumb {
  background: #ffa07a;
  border-radius: 9px;
}
#destDialog .dest-lang.is-open .dest-lang-list {
  display: block;
}
#destDialog .dest-lang-option {
  font-family: Quicksand, sans-serif;
  font-size: 16px;
  color: #4a3b33;
  padding: 10px 12px;
  border-radius: 8px;
  cursor: pointer;
}
#destDialog .dest-lang-option:hover {
  background: #ffa07a;
  color: #ffffff;
}
#destDialog .dest-lang-option.is-selected {
  background: rgba(255, 160, 122, 0.22);
  font-weight: 700;
}

/* Popup variant that hosts the injected Travelpayouts widget. */
#destDialog .dest-box--widget,
#blog-widget-overlay .dest-box--widget {
  position: relative;
  max-width: 760px;
  width: 92%;
  padding: 40px 20px 20px;
  margin: auto;
  overflow: visible;
}
#destDialog .dest-widget-close,
#blog-widget-overlay .dest-widget-close {
  position: absolute;
  top: 10px;
  right: 14px;
  background: transparent;
  border: none;
  font-size: 28px;
  line-height: 1;
  color: #4a3b33;
  cursor: pointer;
  font-family: Quicksand, sans-serif;
  z-index: 1;
}
#destDialog .dest-widget-close:hover,
#blog-widget-overlay .dest-widget-close:hover {
  color: #E07A4F;
}
#destDialog .dest-widget-mount,
#blog-widget-mount {
  width: 100%;
  /* No height cap and no scroll container here — the widget's internal
     destination/date dropdowns must be free to expand beyond the mount. */
  overflow: visible;
}

@media (prefers-reduced-motion: reduce) {
  #dest-outer { transition: none; }
}

/* ── Mobile-only (≤600px) pagination dots for the #dest-track carousel ─────
   Injected from JS (no HTML edits) as the last child of #dest-outer, so the row
   sits just below the cards. Hidden on every viewport except phones. The five
   dots are identical in size; a single fully-opaque dot travels across them on
   each swipe (see animateDots() in main.js) and then they settle back to 50%. */
.dest-dots { display: none; }

@media (max-width: 600px) {
  .dest-dots {
    display: flex;
    justify-content: center;
    align-items: center;
    gap: 10px;
    margin-top: 26px;
  }
  .dest-dot {
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: #FAF8F4;
    opacity: 0.5;
    transition: opacity 90ms ease, transform 90ms ease;
  }
  .dest-dot.is-active {
    opacity: 1;
    transform: translateY(-5px);
  }

  /* One card per screen: make each .dcard exactly the viewport width and let it
     sit flush to the edges (drop the track's 40px side padding). The 20px gap is
     intentionally LEFT as-is — the JS auto-scroll/snap math (GAP = 20) and the
     infinite-loop wrap depend on the CSS gap matching that constant. With the
     card at 100vw + 20px gap, each swipe advances exactly one full-width card.

     align-self: flex-start is critical. #dest-outer centers its items
     (align-items: center), but #dest-track is far wider than the viewport, so
     centering offsets it sideways by a non-whole number of card widths — the
     viewport then straddles a card boundary and shows two half-cards. The JS
     translateX() snap assumes the track's left edge is at x=0, so the track must
     be left-aligned for 100vw cards to land flush. (The dots stay centered.) */
  #dest-track {
    padding: 0;
    align-self: flex-start;
  }
  .dcard {
    flex: 0 0 100vw;
    width: 100vw;
  }
}

@media (min-width: 601px) and (max-width: 1024px) {
  #s3 { margin-top: -20vh; }
}

/* DESKTOP (pointer:fine) ≤1024px : le `#s3 { margin-top:-20vh }` ci-dessus tire
   #s3 — donc le titre #amazon-title — vers le HAUT, par-dessus le bloc Mika +
   widget Travelpayouts → chevauchement entre 860 et 1024px. Les tablettes
   (pointer:coarse) y échappent déjà via `.page-blog #s3 { margin-top:50px }`.
   Au-dessus de 1025px, #s3 est en flux normal (margin-top:0) et tout est correct.
   On annule donc le -20vh pour les pointeurs fins jusqu'à 1024px : le titre reste
   exactement à la même place qu'au-dessus de 1025px — plus de remontée, plus de
   chevauchement, et plus de saut au seuil 1024/1025. Même spécificité que la règle
   -20vh (#s3 = 1,0,0) mais PLUS BAS dans la source → l'emporte sur pointeur fin. */
@media (pointer: fine) and (max-width: 1024px) {
  #s3 { margin-top: 0; }
}

/* Large touch tablets (Galaxy Tab S9 @1280px, iPad Pro @1366px, etc.) are
   pointer:coarse but sit ABOVE 1250px, so they fall through to the portrait/
   landscape blocks (later in source) which provide top:62%. The cap is 1250px,
   aligned to the project's nav-switch breakpoint. Still gated on pointer:coarse,
   so hover:hover desktops in this width range are unaffected. The 601–1200
   coarse block below (later in source) keeps the smaller-tablet tier at
   top:62%, so only 1201–1250 gets this top:58%. */
@media (max-width: 1250px) and (pointer: coarse) {
  :root { --nav-h: 120px; }
  .carousel-card-wrapper { top: 58%; }
}
@media (max-width: 600px) {
  :root { --nav-h: 128px; }
  .carousel-card-wrapper { top: 64%; }
  .carousel-card-inner {
    position: absolute;
    left: 0;
    right: 0;
    top: 75%;
    bottom: 0;
    width: auto;
    height: auto;
    align-items: center;
    padding-bottom: 0;
    font-size: 1.5rem;
  }
}

/* ── Tablet landscape (touch, ≥601px, landscape) : keep #destDialog below nav bar ── */
@media (pointer: coarse) and (min-width: 601px) and (orientation: landscape) {
  #destDialog {
    padding-top: var(--nav-h) !important;
  }
}

/* ── Tablet portrait (touch, ≥601px, portrait) : double all #destDialog sizes ── */
@media (pointer: coarse) and (min-width: 601px) and (orientation: portrait) {
  #destDialog .dest-box {
    max-width: 900px !important;
    padding: 64px 56px !important;
    border-radius: 40px !important;
  }
  #destDialog .dest-box h2 {
    font-size: 40px !important;
  }
  #destDialog .dest-box p {
    font-size: 28px !important;
  }
  .dest-btn-cancel,
  .dest-btn-go {
    font-size: 34px !important;
    padding: 24px 58px !important;
    border-radius: 24px !important;
  }
  #destDialog .dest-lang-trigger {
    font-size: 32px !important;
    padding: 22px 28px !important;
    border-radius: 24px !important;
    white-space: nowrap !important;
  }
  #destDialog .dest-lang-option {
    font-size: 32px !important;
    padding: 20px 24px !important;
  }
  #destDialog .dest-lang-list {
    max-height: 520px !important;
  }
  #destDialog .dest-widget-back {
    font-size: 32px !important;
    padding: 22px 28px !important;
    border-radius: 24px !important;
  }
}


#carousel-title-text span {
  display: inline-block;
  opacity: 0;
  white-space: pre;
}
#carousel-title-text span.is-popped {
  animation: letterPop 0.5s cubic-bezier(0.34, 1.56, 0.64, 1) both;
}

@keyframes letterPop {
  0%   { opacity: 0; transform: translateY(28px) scale(0.6); }
  60%  { opacity: 1; transform: translateY(-6px) scale(1.12); }
  100% { opacity: 1; transform: translateY(0)    scale(1); }
}

@media (hover: hover) {
  .carousel-card-wrapper:hover {
    box-shadow: 0 16px 48px rgba(74, 59, 51, 0.32);
  }
}

.hero-section {
  position: sticky;
  top: 0;
  z-index: 1;
  /* Match .hero-stage's unit: the stage child is 100dvh (tracks the mobile URL
     bar), so pinning the SECTION to the stable-large 100vh left a dead strip at
     the bottom of #s1 whenever the bar was visible (dvh < vh). With no background
     on .hero-section that strip showed through as a white band, and as the bar
     collapsed (dvh → vh) it closed — read on touch tablets as #s2 sliding up over
     #s1 with a moving white gap. Making the section track the same dynamic
     viewport keeps parent and child equal-height → no strip. 100vh stays as the
     fallback for engines without dvh; on desktop dvh === vh so the sticky overlap
     is unchanged. (We make the WRAPPER dynamic, never the stage — per the
     .hero-stage note, the stage must keep tracking the visual viewport.) */
  height: 100vh;
  height: 100dvh;
  overflow: hidden;
}

#scroll-chevron {
  position: fixed;
  bottom: 2.5rem;
  left: 50%;
  transform: translateX(-50%);
  z-index: 10;
  cursor: pointer;
  opacity: 1;
  transition: opacity 400ms ease;
  padding: 1.5rem 2rem;

}
#scroll-chevron svg {
  display: block;
  width: 40px;
  height: 20px;
  opacity: 0.8;
  filter: drop-shadow(0px 3px 2px rgba(0,0,0,0.7));
  animation: chevronBounce 1.6s ease-in-out infinite;
}
@keyframes chevronBounce {
  0%   { transform: translateY(0); }
  50%  { transform: translateY(10px); }
  100% { transform: translateY(0); }
}
.site-header.is-scrolled ~ main #scroll-chevron {
  opacity: 0;
}
/* The page's own "Fade-in section 1" reveal scripts stamp an INLINE opacity:1
   on #scroll-chevron once it appears, and an inline style beats the selector
   rule above — so on phones the chevron could never fade back out when
   .is-scrolled is added on leaving #s1, leaving it stuck at the bottom across
   every section. That inline opacity is set by the page's inline script (which
   we can't touch), so defeat it with !important here, scoped to mobile.
   pointer-events:none also stops the now-hidden chevron from being tappable. */
@media (max-width: 600px) {
  .site-header.is-scrolled ~ main #scroll-chevron {
    opacity: 0 !important;
    pointer-events: none;
  }
  #scroll-chevron {
    bottom: 3rem !important;
    z-index: 2;
  }
}
@media (prefers-reduced-motion: reduce) {
  #scroll-chevron svg {
    animation: none;
  }
}

.cover-section {
  position: relative;
  z-index: 2;
  min-height: 20vh;
  background: #F2EBE0;
  box-shadow: 0 -6px 22px rgba(74, 59, 51, 0);
  transition: box-shadow 300ms ease, background-color 400ms ease;
}

.cover-section.is-lifting {
  box-shadow: 0 -30px 42px -6px rgba(74, 59, 51, 0.68);
}

.cover-section-4 {
  position: relative;
  z-index: 3;
  height: 100vh;
  background: #FAF8F4;
  box-shadow: 0 -27px 36px -6px rgba(74, 59, 51, 0.60);
}

@media (pointer: coarse) and (orientation: landscape) {
  .cover-section.is-lifting {
    box-shadow: none;
  }
  .cover-section-4 {
    box-shadow: none;
  }
}

.site-footer {
  position: relative;
  z-index: 4;
}

.s4-scene {
  position: relative;
  width: 100%;
  min-height: 100vh;
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
}
body.page-home .s4-scene {
  background-image: url('https://cdn.followmika.com/assets/images/Homepage/yuuki_robot.webp');
}

/* TOUCH (pointer: coarse, tablet) — pin the s4 globe scene to the STABLE large
   viewport so its background-size:cover image can never reflow with the URL bar.
   NOTE on intent: unlike the hero (which is 100dvh and therefore genuinely
   bar-tracking + drifting), s4 is sized in vh, and on every modern engine vh
   already resolves to the large/stable viewport (vh == lvh; dvh is the
   bar-tracking unit). So this is a STABILITY GUARANTEE / hardening — it forces
   the stable viewport on any engine and is a no-op where vh is already stable —
   not the structural drift-fix the hero required. If background motion is still
   observed on s4, it is NOT bar-reflow and must be diagnosed separately (e.g.
   the #incenseSmoke WebGL canvas or the manga bubble, both animated).
   #s4 is display:none on phones, so this is scoped to the tablet (≥601px) where
   the scene is visible. lvh is Baseline (2023); engines without it drop the line
   and fall back to the 100vh above. Desktop (pointer: fine) untouched. */
@media (pointer: coarse) and (min-width: 601px) {
  .cover-section-4 { height: 100lvh; }
  .s4-scene { min-height: 100lvh; }
}

@media (max-width: 601px) {
  /* Hide the entire globe scene (incense smoke + manga bubble + clickable globe)
     on phones. #s4 (id, specificity 1,0,0) beats the base .cover-section-4
     (0,1,0) so no !important is needed. display:none — not visibility/opacity —
     so #globe-placeholder (role="button" tabindex="0") leaves the tab order and
     a11y tree, never trapping keyboard/screen-reader focus on an unseen control.
     Its destination (/fr/blog/map/) stays reachable via the menu, so nothing is
     orphaned. The .s4-scene / #incenseSmoke / .manga-bubble rules below are now
     inert (hidden parent) but harmless. */
  #s4 {
    display: none;
  }
  /* #s4 (id) raises specificity to (1,1,0) so this beats the base
     .cover-section-4 { height: 100vh } regardless of source order, letting
     the section collapse to the .s4-scene's natural 9:16 height. */
  #s4.cover-section-4 {
    height: auto;
    min-height: 0;
  }
  /* Kill the rising incense-smoke (WebGL canvas in .s4-scene) on phones. The
     `display` property isn't set by the canvas's inline style, so this needs no
     !important; main.js additionally loses the WebGL context so the inline
     animation loop stops doing GPU work, not just hides. */
  #incenseSmoke {
    display: none;
  }
  .site-footer__disclosure br {
    display: none;
  }
  /* The hide above targets the home page's interactive globe scene. The flights
     page #s4 is a plain background image (S4_smartphone.webp, 1:1) with manga
     bubbles — appropriate on phones and already art-directed. Restore it here.
     Specificity (1,1,0) > (1,0,0) so it wins without !important. */
  body.page-flights #s4 {
    display: block;
  }
  /* Make the scene a square to match the 1:1 S4_smartphone.webp art direction.
     min-height:0 clears the base min-height:100vh so aspect-ratio governs the
     height (mirrors the tablet-portrait pattern at line ~1466). The section's
     height:auto (above) expands to contain the square scene. */
  body.page-flights .s4-scene {
    min-height: 0;
    aspect-ratio: 1 / 1;
  }
  /* Center the image inside the square container; !important beats the inline
     object-position:center top on the <img>. No visual effect on the 1:1 image
     (no cropping occurs in cover mode), but semantically correct. */
  body.page-flights #s4 picture img {
    object-position: center !important;
  }
}

@media (pointer: coarse) and (min-width: 601px) and (orientation: landscape) {
  body.page-home .s4-scene {
    background-image: url('https://cdn.followmika.com/assets/images/Homepage/yuuki_robot_tablette.webp');
  }
}
@media (pointer: coarse) and (min-width: 601px) and (orientation: portrait) {
  /* New yuuki_robot_smartphone.webp is 1:1 (768×768). Collapse the section from
     100lvh down to the square scene so its #FAF8F4 background no longer shows as a
     band below the image (the white space the previous min-height:100vw left). */
  .cover-section-4 { height: auto; }
  .s4-scene {
    /* 1:1 image in a 1:1 box: cover fills the full width with no left/right bars and,
       because the aspect ratios match, crops nothing and distorts nothing. */
    background-size: cover;
    background-position: center;
    /* aspect-ratio derives the square from the scene's REAL rendered width — not the
       viewport unit 100vw, which includes the scrollbar gutter and breaks if the
       section ever gains padding/max-width. min-height:0 clears the inherited
       100vh / 100lvh floor (lines ~1387/1409) so aspect-ratio governs the height.
       aspect-ratio is already used elsewhere in this file (the 9/16 hero boxes). */
    min-height: 0;
    aspect-ratio: 1 / 1;
  }
  body.page-home .s4-scene {
    background-image: url('https://cdn.followmika.com/assets/images/Homepage/yuuki_robot_smartphone.webp');
  }
}

@media (pointer: coarse) and (min-width: 601px) and (max-width: 601px) and (orientation: portrait) {
  #s4 {
    display: none;
  }
}

.s4-scene .manga-bubble-wrap {
  position: absolute;
  top: 8% !important;
  right: 18%;
}

.s4-scene #globe-placeholder {
  position: absolute;
  top: 50%;
  left: 51%;
  transform: translate(-50%, -50%);
}

#globe-placeholder {
  width: 300px;
  height: 300px;
  border-radius: 50%;
  background: transparent;
  cursor: pointer;
  flex-shrink: 0;
}
#globe-placeholder:focus-visible {
  outline: 3px solid #1A3A5C;
  outline-offset: 4px;
}

/* Tablettes tactiles (pointer: coarse + min-width 601px), portrait ET paysage :
   on agrandit la cible cliquable du globe de 260px à 390px. Pas de clause
   d'orientation -> les deux orientations sont couvertes. Sélecteur #globe-placeholder
   (1,0,0) identique à la règle de base ci-dessus : placé APRÈS dans l'ordre source,
   il gagne sans !important. Le globe reste centré (top:52%/left:55.5% +
   translate(-50%,-50%) ancre le centre), donc il grandit symétriquement et reste
   aligné sur le globe du fond. Mobile (≤600 ; #s4 masqué en ≤600) et desktop
   (pointer: fine) non touchés ; règle de base et autres breakpoints inchangés. */
@media (pointer: coarse) and (min-width: 601px) {
  #globe-placeholder {
    width: 390px;
    height: 390px;
  background: transparent;
  }
}

@media (pointer: coarse) and (min-width: 601px) and (orientation: landscape) {
  .s4-scene #globe-placeholder {
    top: 50% !important;
    left: 50% !important;
  }
  #globe-placeholder {
    background: transparent;
    width: 300px !important;
    height: 300px !important;
  }
}

.manga-bubble-wrap {
  position: relative;
  display: inline-block;
  transform: scale(0);
  transform-origin: bottom center;
  opacity: 0;
  transition: transform 0.55s cubic-bezier(0.34, 1.56, 0.64, 1), opacity 0.55s ease;
}
.manga-bubble-wrap.is-visible { transform: scale(1); opacity: 1; }
.manga-bubble-wrap svg { width: clamp(180px, 24vw, 300px); max-width: 92vw; display: block; }
.manga-bubble-wrap svg.is-flipped { transform: scaleX(-1); }
.manga-bubble-text {
  position: absolute;
  top: 46%; left: 50%;
  transform: translate(-50%, -50%);
  width: 76%;
  text-align: center;
  font-family: 'Quicksand', sans-serif;
  font-size: 14px !important;
  font-weight: 600;
  color: #1A3A5C;
  line-height: 1.6;
  pointer-events: none;
  /* Words are never split: see .manga-word below. Keep both `normal` so nothing
     here re-introduces intra-word breaking. */
  word-break: normal;
  overflow-wrap: normal;
  margin: 0;
}
.manga-bubble-text span { display: inline-block; opacity: 0; white-space: pre-wrap; }

/* The JS builders render each letter as its own inline-block <span> (required so
   the mangaLetterPop transform applies — transforms are ignored on inline boxes).
   But adjacent inline-block boxes are soft-wrap opportunities, so without grouping
   the line could break between ANY two letters (e.g. "com-bine"). Each word's
   letters are therefore wrapped in a .manga-word box with white-space:nowrap, which
   suppresses every break opportunity inside it — leaving the spaces BETWEEN words as
   the only place a line can wrap, in every language and at every viewport size.
   Higher specificity than `.manga-bubble-text span` above so it restores opacity:1
   (a wrapper at opacity:0 would hide all of its letters) and nowrap over pre-wrap. */
.manga-bubble-text .manga-word {
  display: inline-block;
  white-space: nowrap;
  opacity: 1;
}

/* #echoBubble (l'écho sous le 1er carrousel) : la bulle (SVG) doit prendre la
   largeur de SON conteneur — clamp(160px,22vw,320px) — et non sa propre largeur
   clamp(180–300) qui désynchronisait la bulle et la boîte de texte (en %). Le
   viewBox de #echoBubble est désormais symétrique (-200..200), donc le centre du
   corps (x=0) tombe à 50% : left:50% centre vraiment le texte DANS le corps, pas
   sur la queue. Retour à la ligne aux espaces uniquement (jamais au milieu d'un
   mot). Réglages limités à #echoBubble pour ne pas toucher les bulles héro/s4. */
#echoBubble svg { width: 100%; }
#echoBubble .manga-bubble-text {
  top: 40%;
  width: 72%;
  word-break: normal;
  overflow-wrap: normal;
  hyphens: none;
}

@media (pointer: coarse) and (min-width: 601px) and (max-width: 1250px) {
  #echoBubble .manga-bubble-text {
    width: 82% !important;
  }
}

/* Tablette tactile en mode PORTRAIT (pointer: coarse + min-width 601px +
   orientation: portrait) : agrandit le texte de la bulle écho (#echoBubbleText).
   #echoBubbleText (1,0,0) + !important passe devant le font-size INLINE posé par
   le JS (l.5043 main.js : clamp(9px,1.2vw,14px)) et les `.manga-bubble-text`
   clamp (0,1,0). La règle #echoBubbleText 16px (l.5426) est en orientation:
   landscape -> exclusive, aucun conflit ; la page flights garde son
   body.page-flights #echoBubbleText (1,1,1), non touché.
   VALEUR : 32px demandé débordait (pire cas : le FR « ...partenaires de
   confiance ! » = 60 car. sans saut de ligne, et le DE long avec
   « vertrauenswürdige ») ; 22px est le max où ces cas tiennent CONFORTABLEMENT
   (3 lignes dans la bulle de 368px de large, mesuré). NB : la bulle écho est
   display:none en ≤600px, donc 601px est la borne naturelle. */
@media (pointer: coarse) and (min-width: 601px) and (orientation: portrait) {
  #echoBubbleText {
    font-size: 16px !important;
  }
  .site-header.is-scrolled ~ main #scroll-chevron {
    opacity: 0 !important;
    pointer-events: none;
  }
  #scroll-chevron {
    position: fixed;
    z-index: 2;
  }
}

.manga-bubble-text span.is-popped {
  animation: mangaLetterPop 0.35s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;
}
@keyframes mangaLetterPop {
  0%   { opacity: 0; transform: translateY(6px)  scale(0.6);  }
  60%  { opacity: 1; transform: translateY(-4px) scale(1.15); }
  80%  {             transform: translateY(1px)  scale(0.97); }
  100% { opacity: 1; transform: translateY(0px)  scale(1);    }
}
@media (prefers-reduced-motion: reduce) {
  .manga-bubble-wrap { transform: scale(1); transition: none; }
  .manga-bubble-text span.is-popped { animation: none; opacity: 1; transform: none; }
}


/* Tablette tactile en mode PORTRAIT uniquement (pointer: coarse + min-width 601px
   + orientation: portrait). La bulle manga de la section 4 (#mangaBubbleWrap /
   .s4-scene .manga-bubble-wrap) y est trop petite : on DOUBLE la taille du SVG
   (clamp 180/24vw/300 -> 360/48vw/600) et du texte (clamp 8/1vw/12 -> 16/2vw/24,
   le double de la règle de base `.manga-bubble-text` ligne ~1577), et on descend la bulle
   plus bas (top: 20% !important, aligné sur la règle de base). Sélecteurs préfixés .s4-scene (spécificité 0,2,x) +
   !important pour battre la règle de base `.manga-bubble-text { font-size: clamp(9px, 1.4vw, 16px) !important }` (0,1,0) ligne ~1577. Pas de max-width : aucun chevauchement avec le mobile
   (≤600), le paysage (orientation: landscape), ni le desktop (pointer: fine)
   — ces cibles restent intactes. Le max-width:92vw de base sur le SVG reste actif
   (garde-fou overflow). */

@media (pointer: coarse) and (min-width: 601px) and (orientation: portrait) {
  .s4-scene .manga-bubble-wrap svg {
    width: clamp(216px, 28.8vw, 360px) !important;
  }
  .s4-scene .manga-bubble-text {
    font-size: 14px;
  }
  .s4-scene .manga-bubble-wrap {
    top: 22% !important;
    left: 70% !important;
    right: auto !important;
    transform: scale(1.1) !important;
  }
}

@media (pointer: coarse) and (min-width: 601px) and (orientation: landscape) {
  .s4-scene .manga-bubble-wrap {
    top: 13% !important;
    left: 62% !important;
    right: auto !important;
  }
}

#mangaBubbleHero {
  position: absolute;
  top: 100px;
  left: clamp(45%, 10%, 0%);
  z-index: 2;
}

@media (pointer: coarse) and (min-width: 601px) and (orientation: portrait) {
  #mangaBubbleHero {
    position: absolute !important;
    top: 15% !important;
    left: 60% !important;
    transform: scale(1.2) !important;
  }
  #mangaBubbleHero svg {
    width: clamp(198px, 33vw, 287px) !important;
  }
  #mangaBubbleHero #mangaBubbleHeroText.manga-bubble-text {
    font-size: 14px !important;
    padding-top: 1%;
  }
  #incenseSmoke {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
  }
}

@media (pointer: coarse) and (hover: none) and (orientation: landscape) and (min-height: 450px) {
  #mangaBubbleHero {
    position: absolute !important;
    top: 24% !important;
    left: 45% !important;
    transform: scale(1.1) !important;
  }
  #mangaBubbleHero svg {
    width: clamp(198px, 33vw, 287px) !important;
  }
  #mangaBubbleHero #mangaBubbleHeroText.manga-bubble-text {
    font-size: clamp(10px, 1.5vw, 14px) !important;
  }
}

@media (pointer: coarse) and (orientation: landscape) {
  #amazon-title {
    padding-top: 80px;
    padding-bottom: 30px;
  }
}

.cover-title {
  margin: 0;
  padding: 2rem;
  font-family: "Klee One", Georgia, serif;
  font-weight: 600;
  font-size: clamp(2rem, 6vw, 4rem);
  color: var(--text-light);
}

main { display: block; }

.hero-stage {
  position: relative;
  width: 100%;
  /* height: 100vh fallback, then 100dvh (dynamic — tracks the mobile URL bar so the
     stage matches the VISUAL viewport during the bar collapse).
     DO NOT change this to `height: 100%`: tested on a real touch tablet, pinning the
     stage to the parent's stable large 100vh makes the URL-bar-collapse background
     drift ~2x WORSE (the stable-large box diverges further from the visual viewport
     mid-transition). Any drift fix must live at the image layer, never on the stage. */
  height: 100vh;
  height: 100dvh;
  overflow: hidden;

  background: #FAF8F4;
}

.hero-layer {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;

  opacity: 1;
  visibility: hidden;
  transform: translateX(100%) scale(0.88);
  transform-origin: right center;
  z-index: 0;
  pointer-events: none;
}

.hero-layer.is-previous {
  visibility: visible;
  transform: none;
  z-index: 1;
}

.hero-layer.is-active {
  visibility: visible;
  transform: none;
  z-index: 2;
  pointer-events: auto;
}

.hero-layer.is-entering {
  animation: manga-page-in 1.3s cubic-bezier(0.1, 0, 0.3, 1) both;
  visibility: visible;
  z-index: 2;
  pointer-events: none;
}

@keyframes manga-page-in {
  0% {
    transform: translateX(100%) scale(0.88);
    box-shadow: -14px 0 32px rgba(74, 59, 51, 0.32);
  }
  55% {
    transform: translateX(0) scale(0.88);
    box-shadow: -14px 0 32px rgba(74, 59, 51, 0.32);
  }
  100% {
    transform: translateX(0) scale(1);
    box-shadow: 0 0 0 rgba(74, 59, 51, 0);
  }
}

.layer-bg {
  position: absolute;
  inset: 0;
  background: #FAF8F4;
}

/* The <img> carries an HTML width="1920" attribute that wins over CSS unless
   we set an explicit width; force the picture/img to fill the layer and cover
   it so the intrinsic 1920px width can never overflow, at any breakpoint. */
.layer-bg picture,
.layer-bg img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center top;
}

/* TOUCH (pointer: coarse) — pin the ENTIRE hero as one completely static backdrop
   while #s2 slides over it: the background image AND all of section 1's foreground
   content (title "Mika Hara", tagline, "Comment ça marche" button, social links,
   and the manga bubble) must not move a single pixel during scroll, portrait AND
   landscape.

   How: promote the ACTIVE hero layer from position:absolute (anchored to the
   scrolling stage) to position:fixed (anchored to the viewport). This works in ONE
   rule because everything inside the layer is positioned relative to it:
     • .layer-bg (the image) is position:absolute; inset:0 — fills the fixed layer.
     • .hero-intro (title/tagline/button/social) is position:absolute with its own
       top/left + z-index:6 (NOT a flex child) — so it keeps its exact offsets and
       its stacking ABOVE the image.
   Fixing the LAYER therefore pins the image and all foreground content together as
   one unit. Height 100lvh = the STABLE large viewport, so nothing reflows when the
   URL bar collapses; combined with `fixed`, the hero is immune to both scroll
   translation and viewport-height changes. The opaque sections below (#s2 z-index:2
   and up) scroll up and cover the fixed hero, so it only shows within section 1.

   The manga bubble (#mangaBubbleHero) is NOT inside the layer — it's a sibling of
   .hero-stage in #s1. It stays position:absolute (its base value), NOT fixed: as a
   child of #s1 (position:sticky, overflow:hidden) it is anchored inside the hero box
   and CLIPPED by #s1's overflow, so it scrolls away under #s2 instead of floating
   over later sections. z-index:2 + DOM order (stage → bubble) paints it OVER the hero
   image; #s2 (z-index:2) then covers #s1's subtree on the way up — matching desktop.
   (It was briefly position:fixed here; fixed escaped the #s1 overflow clip and pinned
   the bubble to the viewport, leaving it floating after the footer in tablet
   landscape — the same trap documented on the hero CTA near l.4700.)

   Safe: no ancestor (html/body/main/.hero-stage/.hero-section — and
   .hero-layer.is-active is transform:none) establishes a containing block, so
   `fixed` resolves against the viewport, not a scrolling box. Scoped to .is-active
   (theme-switch slide-in, which transforms the entering layer, is untouched) and to
   pointer:coarse (DESKTOP keeps its sticky-hero behavior unchanged). 100lvh is
   Baseline (2023); engines without it fall back to the stage-sized box. */
@media (pointer: coarse) {
  .hero-layer.is-active {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
  }
  #mangaBubbleHero {
    position: absolute;
    z-index: 2;
  }
}

@media (pointer: coarse) and (orientation: portrait) {
  .hero-section { height: 100vh; height: 100svh; }
  .hero-stage   { height: 100vh; height: 100svh; }
}

@media (pointer: coarse) and (orientation: landscape) {
  #carousel-title {
    padding-top: 4rem;
  }
  .carousel-card-wrapper {
    top: 72% !important;
    width: clamp(286px, 23.1vw, 297px) !important;
    height: clamp(372px, 30vw, 385px) !important;
  }
  .hero-section {
    height: 120vh !important;
    position: static;
    top: auto;
    z-index: auto;
  }
  .hero-stage {
    margin-top: var(--nav-h, 66px);
    height: calc(120vh - var(--nav-h, 66px));
  }
  .hero-layer .layer-bg img {
    height: 100% !important;
    object-position: center center !important;
  }
  #scroll-chevron {
    position: fixed !important;
    bottom: 1.5rem;
  }
  #carousel-panel {
    justify-content: flex-end !important;
  }
}

@media (pointer: coarse) and (min-width: 601px) and (orientation: portrait) {
  #carousel-panel {
    justify-content: flex-start !important;
    padding-top: 23.5% !important;
  }
}

/* Le choix de l'image héro (smartphone / tablette / desktop) est géré ENTIÈREMENT
   par les <source> du <picture class="layer-bg"> dans index.html — y compris la
   tablette en portrait, qui reçoit l'image smartphone via
   (pointer: coarse) and (orientation: portrait). Les anciennes règles
   background-image par orientation sur .layer-bg étaient peintes DERRIÈRE le <img>
   opaque (object-fit:cover) → invisibles → supprimées. .layer-bg conserve son fond
   plat #FAF8F4 (ci-dessus) comme repli avant chargement / si le <img> échoue. */

.layer-label {
  position: relative;
  margin: 0;
  padding: 1rem;
  text-align: center;
  font-family: "Klee One", Georgia, serif;
  font-weight: 600;
  font-size: clamp(1.8rem, 6vw, 4rem);
  line-height: 1.1;
  color: var(--text-light);
  text-shadow: 0 2px 12px rgba(0,0,0,0.9), 0 0 40px rgba(0,0,0,0.7);
}

.hero-intro {
  position: absolute;
  top: clamp(8rem, 12vh, 7rem);
  left: clamp(4rem, 6vw, 5rem);
  max-width: 90vw;
  width: max-content;
  text-align: left;
  z-index: 6;
}

@media (min-width: 1025px) {
  .hero-intro {
    width: auto;
  }
}

@media (pointer: coarse) and (orientation: landscape) {
  .hero-intro {
    top: 3% !important;
  }
  .hero-intro-sub {
    white-space: normal;
    max-width: 38ch;
  }
}

.hero-intro-title {
  margin: 0 0 1.2rem 0;
  font-family: "Klee One", Georgia, serif;
  font-weight: 600;
  font-size: clamp(2.5rem, 6.5vw, 5.5rem);
  line-height: 1.05;
  color: var(--text-light);
  text-shadow: 4px 3px 9px rgba(0,0,0,0.9);
  user-select: none;
  white-space: nowrap;
  position: relative;
  z-index: 6;
}

/* Non-homepage pages (those carrying a page-* body class, e.g. body.page-flights)
   get a hero title ~20% smaller. Scoped to [class*="page-"] rather than [class]
   so it never matches homepages while they transiently carry JS transition
   classes (fm-entering / fm-leaving). */
body[class*="page-"] .hero-intro-title {
  font-size: clamp(1.9rem, 5vw, 4rem);
}

.hero-intro-sub {
  margin: 0;
  font-family: "Quicksand", sans-serif;
  font-weight: 400;
  font-size: clamp(0.9rem, 1.8vw, 1.2rem);
  line-height: 1.6;
  color: var(--text-light);
  opacity: 0.85;
  text-shadow: 3px 2px 4px rgba(0,0,0,0.9);
  white-space: normal;
  max-width: 38ch;
  user-select: none;
}

@media (max-width: 1250px) {
  .hero-intro-sub {
    white-space: normal;
    max-width: 34ch;
  }
}

@media (max-width: 600px) {
  .hero-intro-sub {
    max-width: 24ch;
  }
}

@media (min-width: 1250px) {
  body.page-transfers .hero-intro-sub {
    white-space: normal;
    max-width: 38ch;
  }
}

.hero-intro-sub strong {
  font-weight: 700;
  text-decoration: underline;
  text-underline-offset: 3px;
}

.promo-card {
  position: relative;
  z-index: 2;
  margin-top: 1.5rem;
  width: 280px;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  background: transparent;
  border-radius: 2em;
  overflow: hidden;
  box-shadow: none;
  transition: background 300ms ease,
              box-shadow 300ms ease,
              border-radius 300ms ease;
}

.promo-card.is-expanded {
  border-radius: 16px;
  background: rgba(255, 255, 255, 0.50);
  -webkit-backdrop-filter: blur(10px);
  backdrop-filter: blur(10px);
  box-shadow: 0 8px 32px rgba(74, 59, 51, 0.15);
  overflow: visible;
}

.promo-content {
  overflow: hidden;
  max-height: 0;
  opacity: 0;
  padding: 0 0.8rem;
  order: 1;
  transition: max-height 250ms ease-in, opacity 60ms ease 0ms;
}

.promo-card.is-expanded .promo-content {
  max-height: 400px;
  opacity: 1;
}

.promo-langs {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 0.55rem;
}

.promo-lang-item {
  position: relative;
  display: inline-block;
  font-family: "Klee One", Georgia, serif;
  font-weight: 600;
  font-size: 1.25rem;
  color: var(--text);
  cursor: default;
  padding-bottom: 4px;
}

.promo-btn {
  display: inline-block;
  align-self: flex-start;
  background: var(--peach);
  color: var(--text-light);
  border: none;
  border-radius: 2em;
  padding: 0.6em 1.8em;
  font-size: clamp(0.9rem, 2vw, 1.4rem);
  font-family: "Quicksand", sans-serif;
  font-weight: 500;
  text-decoration: none;
  white-space: nowrap;
  position: relative;
  z-index: 1;
  margin: 0.8rem 0 0.8rem 0.8rem;
  cursor: pointer;
  transition: background 200ms ease;
  box-shadow: 0 4px 14px rgba(0,0,0,0.2);
}

.mika-info-close { display: none; }

.social-links {
  position: relative;
  height: 80px;
  margin-left: 0.8rem;
  transition: none;
}
.mika-info-panel.is-open ~ .social-links {
  opacity: 0;
  pointer-events: none;
}
.social-links a {
  position: absolute;
}

.social-links a[aria-label="YouTube"]   { top: 25px;  left: 0px; }
.social-links a[aria-label="Instagram"] { top: 30px;  left: 92px; }
.social-links a[aria-label="Pinterest"] { top: 31px;  left: 174px; }

.social-links a {
  opacity: 0.8;
  transition: opacity 0.2s ease, transform 0.2s ease, filter 0.2s ease;
}
.social-links a img {
  filter: brightness(0) invert(96%) sepia(5%) saturate(200%) hue-rotate(320deg)
          drop-shadow(2px 3px 5px rgba(0,0,0,0.8));
}
.social-links a:hover {
  opacity: 1;
  transform: scale(1.15);
}
.social-links a:hover img {
  filter: brightness(0) saturate(100%) invert(72%) sepia(40%) saturate(600%) hue-rotate(330deg) brightness(105%);
}
.promo-btn.is-fading {
  opacity: 0;
  transition: opacity 200ms ease;
}

.promo-btn.is-visible {
  opacity: 1;
  transition: opacity 300ms ease 800ms;
}

.promo-card.is-expanded .promo-btn {
  margin: 0.8rem 0 0.8rem 0.8rem;
}

.promo-langs {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 0.55rem;
}

.promo-lang-item {
  position: relative;
  display: inline-block;
  font-family: "Klee One", Georgia, serif;
  font-weight: 600;
  font-size: 1.25rem;
  color: var(--text);
  cursor: pointer;
  padding-bottom: 4px;
  user-select: none;
}

.promo-waiting {
  margin: 0.5rem 0;
  font-family: "Klee One", sans-serif;
  font-size: 0.9rem;
  color: #A9A9A9;
  opacity: 0.75;
  font-style: italic;
}

.promo-country-wrap {
  position: relative;
  width: 100%;
}

.promo-country-input {
  width: 100%;
  border: none;
  border-bottom: 2px solid var(--peach);
  background: transparent;
  font-family: "Klee One", sans-serif;
  font-size: 1.1rem;
  color: #A9A9A9;
  padding: 0.4em 0.2em;
  outline: none;
  cursor: text;
}

.promo-country-input::placeholder {
  color: #A9A9A9;
}

.promo-country-list {
  list-style: none;
  margin: 0;
  padding: 0.3rem 0;
  background: #FAF8F4;
  border-radius: 12px;
  box-shadow: 0 -6px 20px rgba(74, 59, 51, 0.12);
  max-height: 220px;
  overflow-y: auto;
scrollbar-width: auto;
  scrollbar-color: #ffa07a transparent;
}
.promo-country-list::-webkit-scrollbar {
  width: 18px;
}
.promo-country-list::-webkit-scrollbar-track {
  background: transparent;
}
.promo-country-list::-webkit-scrollbar-thumb {
  background: #ffa07a;
  border-radius: 9px;
}

.promo-country-option {
  padding: 0.45em 1em;
  font-family: "Klee One", sans-serif;
  font-size: 0.9rem;
  color: var(--text);
  cursor: pointer;
}

@media (hover: hover) {
  .promo-country-option:hover {
    background: rgba(255, 160, 122, 0.12);
    color: var(--peach-deep);
  }
}

@media (hover: hover) {
  .promo-btn:hover { background: var(--peach-deep); }
}

@media (prefers-reduced-motion: reduce) {
  .nav-inner { transition: none; }
  .nav-dropdown { transition: none; }
  .hero-layer { transition: none; }
  .hero-layer.is-entering { animation: none; }
  .promo-card { transition: none; }
  .promo-content { transition: none; }

}

.hero-intro-title,
.hero-intro-sub,
.layer-label {
  padding: 8px 16px;
  opacity: 0;
}

.lang-li { position: relative; }
.lang-spiral {
  position: absolute;
  top: 50%;
  left: 40%;
  transform: translate(-50%, -50%);
  width: 125%;
  height: 220%;
  overflow: visible;
  pointer-events: none;
}

.lang-li.lang-selected:hover .lang-dropdown {
  opacity: 0 !important;
  pointer-events: none !important;
}

.lang-dropdown:focus-within,
.lang-li .btn-lang:focus ~ .lang-dropdown,
#btn-lang:focus ~ .lang-dropdown {
  opacity: 0 !important;
  pointer-events: none !important;
}

/* Drop the readability shadow on hover ONLY when the bar is opaque/light
   (homepage hover → light bar; blog white bar). When the header is transparent
   (.is-on-peach, e.g. blog section 3), the base .nav-item/.logo shadow (~line
   114) must survive hover so the white text stays legible over the photo — so
   exclude .is-on-peach here. The scrolled-over-peach hover case keeps being
   handled by the .is-scrolled.is-on-peach:hover rules above. */
.nav-trigger:hover ~ .site-header:not(.is-on-peach) .nav-item,
.site-header:not(.is-on-peach):hover .nav-item {
  text-shadow: none;
}

.nav-trigger:hover ~ .site-header:not(.is-on-peach) .logo,
.site-header:not(.is-on-peach):hover .logo {
  text-shadow: none;
}

.dropdown-item {
  text-shadow: none;
}

.mika-info {
  position: relative;
  margin-top: 1.5rem;
  display: inline-block;
}

.mika-info-panel {
  position: absolute;
  top: 0;
  left: 0;
  width: 400px;
  background: #FAF8F4;
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
  border-radius: 16px;
  padding: 4rem 1.2rem 1rem 1.2rem;
  font-family: "Quicksand", sans-serif;
  font-size: 1.05rem;
  line-height: 1.7;
  color: var(--text);
  overflow: hidden;
  max-height: 0;
  opacity: 0;
  transition: max-height 400ms ease, opacity 300ms ease;
}

.mika-info-panel.is-open {
  max-height: 400px;
  opacity: 1;
}

@media (max-width: 600px) {
.hero-intro {
    left: 1.25rem;
    right: 1.25rem;
    max-width: none;
    width: auto;
    top: 100px !important;
  }

  .mika-info-panel {
    width: calc(100vw - 2.5rem);
    max-width: 400px;
  }

  .mika-info-panel.is-open {
    max-height: 75vh;
  }
}

.menu-mobile-li { display: none; }
.menu-mobile-single-li { display: none; }

@media (max-width: 1250px) {
  .nav-list > li:not(.lang-li):not(.menu-mobile-li):not(.menu-mobile-single-li) { display: none; }
  .menu-mobile-li { display: block; }
  .lang-spiral { display: none; }

    .site-header { min-height: 90px; }
.nav-inner {
    min-height: 66px;
    align-items: center;
    justify-content: flex-end;
  }
  .nav-list {
    margin-left: auto;
  }
  .nav-list {
    flex-wrap: nowrap;
  }
}

@media (max-width: 1250px) {
  .lang-dropdown { display: none !important; }
  .lang-spiral { display: none; }
}


@media (max-width: 600px) {
  .site-header { 
    min-height: 110px; 
  }
  .nav-inner { 
    min-height: 110px; 
  }

  .nav-inner {
    justify-content: center;
  }

  .nav-list {
    display: grid;
    grid-template-columns: 1fr 1fr;
    column-gap: 0.5rem;
    row-gap: 1.4rem;
    justify-content: center;
    justify-items: center;
    width: fit-content;
    margin: 0 auto;
  }

  .btn-menu-mobile,
  .btn-lang,
  #btn-lang {
    width: 100%;
    text-align: center;
  }
  .lang-spiral { display: none; }
  .lang-dropdown { display: none !important; }

  .menu-mobile-li { display: none; }
  .menu-mobile-single-li { display: block; }
}

.btn-menu-mobile {
  font-family: "Quicksand", sans-serif;
  font-weight: 700;
  font-size: 0.9rem;
  letter-spacing: 0.12em;
  color: #ffffff;
  background: transparent;
  border: 2px solid transparent;
  --dash-color: #ffa07a;
  position: relative;
  border-radius: 2em;
  padding: 0.3em 1.1em;
  min-width: 7.5rem;
  cursor: pointer;
  text-shadow: none;
  transition: color 200ms, border-color 200ms, filter 200ms, background-color 200ms;
}

.btn-menu-mobile,
.btn-lang:not(.btn-menu-mobile) {
  min-width: 7.5rem;
  text-align: center;
  justify-content: center;
}

.mob-drawer-list {
  position: relative;
  z-index: 1;
  list-style: none;
  margin: 0;
  padding: 3.25rem 0 1.5rem 0;
}

.mob-drawer-list > li { margin: 0; }

.mob-drawer-cat {
  display: block;
  width: 100%;
  text-align: left;
  font-family: "Quicksand", sans-serif;
  font-size: 1.1rem;
  font-weight: 600;
  letter-spacing: 0.02em;
  color: var(--text);
  background: transparent;
  border: 0;
  padding: 0.85em 1.5em;
  cursor: pointer;
}

.mob-drawer-sub {
  display: block;
  width: 100%;
  text-align: left;
  font-family: "Quicksand", sans-serif;
  font-size: 1rem;
  font-weight: 400;
  letter-spacing: 0.01em;
  color: var(--text);
  background: transparent;
  border: 0;
  padding: 0.65em 1.5em;
  cursor: pointer;
}

.mob-drawer-back {
  display: block;
  width: 100%;
  text-align: left;
  font-family: "Quicksand", sans-serif;
  font-size: 1rem;
  font-weight: 700;
  letter-spacing: 0.03em;
  color: var(--peach);
  background: transparent;
  border: 0;
  border-bottom: 1px solid rgba(74, 59, 51, 0.1);
  padding: 0.85em 1.5em;
  cursor: pointer;
}

.mob-drawer-back-row {
  grid-column: 1 / -1;
}

@keyframes drawerArrowBounce {
  0%,  100% { transform: translateY(0); }
  15%       { transform: translateY(5px); }
  30%       { transform: translateY(-4px); }
  45%       { transform: translateY(3px); }
  60%       { transform: translateY(-2px); }
  75%       { transform: translateY(1px); }
}

svg:has(#blog-arrow) {
  overflow: visible;
}

.mob-drawer-blog svg,
#blog-arrow {
  animation: drawerArrowBounce 1.8s ease-in-out infinite;
}

@media (prefers-reduced-motion: reduce) {
  .mob-drawer-blog svg,
  #blog-arrow { animation: none; }
}

@media (min-width: 601px) and (pointer: coarse) and (orientation: portrait) {
    :root { --nav-h: 163px; }
    .site-header { min-height: 163px; }
    .nav-inner {
    min-height: 150px;
    padding-inline: clamp(0.4rem, 1vw, 0.6rem);
      justify-content: center;
  }
    .hero-intro-title {
    font-size: clamp(3.75rem, 9.75vw, 8.25rem);
  }
    body[class*="page-"] .hero-intro-title {
    font-size: clamp(2.85rem, 7.5vw, 6rem);
    }
    .hero-intro {
    top: calc(clamp(8rem, 12vh, 7rem) + 40px);
    }
    .hero-intro-sub {
    font-size: clamp(1.35rem, 2.7vw, 1.8rem);
    max-width: 28ch;
    }

  .logo { font-size: clamp(1.875rem, 6.875vw, 3.25rem); }
  .nav-list { gap: 1.3rem !important; }
  .btn-menu-mobile {
    min-width: 0;
    font-size: 1.625rem;
    letter-spacing: 0.06em;
    padding: 0.625em 0.875em;
  }
  .btn-lang,
  #btn-lang {
    min-width: 10rem;
    font-size: 1.625rem;
    padding: 0.625em 0.875em;
  }

  .mob-drawer-list {
    padding: 0;
  }
  .mob-drawer-cat {
    font-size: 3rem;
    padding: 0 1.7em;
  }
  .mob-drawer-sub {
    font-size: 2.5rem;
    font-weight: 800;
    padding: 0 1.7em;
  }
  .mob-drawer-back {
    font-size: 1.66rem;
    padding: 0 1.73em;
  }
  .promo-btn {
  font-size: 1.3rem;
  padding: 0.55em 1.7em;
}
  .social-links {
    transform: scale(1.3);
    transform-origin: left center;
  }
  .mob-drawer-blog svg {
    width: 22px;
    height: 22px;
  }
  #mob-drawer {
    width: 60vw !important;
    max-width: 60vw !important;
    display: flex;
    flex-direction: column;
  }
  /* is-lang-view replaces the broken nested-:has() approach: CSS Selectors L4 forbids
     :has() inside another :has() argument (even via :not()), so browsers silently
     dropped the whole selector and the drawer stayed at 50vw. The class is toggled in
     JS (openDrawer / closeDrawer) instead. */
  #mob-drawer.is-lang-view {
    width: 50vw !important;
    max-width: 50vw !important;
    overflow: hidden;
  }
  #mob-drawer.is-lang-view .mob-drawer-list {
    flex: 1 1 auto;
    min-height: 0;
    display: grid;
    grid-template-columns: 1fr;
    align-content: space-evenly;
    padding-top: 0;
    padding-bottom: 0;
  }
  #mob-drawer.is-lang-view .mob-drawer-sub {
    padding-top: 0.65em;
    padding-bottom: 0.65em;
    font-weight: 800;
    font-size: 2.6rem;
    font-family: "Quicksand", sans-serif;
  }
  #mob-drawer.is-lang-view .mob-drawer-sub[data-lang-group="ru"],
  #mob-drawer.is-lang-view .mob-drawer-sub[data-lang-group="zh"],
  #mob-drawer.is-lang-view .mob-drawer-sub[data-lang-group="ja"],
  #mob-drawer.is-lang-view .mob-drawer-sub[data-lang-group="ko"] {
    font-weight: 400;
  }
  #mob-drawer.is-lang-view .mob-drawer-sub[data-lang-group="ko"] {
    font-weight: 400;
  }
  #mob-drawer:not(.is-lang-view) .mob-drawer-list {
    flex: 1 1 auto;
    min-height: 0;
    display: flex;
    flex-direction: column;
    justify-content: space-evenly;
    padding-bottom: 0;
  }
  #scroll-chevron {
    bottom: 7rem;
  }
  #scroll-chevron svg {
    width: 60px;
    height: 30px;
  }
  .carousel-card-wrapper { top: 62%; }
}

@media (min-width: 601px) and (pointer: coarse) and (orientation: landscape) {
  :root { --nav-h: 117px; }
  .site-header { min-height: 117px; }
  .nav-inner {
    min-height: 117px;
    padding-inline: clamp(0.77rem, 1.8vw, 1.13rem);
    justify-content: center;
  }

  .logo { font-size: clamp(1.37rem, 4.97vw, 2.36rem); }
  .nav-list { gap: 0.35rem; }

  .btn-menu-mobile {
    min-width: 0;
    font-size: 1.23rem;
    letter-spacing: 0.06em;
    padding: 0.45em 1.30em;
  }
  .btn-lang,
  #btn-lang {
    min-width: 9.72rem;
    font-size: 1.4rem;
    padding: 0.45em 1.30em;
  }

  .mob-drawer-list {
    padding: 2.2rem 0 1rem 0;
  }
  .mob-drawer-cat {
    font-size: 1.5rem;
    padding: 0 1.4em;
  }
  .mob-drawer-sub {
    font-size: 1.7rem;
    padding: 0 1em;
  }
  .mob-drawer-back {
    font-size: 1.1rem;
    padding: 0 1.4em;
  }
  .social-links {
    transform: scale(1.3);
    transform-origin: left center;
  }
  .mob-drawer-blog svg {
    width: 22px;
    height: 22px;
  }

  #mob-drawer {
    width: 35vw !important;
    max-width: 45vw !important;
    display: flex;
    flex-direction: column;
  }
  #mob-drawer.is-lang-view {
    width: 50vw !important;
    max-width: 50vw !important;
    overflow: hidden;
  }
  #mob-drawer.is-lang-view .mob-drawer-list {
    flex: 1 1 auto;
    min-height: 0;
    display: grid;
    grid-template-columns: 0.8fr 1fr;
    align-content: space-evenly;
    padding-top: 0;
    padding-bottom: 0;
    padding-left: 2rem;
    font-weight: 800;
    font-size: 2rem;
  }
  #mob-drawer.is-lang-view .mob-drawer-sub {
    padding-top: 0.7em;
    padding-bottom: 0.7em;
    font-family: "Quicksand", sans-serif;
  }
  #mob-drawer.is-lang-view .mob-drawer-sub[data-lang-group="ru"],
  #mob-drawer.is-lang-view .mob-drawer-sub[data-lang-group="zh"],
  #mob-drawer.is-lang-view .mob-drawer-sub[data-lang-group="ja"],
  #mob-drawer.is-lang-view .mob-drawer-sub[data-lang-group="ko"] {
    font-weight: 400;
  }
  #mob-drawer:not(.is-lang-view) .mob-drawer-list {
    flex: 1 1 auto;
    min-height: 0;
    display: flex;
    flex-direction: column;
    justify-content: space-evenly;
    padding-top: 0;
    padding-bottom: 0;
  }
  .carousel-card-wrapper { top: 62%; }
}

/* Touch tablets in PORTRAIT (pointer: coarse, ≥601px → phones ≤600px keep their own
   ≤600 rules; non-touch desktop excluded by pointer:coarse): show ONLY the single
   "Menu" button (.menu-mobile-single-li) + Langues (.lang-li). Hide the three
   VOYAGER/EXPLORER/PRÉPARER buttons (.menu-mobile-li). Landscape is handled by the
   (pointer:coarse) and (orientation:landscape) block further down. No max-width so wide
   tablets are covered too. Overrides the generic max-width:1250 block above. */
@media (pointer: coarse) and (min-width: 601px) and (orientation: portrait) {
  .menu-mobile-li { display: none; }
  .menu-mobile-single-li { display: block; }
}

@media (pointer: coarse) and (min-width: 601px) {
  .nav-list > li:not(.lang-li):not(.menu-mobile-single-li) { display: none !important; }
  .menu-mobile-single-li { display: block !important; }
  .menu-mobile-li { display: none !important; }
  .lang-dropdown { display: none !important; }
  .lang-spiral { display: none; }
}

@media (hover: hover) {
  .btn-menu-mobile {
    background: rgba(0, 0, 0, 0.3);
    --dash-color: #ffa07a;
  }
.page-blog .site-header.is-on-peach .btn-menu-mobile {
    background: transparent;
    --dash-color: #FAF8F4;
  }
  .page-blog .site-header.is-on-peach .btn-menu-mobile:hover {
    --dash-color: #FAF8F4;
  }
}

@media (hover: hover) {
  .btn-menu-mobile:hover {
    color: #fff;
    background: transparent;
    --dash-color: #fff;
    filter: drop-shadow(0 0 8px rgba(255,255,255,0.9));
  }
}

.nav-trigger:hover ~ .site-header .btn-menu-mobile,
.site-header:hover .btn-menu-mobile,
.site-header.is-scrolled .btn-menu-mobile {
  color: #4a3b33;
  background: transparent;
}

@media (hover: hover) {
  .nav-trigger:not(:hover) ~ .site-header:not(.is-scrolled):not(:hover) .btn-menu-mobile {
    color: #FAF8F4 !important;
  }
}

@media (hover: hover) {
  .nav-trigger:hover ~ .site-header .btn-menu-mobile:hover,
  .site-header:hover .btn-menu-mobile:hover {
    color: #c05a2f;
    --dash-color: #e07a4f;
    filter: none;
  }
}

.dash-border {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  overflow: visible;
  pointer-events: none;
}
.dash-border > rect {
  fill: none;
  stroke: var(--dash-color, #ffa07a);
  stroke-width: 2;
  stroke-dasharray: 12 2;
  stroke-dashoffset: 0;
  transition: stroke 200ms;
}

@keyframes dash-travel {
  to { stroke-dashoffset: -200; }
}

@media (hover: hover) {
  .btn-menu-mobile:hover .dash-border > rect,
  .dash-travel:hover .dash-border > rect {
    animation: dash-travel 4s linear infinite;
  }
}

@media (prefers-reduced-motion: reduce) {
  .dash-border > rect { animation: none !important; }
}


#mob-overlay {
  position: fixed;
  inset: 0;
  z-index: 1000;
  background: rgba(0, 0, 0, 0.4);
  opacity: 0;
  visibility: hidden;
  transition: opacity 220ms ease, visibility 0s linear 220ms;
}

#mob-overlay.is-open {
  opacity: 1;
  visibility: visible;
  transition: opacity 280ms ease, visibility 0s;
}

#mob-drawer {
  position: fixed;
  top: 0;
  right: 0;
  width: 80vw;
  max-width: 360px;
  height: 100vh;
  height: 100dvh;
  z-index: 1001;
  background: #FAF8F4;
  box-shadow: -10px 0 30px rgba(74, 59, 51, 0.18);
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
  transform: translateX(100%);
  transition: transform 220ms ease;
}

#mob-drawer.is-open {
  transform: translateX(0);
  transition: transform 280ms ease;
}

@media (max-width: 600px) {
  #mob-drawer {
    width: 70vw;
    max-width: 70vw;
    display: flex;
    flex-direction: column;
  }
  #mob-drawer .mob-drawer-list {
    flex: 1 1 auto;
    min-height: 0;
    display: flex;
    flex-direction: column;
    justify-content: space-evenly;
    padding-bottom: 0;
  }
  #mob-drawer.is-lang-view {
    overflow: hidden;
  }
  #mob-drawer.is-lang-view .mob-drawer-list {
    padding-top: 0;
  }
}

#drawer-hearts-canvas {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  pointer-events: none;
  z-index: 0;
}




@media (prefers-reduced-motion: reduce) {
  #mob-drawer,
  #mob-drawer.is-open { transition: none; }
  #mob-overlay,
  #mob-overlay.is-open { transition: none; }
}
#mika-info-btn {
  opacity: 0;
  transition: opacity 0.8s ease;
}
#mika-info-btn.is-visible {
  opacity: 1;
}

.legal-page {
  max-width: 70ch;
  margin: 0 auto 5rem;
  padding: 6rem 1.25rem 0;
  color: #4a3b33;
  font-size: 1rem;
  line-height: 1.7;
}
.legal-page h1 {
  margin: 0 0 1.5rem;
  padding-bottom: 0.5rem;
  border-bottom: 2px solid #ffa07a;
  color: #4a3b33;
  font-size: 1.75rem;
  line-height: 1.2;
}
.legal-page h2 {
  margin: 2.25rem 0 0.75rem;
  color: #ffa07a;
  font-size: 1.15rem;
}
.legal-page p { margin: 0 0 1rem; }
.legal-page ul {
  margin: 0 0 1.25rem;
  padding-left: 1.25rem;
}
.legal-page li { margin: 0 0 0.4rem; }
.legal-page a {
  color: #ffa07a;
  text-decoration: underline;
  word-break: break-word;
}

@media (min-width: 601px) {
  .legal-page {
    padding-top: 7rem;
    font-size: 1.05rem;
  }
  .legal-page h1 { font-size: 2.25rem; }
  .legal-page h2 { font-size: 1.4rem; }
}

.site-footer {
  position: relative;
  z-index: 4;
  background: #FAF8F4;
  color: #4a3b33;
  font-size: 0.75rem;
  line-height: 1.6;
  text-align: center;
  padding: 3rem 1rem;
}
.site-footer__disclosure {
  max-width: none;
  white-space: normal;
  margin: 0 auto 1rem;
}
.site-footer__links {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 0.5rem 1.25rem;
}
.site-footer__links a {
  color: #4a3b33;
  text-decoration: none;
  transition: color 0.2s ease;
}
.site-footer__links a:hover,
.site-footer__links a:focus { color: #e07a4f; }

/* ── Tablet-landscape: close the ~20px sticky-hero (#s1) bleed at the page bottom ──
   On touch tablets in landscape, the page settles/overshoots ~20px past the footer's
   layout box at max scroll, exposing the pinned sticky hero (#s1, position:sticky,
   z-index:1, height:100dvh) in a thin band below the footer — #s1 uses the dynamic
   viewport (dvh) while the stacked sections use the stable one (#s4:100lvh, #s3:100vh),
   and that unit mismatch leaves the foreground ~20px short of the absolute page bottom.
   The footer is the TOPMOST layer (z-index:4) with an opaque #FAF8F4 background, so we
   extend its PAINTED box ~28px below its layout box to cover that band, anchoring the
   footer's bottom to the absolute bottom of the page. padding-bottom grows the painted
   (background) box downward; the matching NEGATIVE margin-bottom cancels the added flow
   height, so document scrollHeight is UNCHANGED — no new scrollbar, no shifted scroll
   end, only the paint reaches lower (the extra beige sits below the document bottom and
   shows ONLY in the overshoot band where #s1 was bleeding; otherwise it's off-screen).
   Footer-only: touches no section, scroll, or bubble rule. Scoped to the project's
   tablet-landscape query — min-height:450px excludes landscape PHONES, which hide #s4
   (line ~1421) and scroll differently. */
@media (pointer: coarse) and (orientation: landscape) and (min-height: 450px) {
  .site-footer {
    padding-bottom: calc(3rem + 28px);
    margin-bottom: -28px;
  }
}

.blog-s1.blog-hero {
  position: sticky;
  top: 0;
  z-index: 1;
  height: auto;
  background: var(--beige);
}
.blog-hero {
  min-height: 100vh;
  max-width: 1400px;
  margin: 0 auto;
  display: flex;
  align-items: flex-start;
  justify-content: center;
  gap: clamp(2rem, 5vw, 5rem);
  padding: calc(66px + 2.5rem) clamp(1.25rem, 5vw, 4rem) clamp(2.5rem, 6vh, 4rem);
}

.blog-hero__text {
  flex: 1 1 55%;
  max-width: 55%;
  min-width: 0;
  padding-top: 0.5rem;
  padding-bottom: 2.5rem;
  padding-left: clamp(0rem, 3vw, 4rem);
  opacity: 0;
  animation: blogHeroFadeIn 1s ease 0.15s forwards;
}

#heroTitle {
  font-family: "Klee One", sans-serif;
  font-weight: 600;
  font-size: clamp(2rem, 3.9vw, 3.4rem);
  line-height: 1.1;
  text-wrap: balance;
  margin: 0 0 0.5rem;
  color: #4a3b33;
  opacity: 1 !important;
  animation: none !important;
}

.blog-hero__hook {
  font-size: clamp(1rem, 0.9rem + 0.52vw, 1.35rem);
  font-weight: 500;
  color: var(--peach-deep);
  margin: 0 0 1.25rem;
}

.blog-hero__intro {
  font-size: clamp(0.9rem, 0.86rem + 0.22vw, 1.05rem);
  line-height: 1.7;
  color: var(--text);
  margin: 0 0 1.75rem;
}

.blog-hero__actions {
  display: flex;
  flex-wrap: wrap;
  gap: 0.85rem;
  margin-bottom: 5rem;
}

.blog-hero__btn-compose,
.blog-hero__btn-destinations {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.5em;
  box-sizing: border-box;
  min-width: 0;
  max-width: 100%;
  font-family: "Quicksand", "Klee One", sans-serif;
  font-weight: 600;
  text-align: center;
  font-size: clamp(0.8rem, 0.72rem + 0.35vw, 1rem);
  line-height: 1;
  padding: 0.75em 1.4em;
  border-radius: 999px;
  cursor: pointer;
  text-decoration: none;
  transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.2s ease, color 0.2s ease;
}

@media (max-width: 600px) {
  .blog-hero__btn-compose,
  .blog-hero__btn-destinations {
    flex: 1 1 100%;
  }
}

.blog-hero__btn-compose {
  border: 0;
  color: var(--text-light);
  background: var(--peach);
}
.blog-hero__btn-compose:hover,
.blog-hero__btn-compose:focus-visible {
  background: var(--peach-deep);
  box-shadow: 0 10px 24px rgba(224, 122, 79, 0.45);
}

.blog-hero__btn-destinations {
  border: 2px dashed var(--peach);
  color: var(--text);
  background: #transparent;
}
.blog-hero__btn-destinations:hover,
.blog-hero__btn-destinations:focus-visible {
  background: var(--peach-soft);
}

.blog-hero__media {
  flex: 0 1 45%;
  align-self: flex-start;
  margin-top: clamp(1.5rem, 8vw, 8.3rem);
  display: flex;
  padding-left: clamp(0rem, 4vw, 4rem);
  align-items: center;
  justify-content: center;
  opacity: 0;
  animation: blogHeroSlideInRight 1s cubic-bezier(0.22, 1, 0.36, 1) 0.2s forwards;
}

.blog-hero__video {
  width: min(100%, 420px, 47.8vh);
  height: auto;
  aspect-ratio: 9 / 16;
  object-fit: cover;
  border-radius: 20px;
  background: #000;
  box-shadow: 0 18px 50px rgba(74, 59, 51, 0.28);
  transition: transform 0.3s ease-out;
  will-change: transform;
}

@keyframes blogHeroFadeIn {
  from { opacity: 0; transform: translateY(12px); }
  to   { opacity: 1; transform: translateY(0); }
}

@keyframes blogHeroSlideInRight {
  from { opacity: 0; transform: translateX(120%); }
  to   { opacity: 1; transform: translateX(0); }
}

.pop-text span {
  display: inline-block;
  opacity: 0;
  white-space: pre;
}
.pop-text span.is-popped {
  animation: mangaLetterPop 0.35s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;
}
@keyframes mangaLetterPop {
  0%   { opacity: 0; transform: translateY(6px)  scale(0.6);  }
  60%  { opacity: 1; transform: translateY(-4px) scale(1.15); }
  80%  {             transform: translateY(1px)  scale(0.97); }
  100% { opacity: 1; transform: translateY(0px)  scale(1);    }
}
@media (prefers-reduced-motion: reduce) {
  .pop-text span.is-popped { animation: none; opacity: 1; transform: none; }
}

/* Tablette (861–1024px) : on GARDE les deux colonnes, mais sur ce viewport plus
   étroit la vidéo prenait trop de place et tassait le texte. On rétrécit la
   vidéo et sa colonne, on élargit la colonne de texte, et on réduit
   proportionnellement les tailles de police, le gap et les paddings. */
@media (min-width: 861px) and (max-width: 1024px) {
  .blog-hero {
    gap: 2rem;
    padding: calc(66px + 1.5rem) clamp(1.25rem, 3vw, 2.5rem) clamp(2rem, 5vh, 3rem);
  }
  .blog-hero__text {
    flex: 1 1 62%;
    max-width: 62%;
    padding-left: clamp(0rem, 1.5vw, 1.5rem);
  }
  .blog-hero__media {
    flex: 0 1 38%;
    margin-top: clamp(1rem, 4vw, 3rem);
    padding-left: clamp(0rem, 2vw, 1.5rem);
  }
  .blog-hero__video {
    width: min(100%, 300px, 38vh);
  }
  #heroTitle {
    font-size: clamp(1.7rem, 3.2vw, 2.6rem);
  }
  .blog-hero__hook {
    font-size: clamp(0.95rem, 1.6vw, 1.2rem);
  }
  .blog-hero__intro {
    font-size: clamp(0.85rem, 1.4vw, 1rem);
  }
}

@media (max-width: 860px) {
  .blog-hero {
    flex-direction: column;
    text-align: left;
    gap: 2rem;
    padding: calc(66px + 1.5rem) clamp(1.25rem, 5vw, 4rem) clamp(2rem, 6vh, 4rem);
  }
  .blog-hero__media {
    order: -1;
    flex: 0 0 auto;
    margin-top: 0;
    padding-left: 0;
    display: none;
  }
  .blog-hero__text {
    flex: 1 1 auto;
    max-width: 100%;
    padding-left: 0;
    text-align: left;
  }
  .blog-hero__actions {
    justify-content: center;
    margin-bottom: 2rem;
    text-align: left;
  }
  .blog-hero__video {
    height: auto;
    width: min(80vw, 300px);
    max-height: 70vh;
  }
}

@media (prefers-reduced-motion: reduce) {
  .blog-hero__text,
  .blog-hero__media {
    animation: none;
    opacity: 1;
  }
  .blog-hero__video {
    transition: none;
    transform: none;
  }
}

.compose-modal {
  position: fixed;
  inset: 0;
  z-index: 1000;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 1.25rem;
}
.compose-modal[hidden] { display: none; }

.compose-modal__overlay {
  position: absolute;
  inset: 0;
  background: rgba(26, 58, 92, 0.30);
  backdrop-filter: blur(2px);
  -webkit-backdrop-filter: blur(2px);
  animation: composeOverlayIn 0.25s ease both;
}

.compose-modal__dialog {
  position: relative;
  width: min(420px, 100%);
  background: var(--beige);
  border-radius: 22px;
  padding: 2rem 1.75rem 1.75rem;
  box-shadow: 0 24px 70px rgba(74, 59, 51, 0.4);
  animation: composeDialogIn 0.3s cubic-bezier(0.22, 1, 0.36, 1) both;
}

.compose-modal__close {
  position: absolute;
  top: 0.85rem;
  right: 0.95rem;
  width: 2rem;
  height: 2rem;
  border: 0;
  border-radius: 50%;
  background: transparent;
  color: var(--text);
  font-size: 1.1rem;
  line-height: 1;
  cursor: pointer;
  transition: background 0.2s ease, color 0.2s ease;
}
.compose-modal__close:hover,
.compose-modal__close:focus-visible {
  background: var(--peach-soft);
  color: var(--peach-deep);
}

.compose-modal__title {
  font-family: "Klee One", sans-serif;
  font-weight: 600;
  font-size: 1.4rem;
  text-align: center;
  margin: 0 0 1.25rem;
  color: var(--text);
}

.compose-modal__options {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 0.7rem;
}

.compose-modal__option {
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  gap: 0.5em;
  width: 100%;
  padding: 1em 1.1em;
  border-radius: 14px;
  border: 0;
  background: var(--peach);
  color: var(--text-light);
  font-family: "Quicksand", "Klee One", sans-serif;
  font-weight: 600;
  font-size: 1rem;
  cursor: pointer;
  transition: transform 0.18s ease, background 0.18s ease, box-shadow 0.18s ease;
}
.compose-modal__option:hover,
.compose-modal__option:focus-visible {
  background: var(--peach-deep);
  transform: translateY(-2px);
  box-shadow: 0 8px 20px rgba(224, 122, 79, 0.32);
}

@media (max-width: 600px) {
  .compose-modal__options { grid-template-columns: 1fr; }
}

@keyframes composeOverlayIn {
  from { opacity: 0; }
  to   { opacity: 1; }
}
@keyframes composeDialogIn {
  from { opacity: 0; transform: translateY(16px) scale(0.96); }
  to   { opacity: 1; transform: translateY(0) scale(1); }
}

.blog-s2.blog-carousel {
  position: sticky;
  top: 0;
  z-index: 2;
  /* Promote the carousel to its own compositing layer. The polaroid cards carry
     a permanent will-change:transform (and the JS bumps a card to z-index:5
     while expanding), so each card is promoted to its own compositor layer.
     Promoting the section too keeps the whole subtree compositing within this
     z-index:2 group, so its cards stay strictly behind .blog-s4 (z-index 4)
     instead of bleeding ON TOP of the post-its. */
  will-change: transform;
  margin-top: 0;
  margin-left: 0;
  margin-right: 0;
  width: 100%;
  min-height: 100vh;
  background: #FAF8F4;
  border-radius: 0;
  /* .blog-carousel__track cards are translateX'd horizontally; the track's
     clip-path only clips painting, not scrollable overflow, so contain it
     here. The track sits well within this 100vh section vertically, so its
     -90px clip-path vertical bleed is not affected. */
  overflow: hidden;
  /* This section is position:sticky + min-height:100vh, so once the user
     scrolls past it into .blog-s4 the pinned section still physically covers
     the viewport BEHIND s4 (carousel z-index:2 < s4 z-index:4). Its opaque
     background would otherwise swallow clicks aimed at s4's links/post-its
     wherever no s4 element sits directly under the cursor. Make the section
     transparent to the mouse; pointer-events is re-enabled on the interactive
     carousel track below so dragging/expanding polaroids still works. */
  pointer-events: none;
}
.blog-carousel {
  max-width: 100%;
  margin: 0 auto;
  padding: 3rem 0 4rem;
}

/* ---------------------------------------------------------------------------
   Mobile: disable the sticky-stacking / overlap effect.
   On desktop these hero/carousel sections use `position: sticky` + z-index so
   each pins while the next (higher z-index) section scrolls up and overlaps
   it ("stacked paper" look). On phones that overlap is unwanted — sections
   must scroll normally, one after another. Un-pinning them (position: static)
   drops them back into normal flow; z-index is then irrelevant (it only
   affects positioned boxes) but reset for clarity.

   Placed AFTER every targeted base rule (home .hero-section, blog .blog-s1 /
   .blog-s2) so it wins on source order at equal specificity — no !important.
   NOT touched: .blog-s3__sticky, which is a JS-driven horizontal scroll-jack
   (a different effect), and the modal/drawer/overlay stickies.
   --------------------------------------------------------------------------- */
@media (max-width: 600px) {
  .hero-section,
  .blog-s1.blog-hero,
  .blog-s2.blog-carousel {
    position: static;
    top: auto;
    z-index: auto;
  }
  /* Stabilise #s1's document-flow height on phones. The base rule uses 100dvh
     which changes when the URL bar collapses mid-scroll, reflowing #s2's
     offsetTop and causing a visible jolt at the S1→S2 boundary. 100svh is the
     small (URL-bar-visible) viewport height — a constant that never changes
     during scroll. .hero-stage inside keeps 100dvh (intentional: tracks the
     visual viewport for the hero image); it is clipped by #s1's overflow:hidden
     (inherited from the base rule) and cannot affect the document layout. */
  .hero-section {
    height: 100vh;    /* fallback for browsers without svh */
    height: 100svh;   /* stable: always the small viewport height */
  }
}

/* Tablettes tactiles (pointer: coarse ET min-width:601px) : on dé-pingle les
   sections blog .blog-s1/.blog-s2. Pas de PLAFOND en px → les grandes tablettes
   (iPad 10e gén. 1180px, iPad Pro 1366px) restent incluses. Les TÉLÉPHONES (≤600px)
   sont exclus ici car déjà dé-pinglés, à l'identique, par la règle
   @media (max-width:600px) ci-dessus ; min-width:601px supprime simplement le
   double-emploi (aucun changement de rendu sur téléphone). L'empilement « papier »
   (sticky + z-index) provoque un chevauchement non voulu sur tactile ;
   position:static les remet en flux normal (z-index sans effet, remis à auto pour
   clarté). Desktop (pointer: fine) inchangé → le sticky reste actif. On NE touche
   PAS .blog-s3__sticky (scroll-jack JS), ni les overlays/modales/tiroirs. En
   mouvement normal, main.js ne pose qu'un `top` inline sur .blog-s1 (inerte sur un
   élément static) ; en reduced-motion il force position:relative inline → aucun
   chevauchement. */
@media (pointer: coarse) and (min-width: 601px) {
  .blog-s1.blog-hero,
  .blog-s2.blog-carousel {
    position: static;
    top: auto;
    z-index: auto;
  }
}

/* Home page, tablettes tactiles (pointer:coarse + min-width:601px) : même
   dé-pinglage que la règle @media (max-width:600px) ci-dessous, pour supprimer
   l'empilement « papier » (sticky + z-index) sur tablette. Desktop (pointer:fine)
   inchangé. On ne dé-pingle QUE les deux sections réellement ÉPINGLÉES :
     • .hero-section (#s1, position:sticky) → static : #s2 (.cover-section) glisse
       alors normalement à sa suite → plus de recouvrement #s2 sur #s1.
     • #s3 (sticky via style inline) → position:relative !important (PAS static) :
       #amazon-title est position:absolute ancré sur #s3 ; le passer en static le
       ferait fuir vers un ancêtre lointain et disparaître.
   On NE touche volontairement PAS (contrairement à ce qu'on pourrait croire) :
     • .cover-section (#s2) : doit rester relative — c'est l'offsetParent de #s3 et
       main.js lit s3.offsetTop (fond beige→pêche ligne ~2392, cible de scroll
       ligne ~4756). Le passer en static casserait ces mesures sur tablette ; la
       règle ≤600px l'évite déjà pour la même raison.
     • .cover-section-4 (#s4) : non épinglé (relative). Dé-pingler #s3 suffit à
       enlever le recouvrement #s4 sur #s3 ; #s4 reste en flux normal, aucun reset
       requis. */
@media (pointer: coarse) and (min-width: 601px) {
  #s3 {
    position: relative !important;
    top: auto !important;
    z-index: auto !important;
  }
}

/* Tablettes tactiles uniquement (pointer: coarse + min-width:601px → téléphones et
   desktop exclus). Le vide en bas du héros ne vient PAS de min-height : le geler
   n'a rien changé car .blog-hero est en flex avec justify-content:center — en une
   colonne (≤860px, flex-direction:column) le mou est CENTRÉ (réparti en haut ET en
   bas), donc -50px de hauteur n'enlève que ~25px en bas ; et si le contenu remplit
   déjà ~100vh, min-height ne contraint rien. La vraie réserve située tout en bas du
   héros est son padding-bottom (~3–4rem selon la largeur), posé SOUS le contenu
   quelle que soit la mise en page (1 col. centrée ou 2 col. alignées en haut). On le
   réduit donc ici → l'espace bas diminue d'environ 40–50px. Sûr : la section suivante
   (.blog-carousel) garde son padding-top:3rem, aucun chevauchement. Desktop,
   téléphones (≤600px), .blog-s3__sticky, overlays et la règle max-width:600px :
   inchangés. */
@media (pointer: coarse) and (min-width: 601px) {
  .blog-hero {
    padding-bottom: 1rem;
  }
}

/* Grandes tablettes tactiles (pointer: coarse, ≥1025px : iPad 10e gén. 1180px,
   iPad Pro 1366px…). Au-delà de 1024px aucun palier ne redéfinit la vidéo : elle
   reprend la taille de base DESKTOP (min(100%, 420px, 47.8vh)), trop grande sur
   tablette. On la réduit de 15% : min(85%, 357px, 40.63vh) = 0,85 × la base
   (chaque borne ×0,85 ⇒ la min résolue est exactement à −15%, quelle que soit la
   borne contraignante). On NE descend PAS à 601px : le palier 861–1024px impose
   déjà une vidéo plus petite (min(100%, 300px, 38vh)) ; une règle coarse ≥601
   l'écraserait à 357px et l'AGRANDIRAIT (régression). À ≤860px la vidéo est masquée
   (.blog-hero__media: display:none). Desktop (fine) et téléphones (≤600px) : inchangés. */
@media (pointer: coarse) and (min-width: 1025px) {
  .blog-hero__video {
    width: min(85%, 357px, 40.63vh);
  }
}

/* Home page: un-pin the destinations stack so #s4 stops overlapping #s3 on
   phones. #s3 is the sticky "paper" holding the destinations carousel; #s4
   (.cover-section-4, z-index 3) scrolls up and overlaps the pinned #s3. #s3's
   stickiness comes from an INLINE style (fr/index.html: style="position:sticky;
   top:0"), so only an !important author rule can override it.

   Use position: RELATIVE (not static): relative still cancels the sticky
   pinning — so the overlap is gone — but, unlike static, it keeps #s3 a
   positioning containing block. That matters because #amazon-title (the "Mes
   bons plans voyage !" title) is position:absolute and is anchored to #s3; a
   static #s3 would let it escape to a far ancestor and vanish off-screen.

   We deliberately DON'T touch #s2.cover-section here. It must stay its base
   position:relative so (a) it remains #s3's offsetParent — main.js reads
   s3.offsetTop to drive the beige→peach background behind the cards, which
   breaks if offsetParent jumps to <body> — and (b) its z-index:2 background
   layer keeps painting behind the carousel. */
@media (max-width: 600px) {
  #s3 {
    position: relative !important;
    top: auto !important;
    height: auto !important;
    z-index: auto !important;
  }
  /* The destinations carousel inherits desktop sticky/parallax sizing
     (height:100vh, padding-top:53vh, padding-bottom:200px from the base
     #dest-outer rule). With #s3 un-pinned above, those values just bake huge
     empty bands above and below the cards. Collapse the box to its content and
     give it ordinary in-flow spacing. No !important needed: this rule is later
     in source than the base #dest-outer (line ~747) with equal specificity, so
     it wins at ≤600px. The cards keep their own clamp() height and the carousel
     JS (driven by #dest-track card widths, not this height) is unaffected. */
  #dest-outer {
    height: auto;
    padding-top: 2rem;
    padding-bottom: 2rem;
  }
  /* Collapse the 100px spacer (<div style="height:100px;" aria-hidden="true">)
     that precedes #s4. On desktop it cushions the globe scene; on phones #s4 is
     display:none, so the spacer is left as a dead peach band under the carousel.
     This is the ONLY element in the page whose style attribute is exactly
     "height:100px;", so the exact-match attribute selector hits nothing else.
     Inline height has specificity (1,0,0,0), so !important is required to beat
     it. Scoped to ≤600px → desktop keeps its cushion. */
  div[aria-hidden="true"][style="height:100px;"] {
    height: 0 !important;
  }
}

/* Bike page, all touch devices (phones + tablets portrait + landscape) : collapse
   the 200px spacer before #s4. On phones, #s4 is display:none so the spacer is a
   dead peach band. On tablets, #s4 is visible but the 200px gap is still unwanted
   (mirrors the 100px collapse the home page already gets from the tablet block at
   line ~3481). The bare 200px selector is NOT used here because the same div
   appears on flights pages where #s4 IS restored on phones (body.page-flights #s4
   display:block), so the bare selector would incorrectly collapse that spacer too.
   body.page-bike keeps this fix precise. Desktop (pointer:fine) keeps the 200px
   cushion. */
@media (pointer: coarse) {
  body.page-bike div[aria-hidden="true"][style="height:200px;"] {
    height: 0 !important;
  }
}

/* Home page, tablettes tactiles (pointer:coarse + min-width:601px) : même collapse
   que le bloc ≤600px ci-dessus (le sticky est déjà annulé par le bloc coarse plus
   haut), avec deux particularités tablette :
     • #dest-outer { padding-top: 2rem } doit être en !important : sur 768–1400px une
       règle existante (#dest-outer { padding-top: calc(55vh + 80px) !important }, ~l.764,
       vestige du parallax sticky desktop) imposerait sinon une grande bande vide
       AU-DESSUS des cartes. height (base 100vh) et padding-bottom (base 200px) n'ont
       pas de !important concurrent → ils l'emportent par l'ordre source, sans !important.
     • #s3 { height: auto !important } annule le height:100vh INLINE de #s3
       (fr/index.html:488) — ce que le bloc ≤600px ne fait pas. Sans ça, le 100vh laisse
       une bande morte sous les cartes une fois #dest-outer collapsé. Sûr : #s3 ne contient
       que #amazon-title + #dest-outer (aucun widget haut à clipper) et main.js ne lit que
       s3.offsetTop (position) + un s3Height codé en dur (2*innerHeight), jamais sa hauteur
       réelle.
   Le spacer 200px est réduit à 0 comme sur téléphone (sélecteur exact, unique). NB : sur
   tablette #s4 EST visible (fond yuuki_robot_tablette.webp) — c'est donc un resserrement
   de l'espace avant la scène du globe, pas la suppression d'un vide mort comme sur
   téléphone. On NE touche PAS .blog-s3__sticky, les overlays ni les tiroirs/modales. */
@media (pointer: coarse) and (min-width: 601px) {
  #dest-outer {
    height: auto;
    padding-top: 2rem !important;
    padding-bottom: 2rem;
    margin-top: -30px;
    margin-bottom: 80px;
  }
  #s3 {
    height: auto !important;
  }
  div[aria-hidden="true"][style="height:100px;"] {
    height: 0 !important;
  }
}

@media (max-width: 600px) {
  body.page-flights #dest-outer {
    height: auto;
    padding-bottom: 2rem;
  }
}

@media (pointer: coarse) and (min-width: 601px) {
  body.page-flights #dest-outer {
    height: auto;
    padding-top: 2rem !important;
    padding-bottom: 2rem;
  }
}

@media (pointer: coarse) {
  body.page-transfers div[aria-hidden="true"][style="height:200px;"] {
    height: 0 !important;
  }
}

@media (max-width: 600px) {
  body.page-transfers div[aria-hidden="true"][style="height:200px;"] {
    height: 0 !important;
  }
}

/* Home page, tablettes tactiles (pointer:coarse + min-width:601px) : la
   .carousel-section « Mes précédentes aventures » est en height:100vh (parallax
   sticky desktop) mais ne contient QUE #carousel-track (position:absolute, cartes
   injectées en JS) → height:auto la réduirait à 0 et ferait disparaître le
   carrousel. On lui donne donc une hauteur explicite ajustée au contenu, ET on
   abaisse la position verticale des cartes pour supprimer la bande vide SOUS les
   cartes sans qu'elles débordent sur la section suivante.

   Sur tablette on réduit aussi #carousel-title de 35vh (base) à 20vh, pour resserrer
   l'espace AU-DESSUS du titre. Les deux calc() ci-dessous utilisent donc 20vh comme
   réserve de titre (au lieu de 35vh) afin de rester cohérents avec cette hauteur.

   Géométrie : main.js applique transform: translateY(calc(-50% + wave)) à chaque
   carte → la valeur CSS `top` est le CENTRE de la carte (pas son bord haut). Les
   cartes ondulent verticalement de ±WAVE_AMP=38px (+ rotation ~±5°). Le titre
   #carousel-title (hauteur 20vh sur tablette, absolu, au-dessus de la section) doit
   rester dégagé. D'où :
     • height = 20vh (titre) + hauteur carte + 8rem (4rem de marge en haut + 4rem
       en bas, > l'amplitude d'ondulation ~50px → aucun débordement).
     • top (centre) = 20vh + 4rem + hauteur_carte/2 → bord haut de la carte à
       20vh+4rem (sous le titre), bord bas à 4rem du bas de la section.
   Portée : sélecteur `.carousel-section .carousel-card-wrapper` (spécificité 0,2,0)
   → cible UNIQUEMENT le carrousel d'accueil ; les cartes du blog (même classe, mais
   sous .blog-s2.blog-carousel) gardent leur top:58%/64% existant. PAS de !important
   sur `top` : l'état « carte dépliée » de main.js pose un top:'55%' INLINE qui doit
   l'emporter, et le reset (top:'') doit revenir à cette règle. #carousel-title garde
   ses 35vh sur desktop (pointer:fine) et ≤600px → inchangés. */
@media (pointer: coarse) and (min-width: 601px) {
  #carousel-title {
    height: 18vh;
  }
  .carousel-section {
    height: calc(20vh + clamp(338px, 27.3vw, 350px) + 8rem);
  }
  .carousel-section .carousel-card-wrapper {
    top: calc(20vh + 4rem + clamp(338px, 27.3vw, 350px) / 2);
  }
}

.blog-s4, .blog-s5, .blog-s6 {
  position: relative;
  z-index: 4;
  background: var(--beige);
}
/* .blog-s2.blog-carousel sets pointer-events:none so its pinned sticky
   background doesn't swallow clicks meant for s4. pointer-events does NOT
   inherit from carousel to s4 (they are siblings, not ancestor/descendant),
   but set it explicitly here so s4 and its subtree are unambiguously
   click-interactive regardless of any future cascade changes. */
.blog-s4 {
  pointer-events: auto;
}

#blog-carousel-title {
  text-align: center;
  margin: 2rem 0 2.5rem;
}
#blog-carousel-title-text {
  display: inline-block;
  position: relative;
  margin: 0;
  white-space: normal;
  font-family: "Klee One", sans-serif;
  font-weight: 600;
  font-size: clamp(1.6rem, 4vw, 3rem);
  color: #4a3b33;
}

@media (pointer: coarse) and (orientation: portrait) {
  #blog-carousel-title-text { white-space: nowrap; }
}

#blog-carousel-title-text span {
  display: inline-block;
  opacity: 0;
  white-space: pre;
}
#blog-carousel-title-text span.is-popped {
  animation: mangaLetterPop 0.35s cubic-bezier(0.34, 1.56, 0.64, 1) both;
}
#blog-stabilo-svg {
  position: absolute;
  left: -18px;
  top: 0;
  width: calc(100% + 36px);
  height: 100%;
  z-index: -1;
  pointer-events: none;
  overflow: visible;
  clip-path: inset(0 100% 0 0);
}
#blog-stabilo-poly { fill: #ffa07a; opacity: 0.45; }
#blog-stabilo-svg.is-drawn {
  clip-path: inset(0 0 0 0);
  transition: clip-path 600ms ease-out;
}

.blog-carousel__track-wrap {
  position: relative;
  width: 100%;
  margin-top: 0rem;
}

.blog-carousel__track {
  position: relative;
  height: clamp(400px, 60vh, 520px);
  clip-path: inset(-90px 0);
  /* Re-enable mouse interaction here: the parent .blog-s2.blog-carousel sets
     pointer-events:none so its background doesn't intercept clicks meant for
     .blog-s4. The track (and the polaroids inside it) must stay grabbable. */
  pointer-events: auto;
  cursor: grab;
  touch-action: pan-y;
  user-select: none;
  -webkit-user-select: none;
}

.blog-polaroid {
  position: absolute;
  top: 50%;
  left: 0;
  width: clamp(220px, 70vw, 304px);
  background: #ffffff;
  border-radius: clamp(18px, 6.4vw, 28px);
  padding: clamp(11px, 3.7vw, 16px) clamp(11px, 3.7vw, 16px) clamp(28px, 9.2vw, 40px);
  box-shadow: 4px 12px 36px rgba(74, 59, 51, 0.2);
  cursor: grab;
  will-change: transform;
  user-select: none;
  -webkit-user-select: none;
}
.blog-polaroid__photo {
  width: 100%;
  aspect-ratio: 272 / 240;
  border-radius: 0px;
  overflow: hidden;
}
.blog-polaroid__img {
  width: 100%;
  height: 100%;
  display: block;
  object-fit: cover;
  pointer-events: none;
}
.blog-polaroid__caption {
  margin-top: 16px;
  text-align: center;
  font-family: "Klee One", sans-serif;
  font-size: 0.95rem;
  color: #4a3b33;
}

@media (max-width: 860px) {
  .blog-polaroid {
    width: clamp(160px, 60vw, 260px);
    max-width: 80vw;
  }
  .blog-polaroid__photo,
  .blog-polaroid__img {
    max-width: 100%;
  }
}

/* Tablettes tactiles en grand format (pointer: coarse, ≥861px : tablettes en
   PAYSAGE — iPad 10e gén. 1180px, iPad Pro 1194/1366px…). À ces largeurs la
   polaroid reprend sa taille de BASE clamp(220px, 70vw, 304px) (le palier
   max-width:860px ne s'applique pas), jugée trop petite sur tablette. On l'agrandit
   de 15% → clamp(253px, 70vw, 349px) ≈ base × 1,15 (sur tablette la borne MAX est
   contraignante : 304→349). On NE descend PAS à 601px : sous 861px la polaroid a une
   base PLUS PETITE (clamp(160px, 60vw, 260px) via le palier max-width:860px) ; une
   règle coarse ≥601 l'y écraserait à 349px et la sur-agrandirait (régression).
   Desktop (pointer: fine) et téléphones (≤600px) : inchangés. */
@media (pointer: coarse) and (min-width: 861px) {
  .blog-polaroid {
    width: clamp(253px, 70vw, 349px);
  }
}

.blog-s3.blog-video-text {
  position: relative;
  z-index: 3;
  margin-top: 0;
  height: 300vh;
  min-height: 300vh;
  transform-origin: right top;
  will-change: transform;
  border-radius: 0;
  box-shadow: 0 -14px 18px -3px rgba(74, 59, 51, 0.30);
}

.blog-s3-backdrop {
  position: fixed;
  inset: 0;
  z-index: 2;
  background: #FAF8F4;
  opacity: 0;
  pointer-events: none;
}
.blog-s3-backdrop.is-active { opacity: 1; }

.blog-s3__sticky {
  position: sticky;
  top: 0;
  height: 100vh;
  overflow: hidden;
}

.blog-s3__hscroll {
  display: flex;
  flex-wrap: nowrap;
  height: 100%;
  will-change: transform;
}

.blog-s3__panel {
  flex: 0 0 80vw;
  height: 100%;
  position: relative;
  z-index: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: clamp(2rem, 5vw, 5rem);
  box-sizing: border-box;
  padding: 50px 8vw 0;
  color: var(--text-light);
}

/* Le panneau 3 a la MÊME largeur que les panneaux 1 et 2 (80vw). Il était
   auparavant plus large (120vw) pour ménager une marge à droite de l'image Yuuki.
   Yuuki ayant été retirée, cette largeur supplémentaire n'a plus lieu d'être :
   justify-content:center centrait le surplus (40vw) des deux côtés, donc la moitié
   (20vw) atterrissait à GAUCHE et gonflait l'écart entre le texte du panneau 2 et
   la vidéo du panneau 3 par rapport à l'écart 1→2. On repasse donc à 80vw. */
.blog-s3__panel-3 {
  flex: 0 0 80vw;
}

.blog-s3__yuuki {
  margin-left: auto;
  flex-shrink: 0;
  margin-right: 3vw;
  margin-top: 4rem;
}

.blog-s3__text-col {
  flex: 1 1 0;
  max-width: 540px;
  align-self: center;
  padding-top: 0;
  padding-left: 80px;
  margin-top: -120px;
}

.blog-s3__title {
  position: relative;
  display: inline-block;
  margin: 0 0 1.25rem;
  font-family: "Klee One", sans-serif;
  font-weight: 600;
  font-size: clamp(1.28rem, 2.56vw, 2.18rem);
  line-height: 1.15;
  color: var(--text-light);
}
.blog-s3__title-text {
  position: relative;
  z-index: 1;
  display: inline-block;
  opacity: 0;
  transform: translateY(8px);
  transition: opacity 0.5s ease, transform 0.5s ease;
  white-space: nowrap;
}
.blog-s3__panel.is-active .blog-s3__title-text {
  opacity: 1;
  transform: none;
  transition-delay: 0.65s;
}
.blog-s3__title-underline {
  position: absolute;
  z-index: 0;
  left: -18px;
  top: 0;
  width: calc(100% + 36px);
  height: 100%;
  pointer-events: none;
  overflow: visible;
  clip-path: inset(0 100% 0 0);
}
.blog-s3__title-underline svg { display: block; width: 100%; height: 100%; }
.blog-s3__title-underline path { fill: #7a3a1a; }
.blog-s3__panel.is-active .blog-s3__title-underline {
  clip-path: inset(0 0 0 0);
  transition: clip-path 0.6s ease-out;
}

.blog-s3__body {
  margin: 0;
  max-width: 46ch;
  font-family: "Quicksand", "Klee One", sans-serif;
  font-size: clamp(1rem, 1.2vw, 1.15rem);
  line-height: 1.7;
  color: var(--text-light);
  opacity: 0;
  transform: translateY(10px);
  transition: opacity 0.6s ease, transform 0.6s ease;
}
.blog-s3__panel.is-active .blog-s3__body {
  opacity: 1;
  transform: none;
  transition-delay: 0.9s;
}

.blog-s3__video-1,
.blog-s3__video-2,
.blog-s3__video-3 {
  flex: 0 0 auto;
  width: clamp(172px, 20.3vw, 265px);
  aspect-ratio: 9 / 16;
  object-fit: cover;
  border-radius: 16px;
  background: #000;
  box-shadow: 0 18px 50px rgba(74, 59, 51, 0.35);
  display: block;
  margin-top: 0;
}

.blog-s3__video-1 {
  opacity: 0;
  transform: translateX(-120%);
  transition: opacity 0.9s cubic-bezier(0.22, 1, 0.36, 1),
              transform 0.9s cubic-bezier(0.22, 1, 0.36, 1);
}
.blog-s3__panel-1.is-active .blog-s3__video-1 { opacity: 1; transform: none; }
.blog-s3__video-2 {
  opacity: 0;
  transform: translateY(120%);
  transition: opacity 0.9s cubic-bezier(0.22, 1, 0.36, 1),
              transform 0.9s cubic-bezier(0.22, 1, 0.36, 1);
}
.blog-s3__panel-2.is-active .blog-s3__video-2 { opacity: 1; transform: none; }
.blog-s3__video-3 {
  opacity: 0;
  transform: translateY(-120%);
  transition: opacity 0.9s cubic-bezier(0.22, 1, 0.36, 1),
              transform 0.9s cubic-bezier(0.22, 1, 0.36, 1);
}
.blog-s3__panel-3.is-active .blog-s3__video-3 { opacity: 1; transform: none; }

.blog-s3__lava {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  z-index: 0;
  pointer-events: none;
  opacity: 0;
}

/* ============================================================================
   Section 3 — GEL desktop sous 860px (pointer: fine).
   Sous 860px la fenêtre déclenche la barre de défilement horizontale (body
   min-width:860px). Sans gel, le contenu de .blog-s3 continue de rétrécir car
   tout y est en unités VIEWPORT (vw), calculées sur la fenêtre, pas sur le
   panneau : flex-basis des panneaux (80vw), gap (5vw), padding (8vw),
   largeur des vidéos (20.3vw), marge de Yuuki (3vw), taille du titre (2.56vw).
   On fige chaque vw à son équivalent px AU point de rupture 860px (vw × 860/100)
   pour que 859px rende À L'IDENTIQUE de 860px — aucun reflow, aucun saut au seuil
   (à 861px un panneau vaut déjà 80vw ≈ 689px ≈ la valeur figée 688px).
   IMPORTANT — on NE fige PAS .blog-s3__text-col : en flex:1 1 0, une fois TOUS
   ses voisins figés en px, sa largeur devient déterministe automatiquement (et
   elle diffère entre les panneaux 1/2 et le panneau 3 qui porte Yuuki) ; lui
   imposer un px casserait l'un des deux. .blog-s3__body est déjà gelé : son
   font-size clamp(1rem, 1.2vw, 1.15rem) bute sur 1rem dès que la fenêtre passe
   sous ~1333px. Le scroll-jack (main.js) lit hscroll.scrollWidth et se recale au
   resize, donc une largeur de rail fixe (2064px) reste parfaitement synchrone.
   Cible (pointer:fine) : le tactile garde sa pile verticale (bloc ci-dessous). */
@media (pointer: fine) and (max-width: 859px) {
  .blog-s3__hscroll { min-width: 2064px; }                       /* 688 × 3 */
  .blog-s3__panel   { flex: 0 0 688px; gap: 43px; padding: 50px 68.8px 0; } /* 80vw / 5vw / 8vw @860 */
  .blog-s3__panel-3 { flex: 0 0 688px; }                         /* 80vw @860 (égal aux panneaux 1/2) */
  .blog-s3__video-1,
  .blog-s3__video-2,
  .blog-s3__video-3 { width: 174.58px; }                         /* 20.3vw @860 */
  .blog-s3__yuuki   { margin-right: 25.8px; }                    /* 3vw @860 */
  .blog-s3__title   { font-size: 1.376rem; }                     /* 2.56vw @860 = 22.016px */

  /* .blog-hero (blog-s1) — gel des unités vw sous 860px. Sous 860px le bloc
     @media (max-width:860px) passe le héros en UNE colonne et masque
     .blog-hero__media (la vidéo) ; il ne reste que la colonne texte. Ses seules
     valeurs qui rétrécissent encore avec la fenêtre sont le padding gauche/droit
     (5vw) et les tailles de police (clamp à terme vw). On les fige à leur valeur
     à 860px (vw × 860/100). La largeur de la boîte est déjà figée par
     body{min-width:860px}. NB : #blog-widget-mount n'est PAS dans .blog-hero (il
     est dans .blog-s4) et n'a aucune dimension en vw → rien à y geler ici. */
  .blog-hero { padding-left: 43px; padding-right: 43px; }        /* 5vw @860 */
  #heroTitle { font-size: 33.54px; }                            /* 3.9vw @860 */
  .blog-hero__hook { font-size: 18.87px; }                      /* 0.9rem + 0.52vw @860 */
  .blog-hero__intro { font-size: 15.65px; }                     /* 0.86rem + 0.22vw @860 */
  .blog-hero__btn-compose,
  .blog-hero__btn-destinations { font-size: 14.53px; }          /* 0.72rem + 0.35vw @860 */
}

/* ============================================================================
   Section 3 — TACTILE (pointer: coarse, tablette & mobile) : reset structurel.
   Le scroll-jack horizontal ET le pivot S3->S4 sont desactives en JS sur pointeur
   grossier (main.js, gabarit `(hover: hover) and (pointer: fine)` = l'inverse exact
   de ce @media, pour qu'une tablette large en paysage tombe du bon cote),
   qui ajoute aussi .is-active a tous les panneaux : plus besoin de !important
   pour neutraliser un transform inline. On repasse la section en flux normal ->
   3 panneaux empiles verticalement, scroll natif, videos + textes visibles.
   (Le layout qui alterne gauche/droite arrivera a l'etape suivante.)
   NE PAS confondre avec le bloc Yuuki fluide (1025-1400px) ni le bloc fleche
   (861-1400px) plus bas, qui restent inchanges. */
@media (pointer: coarse) {
  /* Section : plus de hauteur fixe (le 300vh n'etait que la course du
     scroll-jack), conteneur sticky depingle, rail transforme en pile verticale. */
  .blog-s3.blog-video-text {
    height: auto;
    min-height: 0;
    /* Clippe l'overflow horizontal : les videos demarrent hors panneau
       (translateX +/-120%) pour le slide-in et ne doivent pas creer de barre de
       defilement horizontale. `clip` ne cree pas de conteneur de scroll et
       laisse le flux vertical intact. */
    overflow-x: clip;
  }
  /* Pas d'ombre « feuille superposee » en tactile (cet effet ne sert que la pile
     desktop). !important car ces ombres viennent d'un <style> inline du HTML
     (meme specificite (0,2,0) mais charge APRES main.css) ; en desktop
     (pointer: fine) ce bloc ne s'applique pas, les ombres sont donc preservees. */
  .blog-s2.blog-carousel,
  .blog-s3.blog-video-text {
    box-shadow: none !important;
  }
  .blog-s3__sticky {
    position: static;
    height: auto;
    overflow: visible;
  }
  .blog-s3__hscroll {
    flex-direction: column;
    height: auto;
  }

  /* Chaque panneau : pleine largeur, hauteur selon son contenu, contenu empile
     et centre. */
  .blog-s3__panel-1,
  .blog-s3__panel-2,
  .blog-s3__panel-3 {
    flex: 0 0 auto;
    width: 100%;
    height: auto;
  }
  /* Layout alterne : rangee horizontale video | texte. align-items:center aligne
     verticalement video et texte ; texte a gauche puisqu'ils sont cote a cote.
     Padding vertical reduit (contenu desormais horizontal) mais on garde la
     reserve du header fixe en haut (calc(66px + ...)). */
  .blog-s3__panel {
    position: relative;
    flex-direction: row;
    align-items: center;
    justify-content: center;
    text-align: left;
    gap: 5rem;
  }
  .blog-s3__panel-2 {
    gap: 11rem;
    padding: calc(66px + 1rem) clamp(1.25rem, 5vw, 4rem) 1.5rem;
  }
  /* Panneau 2 : rangee inversee -> video a droite, texte a gauche. */
  .blog-s3__panel-2 {
    flex-direction: row-reverse;
  }
  /* Panneau 3 : simple rangee video | texte (plus de flex-wrap : Yuuki est
     masque en tactile). margin-bottom pour 30px d'espace sous la video du
     panneau 3 sur tactile. */
  .blog-s3__panel-3 {
    margin-bottom: 30px;
  }

  /* Colonne de texte : on annule le decalage desktop (margin-top:-280px) et les
     paddings/largeurs desktop ; prend l'espace restant, texte a gauche, ancree
     en haut (voir ci-dessous). */
  .blog-s3__text-col {
    margin-top: 0;
    /* Ancree en HAUT de la rangee (et non centree) pour que le titre s'aligne sur
       le HAUT de la video ; petit offset pour caler le titre au bord superieur. */
    align-self: center;
    padding-top: 0.5rem;
    padding-left: 80px;      /* meme decalage que desktop (titre + corps vers la droite) */
    flex: 0 0 auto;
    min-width: 0;
    max-width: 480px;
    text-align: left;
  }

  /* Le texte s'affiche via .is-active, posee de maniere FIABLE sur tactile par
     main.js (activateAllPanels en <1025px, IntersectionObserver en >=1025px). On
     NE force donc PLUS l'opacite en !important : ce forcage (opacity:1 +
     animation:none !important) figeait tout a l'etat final et empechait les
     animations de jouer. On garde juste display:block pour la mise en page, puis
     on (re)declare les etats .is-active afin que les transitions JOUENT sur
     tablette : surligneur stabilo (clip-path), titre et corps en fondu ; les
     lettres du titre sont animees par .is-popped (pose par main.js). */
  .blog-s3__text-col,
  .blog-s3__body {
    display: block;
  }
  /* Sur tactile, .is-active peut etre posee DES LE CHARGEMENT (activateAllPanels,
     <1025px) avant le 1er paint : une TRANSITION n'aurait alors pas d'etat "avant"
     a animer et snapperait. On utilise donc des ANIMATIONS (jouent au rendu meme
     si .is-active est deja la), comme mangaLetterPop le fait deja pour les lettres.
     A >=1025px (.is-active pose au scroll) elles jouent tout autant. Les lettres
     restent animees par .is-popped (mangaLetterPop, pose par main.js). */
  @keyframes s3UnderlineDraw {
    from { clip-path: inset(0 100% 0 0); }
    to   { clip-path: inset(0 0 0 0); }
  }
  @keyframes s3BodyReveal {
    from { opacity: 0; transform: translateY(10px); }
    to   { opacity: 1; transform: none; }
  }
  .blog-s3__panel.is-active .blog-s3__title-underline {
    clip-path: inset(0 0 0 0);
    animation: s3UnderlineDraw 0.6s ease-out both;
    animation-delay: 1s;
  }
  .blog-s3__panel.is-active .blog-s3__title-text {
    opacity: 1;
    transform: none;
    animation-delay: 1s;
  }
  .blog-s3__panel.is-active .blog-s3__body {
    opacity: 1;
    transform: none;
    animation: s3BodyReveal 0.6s ease both;
    animation-delay: 1s;
  }
  /* display:inline-block (et non block herite de la regle de visibilite
     ci-dessus) pour que le titre se retrecisse a son texte : le surligneur
     .blog-s3__title-underline fait width:calc(100% + 36px) du titre, donc en
     block il s'etirait sur toute la largeur du panneau. */
  .blog-s3__title {
    display: inline-block;
    font-size: clamp(1.5rem, 6vw, 2.2rem);
  }

  /* Videos : etat INITIAL cache hors-panneau pour le slide-in pilote au scroll
     par IntersectionObserver (main.js, IIFE pointer:coarse) qui ajoute
     .is-visible. !important pour passer DEVANT la revelation desktop
     .blog-s3__panel-N.is-active .blog-s3__video-N (0,3,0) — .is-active est posee
     sur tous les panneaux en tactile par main.js. La preference reduce (bloc
     @media plus bas, !important, source posterieure) reprend la main et montre
     les videos immediatement. Transform + opacity uniquement. */
  .blog-s3__video-1,
  .blog-s3__video-2,
  .blog-s3__video-3 {
    display: block;
    flex: 0 0 auto;
    width: clamp(135px, 25.5vw, 225px);
    height: auto;
    max-width: 100%;
    opacity: 0 !important;
    transition: opacity 0.6s cubic-bezier(0.22, 1, 0.36, 1),
                transform 0.6s cubic-bezier(0.22, 1, 0.36, 1);
  }
  /* Panneaux 1 & 3 : entree depuis la GAUCHE ; panneau 2 : depuis la DROITE. */
  .blog-s3__video-1,
  .blog-s3__video-3 { transform: translateX(-120%) !important; }
  .blog-s3__video-2 { transform: translateX(120%) !important; }
  /* Revele quand la video entre dans le viewport (.is-visible pose par le JS). */
  .blog-s3__video-1.is-visible,
  .blog-s3__video-2.is-visible,
  .blog-s3__video-3.is-visible {
    opacity: 1 !important;
    transform: translateX(0) !important;
  }

  /* Yuuki (le chat newsletter) et sa fleche ne sont pas montres en tactile : on
     les masque completement pour qu'ils ne reservent plus d'espace vide sous le
     panneau 3. Masquer le wrap suffit a cacher l'image et la fleche, mais on
     cible aussi la fleche explicitement par securite. */
  .blog-s3__yuuki-wrap {
    display: none !important;
  }
  .blog-s3__yuuki-arrow {
    display: none;
  }

  /* Bulle manga plus grande sur la page blog (tactile). !important NECESSAIRE :
     la bulle blog est #mangaBubbleS4, regie par une regle inline du HTML
     `#mangaBubbleS4 .manga-bubble-text` (1,1,0). Avec !important ce selecteur
     (0,2,0) passe devant la regle inline (non-!important) uniquement, sans
     toucher le global clamp(9px, 1.4vw, 16px). */
  .page-blog .manga-bubble-text {
    font-size: clamp(11px, 2.2vw, 19px) !important;
  }

  /* Bulle manga du HERO d'accueil (#mangaBubbleHero > #mangaBubbleHeroText) :
     nettement plus grande sur tactile. Selecteur DOUBLE-ID (2,0,0) + !important
     pour passer devant TOUTES les regles de taille existantes de cette bulle :
       - global `.manga-bubble-text` clamp(9px,1.4vw,16px) (0,1,0),
       - `#mangaBubbleHero .manga-bubble-text {...!important}` (1,1,0, <=600px).
     (2,0,0) > (1,1,0), donc gagne aussi sur telephone. Global non touche. */
  #mangaBubbleHero #mangaBubbleHeroText {
      font-size: clamp(9px, 1.4vw, 13px) !important;
  }

  /* Grille de post-its (section 4) : 30px d'espace au-dessus sur tactile.
     !important car la regle de base `.s4-postits-grid { margin: 0 auto }`
     (meme specificite mais PLUS BAS dans le fichier) remet sinon margin-top:0. */
  .s4-postits-grid {
    margin-top: 30px !important;
  }
}

/* Yuuki (chat) : reduction FLUIDE des 1250px, sans attendre le palier 1024px.
   width/height auto + max-width clamp(...,42vw,...) => l'image se reduit
   proportionnellement et sans deformation. La borne 42vw est CONTINUE avec le
   bloc <=1024px (qui utilise deja max-width:42vw) : aucun saut a 1024px, et a
   1250px la borne atteint 525px -> continu avec le desktop (palier nav-switch).
   margin-top:0 + align-self:center la gardent centree verticalement dans le
   panneau (align-items:center herite). */
@media (min-width: 1025px) and (max-width: 1250px) {
  .blog-s3__yuuki {
    margin-top: 0;
    align-self: center;
    width: auto;
    height: auto;
    max-width: clamp(360px, 42vw, 560px);
    max-height: calc(100vh - 9rem);
  }
}
/* Fleche decorative : taille fluide sur TOUTE la plage 861-1250px pour suivre le
   chat. 9vw ≈ 120/560 de la largeur du chat -> reduction proportionnelle.
   Selecteur (0,2,0) pour battre le width/height:120px du <style> inline du HTML. */
@media (min-width: 861px) and (max-width: 1250px) {
  .blog-s3__panel .blog-s3__yuuki-arrow {
    width: clamp(77px, 9vw, 120px);
    height: clamp(77px, 9vw, 120px);
  }
}

@media (prefers-reduced-motion: reduce) {
  .blog-s3__title-text,
  .blog-s3__body,
  .blog-s3__video-1,
  .blog-s3__video-2,
  .blog-s3__video-3 {
    opacity: 1 !important;
    transform: none !important;
    transition: none !important;
    animation: none !important;
  }
  .blog-s3__title-underline { clip-path: inset(0 0 0 0) !important; transition: none !important; animation: none !important; }
}

.blog-s3 .blog-s3__video-wrap { border-radius: 0 !important; }

.blog-s4 {
  position: relative;
  z-index: 4;
  min-height: auto;
  background: #FAF8F4;
  padding: clamp(1.5rem, 4vh, 3rem) 0;
  will-change: transform;
}

/* Tablettes tactiles (pointer: coarse, ≥601px → téléphones ≤600px et desktop exclus) :
   +30px d'espace EN HAUT de .blog-s4, EN PLUS du padding-top de base
   (clamp(1.5rem,4vh,3rem)) — d'où le calc(... + 30px) (un padding-top fixe écraserait
   la base au lieu d'ajouter). On utilise padding-top plutôt que margin-top : immunisé
   contre le « margin collapse » avec la section précédente .blog-s3 (qui n'a aujourd'hui
   aucun margin-bottom, mais le padding reste sûr quoi qu'il arrive) et contenu dans le
   fond beige de .blog-s4. Longhand → ne touche ni le bas ni les côtés du raccourci. */
@media (pointer: coarse) and (min-width: 601px) {
  .blog-s4 {
    padding-top: calc(clamp(1.5rem, 4vh, 3rem) + 30px);
  }
}

.blog-s4__content,
.blog-s4__widget-cta,
#blog-s4-title {
  padding-left: clamp(1.25rem, 5vw, 4rem);
  padding-right: clamp(1.25rem, 5vw, 4rem);
}

#blog-s4-title {
  text-align: center;
  margin: 0 0 2.5rem;
}
#blog-s4-title-text {
  display: inline-block;
  position: relative;
  margin: 0;
  white-space: nowrap;
  font-family: "Klee One", sans-serif;
  font-weight: 600;
  font-size: clamp(1.6rem, 4vw, 3rem);
  color: #4a3b33;
}
#blog-s4-title-text span {
  display: inline-block;
  opacity: 0;
  white-space: pre;
}
#blog-s4-title-text span.is-popped {
  animation: mangaLetterPop 0.35s cubic-bezier(0.34, 1.56, 0.64, 1) both;
}
#blog-s4-stabilo-svg {
  position: absolute;
  left: -18px;
  top: 0;
  width: calc(100% + 36px);
  height: 100%;
  z-index: -1;
  pointer-events: none;
  overflow: visible;
  clip-path: inset(0 100% 0 0);
}
#blog-s4-stabilo-poly { fill: #ffa07a; opacity: 0.45; }
#blog-s4-stabilo-svg.is-drawn {
  clip-path: inset(0 0 0 0);
  transition: clip-path 600ms ease-out;
}

.blog-s4__content {
  max-width: 1100px;
  margin: 0 auto;
}

.s4-postits-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: clamp(1.25rem, 3vw, 40px);
  max-width: 940px;
  margin: 0 auto;
  justify-items: center;
}
@media (max-width: 600px) {
  .s4-postits-grid { grid-template-columns: 1fr; }
}

/* CTA « Trouver un vol » sous la grille de post-its : ouvre la popup widget
   Travelpayouts (#blog-widget-overlay). Centré, padding vertical confortable.
   Titre en Klee One (comme le titre de section .blog-s4) ; bouton sur le gabarit
   pêche FollowMika (arrondi 2em, Quicksand 700, survol #e07a4f). */
.blog-s4__widget-cta {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 1.25rem;
  text-align: center;
  padding: clamp(2.5rem, 6vw, 4rem) 1rem 1rem;
}
.blog-s4__widget-cta-title {
  margin: 0;
  font-family: "Klee One", sans-serif;
  font-weight: 600;
  font-size: clamp(1.25rem, 3vw, 1.85rem);
  color: #4a3b33;
}
.blog-s4__widget-cta-btn {
  background: #ffa07a;
  color: #fdf6f0;
  border: none;
  border-radius: 2em;
  padding: 0.85em 1.9em;
  font-family: "Quicksand", sans-serif;
  font-weight: 700;
  font-size: 1.05rem;
  letter-spacing: 0.04em;
  cursor: pointer;
  transition: background-color 200ms ease, transform 120ms ease;
}
.blog-s4__widget-cta-btn:hover,
.blog-s4__widget-cta-btn:focus-visible {
  background: #e07a4f;
}
.blog-s4__widget-cta-btn:active { transform: translateY(1px); }
@media (prefers-reduced-motion: reduce) {
  .blog-s4__widget-cta-btn { transition: none; }
}

.s4-postit {
  position: relative;
  width: min(100%, clamp(240px, 80vw, 390px));
  pointer-events: auto;
  cursor: pointer;
  opacity: 0;
  filter: drop-shadow(0 8px 16px rgba(74, 59, 51, 0.2));
  transition: filter 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);
}
.s4-postit.is-shown { opacity: 1; }
/* Deeper shadow + raise above neighbours on hover, for every post-it. The
   scale-up lives on the inner SVG instead (see below), NOT here: each post-it
   permanently carries `is-in depN`, whose `animation: ... both` keeps filling
   its final keyframe (transform: scale(1)). A filling animation overrides any
   normal `transform` declaration, so a `transform` set on .s4-postit:hover is
   silently clobbered and never shows. */
.s4-postit:hover {
  z-index: 5;
  filter: drop-shadow(0 18px 34px rgba(74, 59, 51, 0.34));
}
/* "Liens utiles" (dep3): no hover effect on the card at all. Keep the resting
   drop-shadow on hover so the shadow does not deepen — higher specificity
   (0,3,0) overrides .s4-postit:hover (0,2,0). */
.s4-postit.dep3:hover {
  filter: drop-shadow(0 8px 16px rgba(74, 59, 51, 0.2));
}

.s4-postit__svg {
  display: block;
  width: 100%;
  height: auto;
  aspect-ratio: 220 / 240;
  overflow: visible;
  /* Keep the SVG (and its anchor links inside the "Liens utiles" post-it)
     click-interactive even if an ancestor turns pointer-events off. */
  pointer-events: auto;
}
/* Hover-grow for ALL post-its — SVG *and* content together, so the text/numbers
   scale with the paper instead of floating in place. The .s4-postit__svg and
   .s4-postit__content are direct siblings; their only common parent is .s4-postit
   itself, which permanently fills its `s4PostitIn… both` entrance keyframe
   (transform: scale(1)) — a filling animation overrides any normal `transform`, so
   scaling .s4-postit:hover would be silently clobbered (see the note above
   .s4-postit:hover). With no animation-free wrapper available, we instead scale the
   two siblings in parallel: both are animation/transform-free, and both share the
   same centre (the SVG defines the card box; .s4-postit__content is inset:0 over
   it), so scale(1.06) about `center center` keeps them perfectly aligned. No
   !important; no entrance keyframe touched. Placed BEFORE the .s4-postit--period
   rules so that card keeps its own 0.3s / scale(1.05) — its :hover transform is more
   specific (and its text already lives inside its SVG, so it needs no content rule). */
@media (hover: hover) and (pointer: fine) {
  .s4-postit .s4-postit__svg,
  .s4-postit .s4-postit__content {
    transition: transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);
  }
  .s4-postit:hover .s4-postit__svg,
  .s4-postit:hover .s4-postit__content {
    transform: scale(1.06);
    transform-origin: center center;
  }
  /* "Liens utiles" (dep3) is excluded from the hover-grow: it holds clickable
     links and has its own interaction style, so it must NOT zoom. Reset the
     scale + its transition on dep3's inner SVG/content only — the two elements
     that actually carry the zoom. The card itself is left alone so its base
     `transition: filter` (drop-shadow ease, line ~3820) survives. Specificity
     clears the general rules: `.dep3 …__svg` (0,3,0) > transition (0,2,0), and
     `.dep3:hover …__svg` (0,4,0) > scale (0,3,0). */
  .s4-postit.dep3 .s4-postit__svg,
  .s4-postit.dep3 .s4-postit__content {
    transition: none;
  }
  .s4-postit.dep3:hover .s4-postit__svg,
  .s4-postit.dep3:hover .s4-postit__content {
    transform: none;
  }
}
/* Only the "Meilleure période" post-it grows on hover. The SVG has no animation
   of its own, so its transform is free to animate; card shape and text both
   live inside the SVG, so they scale up together. The transform transition is
   scoped to this post-it so no other card (e.g. the "Liens utiles" dep3 note)
   carries a transition on hover. */
@media (hover: hover) and (pointer: fine) {
  .s4-postit--period .s4-postit__svg {
    transition: transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
  }
  .s4-postit--period:hover .s4-postit__svg {
    transform: scale(1.05);
    transform-origin: center center;
  }
}
/* Touch devices (phones + TABLETS): neutralise the post-it hover grow. iOS Safari fires a
   sticky fake :hover on tap (which sticks the zoom), and the continuous hover transitions
   burn CPU on tablets. Resetting transition + transform to none on the card and its two
   scaled siblings removes the zoom and kills all hover-driven animation here. The entrance
   fall is untouched: s4PostitIn owns .s4-postit's transform via animation-fill (a filling
   animation overrides a normal `transform`), and .s4-postit__svg/.s4-postit__content carry
   only the hover scale — so transform:none cannot disturb the fall-in. Desktop (pointer:
   fine) never matches this block. */
@media (pointer: coarse) {
  .s4-postit,
  .s4-postit__svg,
  .s4-postit__content {
    transition: none;
    transform: none;
  }
  .s4-postit,
  .s4-postit:hover,
  .s4-postit.dep3:hover {
    filter: none;
  }
}
.s4-postit__paper {
  transition: d 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);
}
/* "Liens utiles" (dep3): no card-background morph/transform on hover — only the
   drop-shadow filter from .s4-postit:hover is allowed. The data-path-hover
   attribute is also removed from its markup so the paper `d` never changes. */
.s4-postit.dep3 .s4-postit__paper {
  transition: none;
}
/* Header band morphs in sync with the paper on hover (dep0's data-header-hover,
   swapped by the inline script). Byte-identical timing/easing to .s4-postit__paper
   above so the two paths ease together. Inert on cards whose header `d` never
   changes (e.g. dep3 has no data-header-hover). */
.s4-postit__header {
  transition: d 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);
}
/* Title text path morphs in sync with the header (dep0's data-titlepath-hover,
   swapped by the inline script): its hover curve = the header hover top edge
   shifted +17 in y, so "Meilleure période" stays centred in the band as it moves.
   Byte-identical timing/easing to the paper/header rules above. */
.s4-postit__titlepath {
  transition: d 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);
}

.s4-postit__content {
  position: absolute;
  inset: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  padding: 1.5% 9% 0;
  box-sizing: border-box;
  text-align: center;
}

.s4-postit__title {
  margin: 0;
  height: clamp(20px, 5vw, 26px);
  line-height: clamp(20px, 5vw, 26px);
  font-family: "Klee One", sans-serif;
  font-weight: 600;
  font-size: clamp(1.15rem, 0.95rem + 1vw, 1.6rem);
  color: #fff;
}

.s4-postit__text {
  margin: clamp(8px, 3%, 12px) 0 0;
  font-family: "Caveat", sans-serif;
  font-size: clamp(1.4rem, 1rem + 2vw, 2rem);
  line-height: 1.5;
  color: #4a3b33;
}

@media (max-width: 860px) {
  .s4-postit { max-width: 100%; }
  .s4-postit__title {
    height: clamp(18px, 3.5vw, 24px);
    line-height: clamp(18px, 3.5vw, 24px);
    font-size: clamp(1rem, 0.8rem + 1vw, 1.4rem);
  }
  .s4-postit__text {
    font-size: clamp(1.1rem, 0.8rem + 1.6vw, 1.6rem);
  }
}

.s4-postit__link {
  font-weight: 600;
  text-decoration: none;
}

.s4-postit.is-in.dep0 { animation: s4PostitIn0 0.95s ease-out both; }
.s4-postit.is-in.dep1 { animation: s4PostitIn1 0.95s ease-out both; }
.s4-postit.is-in.dep2 { animation: s4PostitIn2 0.95s ease-out both; }
.s4-postit.is-in.dep3 { animation: s4PostitIn3 0.95s ease-out both; }

@keyframes s4PostitIn0 {
  0%   { opacity: 0; transform: scale(3.2) rotate(-16deg); }
  55%  { opacity: 1; transform: scale(0.88) rotate(5deg); }
  72%  { transform: scale(1.09) rotate(-3deg); }
  86%  { transform: scale(0.96) rotate(1.5deg); }
  100% { opacity: 1; transform: scale(1) rotate(0deg); }
}
@keyframes s4PostitIn1 {
  0%   { opacity: 0; transform: scale(3.2) rotate(20deg); }
  55%  { opacity: 1; transform: scale(0.88) rotate(-6deg); }
  72%  { transform: scale(1.09) rotate(3deg); }
  86%  { transform: scale(0.96) rotate(-1.5deg); }
  100% { opacity: 1; transform: scale(1) rotate(0deg); }
}
@keyframes s4PostitIn2 {
  0%   { opacity: 0; transform: scale(3.2) rotate(-24deg); }
  55%  { opacity: 1; transform: scale(0.88) rotate(6deg); }
  72%  { transform: scale(1.09) rotate(-3deg); }
  86%  { transform: scale(0.96) rotate(2deg); }
  100% { opacity: 1; transform: scale(1) rotate(0deg); }
}
@keyframes s4PostitIn3 {
  0%   { opacity: 0; transform: scale(3.2) rotate(14deg); }
  55%  { opacity: 1; transform: scale(0.88) rotate(-5deg); }
  72%  { transform: scale(1.09) rotate(3deg); }
  86%  { transform: scale(0.96) rotate(-1.5deg); }
  100% { opacity: 1; transform: scale(1) rotate(0deg); }
}

.s4-postit.is-leaving.dep0 { animation: s4PostitOut0 0.95s ease-in both; }
.s4-postit.is-leaving.dep1 { animation: s4PostitOut1 0.95s ease-in both; }
.s4-postit.is-leaving.dep2 { animation: s4PostitOut2 0.95s ease-in both; }
.s4-postit.is-leaving.dep3 { animation: s4PostitOut3 0.95s ease-in both; }

@keyframes s4PostitOut0 {
  0%   { opacity: 1; transform: scale(1) rotate(0deg); }
  14%  { transform: scale(0.96) rotate(1.5deg); }
  28%  { transform: scale(1.09) rotate(-3deg); }
  45%  { opacity: 1; transform: scale(0.88) rotate(5deg); }
  100% { opacity: 0; transform: scale(3.2) rotate(-16deg); }
}
@keyframes s4PostitOut1 {
  0%   { opacity: 1; transform: scale(1) rotate(0deg); }
  14%  { transform: scale(0.96) rotate(-1.5deg); }
  28%  { transform: scale(1.09) rotate(3deg); }
  45%  { opacity: 1; transform: scale(0.88) rotate(-6deg); }
  100% { opacity: 0; transform: scale(3.2) rotate(20deg); }
}
@keyframes s4PostitOut2 {
  0%   { opacity: 1; transform: scale(1) rotate(0deg); }
  14%  { transform: scale(0.96) rotate(2deg); }
  28%  { transform: scale(1.09) rotate(-3deg); }
  45%  { opacity: 1; transform: scale(0.88) rotate(6deg); }
  100% { opacity: 0; transform: scale(3.2) rotate(-24deg); }
}
@keyframes s4PostitOut3 {
  0%   { opacity: 1; transform: scale(1) rotate(0deg); }
  14%  { transform: scale(0.96) rotate(-1.5deg); }
  28%  { transform: scale(1.09) rotate(3deg); }
  45%  { opacity: 1; transform: scale(0.88) rotate(-5deg); }
  100% { opacity: 0; transform: scale(3.2) rotate(14deg); }
}

.s4-postit.is-gone { opacity: 0; }

.blog-s5 {
  position: absolute;
  inset: 0;
  z-index: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: clamp(2rem, 5vh, 3.5rem);
  padding: clamp(1.5rem, 4vh, 3rem) clamp(1.25rem, 5vw, 4rem);
  background: var(--beige);
  opacity: 0;
  pointer-events: none;
  transition: opacity 0.6s ease;
  will-change: opacity;
}
.blog-s5.is-revealed {
  opacity: 1;
  pointer-events: auto;
  transition: opacity 0.6s ease 0.38s;
}

.blog-s4 > #blog-s4-title,
.blog-s4 > .blog-s4__content {
  position: relative;
  z-index: 2;
}

#blog-s5-title {
  text-align: center;
  margin: 0 0 0.5rem;
}
#blog-s5-title-text {
  display: inline-block;
  position: relative;
  margin: 0;
  white-space: nowrap;
  font-family: "Klee One", sans-serif;
  font-weight: 600;
  font-size: clamp(1.6rem, 4vw, 3rem);
  color: #4a3b33;
}
#blog-s5-title-text span {
  display: inline-block;
  opacity: 0;
  white-space: pre;
}
#blog-s5-title-text span.is-popped {
  animation: mangaLetterPop 0.35s cubic-bezier(0.34, 1.56, 0.64, 1) both;
}
#blog-s5-stabilo-svg {
  position: absolute;
  left: -18px;
  top: 0;
  width: calc(100% + 36px);
  height: 100%;
  z-index: -1;
  pointer-events: none;
  overflow: visible;
  clip-path: inset(0 100% 0 0);
}
#blog-s5-stabilo-poly { fill: #ffa07a; opacity: 0.45; }
#blog-s5-stabilo-svg.is-drawn {
  clip-path: inset(0 0 0 0);
  transition: clip-path 600ms ease-out;
}

.blog-s5__widgets {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: clamp(1.5rem, 3vw, 2.5rem);
  width: 100%;
  max-width: 1000px;
}
.blog-s5__widget {
  flex: 1 1 320px;
  max-width: 460px;
  min-height: 300px;
  display: flex;
  align-items: center;
  justify-content: center;
  background: #ffffff;
  border: 2px dashed var(--peach-soft);
  border-radius: 28px;
  box-shadow: 4px 12px 36px rgba(74, 59, 51, 0.2);
}
.blog-s5__widget::after {
  font-family: "Caveat", sans-serif;
  font-size: 1.6rem;
  color: var(--peach-deep);
  opacity: 0.65;
}
.blog-s5__widget--flights::after { content: "Widget vols"; }
.blog-s5__widget--hotels::after  { content: "Widget hôtels"; }

@media (max-width: 600px) {
  .blog-s5__widget { flex-basis: 100%; min-height: 220px; }
}

@media (prefers-reduced-motion: reduce) {
  .s4-postit.is-leaving { animation: none !important; }
  .blog-s5 { transition: none !important; }
}

#fm-overlay {
  position: fixed;
  inset: 0;
  background: #FAF8F4;
  z-index: 9999;
  pointer-events: none;
  opacity: 0;
  transform: translateX(100%);
  transition: opacity 350ms ease-in-out, transform 380ms ease-in-out;
}


body.fm-leaving > :not(.site-header):not(.nav-trigger):not(#fm-overlay) {
  opacity: 0;
  transition: opacity 350ms ease-in-out;
}

@keyframes fm-enter {
  from { opacity: 0; }
  to   { opacity: 1; }
}
body.fm-entering > :not(.site-header):not(.nav-trigger):not(#fm-overlay) {
  animation: fm-enter 380ms ease-in-out both;
}

@media (prefers-reduced-motion: reduce) {
  #fm-overlay { transition: none; }
  body.fm-leaving > :not(.site-header):not(.nav-trigger):not(#fm-overlay) { transition: none; opacity: 1; }
  body.fm-entering > :not(.site-header):not(.nav-trigger):not(#fm-overlay) { animation: none; }
}


.klaro {
  --green1: var(--peach);
  --green2: var(--peach);
  --green3: var(--peach-soft);
}

.klaro .cookie-modal a:hover,
.klaro .context-notice a:hover,
.klaro .cookie-notice a:hover {
  color: var(--peach-deep);
}
.klaro .cookie-modal .cm-btn.cm-btn-success:hover,
.klaro .context-notice .cm-btn.cm-btn-success:hover,
.klaro .cookie-notice .cm-btn.cm-btn-success:hover,
.klaro .cookie-modal .cm-btn.cm-btn-success-var:hover,
.klaro .context-notice .cm-btn.cm-btn-success-var:hover,
.klaro .cookie-notice .cm-btn.cm-btn-success-var:hover {
  background-color: var(--peach-deep);
}

.klaro .cookie-modal .cm-btn.cm-btn-info,
.klaro .context-notice .cm-btn.cm-btn-info,
.klaro .cookie-notice .cm-btn.cm-btn-info {
  background-color: var(--peach) !important;
}
.klaro .cookie-modal .cm-btn.cm-btn-info:hover,
.klaro .context-notice .cm-btn.cm-btn-info:hover,
.klaro .cookie-notice .cm-btn.cm-btn-info:hover {
  background-color: var(--peach-deep);
}
.klaro .cookie-modal .cm-list-label .slider::before,
.klaro .context-notice .cm-list-label .slider::before,
.klaro .cookie-notice .cm-list-label .slider::before {
  background-color: #333;
}

.klaro #id-cookie-notice > span {
  font-size: 0;
}
.klaro #id-cookie-notice > span > * {
  font-size: var(--font-size, 14px);
}
.klaro #id-cookie-notice > span::before {
  content: "Hi! We use third-party widgets (flights, hotels, activities…) that may set cookies.\A You can choose which ones to allow.";
  content: "Hi! We use third-party widgets (flights, hotels, activities…) that may set cookies.\A You can choose which ones to allow." / "";
  white-space: pre-line;
  font-size: var(--font-size, 14px);
}


@media (min-width: 601px) {

  .nav-inner {
    justify-content: space-between;
  }

.btn-menu-mobile {
    color: #ffffff;
  }

  .nav-trigger:hover ~ .site-header .btn-menu-mobile,
  .site-header:hover .btn-menu-mobile,
  .site-header.is-scrolled .btn-menu-mobile {
    color: #4a3b33;
    --dash-color: #ffa07a;
  }
}

/* Touch / tablet portrait (601–1250px, hover:none): the nav bar already gets its
   beige background from the `@media (hover: none)` block above, and the mobile
   drawer button (.menu-mobile-li) is shown from `@media (max-width: 1250px)`.
   But .btn-menu-mobile defaults to white text (and is re-forced white by
   `@media (min-width: 601px)`), only flipping to dark on :hover or .is-scrolled —
   neither of which fires idle on a touch screen — leaving the menu text invisible
   on the beige bar. Make it dark by default on touch so it is always legible.
   No !important here, so the scrolled-on-peach state (which sets white !important)
   still wins when the header overlaps a peach section. */
@media (hover: none) {
  .btn-menu-mobile {
    color: #4a3b33;
    --dash-color: #ffa07a;
    text-shadow: none;
  }
}

@media (min-width: 1250px) {
  .nav-inner {
    justify-content: space-between !important;
    width: 100% !important;
  }

  .nav-list {
    justify-content: flex-end !important;
    flex-grow: 0 !important;
    margin-left: auto !important;
    width: auto !important;
    display: flex !important;
  }
}


@media (min-width: 1025px) {
  .nav-inner {
    justify-content: space-between !important;
    width: 100% !important;
  }

  .nav-list {
    justify-content: flex-end !important;
    flex-grow: 0 !important;
    margin-left: auto !important;
    width: auto !important;
    display: flex !important;
  }
}

@media (max-width: 600px) {
  .nav-inner {
    justify-content: center !important;
  }

  .nav-list {
    justify-content: center !important;
    margin: 0 auto !important;
  }
}

/* ── Tablet PORTRAIT button-mode (601–1024px): center the menu/language buttons ──
   In this range the bar is in button mode — the regular nav <li>s are display:none
   (max-width:1250 block, ~l.2348), so .nav-list holds only the menu + language
   buttons and is sized to its content. Neither the ≤600 center rule nor the ≥1025
   flex-end rule applies here, so .nav-list keeps the `margin-left:auto` from the
   max-width:1250 block (~l.2359) and — with the logo hidden (max-width:1250)
   — that auto-margin shoves the content-width list to the RIGHT edge. (justify-content
   is moot: a content-width flex container has no free space to distribute, so the
   right-alignment is the auto-margin, NOT flex-end.) Mirror the ≤600 recipe: `margin:0
   auto` balances the auto-margins to center the list; justify-content:center is kept
   for the rare case the buttons ever exceed the bar width. Scoped to portrait and
   ≤1024 so the desktop layout (≥1025, flex-end !important) and the touch-LANDSCAPE
   full-nav block (~l.4985, which re-shows the items and intentionally right-aligns
   them) are both untouched. No !important needed — nothing !important targets
   .nav-list margin/justify in this range, and this rule is later in source than the
   max-width:1250 block it overrides. */
@media (min-width: 601px) and (max-width: 1024px) and (orientation: portrait) {
  .nav-list {
    justify-content: center;
    margin: 0 auto;
  }
}

/* Touch tablets (pointer:coarse, 601–1250px): right-align the Menu + Langues buttons
   in BOTH orientations. The centering in this range is NOT set in the 601–1250 coarse
   block — it comes from the width-based `@media (max-width:600px)` and the
   `601–1024px portrait` blocks via `margin:0 auto` on .nav-list. Those are not
   touch-scoped, so editing them would also shift the desktop nav; instead override only
   on coarse pointers, placed after those blocks so this wins by source order. Mirrors the
   existing right-align recipe (margin:0 0 0 auto + flex-end, as ~l.4646/4985); landscape
   (≥600px tall) is already right-aligned by the ~l.4985 block, so this stays consistent. */
@media (pointer: coarse) and (min-width: 601px) and (max-width: 1250px) {
  .nav-list {
    justify-content: flex-end !important;
    margin: 0 0 0 auto !important;
  }
}


@media (max-width: 600px) {
  .mob-drawer-cat {
    font-size: 1.4rem;
    padding: 0em 1.8em;
    font-family: "Quicksand ", sans-serif;
    font-weight: 530;
  }
  .mob-drawer-sub {
    font-size: 1.4rem;
    padding: 0em 1.4em;
    font-family: "Quicksand ", sans-serif;
    font-weight: 530;
  }
  .mob-drawer-back {
    font-size: 1.3rem;
    padding: 0em 1.4em;
    font-family: "Quicksand ", sans-serif;
    font-weight: 530;
  }
}

/* Hide the brand logo below 1251px; it shows by default at 1251px and above
   (base .logo rule sets no `display`). Hide-only on purpose: an explicit
   show rule would override the intentional coarse-tablet / :lang(ru) hides. */
@media (max-width: 1250px) {
  .logo { display: none; }
}

@media (max-width: 600px) {
  .site-header { min-height: 80px !important; }
  .nav-inner   { min-height: 80px !important; }
  .social-links { display: none !important; }
  .logo { display: none !important; }

.btn-menu-mobile {
    font-size: 1.3rem !important;
  }
  .btn-lang, #btn-lang {
    font-size: 1.3rem !important;
  }

.btn-menu-mobile {
    font-size: 1.3rem !important;
    color: #4a3b33 !important;
  }

  /* Make the single "Menu" button match the "Langues" button's box exactly.
     The nav grid uses justify-items:center, so each <li> hugs its content — and
     "Menu" is a shorter label than the (i18n-variable) "Langues", so Menu rendered
     narrower. Stretch Menu's grid item to fill its 1fr track, which equals Langues'
     track in every language, and align padding + border to .btn-lang so width,
     height, font-size and padding all match. .btn-menu-mobile does not match the
     Langues button, so Langues and its styles stay untouched. */
  .menu-mobile-single-li { justify-self: stretch; }
  .btn-menu-mobile {
    padding: 0.3em 0.9em;   /* match .btn-lang (was 0.3em 1.1em) */
    border-width: 0;        /* match .btn-lang's borderless height; border was a transparent spacer */
  }

#mangaBubbleHero {
    position: absolute !important;
    bottom: 67% !important;
    top: auto !important;
    right: 2% !important;
    left: auto !important;
  }

  .promo-btn {
    display: none !important;
  }
  .mob-drawer-blog svg {
    width: 22px;
    height: 22px;
  }

  .carousel-card-wrapper {
    width: clamp(170px, 68vw, 272px) !important;
    height: clamp(221px, 88.4vw, 354px) !important;
    top: 60% !important;
  }

#carousel-title-text {
    white-space: normal;
    word-break: keep-all;
    overflow-wrap: break-word;
    hyphens: none;
    text-align: center !important;
    font-size: clamp(1.2rem, 6.5vw, 1.8rem) !important;
    line-height: 1.2 !important;
  }

  #carousel-title-text span {
    white-space: normal;
    word-break: keep-all !important;
    hyphens: none !important;
  }

  #carousel-title {
      padding-top: 25px !important;
      padding-bottom: 10px !important;
    }
  #s2-row {
    padding-top: 10px !important;
  }

  #amazon-title-text {
    white-space: normal;
    word-break: keep-all;
    overflow-wrap: break-word;
    hyphens: none;
    font-size: clamp(1.2rem, 6.5vw, 1.8rem) !important;
  }
  #amazon-title-text svg {
    height: 100% !important;
    width: calc(100% + 60px) !important;
  }

  #mika-info-panel {
    position: absolute !important;
    bottom: -32vh !important;
    left: 0rem !important;
    right: 0rem !important;
    padding-top: 3rem;
    padding-left: 40px;
  }

  #mika-info-panel #mika-info-close {
    display: inline-block;
    position: sticky;
    top: 0;
    z-index: 10;
    margin: 0 0 0.6rem 0 !important;
  }

#mika-info-panel.is-open {
    position: fixed !important;
    inset: 0 !important;
    width: auto !important;
    max-width: none !important;
    min-height: 100dvh;
    max-height: none !important;
    border-radius: 0 !important;
    overflow-y: auto !important;
    -webkit-overflow-scrolling: touch;
    z-index: 60;
    padding-top: 9.5rem;
    display: flex !important;
    flex-direction: column !important;
    align-items: center !important;
    justify-content: center !important;
    background: rgba(250, 248, 244, 0.95) !important;
    text-align: center !important;
  }

  #mika-info-panel.is-open #mika-info-close {
    display: block !important;
    position: relative !important;
    margin: 2rem auto 1.5rem auto !important;
    left: auto !important;
    transform: none !important;
    bottom: auto !important;
  }

  #mika-info-panel.is-open ~ #mika-info-btn {
    display: none !important;
  }
}

@media (max-width: 600px) {
#mobile-card-modal {
    position: fixed;
    inset: 0;
    z-index: 99;
    background: #FAF8F4;
    display: none;
    flex-direction: column;
    overflow-y: scroll;
    -webkit-overflow-scrolling: touch;
    padding-top: 84px;
    overscroll-behavior: contain;
  }

  #mobile-card-modal.is-open {
    display: flex;
  }
  #mobile-card-modal {
    opacity: 0;
    transition: opacity 0.35s ease;
  }
  #mobile-card-modal.is-open {
    opacity: 1;
  }

 #mobile-card-modal .modal-img {
    width: 60%;
    height: auto;
    object-fit: contain;
    display: block;
    margin: 60px auto 0;
  }

  #mobile-card-modal .modal-title {
    font-family: "Klee One", sans-serif;
    font-size: 1.8rem;
    padding: 1rem;
    color: #4a3b33;
  }

  #mobile-card-modal .modal-desc {
    font-size: 0.95rem;
    padding: 0 1rem;
    color: #4a3b33;
    line-height: 1.6;
    flex-grow: 1;
  }

#mobile-card-modal .modal-btns {
    display: flex;
    gap: 1rem;
    padding: 1.5rem 1rem;
    justify-content: center;
  }
  #mobile-card-modal .modal-btn-back {
    font-family: "Quicksand", sans-serif;
    font-weight: 700;
    font-size: 0.95rem;
    color: #fdf6f0;
    background: #ffa07a;
    border: none;
    border-radius: 2em;
    padding: 0.4em 1.2em;
    cursor: pointer;
  }
  #mobile-card-modal .modal-btn-return {
    font-family: "Quicksand", sans-serif;
    font-weight: 700;
    font-size: 0.95rem;
    color: #4a3b33;
    background: transparent;
    border: 2px dashed #ffa07a;
    border-radius: 2em;
    padding: 0.4em 1.2em;
    cursor: pointer;
  }
  #mobile-card-modal .modal-btn-discover {
    font-family: "Quicksand", sans-serif;
    font-weight: 700;
    font-size: 0.95rem;
    color: #fdf6f0;
    background: #ffa07a;
    border: none;
    border-radius: 2em;
    padding: 0.4em 1.2em;
    cursor: pointer;
  }

  #amazon-title {
    padding-top: 75px !important;
  }
}

@media (min-width: 601px) and (max-width: 1024px) and (orientation: portrait) {
  #mobile-card-modal .modal-title {
    font-size: 2rem;
  }
  #mobile-card-modal .modal-desc {
    font-size: 2rem;
  }
}

@media (min-width: 601px) and (max-width: 1024px) and (orientation: landscape) and (min-height: 450px) {
  #mobile-card-modal .modal-title {
    font-size: 2rem;
  }
  #mobile-card-modal .modal-desc {
    font-size: 2rem;
  }
}


/* The tablet-portrait rotate overlay has been FULLY removed — both the
   JS-injected #tablet-rotate-overlay and the CSS « Tourne ta tablette » @media
   block (formerly lower in this file). No tablet rotate overlay remains.
   @keyframes rotateHint is KEPT — it is still used by #phone-rotate-overlay below. */
@keyframes rotateHint {
  0%, 100% { transform: rotate(0deg); }
  40%       { transform: rotate(80deg); }
  60%       { transform: rotate(80deg); }
}

#phone-rotate-overlay {
  display: none;
  position: fixed;
  inset: 0;
  z-index: 9999;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 1.8rem;
  padding: 2rem;
  text-align: center;
  background: #FAF8F4;
  color: #4a3b33;
  font-family: "Klee One", sans-serif;
  font-size: 1.69rem;
  line-height: 1.6;
}
#phone-rotate-overlay.is-visible { display: flex; }
#phone-rotate-overlay .rotate-icon {
  font-size: 5rem;
  line-height: 1;
  color: #ffa07a;
  animation: rotateHint 2s ease-in-out infinite;
  display: block;
}
#phone-rotate-overlay .rotate-title {
  font-size: 2.08rem;
  font-weight: 600;
  color: #4a3b33;
  margin: 0;
}
#phone-rotate-overlay .rotate-msg {
  margin: 0;
  max-width: 18em;
  color: #4a3b33;
  opacity: 0.75;
  font-size: 1.43rem;
}
@media (prefers-reduced-motion: reduce) {
  #phone-rotate-overlay .rotate-icon { animation: none; }
}

@keyframes bubbleBounceIn {
  0%   { transform: translateX(-50%) translateY(-40px) scale(0.8); opacity: 0; }
  60%  { transform: translateX(-50%) translateY(6px) scale(1.04); opacity: 1; }
  80%  { transform: translateX(-50%) translateY(-3px) scale(0.98); }
  100% { transform: translateX(-50%) translateY(0) scale(1); }
}
@keyframes bubbleBounceLoop {
  0%, 100% { transform: translateX(-50%) translateY(0); }
  40%       { transform: translateX(-50%) translateY(-8px); }
  60%       { transform: translateX(-50%) translateY(-6px); }
}
#tablet-portrait-rotate-overlay {
  display: none;
  position: fixed;
  inset: 0;
  z-index: 99;
  background: #FAF8F4;
  color: #4a3b33;
  font-family: "Klee One", sans-serif;
  font-size: 1.69rem;
  line-height: 1.6;
}
#tablet-portrait-rotate-overlay.is-visible { display: block; }
#tablet-portrait-rotate-overlay img {
  width: clamp(240px, 54vw, 390px);
  height: auto;
  display: block;
}
#tablet-portrait-rotate-overlay .rotate-icon {
  font-size: 5rem;
  line-height: 1;
  color: #ffa07a;
  animation: rotateHint 2s ease-in-out infinite;
  display: block;
}
#tablet-portrait-rotate-overlay .manga-bubble-wrap {
  position: absolute;
  top: 33%;
  left: 50%;
  transform: translateX(-50%) scale(0);
}
#tablet-portrait-rotate-overlay .tablet-overlay-media {
  position: absolute;
  bottom: 18%;
  left: 50%;
  transform: translateX(-50%);
  display: flex;
  align-items: center;
  gap: 1.8rem;
}
#tablet-portrait-rotate-overlay .manga-bubble-wrap svg {
  width: clamp(360px, 48vw, 600px);
}
#tablet-portrait-rotate-overlay .manga-bubble-text {
  font-size: clamp(18px, 2.8vw, 20px) !important;
  width: clamp(259px, 34.6vw, 432px);
}
#tablet-portrait-rotate-overlay.is-visible .manga-bubble-wrap {
  animation: bubbleBounceIn 0.7s cubic-bezier(0.34, 1.56, 0.64, 1) both, bubbleBounceLoop 2s ease-in-out 0.7s infinite;
  opacity: 1;
}
@media (prefers-reduced-motion: reduce) {
  #tablet-portrait-rotate-overlay .rotate-icon { animation: none; }
}
body.tablet-rotate-active .site-header .logo,
body.tablet-rotate-active .site-header .btn-menu-mobile {
  color: #4a3b33 !important;
}

@media (pointer: coarse) and (orientation: landscape) and (min-height: 450px) {
  /* Tablets in landscape show ONLY the Menu + Langues buttons — exactly like tablet
     portrait and phones — NOT the full desktop nav. The single "Menu" button is
     .menu-mobile-single-li (data-menu="menu", opens the full category drawer); the three
     VOYAGER/EXPLORER/PRÉPARER buttons are .menu-mobile-li and must stay hidden on touch
     tablets. (This block previously had these two inverted, which showed the 3 buttons.) */
  .menu-mobile-li { display: none; }
  .menu-mobile-single-li { display: block; }

  .nav-list > li:not(.lang-li):not(.menu-mobile-li):not(.menu-mobile-single-li) { display: none; }
  .lang-li { display: list-item; }

  .nav-inner { justify-content: space-between !important; }
  .logo { display: block !important; opacity: 1 !important; }
  .nav-list {
    display: flex !important;
    flex-wrap: nowrap;
    justify-content: flex-end !important;
    align-items: center;
    flex-grow: 0 !important;
    width: auto !important;
    margin: 0 0 0 auto !important;
    gap: clamp(0.4rem, 1.5vw, 1.1rem);
  }

  .nav-dropdown { top: calc(100% + 16px); }
  .lang-dropdown { display: block !important; }
  .nav-list > li.is-open > .nav-dropdown {
    opacity: 1;
    transform: translateY(0);
    pointer-events: auto;
  }

  .nav-trigger { display: block; }
}


/* Touch tablets (pointer:coarse, 601–1200px): show the #FollowMika logo on the LEFT in
   BOTH orientations. It is otherwise hidden by the max-width:1250 rule (portrait) and the
   short-landscape height≤800 rule (~l.5061 above). Placed after both so it wins by source
   order; display:block !important beats the landscape !important hide. The logo sits left
   as the first flex child while .nav-list is pushed right by its `margin:0 0 0 auto` (set
   in the coarse 601–1200 block ~l.4705 and the landscape block ~l.5038).
   min-height:450 keeps the tablet scope: portrait tablets in this width range are always
   >450px tall, and it excludes phones held in landscape (≤430px tall) so smartphone
   behaviour is untouched. Desktop (fine pointer / ≥1251px) and phones (≤600px) are out of
   scope. The Russian logo hide (:lang(ru) .site-header .logo, ~l.5478) has higher
   specificity and is intentionally preserved. */
@media (pointer: coarse) and (min-width: 601px) and (min-height: 450px) {
  .logo { display: block !important; opacity: 1 !important; }
}

@media (min-width: 1251px) and (hover: hover) {
  .nav-trigger:not(:hover) ~ .site-header:not(.is-scrolled):not(:hover) {
    background: transparent;
  }

  .nav-trigger:hover ~ .site-header .btn-menu-mobile,
  .site-header:hover .btn-menu-mobile {
    color: #4a3b33 !important;
    --dash-color: #ffa07a;
    text-shadow: none;
  }
}

#faqBtn {
  position: relative;
  top: -30px;
  right: 24px;
  width: 160px;
  height: 160px;
  background: transparent;
  border: none;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 0;
}

#faqBtn svg.faq-arrow {
  position: absolute;
  top: 0; left: 0;
  width: 100%; height: 100%;
  /* Rotation is driven by requestAnimationFrame in main.js for smooth
     hover acceleration/deceleration (see initFaqArrow). */
}

.faq-inner {
  position: relative;
  z-index: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 6px;
}

.faq-inner i {
  font-size: 28px;
  color: #FAF8F4;
  display: inline-block;
  transition: transform 0.3s ease;
  -webkit-text-stroke: 0.7px #FAF8F4;
}

#faqBtn:hover .faq-inner i {
  animation: faqPirouette 0.5s cubic-bezier(0.34,1.56,0.64,1) infinite alternate;
}

@keyframes faqPirouette {
  0%   { transform: rotate(-25deg) scale(1.2); }
  100% { transform: rotate(25deg) scale(0.9); }
}

.faq-inner span {
  font-family: 'Klee One', serif;
  font-weight: 700;
  font-size: 13px;
  color: #FAF8F4;
  text-align: center;
  width: 100px;
  line-height: 1.45;
  display: inline-block;
  transition: font-size 0.3s cubic-bezier(0.34,1.56,0.64,1), width 0.3s ease;
  -webkit-text-stroke: 0.7px #FAF8F4;
}

#faqBtn:hover .faq-inner span {
  font-size: 15.6px;
  width: 118px;
}

@media (prefers-reduced-motion: reduce) {
  /* The arrow's rAF rotation is disabled in main.js (initFaqArrow). */
  #faqBtn:hover .faq-inner i { animation: none; }
}

#faqSheet {
  background: #FAF8F4;
  border-radius: 8px;
  width: 410px;
  max-width: 507px;
  padding: 30px 10px 50px 50px;
  /* position:relative (not absolute) so the sheet flows naturally in the flex
     row where #proof-echo sat; it also anchors the absolutely-placed .faq-holes. */
  position: relative;
  box-shadow: 10px 10px 20px rgba(74,59,51,0.18);
  animation: faqSheetIn 0.95s cubic-bezier(0.34,1.56,0.64,1) both;
}
@keyframes faqSheetIn {
  0%   { opacity: 0; transform: scale(3.2) rotate(-16deg); }
  55%  { opacity: 1; transform: scale(0.88) rotate(5deg); }
  72%  { transform: scale(1.09) rotate(-3deg); }
  86%  { transform: scale(0.96) rotate(1.5deg); }
  100% { opacity: 1; transform: scale(1) rotate(0deg); }
}

.faq-holes {
  position: absolute;
  left: 15px; top: 0; bottom: 0;
  display: flex; flex-direction: column; justify-content: space-around; align-items: center;
}
.faq-hole {
  width: 16px; height: 16px;
  border-radius: 50%;
  /* Depth: a dark inner shadow at the top-left (the paper's cut edge casting
     into the hole) and a light highlight at the bottom-right, so each hole
     reads as physically punched through the sheet. */
box-shadow: inset 2px 2px 3px rgba(74, 59, 51, 0.45);
  border: none;
}

/* Homepages (bodies without a page-* class) use lighter, translucent holes. */
body:not([class*="page-"]) .faq-hole {
  background: rgba(224, 122, 79, 0.35);
}

.faq-question {
  position: relative;
  padding: 16px 0 12px;
  font-size: 16px; font-weight: 600;
  color: #4a3b33;
  cursor: pointer;
  display: flex; align-items: baseline; gap: 3px;
}

.faq-underline {
  position: absolute;
  bottom: -4px; left: 0;
  width: auto; height: 14px;
  pointer-events: none;
  opacity: 0;
  transition: opacity 0.15s ease;
}
.faq-question:hover .faq-underline { opacity: 1; }
.faq-question.active .faq-underline { opacity: 1; }

.faq-q-mark { display: inline-block; color: #E07A4F; font-size: 15px; }
.faq-question:nth-child(1) .faq-q-mark { animation: faqBounce 1.2s ease-in-out infinite; }
.faq-question:nth-child(2) .faq-q-mark { animation: faqSpin2 2s linear infinite; }
.faq-question:nth-child(3) .faq-q-mark { animation: faqBounce 0.9s ease-in-out infinite alternate; }
.faq-question:nth-child(4) .faq-q-mark { animation: faqWobble 1.5s ease-in-out infinite; }
.faq-question:nth-child(5) .faq-q-mark { animation: faqSpin2 2.4s linear infinite; }
.faq-question:nth-child(6) .faq-q-mark { animation: faqBounce 1.8s ease-in-out infinite; }

/* Opening "¿" of the Spanish questions. It carries .faq-q-mark too, so the
   nth-child animations above drive it with the SAME keyframes/timing as the
   closing "?" — both marks of a question move together. Extra here: a small gap
   on the text-facing side, and a reversed timeline so the spinning questions
   read as a symmetric, counter-rotating pair (¿ ↺ … ↻ ?) instead of two marks
   spinning the same way. Colour/size are inherited from .faq-q-mark (#E07A4F),
   and prefers-reduced-motion still applies via the .faq-q-mark rule below. */
.faq-q-mark-open { margin-right: 2px; animation-direction: reverse !important; }

@keyframes faqBounce  { 0%,100% { transform: translateY(0); } 50% { transform: translateY(-5px); } }
@keyframes faqSpin2   { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }
@keyframes faqWobble  { 0%,100% { transform: rotate(-15deg); } 50% { transform: rotate(15deg); } }

@keyframes faqFadeUp { from { transform: translateY(10px); opacity: 0; } to { transform: translateY(0); opacity: 1; } }

@media (prefers-reduced-motion: reduce) {
  .faq-q-mark { animation: none !important; }
  #faqSheet { animation: none; }
}

.proof-postit.blowing {
  animation: blowUp 0.55s cubic-bezier(0.25, 0.46, 0.45, 0.94) forwards;
}
.proof-postit.blowing:nth-child(1) { animation-delay: 0s;    --rot: -18deg; }
.proof-postit.blowing:nth-child(2) { animation-delay: 0.08s; --rot: 22deg; }
.proof-postit.blowing:nth-child(3) { animation-delay: 0.04s; --rot: -12deg; }
.proof-postit.blowing:nth-child(4) { animation-delay: 0.12s; --rot: 28deg; }

@keyframes blowUp {
  0%   { transform: translateY(0) rotate(0deg) scale(1); opacity: 1; }
  20%  { transform: translateY(-20px) rotate(-4deg) scale(1.05); opacity: 1; }
  100% { transform: translateY(-600px) rotate(var(--rot, 15deg)) scale(0.2); opacity: 0; }
}

/* ── Proof "echo" block (under the first carousel) — smartphone layout ───────
   On phones we keep only the 4 post-its (they still drop in via s4PostitIn and,
   per the JS guard on #faqBtn, never blow away). Mika, her manga speech bubble
   and the "Vous avez des questions ?" FAQ button/circle are hidden, and the
   flex row is recentred so the 2×2 grid sits in the middle like desktop. */

@media (max-width: 600px) {
  #echoMika,
  #echoBubble,
  #faqBtn { display: none !important; }

  div:has(> #echoMika) { display: none !important; }

  div:has(> #proof-echo) {
    gap: 0 !important;
    padding: 20px 0 0 0 !important;
    justify-content: center !important;
  }
}

@media (pointer: coarse) and (min-width: 601px) and (orientation: portrait) {
  #echoMika,
  #echoBubble,
  #faqBtn { display: none !important; }

  div:has(> #echoMika) { display: none !important; }

  /* Mika is gone — scale post-its 20% to fill the space.
     gap: 38px = 32px × 1.2 (desktop base). margin:auto recentres the grid now
     that the row has only one visible flex item. transform is on the two
     animation-free children (not the parent, whose animation-fill owns its
     transform). Specificity 1,0,1 beats the (pointer:coarse) transform:none
     block at line ~4349 which is 0,1,0. */
  #proof-echo .proof-grid {
    gap: 110px!important;
    margin: 0 auto!important;
  }

  #s2-row {
    padding-bottom: 20px !important;
  }

  div:has(> #proof-echo) {
    gap: 0 !important;
    justify-content: center !important;
  }

  #proof-echo .s4-postit__svg,
  #proof-echo .s4-postit__content {
    transform: scale(1.3);
    transform-origin: center center;
  }
}

.proof-grid { max-width: 390px; }

#proof-echo {
  flex: 0 0 auto;
  width: min(390px, 100%);
  max-width: 390px;
  box-sizing: border-box;
}

#proof-echo-gap { flex: 0 0 auto; width: min(390px, 100%); max-width: 390px; box-sizing: border-box; }

@media (pointer: coarse) and (orientation: portrait) and (min-width: 601px) {
  .proof-grid {
    max-width: 498px;
    gap: clamp(15px, 2.5vw, 34px);
  }
  #proof-echo {
    width: min(498px, 100%);
    max-width: 498px;
  }
  #proof-echo-gap {
    width: min(498px, 100%);
    max-width: 498px;
  }
}

/* ── #s2 freeze: lock the proof/echo flex row to its desktop (~1400px) layout ──
   The flex row under the first carousel (the div holding #proof-echo / #faqSheet
   / Mika+bubble+#faqBtn) must NOT shrink, reflow, or move when the viewport is
   resized. Instead of fluid vw sizing it gets a fixed width; if the row ends up
   wider than the viewport it simply overflows and is clipped by #s2 — no
   scrollbar, no rescaling. Scoped to ≥601px so the mobile layout above (which
   hides Mika and re-centres the 2×2 grid) is left completely untouched. Only the
   #s2 echo copy is affected; the original post-its in #s5-proof keep their fluid
   clamps.

   Use `overflow-x: clip`, NOT `overflow: hidden`: the row only overflows
   horizontally, and (per the html/body note up top) `hidden` would turn #s2 into
   a scroll container — which breaks the `position: sticky` pinning of #s3 nested
   inside it, killing the #s4-slides-over-#s3 parallax. `clip` clips the row
   without creating a scroll container, so #s3 keeps sticking. */
#s2 { overflow-x: clip; }

@media (min-width: 601px) {
  #s2-row {
    width: 1400px;
    box-sizing: border-box;
    flex-wrap: nowrap;
    gap: 400px;
    padding: 140px 0 0 50px;
    position: relative;
    left: 50%;
    transform: translateX(-50%);
  }
  #proof-echo .proof-grid { gap: 32px; }
  #proof-echo .proof-content i { font-size: 40px; }
  #proof-echo .proof-label { font-size: 17px; }
  #faqSheet { flex: 0 0 auto; }
  #mika-block { margin-left: 40px; }
  #s2-row { transition: gap 0.5s cubic-bezier(0.22, 1, 0.36, 1); will-change: gap; }
}

/* ── #s2 narrow-desktop reflow (≈85% of 1400px) ──────────────────────────────
   At ≤1190px the centred 1400px row starts clipping. To keep things readable we
   hide ONLY post-it dep1 ("40 partenaires", top-right of the 2×2 grid). dep1 is
   hidden with opacity (NOT display:none) so the grid keeps its shape and
   dep0/dep2/dep3 never move; the !important is required because dep1's s4PostitIn1
   entrance animation (fill-mode both) would otherwise keep opacity:1. Scoped to
   ≥601px so the phone layout (max-width:600px) — which keeps all four post-its —
   is untouched.

   We do NOT translate #mika-block: a transform would drag Mika, her #echoBubble and
   #faqBtn bodily leftward (away from the right edge) by an arbitrary amount. Instead
   we shrink the *flex gap* between the post-it grid and #mika-block by exactly the
   space dep1 vacated, so the row narrows from the inside. Mika therefore eases left
   only as much as is needed to close the void dep1 left behind — staying as far right
   as the layout allows — and her children ride along automatically as one flex item,
   with no transform of their own.

   Freed space = one post-it column + the grid column-gap it sat behind. The echo grid
   is max-width:390px with a frozen 32px gap (see the ≥601px block), 2 equal columns →
   column = (390 − 32) / 2 = 179px, so the slot freed by dep1 is 179 + 32 = 211px.
   New gap = 400px − 211px. */
@media (min-width: 601px) and (max-width: 1250px) {
  #proof-echo .s4-postit.dep1 {
    opacity: 0 !important;
    pointer-events: none;
  }
  #s2-row { gap: 180px; }
}

/* ── Tablet landscape: extend the narrow-desktop reflow to ALL tablet widths ──
   The (min-width:601px and max-width:1250px) block above already hides dep1 and
   sets gap:180px for landscape tablets ≤1250px. Tablets wider than that (e.g.
   iPad Pro 13" at 1366px) fell through, leaving dep1 visible and gap at 400px.
   This block extends the same two rules to all coarse-pointer landscape viewports.
   For ≤1250px both blocks match simultaneously — values are identical, no conflict.
   min-height:450px excludes phones in landscape (height ≈375–430px on phones vs
   ≥450px on tablets), consistent with the other landscape blocks in this file.
   Portrait is unaffected: orientation:landscape is mutually exclusive with portrait. */
@media (pointer: coarse) and (min-width: 601px) and (orientation: landscape) and (min-height: 450px) {
  #proof-echo .s4-postit.dep1 {
    opacity: 0 !important;
    pointer-events: none;
  }
  #s2-row { gap: 180px; }
}

@media (pointer: coarse) and (min-width: 601px) and (orientation: portrait) {
  #proof-echo .s4-postit.dep1 {
    opacity: 1 !important;
    pointer-events: auto;
  }
  #amazon-title {
    margin-top: 25px !important;
    padding-top: 100px !important;
  }
  /* Push #s3 below #amazon-title (now a preceding sibling, not a child).
     Also cancels the @media(min-width:601px,max-width:1024px) margin-top:-20vh
     which has no pointer condition and otherwise pulls #s3 over the title. */
  #s3 {
    margin-top: 25px !important;
  }
  .s4-postits-grid {
    grid-template-columns: repeat(2, clamp(222px, 53vw, 444px)) !important;
    gap: clamp(1.44rem, 7.5vw, 3.5rem) !important;
    justify-content: center !important;
    margin: 0 auto !important;
  }
}

@media (min-width: 601px) and (max-width: 860px) and (pointer: fine) {
  #proof-echo,
  #faqBtn { display: none !important; }

  #s2-row {
    width: 100%;
    left: auto;
    transform: none;
    justify-content: flex-end;
    gap: 0;
    padding: 140px 0 0 0;
  }

  #mika-block {
    margin-left: auto;
    margin-right: 0;
    flex-shrink: 0;
    display: flex;
    flex-direction: row;
    align-items: center;
  }

  #echoMika {
    margin-right: 0;
  }

  #echoBubble {
    order: -1;
    flex-shrink: 1;
    max-width: 320px;
  }
}


/* Floating ZZZ over Yuuki the cat in the hero image. */
.zzz-span {
  display: inline-block;
  font-family: Georgia, serif;
  font-style: italic;
  font-weight: bold;
  color: rgba(255, 160, 122, 0.75);
  animation: zFloat 3s ease-in-out infinite;
}
.zzz-span:nth-child(1) { font-size: 1.1vw; }
.zzz-span:nth-child(2) { font-size: 1.4vw; }
.zzz-span:nth-child(3) { font-size: 1.9vw; }

@media (max-width: 600px) {
  .zzz-container {
    left: 38% !important;
    top: 47% !important;
  }
  .zzz-span {
    font-size: 2.5vw !important;
  }
}

@keyframes zFloat {
  0%   { opacity: 0; transform: translateY(10px) rotate(-10deg); }
  20%  { opacity: 0.9; }
  80%  { opacity: 0.9; }
  100% { opacity: 0; transform: translateY(-20px) rotate(5deg); }
}

@media (prefers-reduced-motion: reduce) {
  .zzz-span { animation: none; opacity: 0.7; }
}

.modal-btn-back { display: none !important; }
.modal-btn-return { display: none !important; }
#mobile-card-modal.is-open .modal-btn-return { display: inline-block !important; }

@media (max-width: 600px) {
  .modal-btn-back { display: inline-block !important; }
}

@media (max-width: 1250px) {
  .proof-label {
    white-space: normal;
    overflow: hidden;
    max-width: 100%;
  }
}

/* ── Languages button flag animation (#btn-lang) ─────────────────────────────
   On load the button's label is hidden and emoji flags spawn at random x inside
   the pill, float upward and fade (langFlagFloat). After 5s spawning stops, any
   remaining flags fade out (.is-fading-out) and the label fades back in
   (langLabelFadeIn). All driven by JS adding/removing classes; the only inline
   style is each flag's random `left`. prefers-reduced-motion is handled in JS
   (no animation classes are added) and neutralised here as a belt-and-braces. */
#btn-lang.is-flag-animating {
  /* .nav-item sets overflow:visible !important — beat it so flags clip to the pill */
  overflow: hidden !important;
  /* Hide the label text node (whatever updateBtnLang() writes into it) for the
     duration of the animation; the flags and the fade-in span below carry their
     own explicit colour so they stay visible. */
  color: transparent !important;
}

#btn-lang .lang-flags {
  position: absolute;
  inset: 0;
  overflow: hidden;
  border-radius: inherit;
  pointer-events: none;
  /* Explicit colour so flags don't inherit the transparent label colour above
     (on platforms with no flag glyphs, regional-indicator pairs render as text). */
  color: var(--text-light);
  transition: opacity 400ms ease;
}
#btn-lang .lang-flags.is-fading-out {
  opacity: 0;
}

#btn-lang .lang-flag {
  position: absolute;
  bottom: 0;
  font-size: 1em;
  line-height: 1;
  pointer-events: none;
  will-change: transform, opacity;
  animation: langFlagFloat 1.6s ease-out forwards;
}

@keyframes langFlagFloat {
  0%   { transform: translateY(60%);   opacity: 0; }
  20%  {                                opacity: 1; }
  100% { transform: translateY(-180%); opacity: 0; }
}

#btn-lang .lang-label-fade {
  display: inline-block;
  /* is-flag-animating is still on the button while this span fades in, so give
     it an explicit colour instead of inheriting the transparent label colour. */
  color: var(--text-light);
  animation: langLabelFadeIn 400ms ease forwards;
}
@keyframes langLabelFadeIn {
  from { opacity: 0; }
  to   { opacity: 1; }
}

@media (prefers-reduced-motion: reduce) {
  #btn-lang .lang-flag { animation: none; }
  #btn-lang .lang-label-fade { animation: none; opacity: 1; }
}

/* ── Split-flap Flights ── */

/* Flights hero height is driven by the background image's aspect ratio
   (2000×1116 → padding-bottom: 55.8%) instead of the viewport, so the whole
   image shows uncropped and both images overlap perfectly. Scoped to
   body.page-flights only — the global .hero-section/.hero-stage/.hero-layer
   rules (used by other pages) are left untouched. .hero-layer must become
   height:auto (overriding the global height:100%) so its inset:0 fills the
   padded aspect box rather than collapsing against a 0-height content box. */
body.page-flights .hero-section { height: auto; }
body.page-flights .hero-stage  { height: auto; padding-bottom: 55.8%; }
body.page-flights .hero-layer  { height: auto; }

/* Tablet LANDSCAPE only (touch + no hover + landscape, ≥600px tall) — same as the
   desktop behaviour: the hero fills the FULL viewport (100dvh, 100vh fallback) and
   the fixed nav floats on top, no offset. The aspect-ratio box above (padding-bottom:
   55.8%) is correct on desktop but leaves dead space below the image on tablet
   landscape, where the viewport ratio doesn't match the image. We cancel that spacer
   and pin every hero ancestor to 100dvh so the image bottom touches the viewport
   bottom. The <picture> in fr/flights/index.html swaps the bg source to S1_tablette
   on this SAME media query, so source + layout flip together.

   Scope: matches the file's existing tablet-landscape selector (line ~4574). The
   min-height:450px floor EXCLUDES phones in landscape (height ≈ 390–430px) — min-WIDTH
   could not, since a landscape phone is ~844px wide. Desktop (hover:hover) and phone
   portrait (max-width:600px) never match this query, so both are untouched. Same
   selectors/specificity as the three rules above, and this block comes AFTER them in
   source order, so it wins the cascade. */
@media (pointer: coarse) and (hover: none) and (orientation: landscape) and (min-height: 450px) {
  /* !important required: the base body.page-flights .hero-* rules (specificity 0,2,1,
     lines above) are higher than .hero-* (0,1,0), so source-order alone cannot win.
     !important author always beats normal author regardless of specificity. */
  .hero-section { height: 120vh !important; }
  .hero-stage   { height: calc(120vh - var(--nav-h, 66px)) !important; padding-bottom: 0 !important; }
  .hero-layer   { height: 100% !important; }
  /* Mika+Yuuki layer covers the full hero. It already carries inline
     height:100% + object-fit:cover; we only neutralise its desktop left:4% nudge so
     it sits flush (inset:0). !important is required to beat the inline style. */
  body.page-flights #mika-yuuki-layer { left: 0 !important; }
}

/* Tablet PORTRAIT only (touch, ≥601px wide) — same reasoning as the tablet-landscape
   block above, for the other orientation. The aspect-ratio box (padding-bottom: 55.8%,
   from the three base rules above) is a wide/short 16:9 frame; in a PORTRAIT viewport
   it would crop the 9:16 S1_smartphone.webp the <picture> serves at this breakpoint down
   to a thin horizontal sliver. So we cancel that spacer and pin every hero ancestor to
   100dvh (100vh fallback) — the image fills the screen via the <img>'s inline
   object-fit:cover, and the fixed nav floats on top. The hero is already un-pinned to
   position:static on tablets (≥601px coarse, line ~3250), so #s2 simply flows after this
   full-height block — no sticky overlap.

   Scope mirrors the file's standard tablet-portrait selector (min-width:601px +
   orientation:portrait, e.g. lines ~2450/1709) and the matching <source> media query in
   fr/flights/index.html, so image source and layout flip together. min-width:601px
   excludes phones (≤600px keep their own ≤599 page <style> 100dvh rule) and small tablets
   whose portrait width ≤600px (governed by the phone rules); orientation:portrait keeps
   this clear of the landscape block above. Same (0,1,1) selectors as the three base rules
   and AFTER them in source order, so it wins the cascade. */
@media (pointer: coarse) and (min-width: 601px) and (orientation: portrait) {
  body.page-flights .hero-section { height: 100vh; height: 100svh; }
  body.page-flights .hero-stage   { height: 100vh; height: 100svh; padding-bottom: 0; }
  body.page-flights .hero-layer   { height: 100%; }
  /* Show the smartphone-only manga bubble on TABLET PORTRAIT too, mirroring the phone
     rule (display:block, position:absolute, top-right of .hero-layer, clearing the nav)
     but sized for the larger viewport. Specificity audit vs every #mangaBubbleHero rule
     that ALSO matches (pointer:coarse) + (min-width:601px) + (orientation:portrait):
       • display — the page <style> default `body.page-flights #mangaBubbleHero{display:none}`
         (1,1,1, NO !important) loads AFTER main.css, so only `!important` (important author
         beats normal author) can override it, regardless of source order.
       • position/top/left/right/bottom — strongest competitors are (1,0,0)!important:
         l.1709 position:fixed/top:12%/left:55% (SAME media query), l.1646 top:140px
         (768–1280), l.4777 position:fixed/right:auto/left:10% (max-width:768). The selector
         `body.page-flights #mangaBubbleHero` (1,1,1)!important outranks them all and is the
         latest in source. position:absolute (not fixed) mirrors the phone rule and anchors
         to .hero-layer (the bubble's positioned ancestor — it is a direct child of
         .hero-layer on flights), so it is covered by the opaque #s2 on scroll and cannot
         float past the footer (the fixed-escapes-clip trap documented at l.1898). top uses
         max(7rem,11%) so it always clears the ~100px nav on every portrait-tablet height.
       • font-size — highest competitor is l.1734
         `#mangaBubbleHero #mangaBubbleHeroText.manga-bubble-text` (2,1,0)!important (≥768
         portrait); also l.3986 (2,0,0)! and l.1709 (1,1,0)!. Selector
         `body.page-flights #mangaBubbleHero #mangaBubbleHeroText` (2,1,1) > (2,1,0), so it
         wins WITH !important. Scales with vw, capped at 18px (≤ the ~20px tested German
         no-overflow ceiling noted at l.1735).
     main.js sets an INLINE `top` on this element on load/resize; important-author beats
     normal-author inline, so the !important offsets hold. SVG width is left to l.1709/1723
     (already tablet-sized). z-index:6 needs no !important — the only competitors are
     (1,0,0) z-index:2, beaten by (1,1,1); it lifts the bubble above the hero image (the
     z-index:5 Mika layer is display:none here). */
  body.page-flights #mangaBubbleHero {
    display: block !important;
    position: absolute !important;
    top: max(7rem, 11%) !important;
    right: 3% !important;
    left: auto !important;
    bottom: auto !important;
    z-index: 6;
  }
  body.page-flights #mangaBubbleHero #mangaBubbleHeroText {
    font-size: clamp(13px, 2vw, 18px) !important;
  }
}

/* Hero split layout — scoped to body.page-flights so the globally-shared
   .hero-intro (used on other pages) is untouched. The hero copy box is
   absolutely positioned and normally capped at ~520px; we widen it here so the
   board has room to sit beside the text. */
body.page-flights .hero-intro {
  display: flex;
  flex-direction: row;
  align-items: center;
  gap: 2rem;
  width: min(1100px, 92vw);
  max-width: none;
  z-index: 3;
}
body.page-flights #hero-left  { flex: 0 0 65%; }
body.page-flights #hero-right { flex: 0 0 40%; margin-left: 100px; z-index: 4; position: relative; margin-top: -100px; filter: drop-shadow(-8px 12px 18px rgba(0,0,0,0.85)); }

@media (max-width: 600px) {
  body.page-flights .hero-intro {
    flex-direction: column;
    width: auto;
    max-width: none;
  }
  body.page-flights #hero-left,
  body.page-flights #hero-right {
    width: 100%;
    flex: 0 0 auto;
  }
}

.sfp-board {
  background: #111;
  border: 2px solid #444;
  border-radius: 8px;
  overflow: hidden;
}
.sfp-header {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 7px 12px;
  background: #222;
  border-bottom: 2px solid #444;
}
.sfp-title {
  color: #FFD700;
  font-size: 13px;
  font-weight: 700;
  letter-spacing: 2px;
}
.sfp-period {
  margin-left: auto;
  color: #888;
  font-size: 9px;
  letter-spacing: 1px;
}
.sfp-blink {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: #FFD700;
  animation: blink 1.8s infinite;
}
@keyframes blink {
  0%, 100% { opacity: 1; }
  50%      { opacity: 0.2; }
}

.sfp-cols,
.sfp-row {
  display: grid;
  grid-template-columns: 58px 1fr 68px 40px 84px;
  padding: 2px 8px;
}
.sfp-col-label {
  color: #555;
  font-size: 8px;
  text-transform: uppercase;
  letter-spacing: 1.5px;
}
.sfp-rows {
  padding: 2px 8px 6px;
}
.sfp-row {
  border-bottom: 1px solid #1e1e1e;
  padding: 2px 0;
}
.sfp-cell {
  display: flex;
  align-items: center;
}
.sfp-flap {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 10px;
  height: 16px;
  margin: 0 0.3px;
  background: #1a1a1a;
  border: 1px solid #2a2a2a;
  border-radius: 2px;
  color: #FFD700;
  font-family: "Courier New", monospace;
  font-size: 10px;
  font-weight: 700;
}
.sfp-flap.sfp-space {
  background: transparent;
  border-color: transparent;
}
.sfp-flap.sfp-remark {
  width: 8px;
  font-size: 8px;
}
.sfp-flap.sfp-spinning {
  color: #555;
}

.sfp-status-on   { color: #4fc; }
.sfp-status-board { color: #fa0; }
.sfp-status-del  { color: #f44; }
.sfp-status-cancel { color: #f44; }

@media (prefers-reduced-motion: reduce) {
  .sfp-flap { transition: none; }
  .sfp-blink { animation: none; }
}

/* Echo-bubble text on tablet landscape with viewport height < 450px (e.g. landscape phones).
   Without this guard, only the base .manga-bubble-text clamp(9px,1.4vw,16px)
   applies — this explicit ID rule (1,0,0) ensures the inline font-size on #echoBubbleText
   cannot override it. For height >= 450px the min-height:450px block below takes over
   (source-order win at equal !important specificity). */
@media (pointer: coarse) and (min-width: 601px) and (orientation: landscape) {
  #echoBubbleText { font-size: clamp(9px, 1.4vw, 16px) !important; }
}

/* Tablet-landscape overrides, applied to ALL pages (deliberately un-scoped — no
   body.page-flights guard). #faqSheet also exists on all 14 locale HOME pages, so this
   intentionally nudges their FAQ sheet down 2rem on tablet landscape as well. #faqSheet
   is position:relative everywhere (base rule), so `top` is a pure visual offset.
   #faq-btn-wrap only exists on the flights page, so its rule is effectively flights-only
   regardless. !important on #faq-btn-wrap beats the element's inline right:82%. */
@media (pointer: coarse) and (hover: none) and (orientation: landscape) and (min-height: 450px) {
  :root { --nav-h: 66px; }
  #faq-btn-wrap { right: 60% !important; }
  #faqSheet { top: 2rem; }
  /* Echo-bubble text → 16px on tablet landscape (all pages). (1,0,0)!important beats
     the element's inline font-size. NOTE: the flights page keeps its own
     body.page-flights #echoBubbleText 15px !important (1,1,1), which outranks
     this — so flights stays 15px, unaffected. */
  #echoBubbleText { font-size: 16px !important; }
  /* Hide the scroll chevron once the user scrolls past #s1 — same fix as mobile
     (main.css:1256). The page's reveal script stamps an inline opacity:1 on
     #scroll-chevron; opacity:0 !important defeats it (important-author > normal-inline),
     so it fades out when .is-scrolled is added. pointer-events:none stops the hidden
     chevron from being tappable. */
  .site-header.is-scrolled ~ main #scroll-chevron {
    opacity: 0 !important;
    pointer-events: none;
  }
  /* Re-anchor the chevron so it scrolls AWAY with the hero instead of riding the
     viewport (base rule is position:fixed). On tablet landscape #s1 is position:static
     (main.css:2848) and <main> is static, so there's no positioned ancestor — this
     anchors to the initial containing block (≈ the viewport at the document origin),
     so bottom:2.5rem ≈ the bottom of the ~100dvh hero. Being absolute (document-anchored,
     not viewport-anchored) it scrolls off-screen once you leave #s1. */
  /* z-index:2 lowers the chevron below #s2/#s3/#s4 (z-index 2/3) so they cover it
     as they scroll over it (base is z-index:10). Stays above the fixed hero layer
     (also z-index:2) via DOM order, so it's still visible in #s1. */
  #scroll-chevron { position: fixed; z-index: 0.5; }
  /* Drop the upward "leaf overlap" shadow on .cover-section-4 in tablet landscape
     only. Same specificity as the base rule (main.css:1284) but later in source →
     wins without !important. */
  .cover-section-4 { box-shadow: none; }
}

/* Coarse devices SHORTER than 450px tall in landscape (landscape phones) — not reached
   by the min-height:450 tablet-landscape block above — so #scroll-chevron there falls
   back to the base position:fixed + z-index:10
   and paints OVER #s2/#s3/#s4. Lower ONLY its z-index to 2: below those sections
   (z-index 2/3) so they cover it on the way up, yet above the fixed hero layer (also
   z-index:2, but earlier in DOM) so it stays visible in section 1. Coarse-only →
   desktop untouched; base rule + the max-width:600 mobile override untouched. (This
   query unavoidably also matches landscape phones — they can't be distinguished from
   the short tablet by media query — but it only changes stacking, which is benign
   and fixes the same latent over-paint there too.) */
@media (pointer: coarse) and (orientation: landscape) and (max-height: 599px) {
  #scroll-chevron { z-index: 2; }
}

/* ── Phone-only dashed notice (replaces #dashedRectCanvas) ────────────────────
   The 900px <canvas id="dashedRectCanvas"> draws its text on a single line, so
   on narrow phones it overflows and clips. On coarse-pointer phones we hide the
   canvas and show this responsive HTML box instead: text wraps, width tracks the
   widget container, and the marching-ants border is an SVG <rect> whose
   stroke-dashoffset is animated in pure CSS (a real `border:dashed` cannot be
   marched — there is no border-dash-offset property). Dash 10/7, round caps,
   rx 14 and colour #ffa07a all mirror the canvas. The hide is scoped to the
   .dashed-rect-canvas class (added only on the page that ships this fallback),
   so other locale pages keep their canvas. Text is injected from
   data-notice-text by main.js, so no visible copy lives in JS. */
.dashed-notice-phone {
  display: none;
  position: relative;
  flex: 1 1 auto;
  max-width: 900px;
  margin: 0 16px;
  box-sizing: border-box;
  padding: 16px 22px;
  text-align: center;
  color: #ffa07a;
  font: 500 16px/1.4 sans-serif;
}
.dashed-notice-phone .dashed-notice-border {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  overflow: visible;
  pointer-events: none;
}
.dashed-notice-phone .dashed-notice-border rect {
  x: 1.25px;
  y: 1.25px;
  width: calc(100% - 2.5px);
  height: calc(100% - 2.5px);
  rx: 14px;
  ry: 14px;
  fill: none;
  stroke: #ffa07a;
  stroke-width: 2.5px;
  stroke-linecap: round;
  stroke-linejoin: round;
  stroke-dasharray: 10 7;
  animation: dashedNoticeMarch 1.6s linear infinite;
}
@keyframes dashedNoticeMarch {
  to { stroke-dashoffset: -34; }
}
@media (prefers-reduced-motion: reduce) {
  .dashed-notice-phone .dashed-notice-border rect { animation: none; }
}
@media (pointer: coarse) and (max-width: 600px) {
  .dashed-rect-canvas { display: none; }
  .dashed-notice-phone { display: flex; align-items: center; justify-content: center; }
}
/* Tablet 501–599 fallback merged into the ≤600px phone block above. */

@media (pointer: coarse) and (min-width: 601px) and (orientation: portrait) {
  /* Gap between the post-its and the title on tablet portrait. #amazon-title (1,0,0)
     + !important; placed last in the file so it wins by source order over the earlier
     equal-specificity `#amazon-title { margin-top:170px/200px !important }` rules. */
  #amazon-title {
    margin-top: 220px !important;
    margin-bottom: 50px !important;
  }
  /* Post-its 15% larger at rest on tablet portrait.
     Do NOT put transform on .s4-postit itself: each post-it permanently carries
     `is-in depN`, whose `animation: s4PostitInN … both` fills its final keyframe
     (transform: scale(1)). A filling animation outranks a NORMAL transform (so
     scale(1.15) would be ignored) yet is outranked by an !important one (so
     scale(1.15) !important would freeze the entrance fly-in) — either way breaks a
     constraint. Instead scale the two animation-free children, the same pattern this
     file uses for the desktop hover-grow (~l.4222): both are transform/animation-free
     and share the card's centre, so scaling them about center grows the card without
     disturbing the parent's entrance animation. Specificity (0,2,0) beats the coarse
     `transform:none` (0,1,0, ~l.4271); no !important so nothing is frozen. Tablet is
     pointer:coarse, so the (hover:hover)+(pointer:fine) hover scale never applies here. */
  .s4-postit .s4-postit__svg,
  .s4-postit .s4-postit__content {
    transform: scale(1.54) !important;
    transform-origin: center center;
  }
}

@media (pointer: coarse) and (min-width: 601px) and (orientation: portrait) {
  .zzz-container {
    top: 46% !important;
    left: 38% !important;
  }
  .zzz-span:nth-child(1) { font-size: 2vw !important; }
  .zzz-span:nth-child(2) { font-size: 2.5vw !important; }
  .zzz-span:nth-child(3) { font-size: 3vw !important; }
}

@media (pointer: coarse) and (min-width: 601px) and (orientation: landscape) {
  .zzz-container {
    top: calc(var(--nav-h, 66px) * 0.84 + 42lvh) !important;
    left: 54% !important;
  }
  .zzz-span:nth-child(1) { font-size: 1.3vw !important; }
  .zzz-span:nth-child(2) { font-size: 1.5vw !important; }
  .zzz-span:nth-child(3) { font-size: 1.8vw !important; }
}

@media (max-width: 600px) {
  #mangaBubbleHeroTransfers {
    z-index: 2 !important;
  }
  .hero-layer:has(#mika-info-panel.is-open) { z-index: 61; }
}

@media (pointer: coarse) and (min-width: 601px) and (orientation: portrait) {
  body.page-flights #dashed-arrow-wrap {
    top: -1.1rem !important;
    left: 6% !important;
    transform: translateX(-50%) rotate(90deg) scale(0.7);
  }
}

/* ── Blog dropdown: short list (desktop) vs full list (tablet) ────────────
   Desktop (default): show the short list (Carte du monde + 3 favorites),
   hide the 27-country full list.
   Tablet (pointer: coarse): hide the short list, show the full list.
   Smartphone: Blog is not in the drawer, so neither list appears. */
.blog-full-item {
  display: none;
}

.blog-heart-fill {
  fill: #e00000;
  opacity: 0;
  animation: blog-heart-draw-fill 0.6s ease-in 4.4s forwards;
}
.blog-heart-stroke {
  fill: none;
  stroke: #e00000;
  stroke-width: 3.5;
  stroke-linecap: round;
  stroke-linejoin: round;
  stroke-dasharray: 200;
  stroke-dashoffset: 200;
  animation: blog-heart-draw-stroke 2.8s ease-in-out 1.6s forwards;
}
@keyframes blog-heart-draw-stroke {
  to { stroke-dashoffset: 0; }
}
@keyframes blog-heart-draw-fill {
  to { opacity: 1; }
}
@media (prefers-reduced-motion: reduce) {
  .blog-heart-fill { animation: none; opacity: 1; }
  .blog-heart-stroke { animation: none; stroke-dashoffset: 0; }
}

/* ── Russian locale — Cyrillic font baseline ──────────────────────────────────
   Quicksand and Klee One have no Cyrillic glyphs; without this rule all Cyrillic
   text falls back to the browser's default serif/sans at whatever the OS picks
   (Segoe UI, SF Pro, Roboto …), which varies per device.
   Specificity (0,1,1) beats every standalone class rule (0,1,0) in this file,
   so it catches nav items, drawer buttons, hero subtitle, proof labels, FAQ,
   section headings and anything else that currently inherits or explicitly
   declares Quicksand / Klee One.
   Nunito is already loaded for every ru/ page via its own <link> tag and now
   also via the shared @import above, so no extra network request is added.

   The logo (#FollowMika) is Latin text and renders correctly in Klee One; the
   rule below restores it. Its specificity (0,2,1) beats the blanket (0,1,1)
   regardless of source order.

   The page-level inline <style> in each ru/ HTML file (e.g. Russo One for the
   hero title) uses selectors of specificity ≥ (0,2,1) and therefore also
   survives untouched. */
html[lang="ru"] * {
  font-family: "Nunito", sans-serif;
}
html[lang="ru"] .logo {
  font-family: "Klee One", Georgia, serif;
}
html[lang="ru"] .mob-drawer-cat,
html[lang="ru"] .mob-drawer-sub,
html[lang="ru"] .mob-drawer-back {
  font-family: sans-serif;
}

@media (pointer: coarse) and (max-width: 600px) {
  html[lang="ru"] .mob-drawer-cat,
  html[lang="ru"] .mob-drawer-sub,
  html[lang="ru"] .mob-drawer-back {
    font-family: sans-serif;
  }
}

@media (pointer: coarse) and (min-width: 601px) and (orientation: portrait) {
  html[lang="ru"] .mob-drawer-cat,
  html[lang="ru"] .mob-drawer-sub,
  html[lang="ru"] .mob-drawer-back {
    font-family: sans-serif;
  }
}

@media (pointer: coarse) and (min-width: 601px) and (orientation: landscape) {
  html[lang="ru"] .mob-drawer-cat,
  html[lang="ru"] .mob-drawer-sub,
  html[lang="ru"] .mob-drawer-back {
    font-family: sans-serif;
  }
}

@media (pointer: coarse) and (max-width: 600px) {
  #mob-drawer.is-lang-view {
    overflow: hidden;
  }
  #mob-drawer.is-lang-view .mob-drawer-list {
    flex: 1 1 auto;
    min-height: 0;
    display: grid;
    grid-template-columns: 1fr;
    align-content: space-evenly;
    padding-top: 0;
    padding-bottom: 0;
  }
  #mob-drawer.is-lang-view .mob-drawer-sub {
    padding-top: 0.5em;
    padding-bottom: 0.5em;
    font-weight: 800;
    font-size: 1.5rem;
    font-family: "Quicksand", sans-serif;
  }
  #mob-drawer.is-lang-view .mob-drawer-sub[data-lang-group="ru"],
  #mob-drawer.is-lang-view .mob-drawer-sub[data-lang-group="zh"],
  #mob-drawer.is-lang-view .mob-drawer-sub[data-lang-group="ja"],
  #mob-drawer.is-lang-view .mob-drawer-sub[data-lang-group="ko"] {
    font-weight: 400;
  }
}

@media (pointer: coarse) and (max-width: 600px) {
  html[lang="ru"] #mob-drawer.is-lang-view .mob-drawer-sub {
    font-family: "Quicksand", sans-serif;
    font-weight: 400;
  }
}

@media (pointer: coarse) and (min-width: 601px) and (orientation: portrait) {
  html[lang="ru"] #mob-drawer.is-lang-view .mob-drawer-sub {
    font-family: "Quicksand", sans-serif;
    font-weight: 400;
  }
}

/* ── Tablet portrait: hide all #s2 secondary elements, keep only the 4 post-its ──
   Applies to ALL pages. Hides Mika, manga bubbles, FAQ button and echo bubble. */
@media (pointer: coarse) and (min-width: 601px) and (orientation: portrait) {
  #mika-block,
  #mika-block-gap,
  #mangaBubbleWidget,
  #faqBtn,
  #faq-btn-wrap,
  #faq-btn-wrap-gap,
  #echoBubble,
  #echoBubble-gap,
  #echoBubbleText,
  #echoBubbleText-gap { display: none !important; }
}

/* ── Drawer width: always wide enough for single-line items ── */
@media (pointer: coarse) and (min-width: 601px) and (orientation: portrait) {
  #mob-drawer { width: max-content !important; min-width: min(80vw, 360px); max-width: 70vw !important; }
}

@media (pointer: coarse) and (orientation: landscape) and (min-height: 450px) {
  #mob-drawer { width: max-content !important; min-width: min(80vw, 360px); max-width: 55vw !important; }
}

@media (pointer: coarse) and (max-width: 600px) {
  #mob-drawer { width: max-content; min-width: 70vw; max-width: 80vw; }
}