/* =====================================================
   ANDEAN ADVENTURES PERU — Design system
   Wireframe v1 · OKLCH · esquinas redondeadas · ease-out expo
   ===================================================== */

:root {
  /* ============================================================
     COLOR — sampled directly from the Andean Adventures logotype.
     The mark is four blues; there is no warm colour in it, so blue
     is the primary and every neutral leans blue rather than warm.

       #0A326E  deep navy   wordmark + peak   (dominant)
       #00468C  mid-deep
       #145AA0  mid
       #4678BE  sky
     ============================================================ */

  /* Brand ramp — the four logo blues, plus one darker step for bands */
  --brand-950: oklch(0.240 0.080 259);          /* deepest — dark sections   */
  --brand-900: oklch(0.330 0.113 259);          /* #0A326E  PRIMARY          */
  --brand-700: oklch(0.400 0.132 255);          /* #00468C                   */
  --brand-600: oklch(0.465 0.131 253);          /* #145AA0  links / CTA      */
  --brand-400: oklch(0.571 0.122 257);          /* #4678BE  sky              */
  --brand-200: oklch(0.808 0.098 217);          /* #6fd0e9 celeste — on dark */
  --brand-150: oklch(0.860 0.095 217);          /* #80e1fb celeste ground    */
  --brand-050: oklch(0.960 0.016 255);          /* wash — subtle surfaces    */

  --brand: var(--brand-900);
  --brand-hover: var(--brand-700);

  /* Warm accent — kept from the original palette, used sparingly:
     eyebrows, link arrows, small marks. Never a section ground. */
  --accent: oklch(0.55 0.16 38);                /* terracotta                */
  /* From the client's live site. Amber is a background only — navy on it is
     8.36:1; on white it is 1.53:1. Coral is display-size text and marks. */
  --accent-amber: #ffc943;
  --accent-orange: #fc724c;
  --accent-coral: #e86b4d;
  --accent-deep: oklch(0.47 0.15 36);
  --accent-soft: oklch(0.74 0.12 62);           /* muted gold, on dark only  */

  /* Neutrals — biased toward the brand hue so they read as chosen */
  --ink: oklch(0.215 0.020 259);
  --ink-body: oklch(0.400 0.016 259);
  --ink-secondary: oklch(0.500 0.013 259);
  --ink-muted: oklch(0.545 0.011 259);         /* 4.54:1 on sand; was 0.580 = 3.93 */

  --line: oklch(0.895 0.007 259);
  /* Las marcas de lista, dibujadas con el mismo trazo que los iconos. */
  --mark-check: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6.5 9.5 17 4 11.5'/%3E%3C/svg%3E");
  --mark-cross: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 6l12 12M18 6L6 18'/%3E%3C/svg%3E");
  --line-soft: oklch(0.945 0.005 259);
  --bg-page: oklch(0.995 0.002 259);
  --surface: oklch(0.970 0.006 255);            /* cool alternating ground   */
  --bg-dark: var(--ground-dark);

  --on-dark: oklch(0.975 0.004 255);
  --on-dark-body: oklch(0.855 0.012 255);
  --on-dark-muted: oklch(0.700 0.018 255);

  /* Section grounds — deliberately close to neutral so photography leads.
     Keep these separate from the brand ramp: --brand-* stays saturated
     for buttons, links and accents. */
  --ground-dark: oklch(0.318 0.073 259);          /* #1a3257 — the client's own deep blue */
  --ground-deep: oklch(0.255 0.060 259);    /* #10223f — was 0.185/0.016, near-black */

  --wa-green: oklch(0.52 0.13 152);            /* 5.18:1 for white; was 0.62 = 3.44 */
  --form-error: oklch(0.52 0.19 27);   /* semantic, not the brand accent */

  /* ---- Aliases ----
     `--sand`/`--stone*` are from the previous warm pass; they now resolve to
     the cool system so any rule still referencing them stays on-brand.
     It was briefly repointed at a warm paper to answer "está muy fría la
     web" — but --sand grounds half the sections on all fourteen pages, so
     that repainted the home too. The warmth belongs in the new blocks and
     their hovers, not in a token this wide. */
  --sand: var(--surface);
  --stone-deep: var(--brand-950);
  --stone: var(--brand-900);
  --stone-soft: var(--brand-700);
  --clay: var(--accent);
  --clay-deep: var(--accent-deep);
  --ochre: var(--accent-soft);
  --navy: var(--brand-900);
  --navy-deep: var(--brand-950);
  --navy-soft: var(--brand-700);
  --terracotta: var(--accent);
  --coral: var(--accent);
  --gold: var(--accent-soft);
  --blue-brand: var(--brand-600);
  --teal: var(--brand-400);

  /* Shape */
  --radius-card: 4px;
  --icon-arrow-right: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12h14M13 6l6 6-6 6'/%3E%3C/svg%3E");
  --btn-light-hover: oklch(0.905 0.008 255);    /* one step under --on-dark */
  --radius-btn: 2px;
  --radius-lg: 6px;

  /* Motion */
  --ease-out-expo: cubic-bezier(0.16, 1, 0.3, 1);
  --ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
  --t-fast: 150ms;
  --t-med: 220ms;
  --t-slow: 400ms;

  /* Type */
  /* Was Fraunces, a serif. Kept as a token so every rule that asks for
     the display face still resolves — it now resolves to the same
     grotesque as the body, which is what makes the page read modern. */
  --font-display: "Instrument Sans", system-ui, sans-serif;
  --font-body: "Instrument Sans", system-ui, sans-serif;

  /* Layout */
  /* The content used to stop dead at 1200px, and every pixel of screen past
     that became margin. So the same page filled 86% of a 1280 laptop and 57%
     of a 1920 monitor — the reason it reads as cramped on one and as a narrow
     column on the other. Above 1280 the content now takes 40% of whatever is
     added, which keeps the margins growing while the page keeps up. Text is
     unaffected: p is capped at 62ch and 44 other blocks carry their own ch
     limit, so widening the container widens layout, not lines. */
  --wrap-max: clamp(1200px, 1200px + (100vw - 1280px) * 0.4, 1440px);
  --wrap-wide: 1440px;
  --wrap-text: 640px;
  /* Was capped at 3rem, which it reached at 960px and never exceeded, so from
     there up the gutter was a constant 48px against a viewport twice as wide. */
  --pad-x: clamp(1.25rem, 5vw, 4.5rem);
  --header-h: 76px;
  /* The fixed bar at the foot of a phone. Named because three things have to
     agree with it: the bar's own cells, the body's bottom padding, and the
     hero controls that would otherwise sit behind it. */
  --mobile-bar-h: 60px;

  /* Vertical rhythm — sections vary deliberately instead of all sharing one value */
  /* 8rem top and bottom put 256px of nothing between two blocks of text.
     6rem leaves 192, which still separates them without a hole. */
  --section-y: clamp(3rem, 5.5vw, 5rem);
  --section-y-lg: clamp(5rem, 9.5vw, 8.5rem);
  --section-y-sm: clamp(3rem, 5vw, 4.5rem);

  /* Shadows */
  --shadow-sm: 0 2px 4px oklch(0 0 0 / 0.08);
  --shadow-md: 0 4px 12px oklch(0 0 0 / 0.1);
  --shadow-lg: 0 8px 24px oklch(0 0 0 / 0.12);
  --shadow-xl: 0 16px 40px oklch(0 0 0 / 0.15);

  /* Opacity */
  --opacity-disabled: 0.5;
  --opacity-hover: 0.95;
  --opacity-active: 0.9;

  /* Typography Scale */
  --line-height-tight: 1.2;
  --line-height-normal: 1.6;
  --line-height-relaxed: 1.8;
  --letter-spacing-tight: -0.02em;
  --letter-spacing-normal: 0em;
  --letter-spacing-wide: 0.02em;

  /* Breakpoints */
  --bp-mobile: 480px;
  --bp-tablet: 768px;
  --bp-desktop: 1024px;
  --bp-wide: 1440px;

  /* Transitions */
  --transition-fast: all var(--t-fast) var(--ease-out-expo);
  --transition-med: all var(--t-med) var(--ease-out-expo);
  --transition-slow: all var(--t-slow) var(--ease-out-expo);
}

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

html { scroll-behavior: smooth; }

body {
  margin: 0;
  font-family: var(--font-body);
  font-size: 1rem;
  line-height: 1.6;
  color: var(--ink);
  background: var(--bg-page);
  -webkit-font-smoothing: antialiased;
}
/* Home lets the hero run under the transparent header.
   Inner pages keep the offset so content clears the bar. */
body:not(.has-hero) { padding-top: var(--header-h); }

/* height:auto matters more than it looks. Every <img> carries width/height
   attributes for layout stability; those map to presentational height, which
   silently beat `aspect-ratio` wherever a component set one. The collections
   strip was rendering 1280px tall, editorial rows 854px and the split intros
   768px — the aspect-ratio was declared and ignored. Components that really
   want a fixed height set it in their own rule and still win on specificity. */
img { max-width: 100%; height: auto; display: block; }

/* One family, weight and tracking carry the hierarchy. The serif display face
   with italic accents read as formal and dated; a single grotesque set tight
   and heavy is both cleaner and one font family lighter to download. */
h1, h2, h3, h4, h5, h6 {
  font-family: var(--font-display);
  font-weight: 600;
  line-height: var(--line-height-tight);
  margin: 0;
  letter-spacing: -0.03em;
  text-wrap: balance;
}

h1 {
  font-size: clamp(2.4rem, 5.6vw, 4.2rem);
  line-height: 1.02;
  letter-spacing: -0.04em;
  margin-bottom: clamp(1.25rem, 2.5vw, 1.75rem);
}

h2 {
  font-size: clamp(1.85rem, 3.6vw, 2.8rem);
  line-height: 1.06;
  letter-spacing: -0.035em;
  margin-bottom: clamp(1rem, 2vw, 1.5rem);
  margin-top: 0;
}

h3 {
  font-size: clamp(1.1rem, 1.6vw, 1.35rem);
  line-height: 1.25;
  letter-spacing: -0.02em;
  margin-bottom: clamp(0.6rem, 1.2vw, 0.85rem);
}

h4 {
  font-size: 1rem;
  font-weight: 500;
  margin-bottom: 0.75rem;
}

/* Heading accent. The <em> stays for meaning, but the italic serif that made
   it read as a wedding invitation is gone — the emphasis is now colour only,
   at the same weight and slant as the rest of the line. */
h1 em, h2 em, h3 em {
  font-style: normal;
  font-weight: inherit;
  color: var(--brand-600);
}
.duo-dark h2 em,
.how h2 em,
.hero-content h1 em,
.final-cta h2 em {
  color: var(--brand-200);
}

p {
  margin: 0;
  max-width: 62ch;
  line-height: var(--line-height-normal);
}

.wrap {
  max-width: var(--wrap-max);
  margin-left: auto;
  margin-right: auto;
  padding-left: var(--pad-x);
  padding-right: var(--pad-x);
  /* Ensure no overflow on smaller screens */
  width: 100%;
  box-sizing: border-box;
}

section[id], footer[id] { scroll-margin-top: calc(var(--header-h) + 1rem); }

.skip-link {
  position: absolute; left: -9999px; top: 0;
  background: var(--navy); color: var(--on-dark);
  padding: 0.6rem 1rem; z-index: 100;
}
.skip-link:focus { left: 0; }

:focus-visible {
  outline: 2px solid var(--blue-brand);
  outline-offset: 2px;
}
.btn:focus-visible { outline-offset: 3px; }
.bento-card:focus-visible,
.guide-card:focus-visible,
.itin-media:focus-visible,
.duo-media:focus-visible { outline-offset: 4px; border-radius: var(--radius-card); }
.hero-dots button:focus-visible { outline-offset: 3px; }
.footer-social a:focus-visible { outline-offset: 4px; }

/* ============ Eyebrows ============ */

.eyebrow {
  font: 600 0.68rem/1 var(--font-body);
  letter-spacing: 0.2em; text-transform: uppercase;
  color: var(--accent);
  margin-bottom: 1.1rem;
  display: flex; align-items: center; gap: 0.85rem;
}
.eyebrow-dark { color: var(--accent-soft); }
.eyebrow-light { color: oklch(1 0 0 / 0.72); }
/* No rules on the eyebrow: the label is the label. The orange one went at
   Enrique's request, and the grey companion went with it — a rule on one side
   only reads as something that failed to load. The value section's eyebrow is
   left-aligned with its heading now; Trending's stays centred with its own. */
.trending-section .eyebrow { justify-content: center; }

/* Inline links in body copy. Every component anchor carries a class and sets
   its own colour; these carried none, so they fell through to the browser's
   default #0000ee — a blue that is nowhere in this palette. Scoped with
   :not([class]) so the 200-odd component anchors are untouched.
   :not(nav li) as well: the anchor index under the hero is a list of bare
   <a> in <li>, so every one of its six labels came out underlined. A rule
   for prose has no business inside a navigation. */
p a:not([class]),
li:not(nav li) a:not([class]),
dd a:not([class]) {
  color: var(--brand-600);
  text-decoration: underline;
  text-underline-offset: 0.18em;
  text-decoration-thickness: 1px;
  text-decoration-color: oklch(0.465 0.131 253 / 0.4);
  transition: text-decoration-color var(--t-med) var(--ease-out-expo);
}
@media (hover: hover) and (pointer: fine) {
  p a:not([class]):hover,
  li:not(nav li) a:not([class]):hover,
  dd a:not([class]):hover { text-decoration-color: currentColor; }
}

/* Blocks whose copy is still a [PLACEHOLDER]. build.py marks them on every
   build, so the moment the real text lands the marker stops being written and
   the block comes back on its own. Left visible they read as an unfinished
   site rather than as reserved space. */
[data-tbc] { display: none !important; }

/* "Más adelante" in the client's category list: on the page as a plan, not as
   a live link. Muted ground, no photograph, and it is a <span>, so it is not
   focusable and cannot be clicked into a page that does not exist yet. */
.place-soon,
.place-soon {
  background: var(--brand-050);
  border: 1px dashed var(--line);
}
.place-soon > span { color: var(--ink-secondary); text-shadow: none; }
.place-note,

/* A grid of the same overlay card the rails use, so a listing and a rail show
   the same object. The reference puts the copy on the picture; the earlier
   panel kept them as two stacked halves. */
/* The section this grid lives in gets a wider container. Inside the standard
   1200px cap the four cards came out 258px on a 1440 screen, smaller than the
   photographs deserve. */
.wrap:has(> .tall-grid) { max-width: 1600px; }

.tall-grid {
  display: grid;
  /* Explicit counts rather than auto-fill: eight cards over two rows of four,
     so neither row is left with an orphan. */
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: clamp(1rem, 2vw, 1.5rem);
  /* Not stretch. Stretch hands each card a definite height, and then its
     aspect-ratio derives the WIDTH from that — so cards shrank inside their
     own columns and the two shapes came out 258 and 291 wide. Sized from the
     column instead, one ratio gives one size. */
  align-items: start;
}
@media (max-width: 1100px) { .tall-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
@media (max-width: 860px)  { .tall-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 520px)  { .tall-grid { grid-template-columns: 1fr; } }

/* Three cards, three columns. In the four-column default they filled three
   slots and left the fourth empty, so the row hung to one side under a
   centred heading. The wide container goes with it: the guide's prose above
   is 1200, and a 1600 row under it read as a different page. */
.tall-grid-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.wrap:has(> .tall-grid-3) { max-width: var(--wrap-max); }
@media (max-width: 900px) { .tall-grid-3 { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 560px) { .tall-grid-3 { grid-template-columns: 1fr; } }

/* ---------- Marks in article prose --------------------------------------
   A drawn mark beside each heading, so a guide can be scanned before it is
   read. It sits outside the measure on a wide screen and inline on a narrow
   one, and it never carries meaning the heading does not already carry. */
.prose h2 { display: flex; align-items: center; gap: 0.7rem; }
.prose-mark {
  flex: none;
  display: inline-grid; place-items: center;
  width: 1.9rem; height: 1.9rem;
  color: var(--brand-600);
}
.prose-mark svg { width: 100%; height: 100%; }
/* The bullets become a mark of their own: a short rule in the accent, which
   lines the points up without pretending each one is a completed task. */
.prose ul, .article-body ul { list-style: none; padding-left: 0; }
.prose ul > li,
.article-body ul > li {
  position: relative;
  padding-left: 1.6rem;
}
.prose ul > li::before,
.article-body ul > li::before {
  content: "";
  position: absolute; left: 0; top: 0.72em;
  width: 0.85rem; height: 2px;
  border-radius: 1px;
  background: var(--accent);
}

/* ============ Buttons & links ============ */

.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 0.5rem;
  font: 600 0.75rem/1 var(--font-body);
  letter-spacing: 0.13em;
  text-transform: uppercase;
  padding: 1rem 1.9rem;
  border: none; border-radius: var(--radius-btn);
  cursor: pointer; text-decoration: none;
  background: var(--stone); color: var(--on-dark);
  position: relative;
  transition: background-color 400ms var(--ease-out-expo),
              color 400ms var(--ease-out-expo),
              box-shadow 400ms var(--ease-out-expo),
              opacity 300ms var(--ease-out-expo),
              /* Shorter than the colour fade on purpose. Size is the fastest
                 thing the eye reads, so at 400ms it lags behind the cursor. */
              transform 180ms var(--ease-out-expo);
}

/* The pop. The button grows a little under the cursor and dips when pressed,
   so it answers before the page can. The dip is what makes it pop: releasing
   from 0.97 back up to 1.035 is the spring you actually feel. Held to 3.5%
   because these are wide, and a wide box magnifies a percentage. */
@media (hover: hover) and (pointer: fine) {
  .btn:hover { transform: scale(1.035); }
}
.btn:active {
  opacity: 0.85;
  transform: scale(0.97);
  /* A press has to land now, not in a fifth of a second. */
  transition-duration: 90ms;
}
@media (prefers-reduced-motion: reduce) {
  .btn:hover, .btn:active { transform: none; }
}
/* One hover law for every button: it darkens within its own colour, and a
   button with a ring fills with that ring's colour. Nothing changes hue on
   hover — a white button that turns blue reads as a different control. */
.btn-light {
  /* Off-white, not #fff: on a dark band pure white is 15.8:1 and reads as
     glare beside 5-9:1 copy. This is 12.9:1 — still the brightest thing in
     the band, without the hard edge. */
  background: var(--on-dark); color: var(--ink);
  box-shadow: none;
}
.btn-ghost {
  background: transparent; color: oklch(1 0 0 / 0.92);
  box-shadow: inset 0 0 0 1px oklch(1 0 0 / 0.42);
}
.btn-whatsapp {
  background: var(--wa-green); color: oklch(1 0 0);
  box-shadow: none;
}
/* Outline variant for CTAs that sit inside editorial copy on a light ground,
   where a solid button would out-shout the paragraph it belongs to. */
.btn-outline {
  background: transparent; color: var(--brand-900);
  box-shadow: inset 0 0 0 1px var(--brand-900);
}
.btn-block { width: 100%; }

/* The bordered variants used to fill in on hover — outline went solid navy,
   ghost went solid white. Beside a solid button that only deepens by a shade,
   that reads as two different components rather than one set: the eye sees a
   button change into another button. Now every button answers the cursor the
   same way, with the pop, and keeps the colour it had. Solid buttons still
   deepen within their own hue, which is a shade, not a repaint. */
@media (hover: hover) and (pointer: fine) {
  .btn-primary:hover { background: var(--brand-hover); }
  .btn-light:hover { background: var(--btn-light-hover); }
  .btn-whatsapp:hover { background: oklch(0.46 0.12 152); }
}

/* Editorial link: rule that draws itself in on hover */
.link-arrow {
  display: inline-flex; align-items: center; gap: 0.5rem;
  font: 600 0.72rem/1.2 var(--font-body);
  letter-spacing: 0.13em; text-transform: uppercase;
  color: var(--brand-600); text-decoration: none;
  padding-bottom: 0.4rem;
  position: relative;
}
.link-arrow::after {
  content: "\2192";
  font-size: 0.9rem;
  transition: transform 400ms var(--ease-out-expo);
}
.link-arrow::before {
  content: "";
  position: absolute; left: 0; bottom: 0; right: 0;
  height: 1px; background: currentColor;
  transform: scaleX(0); transform-origin: left;
  transition: transform 500ms var(--ease-out-expo);
  opacity: 0.45;
}
@media (hover: hover) and (pointer: fine) {
  .link-arrow:hover::after { transform: translateX(5px); }
  .link-arrow:hover::before { transform: scaleX(1); }
}
.link-arrow-dark { color: var(--brand-200); }

/* ============ Header — blanco fijo ============ */

/* Default: solid. Only a page that opts in with `body.has-hero` gets the
   transparent-over-photo treatment — otherwise light nav type would sit on a
   light page background and disappear. */
.site-header {
  position: fixed; inset: 0 0 auto 0; z-index: 50;
  background: oklch(0.995 0.002 80 / 0.94);
  backdrop-filter: blur(14px) saturate(1.4);
  -webkit-backdrop-filter: blur(14px) saturate(1.4);
  box-shadow: 0 1px 0 var(--line);
  transition: background-color 500ms var(--ease-out-expo),
              box-shadow 500ms var(--ease-out-expo),
              backdrop-filter 500ms var(--ease-out-expo);
}
.site-header::before {
  content: "";
  position: absolute; inset: 0;
  background: linear-gradient(180deg, oklch(0.15 0.010 259 / 0.45), transparent);
  opacity: 0;
  transition: opacity 500ms var(--ease-out-expo);
  pointer-events: none;
}
/* Over the hero: transparent, light type, subtle scrim for legibility */
.has-hero .site-header:not(.is-scrolled) {
  background: transparent;
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
  box-shadow: none;
}
.has-hero .site-header:not(.is-scrolled)::before { opacity: 1; }

.header-inner {
  height: var(--header-h);
  display: grid;
  grid-template-columns: auto 1fr auto;
  align-items: center;
  gap: 2.5rem;
  position: relative;
  z-index: 1;
}
.brand-logo {
  height: 42px; width: auto;
  filter: none;
  transition: filter 500ms var(--ease-out-expo);
}
.has-hero .site-header:not(.is-scrolled) .brand-logo { filter: brightness(0) invert(1); }

.main-nav {
  display: flex;
  gap: 2.25rem;
  justify-content: center;
  align-items: center;
}
.main-nav a {
  font: 500 0.78rem/1 var(--font-body);
  letter-spacing: 0.11em;
  text-transform: uppercase;
  color: var(--ink-body);
  text-decoration: none;
  padding: 0.4rem 0;
  position: relative;
  transition: color 400ms var(--ease-out-expo), opacity var(--t-med) ease-out;
  display: flex;
  align-items: center;
  gap: 0.45rem;
  white-space: nowrap;
}
.has-hero .site-header:not(.is-scrolled) .main-nav a { color: oklch(1 0 0 / 0.88); }
.main-nav a:hover { color: var(--brand-600); }
.has-hero .site-header:not(.is-scrolled) .main-nav a:hover { color: oklch(1 0 0); }
.main-nav a.is-active { font-weight: 600; color: var(--brand-600); }
.has-hero .site-header:not(.is-scrolled) .main-nav a.is-active { color: oklch(1 0 0); }
.main-nav a.is-active::after {
  content: "";
  position: absolute;
  bottom: -0.35rem;
  left: 0;
  right: 0;
  height: 1px;
  background: currentColor;
  transform: none;
}
.main-nav a::after {
  content: ""; position: absolute; left: 0; right: 0; bottom: 0;
  height: 1.5px; background: currentColor;
  transform: scaleX(0); transform-origin: left;
  transition: transform var(--t-med) var(--ease-out-expo);
}
@media (hover: hover) and (pointer: fine) {
  .main-nav a:hover::after { transform: scaleX(1); }
}

.header-actions {
  display: flex;
  align-items: center;
  gap: 0.75rem;
}
.header-actions .btn {
  padding: 0.7rem 1.4rem;
  font-size: 0.72rem;
  font-weight: 600;
  letter-spacing: 0.13em;
  text-transform: uppercase;
}
/* Over the hero the CTA is an outline; on scroll it fills in */
.header-actions .btn-primary {
  background: var(--brand);
  color: var(--on-dark);
  box-shadow: inset 0 0 0 1px transparent;
}
.has-hero .site-header:not(.is-scrolled) .header-actions .btn-primary {
  background: transparent;
  color: oklch(1 0 0);
  box-shadow: inset 0 0 0 1px oklch(1 0 0 / 0.55);
}
@media (hover: hover) and (pointer: fine) {
  .header-actions .btn-primary:hover {
    background: var(--brand-hover);
    color: var(--on-dark);
  }
  /* Over the hero this button is transparent with a ring, and it used to
     invert to solid white. Same reason as the other bordered ones: it keeps
     its colour and answers with the pop. */
}
/* WhatsApp reads as a quiet secondary in the bar, not a green slab */
/* The header's WhatsApp is the same button as the one in the body — same
   green, same shape, only smaller. It used to be a grey text link, which made
   one action look like two different controls. */
.header-actions .btn-whatsapp { padding: 0.6rem 1.1rem; }

.nav-toggle {
  display: none; flex-direction: column; gap: 6px;
  background: none; border: none; cursor: pointer;
  min-width: 44px; min-height: 44px;
  padding: 11px;
  align-items: center; justify-content: center;
}
.nav-toggle span {
  width: 24px; height: 1.5px; background: var(--ink);
  transition: transform var(--t-med) var(--ease-out-expo),
              background-color 400ms var(--ease-out-expo);
}
.has-hero .site-header:not(.is-scrolled) .nav-toggle span { background: oklch(1 0 0); }
.nav-toggle[aria-expanded="true"] span:nth-child(1) { transform: translateY(4px) rotate(45deg); }
.nav-toggle[aria-expanded="true"] span:nth-child(2) { transform: translateY(-4px) rotate(-45deg); }

.mobile-menu {
  display: none;
  flex-direction: column;
  background: var(--bg-page);
  padding: 0.5rem var(--pad-x) 1.25rem;
  box-shadow: 0 1px 0 var(--line);
}
.mobile-menu a {
  font: 500 1rem/1 var(--font-body);
  color: var(--ink); text-decoration: none; padding: 0.7rem 0;
  border-bottom: 1px solid var(--line);
}
.mobile-menu a.is-active { color: var(--brand-600); font-weight: 600; }
.mobile-menu-cta {
  color: var(--brand-600);
  font-weight: 600;
}
.mobile-menu-wa { color: var(--wa-green); font-weight: 600; border-bottom: none; }
.mobile-menu.is-open { display: flex; }

/* ============ Hero — centrado ============ */

.hero {
  position: relative;
  /* Was a fixed height with the copy pinned to the bottom, so on a short
     window the headline had nowhere to go but up, under a header that floats
     over it. Measured: at 600px tall the title crossed the logo by 24px. A
     floor instead of a fixed height means the section grows to fit its own
     text; clamp keeps the same three limits it had before. */
  min-height: clamp(600px, 100svh, 1000px);
  display: flex; align-items: flex-end;
  overflow: hidden;
}
.hero-slides { position: absolute; inset: 0; }
.hero-slide {
  position: absolute; inset: 0; margin: 0;
  opacity: 0;
  transition: opacity 1600ms var(--ease-out-expo);
}
.hero-slide.is-active { opacity: 1; }
.hero-slide img {
  width: 100%; height: 100%; object-fit: cover;
}
/* Slow, barely-perceptible drift — cinematic rather than animated */
.hero-slide.is-active img { animation: kenburns 14s ease-out forwards; }
@keyframes kenburns {
  from { transform: scale(1.02); }
  to { transform: scale(1.09); }
}
.hero-dots {
  position: absolute; bottom: 2.2rem; right: var(--pad-x);
  display: flex; gap: 0;
  z-index: 2;
}
.hero-dots button {
  width: 34px; height: 1px;
  border: none; box-sizing: content-box;
  /* Was a 34x1 target. The rule still reads as 1px; the padding makes the
     control 45px tall without moving it. */
  padding-block: 22px;
  background-clip: content-box;
  cursor: pointer;
  margin-left: 10px;
  position: relative;
  background-color: oklch(1 0 0 / 0.35);
  transition: background-color 500ms var(--ease-out-expo);
}
/* 44px touch target without growing the painted line */
.hero-dots button::after {
  content: ""; position: absolute;
  left: 0; right: 0; top: 50%;
  transform: translateY(-50%);
  height: 44px;
}
.hero-dots button.is-active { background-color: oklch(1 0 0); }
.hero-scrim {
  position: absolute; inset: 0;
  background:
    linear-gradient(180deg,
      oklch(0.15 0.010 259 / 0.30) 0%,
      oklch(0.15 0.010 259 / 0.05) 35%,
      oklch(0.13 0.012 259 / 0.62) 78%,
      oklch(0.12 0.012 259 / 0.82) 100%);
}
/* That gradient is built for the home hero, where the copy sits in the bottom
   fifth and the middle of the picture is deliberately left almost clear (0.05
   at 35%). An interior hero carrying buttons fills most of its own box, so the
   clear band lands on the subtitle — on the contact page that is a photograph
   of the team, and the line ran straight across their faces. Where a hero has
   actions, the cover is even from top to bottom. */
.page-hero:has(.hero-actions) .hero-scrim {
  background: linear-gradient(180deg,
    oklch(0.15 0.010 259 / 0.52) 0%,
    oklch(0.14 0.011 259 / 0.62) 45%,
    oklch(0.12 0.012 259 / 0.80) 100%);
}
.hero-content {
  position: relative; width: 100%;
  text-align: left;
  color: var(--on-dark);
  /* The header floats over this section, so its height is not free space —
     it has to be reserved here or the first line sits under the logo. */
  padding-top: calc(var(--header-h) + 1.5rem);
  padding-bottom: clamp(4.5rem, 9vh, 7rem);
  z-index: 1;
}
@keyframes rise {
  from { opacity: 0; transform: translateY(18px); }
  to { opacity: 1; transform: none; }
}
@keyframes fadeInUp {
  from { opacity: 0; transform: translateY(12px); }
  to { opacity: 1; transform: translateY(0); }
}
/* Staged entrance — slow, sequenced, no bounce */
.hero-content .eyebrow { animation: rise 1100ms var(--ease-out-expo) 150ms both; }
.hero-content h1, .page-hero h1 { animation: rise 1200ms var(--ease-out-expo) 300ms both; }
.hero-sub { animation: rise 1200ms var(--ease-out-expo) 520ms both; }
.hero-actions { animation: rise 1200ms var(--ease-out-expo) 700ms both; }
.page-hero .crumb { animation: rise 900ms var(--ease-out-expo) both; }

.hero-content .eyebrow {
  color: oklch(1 0 0 / 0.78);
  margin-bottom: 1.5rem;
}
.hero-content h1 {
  font-size: clamp(2.9rem, 7vw, 5.4rem);
  font-weight: 400;
  line-height: 0.98;
  letter-spacing: -0.038em;
  color: oklch(1 0 0);
  max-width: 15ch;
  margin-bottom: 1.5rem;
  text-shadow: 0 2px 40px oklch(0.12 0.01 55 / 0.35);
}
.hero-content h1 em { color: var(--brand-200); }
.hero-sub {
  font-size: clamp(1rem, 1.35vw, 1.15rem);
  line-height: 1.65;
  color: oklch(1 0 0 / 0.82);
  max-width: 44ch;
  margin-inline: 0;
  margin-bottom: 2.5rem;
}
.hero-actions { display: flex; justify-content: flex-start; align-items: center; gap: 0.75rem; flex-wrap: wrap; }
/* flex-start is for the home hero, whose copy is left-aligned. An interior
   hero centres its heading and its subtitle, so its buttons centre too.
   The trust signals are a flex row, which text-align cannot reach, so they
   take the same treatment — otherwise the checks hang off the left edge under
   a centred headline. */
.page-hero-content .hero-actions,
.page-hero-content .hero-assurances,
/* The eyebrow needs both halves of the fix. The auto inline margin below
   centres its box, but the box is capped at 62ch — wider than the label — and
   a flex container lays its own content out from the start edge, so the words
   stayed left inside a box that was already centred. Centring the box is not
   centring the text. */
.page-hero-content .eyebrow { justify-content: center; }
.page-hero-content .hero-facts { text-align: center; }

/* Scroll cue */
@keyframes cueDrop {
  0%   { transform: scaleY(0); opacity: 0; }
  35%  { transform: scaleY(1); opacity: 1; }
  75%  { transform: scaleY(1); opacity: 1; }
  100% { transform: scaleY(1) translateY(46px); opacity: 0; }
}

.hero-pause {
  position: absolute; bottom: 2.2rem; left: var(--pad-x);
  min-width: 44px; min-height: 44px;
  display: flex; align-items: center; justify-content: center;
  background: transparent;
  border: 1px solid oklch(1 0 0 / 0.28);
  border-radius: 50%;
  cursor: pointer; color: oklch(1 0 0 / 0.7);
  z-index: 2;
  transition: border-color 400ms var(--ease-out-expo),
              color 400ms var(--ease-out-expo);
}
@media (hover: hover) and (pointer: fine) {
  .hero-pause:hover { border-color: oklch(1 0 0 / 0.7); color: oklch(1 0 0); }
}
/* Sandra: "el texto de las fotos esta muy pegado a las lineas". Estaba a la
   misma altura que la barra de los puntos y casi tocandola. Baja su propia
   linea de base y se separa de la fila de controles. */
.hero-caption {
  position: absolute; bottom: 1.5rem; right: calc(var(--pad-x) + 190px);
  font: 500 0.68rem/1 var(--font-body);
  letter-spacing: 0.14em; text-transform: uppercase;
  color: oklch(1 0 0 / 0.45);
  z-index: 2;
}

/* ============ Trust bar ============ */

.trust {
  background: var(--sand);
  position: relative;
}
.trust-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  padding-block: clamp(2.75rem, 5vw, 4rem);
  gap: 2rem;
}
.trust-item {
  display: flex; flex-direction: column;
  align-items: center; text-align: center;
  gap: 0.6rem;
  position: relative;
}
/* Hairline separators, not boxes */
.trust-item + .trust-item::before {
  content: "";
  position: absolute; left: -1rem; top: 50%;
  transform: translateY(-50%);
  width: 1px; height: 2.6rem;
  background: var(--line);
}
.trust-figure {
  font-family: var(--font-display);
  font-size: clamp(2.1rem, 3.6vw, 3rem);
  font-weight: 430;
  line-height: 1;
  letter-spacing: -0.03em;
  color: var(--accent);
  display: inline-flex; align-items: baseline; gap: 0.1em;
  font-variant-numeric: tabular-nums;
}
.trust-figure-text {
  font-weight: 500;
  color: var(--brand-600);
}
.trust-sup {
  font-size: 0.5em;
  font-family: var(--font-body);
  font-weight: 600;
  color: var(--brand-600);
  align-self: flex-start;
  margin-top: 0.35em;
}
.trust-star {
  font-size: 0.42em;
  /* --accent-soft is for dark grounds; on sand it is 2.17:1. */
  color: var(--accent);
  margin-left: 0.15em;
  align-self: center;
}
.trust-label {
  font: 500 0.76rem/1.4 var(--font-body);
  letter-spacing: 0.11em;
  text-transform: uppercase;
  color: var(--ink-muted);
  max-width: 16ch;
}

@keyframes marquee {
  to { transform: translateX(-50%); }
}

/* ============ Sections ============ */

.section {
  padding-block: var(--section-y);
  position: relative;
}
.section-sand { background: var(--sand); }

/* Asymmetric editorial section header: title left, lead right */
/* u-center: one centred column. Without this the two-column grid above puts
   the eyebrow in one cell and the heading in the other, which is what left the
   inspiration heading sitting to the right of its own eyebrow. */
.section-head.u-center {
  grid-template-columns: 1fr;
  justify-items: center;
  text-align: center;
  /* The 5vw gap is the space between two columns. Stacked it put 82px between
     an eyebrow and the heading it introduces. */
  row-gap: clamp(0.5rem, 1vw, 0.9rem);
}
.section-head.u-center .eyebrow { margin-bottom: 0; }
.section-head.u-center h2 { margin-bottom: 0; }

/* Sandra: "te prohibi colocar elementos desalineados, y ahi el texto derecho
   esta desalineado". Lo estaba, y no solo ahi: medidas las cabeceras de diez
   paginas, la primera linea de la columna derecha caia entre 144px por encima
   y 50 por debajo de la de la izquierda, cada una distinta.

   La culpa era de align-items:end. Alineando por abajo, lo que coincide es el
   pie de las dos columnas, asi que la primera linea de cada una queda donde la
   deje el numero de lineas que tenga: por eso el desvio parecia aleatorio.

   Sandra, sobre el resultado: "ambos textos deben estar alineados al centro".
   Asi que no es la primera linea la que manda sino el centro: las dos columnas
   se centran una contra otra, que es lo que hace que se lean como un bloque
   aunque una tenga dos lineas y la otra cuatro. */
.section-head {
  display: grid;
  grid-template-columns: 1.15fr 1fr;
  gap: clamp(1.5rem, 5vw, 5rem);
  align-items: center;
  margin-bottom: clamp(2.25rem, 4vw, 3.5rem);
}
.section-head-main h2 { margin-bottom: 0; }
.section-head-lead {
  font-size: 1rem;
  line-height: 1.75;
  color: var(--ink-body);
  max-width: 44ch;
  padding-bottom: 0.35rem;
}
.how .section-head,
.duo-dark .section-head { border-bottom-color: oklch(1 0 0 / 0.14); }
.how .section-head-lead,
.duo-dark .section-head-lead { color: var(--on-dark-body); }

/* ============ Bento — Formas de viajar ============ */

/* Asymmetric mosaic: one tall feature, three supporting cells */
.bento {
  display: grid;
  grid-template-columns: 1.25fr 1fr 1fr;
  grid-template-rows: clamp(190px, 23vw, 275px) clamp(190px, 23vw, 275px);
  gap: clamp(0.5rem, 1vw, 0.9rem);
}
.bento-feature { grid-column: 1; grid-row: 1 / span 2; }
.bento-wide { grid-column: 2 / span 2; grid-row: 2; }

.bento-card {
  position: relative; overflow: hidden;
  border-radius: var(--radius-lg);
  text-decoration: none; color: var(--on-dark);
  display: block;
  box-shadow: none;
  background: var(--stone-deep);
}
.bento-card img {
  width: 100%; height: 100%; object-fit: cover;
  aspect-ratio: auto;
  transition: transform 1400ms var(--ease-out-expo),
              opacity 700ms var(--ease-out-expo);
}
@media (hover: hover) and (pointer: fine) {
  .bento-card:hover img { transform: scale(1.06); opacity: 0.88; }
  .bento-card:hover .bento-cue { opacity: 1; transform: none; }
  .bento-card:hover .bento-overlay::before { opacity: 1; }
}
.bento-overlay {
  position: absolute; inset: 0;
  display: flex; flex-direction: column; justify-content: flex-end;
  padding: clamp(1.25rem, 2vw, 1.9rem);
}
.bento-overlay::before {
  content: "";
  position: absolute; inset: 0;
  background: linear-gradient(0deg,
    oklch(0.14 0.012 259 / 0.90) 0%,
    oklch(0.14 0.012 259 / 0.42) 45%,
    oklch(0.14 0.012 259 / 0.06) 100%);
  opacity: 0.9;
  transition: opacity 700ms var(--ease-out-expo);
}
.bento-overlay > * { position: relative; z-index: 1; }
.bento-overlay h3 {
  color: var(--on-dark);
  font-family: var(--font-display);
  font-weight: 430;
  font-size: clamp(1.35rem, 2vw, 1.75rem);
  letter-spacing: -0.02em;
  text-shadow: none;
  margin-bottom: 0.4rem;
}
.bento-feature .bento-overlay h3 { font-size: clamp(1.7rem, 2.7vw, 2.35rem); }
.bento-overlay p {
  font-size: 0.9rem;
  color: oklch(1 0 0 / 0.78);
  margin-top: 0; line-height: 1.55;
  max-width: 32ch;
}
.bento-cue {
  display: inline-block;
  margin-top: 1.1rem;
  font: 600 0.66rem/1 var(--font-body);
  letter-spacing: 0.16em; text-transform: uppercase;
  color: oklch(1 0 0);
  opacity: 0;
  transform: translateY(6px);
  transition: opacity 500ms var(--ease-out-expo),
              transform 500ms var(--ease-out-expo);
}
.bento-cue::after { content: " \2192"; }
/* Touch devices never hover — keep the cue visible there */
@media (hover: none) {
  .bento-cue { opacity: 0.85; transform: none; }
}

/* ============ Itinerarios — zigzag ============ */

/* Image-dominant, alternating. The photograph carries the row;
   the copy sits in a narrow column beside it. */
.itin {
  display: grid; grid-template-columns: 1.55fr 1fr;
  gap: clamp(1.75rem, 5vw, 4.5rem);
  align-items: center;
  padding-bottom: 0;
  border-bottom: none;
  margin-bottom: clamp(3.5rem, 7vw, 6rem);
}
.itin:last-child { margin-bottom: 0; }
.itin-reverse { grid-template-columns: 1fr 1.55fr; }
.itin-reverse .itin-media { order: 2; }
.itin-reverse .itin-body { order: 1; }

.itin-media {
  display: block; overflow: hidden;
  border-radius: var(--radius-lg);
  position: relative;
  background: var(--sand);
}
.itin-media img {
  height: clamp(300px, 40vw, 520px); width: 100%; object-fit: cover;
  aspect-ratio: 4 / 3;
  transition: transform 1400ms var(--ease-out-expo);
}
@media (hover: hover) and (pointer: fine) {
  .itin-media:hover img { transform: scale(1.045); }
}

.itin-meta {
  font: 500 0.75rem/1.4 var(--font-body);
  letter-spacing: 0.04em;
  color: var(--ink-muted);
}

/* Metadata as a tracked rule above the title */
.itin-meta-clean {
  font: 500 0.7rem/1.5 var(--font-body);
  color: var(--ink-muted);
  text-transform: uppercase;
  letter-spacing: 0.16em;
  margin-bottom: 1rem;
  padding-bottom: 1rem;
  border-bottom: 1px solid var(--line);
}

.itin-body h3 {
  font-size: clamp(1.6rem, 2.7vw, 2.3rem);
  line-height: 1.1;
  letter-spacing: -0.028em;
  margin-top: 0;
  margin-bottom: 0.9rem;
}
.itin-desc {
  font-size: 1rem; color: var(--ink-body);
  margin-top: 0; max-width: 38ch; line-height: 1.75;
}
.itin-body .link-arrow { margin-top: 1.6rem; }

/* ============ Proceso — banda oscura ============ */

.how {
  background: var(--ground-dark);
  padding-block: var(--section-y);
  text-align: left;
}
.how h2 { color: var(--on-dark); }
.how-steps {
  display: grid; grid-template-columns: repeat(3, 1fr);
  gap: clamp(2rem, 5vw, 4.5rem);
  max-width: none; margin-inline: 0;
  position: relative;
  list-style: none; padding: 0;
  counter-reset: none;
}
.how-steps-4 { grid-template-columns: repeat(4, 1fr); gap: clamp(1.5rem, 3vw, 3rem); }
.how-steps-4 .how-step p { max-width: 28ch; }
.how-steps-4 .how-num { margin-bottom: 0; }

.how-step {
  position: relative;
  padding-top: 0;
  display: flex; flex-direction: column;
  align-items: flex-start;
}
.how-num {
  font-family: var(--font-display);
  font-size: clamp(2.6rem, 4.6vw, 4rem);
  font-weight: 430;
  line-height: 1;
  letter-spacing: -0.04em;
  color: var(--on-dark);
  display: block;
  /* No bottom margin: the numeral shares a row with the icon now, and this
     margin was padding the flex line out to 84px so the two never centred. */
  margin-bottom: 0;
  position: relative;
  font-variant-numeric: tabular-nums;
  transition: color 600ms var(--ease-out-expo);
}
/* Numeral and icon read as one marker on a single line. */
.how-marker {
  display: flex; align-items: center;
  gap: clamp(0.7rem, 1.4vw, 1rem);
  margin-bottom: 1.1rem;
}
.how-icon {
  display: block;
  /* The markup ships 28px, which next to a 59px numeral read as a footnote.
     Sized here so it tracks the numeral's own clamp instead of staying fixed. */
  width: clamp(1.9rem, 3.3vw, 2.9rem);
  height: clamp(1.9rem, 3.3vw, 2.9rem);
  /* Was the celeste at 0.75 opacity, which is what made it look like a ghost
     of an icon. Full strength, and the same off-white as the numeral so the
     marker reads as one thing rather than two colours side by side. */
  color: var(--on-dark);
  transition: transform 600ms var(--ease-out-expo);
}
@media (hover: hover) and (pointer: fine) {
  .how-step:hover .how-icon { transform: translateY(-3px); }
}
.how-step h3 {
  font-family: var(--font-display);
  font-weight: 430;
  font-size: clamp(1.15rem, 1.7vw, 1.4rem);
  letter-spacing: -0.02em;
  color: var(--on-dark);
  margin-bottom: 0.6rem;
}
.how-step p {
  font-size: 0.95rem; color: var(--on-dark-muted);
  line-height: 1.7;
  margin-top: 0; margin-inline: 0; max-width: 32ch;
}

/* ============ Quiénes somos / Compromiso ============ */

.duo-grid {
  display: grid; grid-template-columns: 1.15fr 1fr;
  gap: clamp(1.75rem, 6vw, 5.5rem);
  align-items: stretch;
}
.duo-grid > .duo-body { align-self: center; }
/* Starts at 681px, not 820: the duo only stacks below 680, so between 681 and
   819 the media had no capped height and stretched to the full row — 267x892,
   a ratio of 0.30, which sliced the subject out of a landscape photo. */
@media (min-width: 681px) {
  /* The media had a fixed height and sat at the top of its row, so where the
     text column runs long — the responsible-travel block is 755px against a
     435px photo — it left a 320px hole underneath. Centring splits whatever is
     left over, and the taller cap closes most of it.

     Stretching to the full row instead was the other option and it is wrong
     here: it would take this crop from 1.10 to 0.63 and cut the people at the
     edges out of a landscape source. */
  .duo-media { height: clamp(320px, 38vw, 540px); align-self: center; }
  .duo-media img { height: 100%; object-fit: cover; }
}

/* Wide enough that filling the row is safe: the photo becomes a full-height
   panel beside the text instead of a small picture floating in the middle of
   it, which is what made it read as isolated.

   Not below 1100px. There the media column is narrow while the text column is
   at its tallest, so filling would drive the crop to 0.30-0.43 and cut the
   subject out of a landscape source. Measured: 0.58 at 1100, 0.63 at 1280. */
@media (min-width: 1100px) {
  .duo-media { height: auto; align-self: stretch; }
  .duo-media img { height: 100%; }
}
.duo-media {
  display: block; overflow: hidden;
  border-radius: var(--radius-lg);
  background: var(--sand);
}
/* Llevaba a la vez una altura fija (tope 620px) y aspect-ratio 3/4, dos cosas
   que se pelean. La pieza es un item de rejilla y se estira a lo que mida la
   fila -- 755px medidos en la portada -- mientras la imagen se quedaba en 589,
   asi que por debajo asomaban 166px del fondo --sand: la franja gris.
   Ahora la imagen ocupa la caja entera y el clamp pasa a ser el minimo, que es
   lo que hacia falta: un suelo, no un techo. */
.duo-media { align-self: stretch; }
.duo-media img {
  width: 100%; height: 100%;
  min-height: clamp(360px, 46vw, 620px);
  object-fit: cover; object-position: center;
  transition: transform 1400ms var(--ease-out-expo);
}
@media (hover: hover) and (pointer: fine) {
  .duo-media:hover img { transform: scale(1.04); }
}
.duo-body h2 { margin-bottom: 1.25rem; }
.duo-body > p:not(.eyebrow) {
  font-size: 1.02rem; color: var(--ink-body);
  line-height: 1.8; max-width: 44ch;
}
.duo-body .link-arrow { margin-top: 2rem; }

.stats-row {
  display: flex; gap: clamp(1.5rem, 3.5vw, 3rem);
  margin-top: 2.25rem;
  padding-top: 2rem;
  border-top: 1px solid var(--line);
}
.stat strong {
  font-family: var(--font-display);
  font-size: clamp(1.9rem, 3vw, 2.6rem); font-weight: 430;
  display: block; line-height: 1.05;
  letter-spacing: -0.03em;
  color: var(--ink);
  margin-bottom: 0.45rem;
  font-variant-numeric: tabular-nums;
}
.stat span {
  font: 500 0.68rem/1.4 var(--font-body);
  letter-spacing: 0.13em; text-transform: uppercase;
  color: var(--ink-muted);
  display: block; max-width: 13ch;
}

.duo-dark {
  background: var(--ground-dark);
  padding-block: var(--section-y);
}
.duo-dark .stats-row { border-top-color: oklch(1 0 0 / 0.16); }
.duo-dark .stat strong { color: var(--on-dark); }
.duo-dark .stat span { color: var(--on-dark-muted); }

/* ============ Wave dividers ============ */

.duo-dark .duo-body h2 { color: var(--on-dark); }
.duo-dark .duo-body > p:not(.eyebrow) { color: var(--on-dark-body); }

/* ============ Guías — sección clara ============ */

.guides-section {
  /* The larger rhythm: this band follows the testimonials, which uses it too,
     and at --section-y the heading sat close to the top edge. */
  padding-block: var(--section-y-lg);
  background: var(--bg-page);
  border-top: 1px solid var(--line);
}
.guides-section h2 { color: var(--ink); }
.section-intro::after {
  content: '';
  display: block;
  width: 60px;
  height: 3px;
  background: linear-gradient(90deg, var(--brand-600), var(--brand-400), transparent);
  margin: 1.5rem auto 0;
  border-radius: 2px;
}
/* Masthead-style filter row: tracked type on a rule, not pill buttons */
.guide-categories {
  display: flex; gap: clamp(1.25rem, 3vw, 2.5rem); justify-content: flex-start;
  flex-wrap: wrap;
  margin-bottom: clamp(2rem, 3.5vw, 3rem);
  padding-bottom: 1rem;
  border-bottom: 1px solid var(--line);
}
.guide-filter {
  font: 600 0.7rem/1 var(--font-body);
  letter-spacing: 0.16em; text-transform: uppercase;
  padding: 0.35rem 0;
  border: none;
  background: transparent; color: var(--ink-muted);
  border-radius: 0;
  cursor: pointer;
  position: relative;
  transition: color 350ms var(--ease-out-expo);
}
.guide-filter::after {
  content: "";
  position: absolute; left: 0; right: 0; bottom: -1.05rem;
  height: 1px; background: var(--brand-600);
  transform: scaleX(0); transform-origin: left;
  transition: transform 450ms var(--ease-out-expo);
}
.guide-filter.is-active { color: var(--ink); }
.guide-filter.is-active::after { transform: scaleX(1); }
@media (hover: hover) and (pointer: fine) {
  .guide-filter:hover { color: var(--brand-600); }
}
.guide-card[hidden] { display: none; }

.guides {
  display: grid; grid-template-columns: repeat(3, 1fr);
  gap: clamp(1.5rem, 3vw, 2.75rem);
}
/* ---------- Ways to travel, en experiencias.html ------------------------
   Esta rejilla se queda como estaba: la cartilla alta de cuatro columnas que
   ya habiamos afinado. Las de abajo son las unicas piezas que la sostienen;
   el resto del sistema .trip-card se retiro porque nadie mas lo usaba. */
/* Wider than a rail card, so the description has somewhere to go. Scoped to
   the grid so it beats .tall-card's own ratio, which is declared later. */
.tall-grid > .tall-card-wide { aspect-ratio: 4 / 5.2; }
.tall-card-wide h3 { font-size: clamp(0.98rem, 1.3vw, 1.15rem); }
.tall-card-wide .tall-card-desc { font-size: 0.8rem; }
.tall-card-desc {
  display: block;
  margin-bottom: 0.7rem;
  font-size: 0.82rem;
  line-height: 1.45;
  color: oklch(1 0 0 / 0.88);
}

.trip-card {
  display: flex;
  flex-direction: column;
  text-decoration: none;
  color: inherit;
  background: var(--bg-page);
  border: 1px solid var(--line);
  border-radius: var(--radius-card);
  overflow: hidden;
}
.trip-card-title {
  font-family: var(--font-display);
  font-size: 1.15rem;
  line-height: 1.22;
  margin: 0.95rem 0 0.4rem;
}
.trip-card-desc {
  font-size: 0.9rem;
  line-height: 1.55;
  color: var(--ink-body);
  margin-bottom: 0.7rem;
}
.trip-card-soon { cursor: default; border-style: dashed; }
.trip-card-soon .trip-card-title { color: var(--ink-secondary); }
/* Coming-soon tiles are the same card, without a photograph to sit on: same
   ratio, same corners, so a row reads as one set rather than two shapes.
   .tall-grid aligns to start, not stretch, so the ratio sizes the height from
   the column width here and does not run backwards. */
.tall-grid > .trip-card-soon {
  aspect-ratio: 4 / 5.2;
  display: grid; place-items: center; align-content: center;
  gap: 0.4rem;
  padding: clamp(1rem, 2vw, 1.4rem);
  text-align: center;
  border: 1px dashed var(--line);
  border-radius: var(--radius-card);
  background: var(--brand-050);
}
.tall-grid > .trip-card-soon .trip-card-title {
  color: var(--ink); font-size: clamp(0.98rem, 1.3vw, 1.15rem); margin: 0;
  padding: 0;
}
.tall-grid > .trip-card-soon .trip-card-desc {
  font-size: 0.8rem; color: var(--ink-body); margin: 0; padding: 0;
}
.tall-grid > .trip-card-soon::after {
  content: "Coming soon";
  font: 600 0.58rem/1 var(--font-body);
  letter-spacing: 0.16em; text-transform: uppercase;
  color: var(--accent);
  margin-top: 0.35rem;
}

/* ---------- La cartilla ------------------------------------------------
   One card, two contents: a guide and an experience. They were two
   byte-identical blocks under two names, plus a third (.trip-card) that
   differed by 2px of corner radius. Photo on top rather than behind the
   copy: these carry a tag, a title, a description and a cue, which is more
   text than sits legibly over photography the way the role cards do. */
.guide-card,
.ideacard {
  display: flex; flex-direction: column;
  background: var(--bg-page);
  border: 1px solid var(--line);
  border-radius: var(--radius-lg);
  overflow: hidden;                 /* keeps the photo inside the radius */
  text-decoration: none; color: inherit;
  transition: border-color var(--t-med) var(--ease-out-expo),
              box-shadow var(--t-med) var(--ease-out-expo);
}
.guide-card-img,
.ideacard-img {
  display: block; width: 100%;
  aspect-ratio: 16 / 10; height: auto;
  object-fit: cover;
  transition: transform 700ms var(--ease-out-expo);
}
.guide-card-body,
.ideacard-body {
  display: flex; flex-direction: column; flex: 1;
  padding: clamp(1.35rem, 2.4vw, 1.8rem);
}
.guide-card-body h3,
.ideacard h3 {
  font-size: 1.15rem; line-height: 1.25;
  margin: 0 0 0.6rem;
  color: var(--ink);
}
.guide-card-body p,
.ideacard-desc {
  font-size: 0.9rem; line-height: 1.6;
  color: var(--ink-body);
  margin: 0 0 1.2rem;
}
/* One category chip. Navy on amber is 8.36:1; the guide tag used to be
   coral text with no fill, which made two cards out of one card. */
.guide-tag,
.ideacard-tag {
  align-self: flex-start;
  position: static;
  font: 600 0.62rem/1 var(--font-body);
  letter-spacing: 0.18em; text-transform: uppercase;
  background: var(--accent-amber);
  color: var(--brand-900);
  padding: 0.34rem 0.7rem;
  border-radius: var(--radius-btn);
  margin-bottom: 1rem;
}
/* The deck calls this the "itinerary angle": the route hint under the copy. */
.ideacard-angle {
  font-size: 0.78rem; line-height: 1.5;
  /* --ink-muted lands at 4.22:1 here, under the 4.5 bar for text this size. */
  color: var(--ink-secondary);
  padding-top: 0.9rem; margin-bottom: 1.2rem;
  border-top: 1px solid var(--line-soft);
}
.guide-card-cue,
.ideacard-cue {
  margin-top: auto;
  font: 600 0.82rem/1 var(--font-body);
  color: var(--brand-900);
  display: inline-flex; align-items: center; gap: 0.45rem;
}
.guide-card-cue::after,
.ideacard-cue::after {
  content: ""; width: 0.9rem; height: 1px;
  background: var(--accent-orange);
  transition: width var(--t-med) var(--ease-out-expo);
}
@media (hover: hover) and (pointer: fine) {
  .guide-card:hover,
  .ideacard:hover { border-color: var(--brand-400); box-shadow: var(--shadow-sm); }
  .guide-card:hover .guide-card-cue::after,
  .ideacard:hover .ideacard-cue::after { width: 1.6rem; }
  .guide-card:hover .guide-card-img,
  .ideacard:hover .ideacard-img { transform: scale(1.04); }
}
@media (prefers-reduced-motion: reduce) {
  .guide-card-img, .ideacard-img { transition: none; }
  .guide-card:hover .guide-card-img,
  .ideacard:hover .ideacard-img { transform: none; }
}
.guide-card:focus-visible,
.ideacard:focus-visible { outline: 2px solid var(--brand-400); outline-offset: 3px; }
.guide-card[style*="--d:.1s"] { animation-delay: 100ms; }
.guide-card[style*="--d:.2s"] { animation-delay: 200ms; }

/* Same card, nothing to click yet: no photo, a dashed edge, its own label. */
.ideacard-soon {
  position: relative;
  border-style: dashed;
  background: var(--brand-050);
  cursor: default;
}
/* Holds the space the photograph would have taken, so the card keeps the
   height of the ones beside it at every width. A percentage padding resolves
   against this card's own width. aspect-ratio does not: on a stretched grid
   item it runs backwards and derives the WIDTH from the row height, which
   blew these two 75px out of their columns. */
.ideacard-soon::before { content: ""; display: block; padding-top: 62.5%; }
.ideacard-soon::after {
  content: "Coming soon";
  position: absolute; left: 0; right: 0; top: 0;
  padding-top: calc(31.25% - 0.5em);   /* half the block above: centred in it */
  text-align: center;
  font: 600 0.62rem/1 var(--font-body);
  letter-spacing: 0.18em; text-transform: uppercase;
  color: var(--ink-secondary);
}
.ideacard-soon .ideacard-desc { margin: 0; }

.guide-card > img {
  width: 100%;
  height: clamp(230px, 26vw, 320px);
  object-fit: cover;
  border-radius: var(--radius-lg);
  margin-bottom: 0;
  transition: transform 1400ms var(--ease-out-expo),
              opacity 600ms var(--ease-out-expo);
}
.guide-card h3 {
  font: 430 clamp(1.15rem, 1.7vw, 1.4rem)/1.28 var(--font-display);
  letter-spacing: -0.02em;
  padding: 0.7rem 0 0;
  margin: 0;
  color: var(--ink);
  transition: color 350ms var(--ease-out-expo);
}
/* The description grows so the cue is pushed to the foot of the card and every
   card in a row lines its cue up with the others. Sizing lives on
   .guide-card-body p, which this used to override. */
.guide-card-body p { flex-grow: 1; }
@media (hover: hover) and (pointer: fine) {
  .guide-card:hover > img { transform: scale(1.035); opacity: 0.94; }
  .guide-card:hover h3 { color: var(--brand-600); }
}

/* The "see everything" link belongs to the set above it, so it sits closer to
   that set than to the next section. At 3rem it landed 112px under the rail
   with 128px below it — equidistant, which reads as belonging to neither. */
/* Con dos botones dentro esto era texto alineado a la izquierda, asi que lo
   unico que los separaba era el espacio en blanco del marcado: 3px medidos. */
.guides-more { margin-top: clamp(1rem, 1.5vw, 1.25rem); text-align: left; }
.guides-more:has(> .btn + .btn) {
  display: flex; flex-wrap: wrap; align-items: center;
  gap: clamp(0.75rem, 1.4vw, 1.1rem);
}

/* That 1.25rem is measured for a bare "see everything" link, which belongs to
   the set above it. A block that closes the section with a button is a
   different job: it has to clear the grid, not hug it. At 1.25rem the call to
   action under the three steps sat 20px below the last paragraph and read as
   the tail of that column instead of as the section's own close. */
.guides-more:has(.btn) { margin-top: clamp(2.5rem, 4.5vw, 4rem); }

/* ============ CTA final — azul, 2 columnas ============ */

/* Conversion moment: photograph carries it, form stays plainly usable */
.final-cta {
  position: relative;
  background: var(--ground-deep);
  border-top: none;
  padding-block: var(--section-y-lg);
  overflow: hidden;
  isolation: isolate;
}
.final-cta-bg {
  position: absolute; inset: 0;
  width: 100%; height: 100%; object-fit: cover;
  z-index: -2;
}
.final-cta::after {
  content: "";
  position: absolute; inset: 0;
  background: linear-gradient(100deg,
    oklch(0.14 0.012 259 / 0.94) 0%,
    oklch(0.14 0.012 259 / 0.80) 48%,
    oklch(0.14 0.012 259 / 0.62) 100%);
  z-index: -1;
}
.final-cta-grid {
  display: grid; grid-template-columns: 1fr 1.05fr;
  gap: clamp(2rem, 5vw, 4.5rem);
  align-items: center;
}
.final-cta h2 {
  color: var(--on-dark);
  margin-bottom: 1.1rem;
  max-width: 14ch;
}
.final-cta-sub {
  font-size: 1.05rem; color: var(--on-dark-body);
  line-height: 1.75;
  margin-bottom: 2rem; max-width: 40ch;
}
.final-cta-list {
  list-style: none; margin: 0 0 2.25rem; padding: 0;
  display: grid; gap: 0.85rem;
}
.final-cta-list li {
  position: relative; padding-left: 1.75rem;
  font: 500 0.85rem/1.5 var(--font-body);
  letter-spacing: 0.02em;
  color: var(--on-dark-body);
}
.final-cta-list li::before {
  content: "\2014"; position: absolute; left: 0; top: 0;
  width: auto; height: auto; border-radius: 0;
  background: none;
  display: inline; align-items: initial; justify-content: initial;
  font-size: 0.85rem; font-weight: 400; color: var(--brand-200);
}
.trip-form-card {
  background: oklch(1 0 0);
  border-radius: var(--radius-lg);
  padding: clamp(1.75rem, 3vw, 2.5rem);
  box-shadow: 0 30px 70px oklch(0.1 0.01 55 / 0.4);
}
.form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; }

/* ============ Formularios ============ */

.trip-form { display: grid; gap: 1rem; }
.trip-form label {
  display: grid; gap: 0.4rem;
  font: 600 0.8rem/1.2 var(--font-body);
  color: var(--ink);
  text-align: left;
}
/* display:grid outranks the browser's own [hidden] rule, so a field hidden by
   scripting stayed on screen and kept its row in the form's grid. The
   conditional fields on the contact form depend on this. */
.trip-form label[hidden],
.trip-form [hidden] { display: none; }
.trip-form input,
.trip-form select,
.trip-form textarea {
  border-color: var(--line);
  transition: border-color 200ms ease-out, box-shadow 200ms ease-out;
}
.trip-form input:invalid,
.trip-form select:invalid,
.trip-form textarea:invalid {
  border-color: oklch(0.55 0.2 25);
  box-shadow: 0 0 0 3px oklch(0.55 0.2 25 / 0.12);
}
.trip-form input,
.trip-form textarea,
.trip-form select {
  font: 400 0.95rem/1.4 var(--font-body);
  color: var(--ink);
  padding: 0.65rem 0.8rem;
  border: 1px solid var(--line);
  border-radius: var(--radius-btn);
  background: oklch(1 0 0);
  transition: border-color var(--t-fast) var(--ease-out-expo);
}
.trip-form select { cursor: pointer; }
.trip-form select:invalid { color: var(--ink-muted); }
.trip-form input:focus,
.trip-form textarea:focus,
.trip-form select:focus {
  outline: none; border-color: var(--blue-brand);
  box-shadow: 0 0 0 3px oklch(0.45 0.12 250 / 0.12);
}
.trip-form textarea { resize: vertical; }
.form-success {
  font: 600 0.9rem/1.4 var(--font-body); color: oklch(0.45 0.14 155);
  background: oklch(0.95 0.04 155);
  border-radius: var(--radius-btn);
  padding: 0.75rem 1rem;
  display: flex; align-items: center; gap: 0.5rem;
  animation: fadeUp 300ms var(--ease-out-expo) both;
}
.form-success::before {
  content: "\2713";
  width: 22px; height: 22px; border-radius: 50%;
  background: oklch(0.45 0.14 155);
  color: oklch(1 0 0); font-size: 0.7rem; font-weight: 700;
  display: flex; align-items: center; justify-content: center;
  flex-shrink: 0;
}
/* The short confirmation is a single green line with a tick. The deck asks for
   a real reply instead — a heading, what happens next, and somewhere to go
   while waiting — which is a panel, not a line, so it drops the row layout and
   moves the tick out of the way of the heading. */
.form-success-rich {
  display: block;
  padding: clamp(1.25rem, 2.5vw, 1.75rem);
  font: 400 0.9rem/1.6 var(--font-body);
  color: var(--ink-body);
  text-align: left;
}
.form-success-rich::before { display: none; }
.form-success-rich h3 {
  font-family: var(--font-display);
  font-size: clamp(1.25rem, 2vw, 1.6rem);
  font-weight: 430; letter-spacing: -0.02em;
  color: oklch(0.42 0.13 155);
  margin-bottom: 0.6rem;
}
.form-success-rich h3::before {
  content: "\2713";
  display: inline-flex; align-items: center; justify-content: center;
  width: 22px; height: 22px; margin-right: 0.55rem;
  border-radius: 50%;
  background: oklch(0.45 0.14 155);
  color: oklch(1 0 0);
  font-size: 0.7rem; font-weight: 700;
  vertical-align: 0.12em;
}
.form-success-rich p + p { margin-top: 0.6rem; }
.form-success-actions {
  display: flex; flex-wrap: wrap; gap: 0.6rem;
  margin-top: 1.1rem;
}

@keyframes fadeUp {
  from { opacity: 0; transform: translateY(6px); }
  to { opacity: 1; transform: none; }
}
.trip-form-card .form-success { margin-top: 0.4rem; }

/* ============ Certificaciones ============ */

.certs {
  border-top: 1px solid var(--line-soft);
  /* Was its own clamp, which put the seam below it at 218px — the only gap on
     the site that was not a combination of the three rhythm tokens. */
  padding-block: var(--section-y-sm);
  text-align: center;
  background: var(--bg-page);
}
.certs-title {
  font: 500 0.68rem/1 var(--font-body);
  letter-spacing: 0.2em; text-transform: uppercase;
  color: var(--ink-muted);
  margin: 0 auto 2.25rem;
}
.certs-carousel {
  overflow: hidden;
  -webkit-mask-image: linear-gradient(90deg, transparent, black 8%, black 92%, transparent);
  mask-image: linear-gradient(90deg, transparent, black 8%, black 92%, transparent);
}
.certs-track {
  display: flex; align-items: center;
  gap: clamp(2rem, 5vw, 3.5rem);
  width: max-content;
  padding-right: clamp(2rem, 5vw, 3.5rem);
  animation: marquee 32s linear infinite;
}
.certs-track img {
  height: 44px; width: auto;
  filter: grayscale(1); opacity: 0.4;
  transition: filter 500ms var(--ease-out-expo),
              opacity 500ms var(--ease-out-expo);
}
@media (hover: hover) and (pointer: fine) {
  .certs-carousel:hover .certs-track { animation-play-state: paused; }
  .certs-track img:hover { filter: none; opacity: 1; }
}

/* ============ Footer — oscuro ============ */

.site-footer {
  background: var(--bg-dark);
  color: var(--on-dark-muted);
  padding-block: clamp(3rem, 6vw, 4.5rem) 1.5rem;
  font-size: 0.85rem;
}
.footer-top {
  display: flex; align-items: center; justify-content: space-between;
  gap: clamp(1.5rem, 3vw, 2rem); flex-wrap: wrap;
  padding-bottom: clamp(2rem, 4vw, 3rem);
  margin-bottom: clamp(2rem, 4vw, 3rem);
  border-bottom: 1px solid oklch(1 0 0 / 0.1);
}
.footer-tagline {
  font-family: var(--font-display);
  font-size: clamp(1.5rem, 3vw, 2.2rem);
  font-weight: 400; line-height: 1.25;
  color: var(--on-dark);
}
.footer-tagline em { font-weight: 600; color: var(--brand-200); }
.footer-main {
  display: grid;
  grid-template-columns: 1.6fr repeat(3, 1fr) 1.3fr;
  gap: clamp(1.75rem, 3vw, 3rem) clamp(1.5rem, 2.5vw, 2.5rem);
  align-items: start;
}
@media (max-width: 1100px) {
  /* Brand across the top, the four columns in a row beneath it. */
  .footer-main { grid-template-columns: repeat(4, 1fr); }
  .footer-brand { grid-column: 1 / -1; max-width: 46ch; }
}
@media (max-width: 760px) { .footer-main { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 460px) { .footer-main { grid-template-columns: 1fr; } }
.footer-brand img { height: 44px; width: auto; margin-bottom: 0.9rem; }
.footer-brand p { color: var(--on-dark-muted); line-height: 1.9; }
.footer-col { display: grid; gap: 0.05rem; align-content: start; }
.footer-col h2 {
  font: 600 0.78rem/1 var(--font-body);
  letter-spacing: 0.1em; text-transform: uppercase;
  color: var(--on-dark); margin: 0 0 0.6rem;
}
.footer-col a {
  color: var(--on-dark-muted); text-decoration: none;
  line-height: 1.7;
  display: inline-flex; align-items: center; gap: 0.5rem;
  transition: color var(--t-fast) var(--ease-out-expo);
}
.footer-col a svg { flex-shrink: 0; opacity: 0.7; }
@media (hover: hover) and (pointer: fine) {
  .footer-col a:hover { color: var(--on-dark); text-decoration: underline; text-underline-offset: 3px; }
}
.footer-bottom {
  display: flex; align-items: center; justify-content: space-between;
  gap: 1rem; flex-wrap: wrap;
  margin-top: clamp(2rem, 4vw, 3rem);
  padding-top: 1.25rem;
  border-top: 1px solid oklch(1 0 0 / 0.1);
  font-size: 0.75rem;
}
.footer-social { display: flex; gap: 0.9rem; }
.footer-social a {
  color: var(--on-dark-muted);
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 44px; min-height: 44px;
  padding: 0.5rem;
  transition: color var(--t-fast) var(--ease-out-expo),
              transform var(--t-fast) var(--ease-out-expo);
}
.footer-social a:active { transform: scale(0.94); }
@media (hover: hover) and (pointer: fine) {
  .footer-social a:hover { color: var(--on-dark); transform: translateY(-2px); }
}

/* ============ Capa de contacto persistente ============ */

.wa-float {
  position: fixed; right: 1.25rem; bottom: 1.25rem; z-index: 40;
  width: 56px; height: 56px;
  display: flex; align-items: center; justify-content: center;
  border-radius: 50%;
  background: var(--wa-green); color: white;
  box-shadow:
    0 4px 14px oklch(0.72 0.17 150 / 0.3),
    0 0 0 0 oklch(0.72 0.17 150 / 0.25);
  transition: transform var(--t-med) var(--ease-out-expo),
              box-shadow var(--t-med) var(--ease-out-expo);
  animation: waFloat 600ms var(--ease-out-expo) 1.5s both, waPulse 3s ease-in-out 2.5s infinite;
}
@keyframes waPulse {
  0%, 100% { box-shadow: 0 4px 14px oklch(0.72 0.17 150 / 0.3), 0 0 0 0 oklch(0.72 0.17 150 / 0.25); }
  50% { box-shadow: 0 4px 14px oklch(0.72 0.17 150 / 0.3), 0 0 0 8px oklch(0.72 0.17 150 / 0); }
}
@keyframes waFloat {
  from { opacity: 0; transform: scale(0.8) translateY(12px); }
  to { opacity: 1; transform: none; }
}
.wa-float:active { transform: scale(0.94); }
@media (hover: hover) and (pointer: fine) {
  .wa-float:hover { transform: translateY(-2px); }
}

.mobile-bar {
  display: none;
  position: fixed; inset: auto 0 0 0; z-index: 40;
  grid-template-columns: 1fr 1.4fr; gap: 1px;
  background: var(--line);
  border-top: 1px solid var(--line);
  box-shadow: 0 -4px 16px oklch(0.2 0.04 250 / 0.08);
}
/* Was a block with padding, so its text sat at the top of the cell. When the
   neighbour wrapped to two lines the row grew and this one's single line
   stayed up there, off centre against it. Centring both axes here means one
   cell's length stops moving the other's text. */
.mobile-bar a, .mobile-bar button {
  font: 600 0.9rem/1 var(--font-body);
  min-height: var(--mobile-bar-h);
  display: flex; align-items: center; justify-content: center;
  gap: 0.5rem;
  padding: 0.95rem 0.75rem; border: none;
  text-align: center; text-decoration: none; cursor: pointer;
}
/* It was white with green text — the inverse of the same button everywhere
   else on the site, which made one action look like two controls. */
.mobile-bar-wa { background: var(--wa-green); color: oklch(1 0 0); }
.mobile-bar-cta { background: var(--navy); color: var(--on-dark); }
.mobile-bar-cta:active, .mobile-bar-wa:active { opacity: 0.85; }

/* ============ Drawer ============ */

.drawer-overlay {
  position: fixed; inset: 0; z-index: 60;
  background: oklch(0.15 0.04 250 / 0.5);
  opacity: 0;
  transition: opacity var(--t-med) var(--ease-out-expo);
}
.drawer-overlay.is-open { opacity: 1; }

.drawer {
  position: fixed; top: 0; right: 0; bottom: 0; z-index: 61;
  width: min(420px, 100vw);
  background: var(--bg-page);
  padding: 3rem 2rem 2rem;
  overflow-y: auto;
  border-radius: var(--radius-card) 0 0 var(--radius-card);
  transform: translateX(100%);
  transition: transform 280ms var(--ease-out-expo);
}
.drawer.is-open { transform: translateX(0); }
.drawer h2 { font-size: 1.5rem; margin-bottom: 0.4rem; }
.drawer-sub { color: var(--ink-secondary); font-size: 0.9rem; margin-bottom: 1.5rem; }
.drawer-close {
  position: absolute; top: 0.6rem; right: 0.6rem;
  font-size: 1.7rem; line-height: 1;
  background: none; border: none; cursor: pointer; color: var(--ink-muted);
  min-width: 44px; min-height: 44px;
  display: flex; align-items: center; justify-content: center;
  transition: color var(--t-fast) var(--ease-out-expo);
}
@media (hover: hover) and (pointer: fine) {
  .drawer-close:hover { color: var(--ink); }
}
.drawer-wa {
  display: block; margin-top: 1.25rem;
  font: 600 0.88rem/1.3 var(--font-body);
  color: var(--wa-green); text-decoration: none;
}

/* ============ Destinations ============ */

.dest-feature {
  display: grid; grid-template-columns: 1.35fr 1fr;
  gap: clamp(1.75rem, 5vw, 4.5rem);
  align-items: center;
}
.dest-feature-media {
  display: block; overflow: hidden;
  border-radius: var(--radius-lg);
  background: var(--surface);
}
.dest-feature-media img {
  width: 100%; height: clamp(320px, 42vw, 560px); object-fit: cover;
  transition: transform 1400ms var(--ease-out-expo);
}
@media (hover: hover) and (pointer: fine) {
  .dest-feature-media:hover img { transform: scale(1.04); }
}
.dest-feature-body h3 {
  font-size: clamp(2rem, 3.6vw, 3rem);
  line-height: 1.05;
  letter-spacing: -0.03em;
  margin-bottom: 1rem;
}
.dest-feature-body > p {
  font-size: 1.02rem; line-height: 1.8;
  color: var(--ink-body); max-width: 42ch;
}
.dest-facts {
  list-style: none; margin: 2rem 0 0; padding: 1.75rem 0 0;
  border-top: 1px solid var(--line);
  display: flex; gap: clamp(1.5rem, 3vw, 2.75rem); flex-wrap: wrap;
}
.dest-facts li { display: flex; flex-direction: column; gap: 0.35rem; }
.dest-facts span {
  font: 500 0.64rem/1 var(--font-body);
  letter-spacing: 0.14em; text-transform: uppercase;
  color: var(--ink-muted);
}
.dest-facts strong {
  font-family: var(--font-display);
  font-size: 1.35rem; font-weight: 430; line-height: 1;
  color: var(--ink);
  font-variant-numeric: tabular-nums;
}

/* Mosaic: one tall, one wide, the rest even — deliberately not a uniform grid */
.dest-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-auto-rows: clamp(230px, 26vw, 300px);
  gap: clamp(0.6rem, 1.1vw, 1rem);
}
/* Only used where the card count tiles the grid — see destinos.html */
.dest-card-tall { grid-column: 1; grid-row: 1 / span 2; }
.dest-card-wide { grid-column: 2 / span 2; }
/* A grid with no tall card should not inherit the two-row height */
.dest-grid:not(:has(.dest-card-tall)) { grid-auto-rows: clamp(260px, 28vw, 340px); }

.dest-card {
  position: relative; display: block; overflow: hidden;
  border-radius: var(--radius-lg);
  background: var(--ground-deep);
  text-decoration: none; color: var(--on-dark);
}
.dest-card img {
  position: absolute; inset: 0;
  width: 100%; height: 100%; object-fit: cover;
  transition: transform 1400ms var(--ease-out-expo),
              opacity 700ms var(--ease-out-expo);
}
.dest-card::after {
  content: "";
  position: absolute; inset: 0;
  background: linear-gradient(0deg,
    oklch(0.15 0.012 259 / 0.92) 0%,
    oklch(0.15 0.012 259 / 0.44) 52%,
    oklch(0.15 0.012 259 / 0.05) 100%);
}
@media (hover: hover) and (pointer: fine) {
  .dest-card:hover img { transform: scale(1.06); opacity: 0.9; }
  .dest-card:hover .dest-card-cue { opacity: 1; transform: none; }
}
.dest-card-body {
  position: absolute; inset: auto 0 0 0; z-index: 1;
  padding: clamp(1.25rem, 2vw, 1.9rem);
  display: flex; flex-direction: column;
}
.dest-card-meta {
  font: 500 0.64rem/1 var(--font-body);
  letter-spacing: 0.15em; text-transform: uppercase;
  color: oklch(1 0 0 / 0.66);
  margin-bottom: 0.6rem;
  font-variant-numeric: tabular-nums;
}
.dest-card-body h3 {
  font-family: var(--font-display);
  font-weight: 430;
  font-size: clamp(1.3rem, 2vw, 1.75rem);
  letter-spacing: -0.02em;
  color: var(--on-dark);
  margin-bottom: 0.4rem;
}
.dest-card-tall .dest-card-body h3 { font-size: clamp(1.6rem, 2.5vw, 2.1rem); }
.dest-card-body p {
  font-size: 0.9rem; line-height: 1.6;
  color: oklch(1 0 0 / 0.78);
  max-width: 36ch;
}
.dest-card-cue {
  display: inline-block; margin-top: 1rem;
  font: 600 0.64rem/1 var(--font-body);
  letter-spacing: 0.16em; text-transform: uppercase;
  color: oklch(1 0 0);
  opacity: 0; transform: translateY(6px);
  transition: opacity 500ms var(--ease-out-expo),
              transform 500ms var(--ease-out-expo);
}
.dest-card-cue::after { content: " \2192"; }
@media (hover: none) { .dest-card-cue { opacity: 0.85; transform: none; } }

/* ============ Fact bar (destination / itinerary key numbers) ============ */

.meta-bar-section {
  background: var(--bg-page);
  border-bottom: 1px solid var(--line);
}
.fact-bar {
  list-style: none; margin: 0; padding: 0;
  display: grid; grid-template-columns: repeat(4, 1fr);
  padding-block: clamp(1.75rem, 3vw, 2.5rem);
  gap: 1.5rem;
}
.fact-bar li {
  display: flex; flex-direction: column; gap: 0.4rem;
  align-items: center; text-align: center;
  position: relative;
  /* The same inset on every item, so each column's content is centred in its
     own cell and the rule between them sits on the cell edge. */
  padding-inline: clamp(0.5rem, 1.5vw, 1.25rem);
}
.fact-bar li + li::before {
  content: "";
  position: absolute; left: 0; top: 0; bottom: 0;
  width: 1px; background: var(--line);
}
/* Label and value carry the same size. What separates them is the family,
   the weight and the colour, not the scale. */
.fact-bar span {
  display: inline-flex; align-items: center; justify-content: center;
  gap: 0.45rem;
  font: 500 clamp(0.85rem, 1.05vw, 1rem)/1.2 var(--font-body);
  letter-spacing: 0.1em; text-transform: uppercase;
  color: var(--ink-muted);
}
/* Drawn, one stroke weight, and never carrying meaning on their own: the
   label says what the number is, the mark only makes the row scannable. */
.fact-bar svg { flex: none; color: var(--brand-600); }
.fact-bar strong {
  font-family: var(--font-display);
  font-size: clamp(0.85rem, 1.05vw, 1rem);
  font-weight: 430; line-height: 1.15; color: var(--ink);
  font-variant-numeric: tabular-nums;
}

/* ============ Article layout (destination / blog body + aside) ============ */

.article-layout {
  display: grid; grid-template-columns: minmax(0, 1fr) clamp(260px, 26%, 340px);
  gap: clamp(2rem, 5vw, 4.5rem);
  align-items: start;
}
.article-body h2 { margin-bottom: 1.25rem; }
.article-body h3 {
  font-size: clamp(1.2rem, 1.8vw, 1.5rem);
  margin-top: 2.5rem; margin-bottom: 0.85rem;
}
/* :not(.eyebrow) — this rule is more specific than .eyebrow, so without the
   exclusion the eyebrow inside an article rendered at 16px instead of 0.68rem,
   and the label read as a paragraph. Same guard as .duo-body above. */
.article-body p:not(.eyebrow) {
  font-size: 1rem; line-height: 1.85; color: var(--ink-body);
  max-width: 66ch; margin-bottom: 1.15rem;
}
.lead-para {
  font-size: clamp(1.08rem, 1.5vw, 1.22rem);
  line-height: 1.75;
  color: var(--ink);
}
.article-aside {
  display: grid; gap: 1rem;
  position: sticky; top: calc(var(--header-h) + 1.5rem);
}
.aside-card {
  background: var(--surface);
  border-radius: var(--radius-lg);
  padding: clamp(1.4rem, 2vw, 1.85rem);
}
.aside-card h3 {
  font-family: var(--font-body);
  font-size: 0.72rem; font-weight: 600;
  letter-spacing: 0.15em; text-transform: uppercase;
  color: var(--ink-muted);
  margin-bottom: 1.1rem;
}
.aside-list { margin: 0; display: grid; gap: 0.85rem; }
.aside-list dt {
  font: 600 0.85rem/1.4 var(--font-body);
  color: var(--ink);
}
.aside-list dd {
  margin: 0.15rem 0 0;
  font-size: 0.88rem; line-height: 1.6; color: var(--ink-body);
}
.aside-card-cta {
  background: var(--ground-dark);
  color: var(--on-dark);
}
.aside-card-cta h3 {
  font-family: var(--font-display);
  font-size: 1.15rem; font-weight: 430;
  letter-spacing: -0.02em; text-transform: none;
  color: var(--on-dark);
  margin-bottom: 0.6rem;
}
.aside-card-cta p {
  font-size: 0.9rem; line-height: 1.65;
  color: var(--on-dark-body);
  margin-bottom: 1.25rem;
}
.aside-card-cta .btn-primary { background: oklch(1 0 0); color: var(--brand-900); }
@media (hover: hover) and (pointer: fine) {
  .aside-card-cta .btn-primary:hover { background: var(--btn-light-hover); color: var(--brand-900); }
}

/* ============ Spec grid (what you can personalise) ============ */

.spec-grid {
  display: grid; grid-template-columns: repeat(3, 1fr);
  gap: clamp(0.85rem, 1.6vw, 1.25rem);
}
/* A card, like every other card on the site. These were the last blocks still
   carrying border-top: 1px solid var(--ink) -- the rule taken off the value
   cards, which chopped the grid into strips -- with nothing else to hold them.
   The eight SDG items keep their numbers as the mark and take no chip: a
   numbered list does not need a second one. */
/* La tarjeta era --bg-page, es decir blanco. Sobre una seccion con fondo arena
   se lee; sobre una seccion plana, que no pinta nada, quedaba blanco sobre
   blanco y la tarjeta simplemente no existia: un icono y un texto flotando,
   que es lo que se veia en "Visit with curiosity".
   El filete interior la define en los dos suelos sin anadir otra banda de
   color, que es justo lo que Sandra no quiere ("si usas muchos [fondos] se ven
   como cortes de pantalla"). */
.spec-item {
  padding: clamp(1.4rem, 2.4vw, 1.9rem);
  background: var(--bg-page);
  border-radius: var(--radius-xl);
  box-shadow: inset 0 0 0 1px var(--line-soft);
}
.spec-item:only-child { background: var(--bg-page); }
.spec-item .icon-chip { margin-bottom: 1rem; }
.spec-item h3 {
  font-size: clamp(1.05rem, 1.5vw, 1.25rem);
  margin-bottom: 0.6rem;
}
.spec-item p {
  font-size: 0.94rem; line-height: 1.7; color: var(--ink-body);
}

/* ============ Insight — the company speaking in its own voice ============
   Used on destination, experience and itinerary pages so the product is
   framed by our judgement rather than presented as a catalogue entry.
   Deliberately not a card: a rule, a label, and set type. */

.insight {
  padding-top: clamp(1.5rem, 2.5vw, 2.25rem);
  margin-block: clamp(2.5rem, 5vw, 4rem);
  display: grid;
  grid-template-columns: clamp(150px, 20%, 220px) minmax(0, 1fr);
  gap: clamp(1.25rem, 3vw, 3rem);
}
/* Same guard as the suggestions panel: a block whose body is entirely
   placeholders drew its label alone in the middle of white space. */
.insight:not(:has(.insight-body > :not([data-tbc]))) { display: none; }
.insight-label {
  font: 600 0.66rem/1.5 var(--font-body);
  letter-spacing: 0.18em; text-transform: uppercase;
  color: var(--brand-600);
}
.insight-body > p {
  font-family: var(--font-display);
  font-weight: 380;
  font-size: clamp(1.15rem, 1.75vw, 1.5rem);
  line-height: 1.5;
  letter-spacing: -0.015em;
  color: var(--ink);
  max-width: 54ch;
  margin-bottom: 1rem;
}
.insight-body > p + p {
  font-family: var(--font-body);
  font-size: 0.98rem;
  line-height: 1.8;
  color: var(--ink-body);
  letter-spacing: 0;
}
.insight-sig {
  display: flex; align-items: center; gap: 0.7rem;
  margin-top: 1.5rem;
  font: 500 0.72rem/1.4 var(--font-body);
  letter-spacing: 0.1em; text-transform: uppercase;
  color: var(--ink-muted);
}
.insight-sig::before {
  content: ""; width: 1.75rem; height: 1px;
  background: var(--brand-600); flex: 0 0 auto;
}
/* On dark grounds */
.how .insight, .duo-dark .insight { border-top-color: var(--brand-200); }
.how .insight-label, .duo-dark .insight-label { color: var(--brand-200); }
.how .insight-body > p, .duo-dark .insight-body > p { color: var(--on-dark); }
.how .insight-body > p + p, .duo-dark .insight-body > p + p { color: var(--on-dark-body); }

/* Awaiting the client's own words */
.insight-pending .insight-body > p {
  color: var(--ink-muted);
  font-style: italic;
}
.insight-pending .insight-label { color: var(--ink-muted); }

/* ============ Team ============
   Names, roles and bios are placeholders until the client supplies them.
   Placeholder state is styled to read as unfinished on purpose, so it can
   never be mistaken for real content in review. */

.team-grid {
  display: grid; grid-template-columns: repeat(4, 1fr);
  gap: clamp(1.25rem, 2.5vw, 2rem);
}
.team-grid-3 { grid-template-columns: repeat(3, 1fr); }
.team-card { margin: 0; }
.team-photo {
  position: relative;
  overflow: hidden;
  border-radius: var(--radius-lg);
  background: var(--surface);
  margin-bottom: 1.25rem;
}
.team-photo img {
  width: 100%; height: clamp(240px, 24vw, 320px);
  object-fit: cover;
  transition: transform 1400ms var(--ease-out-expo);
}
@media (hover: hover) and (pointer: fine) {
  .team-card:hover .team-photo img { transform: scale(1.04); }
}
/* Awaiting a real portrait: desaturate and label it */
.team-photo[data-placeholder] img { filter: grayscale(1) contrast(0.85); opacity: 0.4; }
.placeholder-tag {
  position: absolute; inset: auto 0 0 0;
  padding: 0.55rem 0.85rem;
  font: 600 0.6rem/1 var(--font-body);
  letter-spacing: 0.14em; text-transform: uppercase;
  color: var(--ink-secondary);
  background: oklch(1 0 0 / 0.86);
  text-align: center;
}
.team-name {
  font-family: var(--font-display);
  font-size: clamp(1.05rem, 1.5vw, 1.25rem);
  font-weight: 430; letter-spacing: -0.02em;
  color: var(--ink);
  margin-bottom: 0.3rem;
}
.team-role {
  font: 600 0.66rem/1.4 var(--font-body);
  letter-spacing: 0.15em; text-transform: uppercase;
  color: var(--brand-600);
  margin-bottom: 0.65rem;
}
.team-bio {
  font-size: 0.9rem; line-height: 1.65;
  color: var(--ink-body);
}
/* Bracketed copy is placeholder copy — make that unmistakable */
.team-name, .team-role, .team-bio { color: var(--ink-muted); }
.team-name { font-weight: 600; }

/* ============ Contact ============ */

/* Peru keeps one offset all year, so this strip is the whole answer to "when
   can I call". It sits under the cards as their footnote, not as a section. */
/* Sandra: "quita la linea superior y usa iconos". El filete de arriba era lo
   unico que sujetaba el bloque, y una raya no es una marca. Con su icono cada
   dato se reconoce antes de leerlo y la raya sobra. */
.contact-hours {
  margin-top: clamp(1.5rem, 3vw, 2.5rem);
  border-top: 0;
  padding-top: 0;
}
/* Sandra: "estan muy pequenos". Estaban: un trazo de 22px encima de un valor
   de 16 se lee como una mota, no como una marca. A 30 tiene el peso del dato
   que encabeza. */
.trio-ic {
  display: inline-flex; align-items: center; justify-content: center;
  width: 30px; height: 30px;
  margin-inline: auto;
  margin-bottom: 0.8rem;
  color: var(--accent);
}
.trio-ic svg { width: 30px; height: 30px; }
.contact-hours .trio-val { font-size: 1rem; line-height: 1.4; }
.contact-hours a { color: inherit; text-decoration: none; }
@media (hover: hover) and (pointer: fine) {
  .contact-hours a:hover { text-decoration: underline; }
}

/* ============ Form extras ============ */

.form-fieldset { border: none; margin: 0; padding: 0; }
.form-fieldset legend {
  font: 600 0.8rem/1.2 var(--font-body);
  color: var(--ink);
  padding: 0; margin-bottom: 0.7rem;
}
.form-fieldset legend span {
  font-weight: 400; color: var(--ink-muted);
  text-transform: none; letter-spacing: 0;
}
.chip-group { display: flex; flex-wrap: wrap; gap: 0.5rem; }
.chip { display: inline-flex; cursor: pointer; }
.chip input {
  position: absolute; opacity: 0;
  width: 1px; height: 1px; margin: 0;
}
.chip span {
  display: inline-block;
  padding: 0.55rem 0.95rem;
  font: 500 0.82rem/1 var(--font-body);
  color: var(--ink-body);
  border: 1px solid var(--line);
  border-radius: 100px;
  transition: all 300ms var(--ease-out-expo);
}
.chip input:checked + span {
  background: var(--brand-900);
  border-color: var(--brand-900);
  color: var(--on-dark);
}
.chip input:focus-visible + span {
  outline: 2px solid var(--brand-600);
  outline-offset: 2px;
}
@media (hover: hover) and (pointer: fine) {
  .chip:hover span { border-color: var(--brand-600); color: var(--brand-600); }
  .chip input:checked + span { color: var(--on-dark); }
  .chip:hover input:checked + span { background: var(--brand-700); border-color: var(--brand-700); }
}
.form-note {
  font-size: 0.78rem; color: var(--ink-muted);
  text-align: center; margin-top: -0.25rem;
}
/* "Optional" beside a field label. Deck, CONTACT US and TAILOR MADE both mark
   fields this way; without a weight change it reads as part of the label. */
.label-opt { font-weight: 400; color: var(--ink-muted); }
.form-consent {
  font-size: 0.72rem; line-height: 1.55;
  color: var(--ink-muted);
  text-align: center;
  margin-top: -0.4rem;
}

/* ============ Páginas interiores ============ */

.page-hero {
  position: relative;
  /* Same fault as .hero, same remedy: a floor, not a fixed height. */
  min-height: max(300px, min(46svh, 420px));
  display: flex; align-items: flex-end;
  overflow: hidden;
}
.page-hero-short { min-height: max(260px, min(38svh, 340px)); }

.page-hero > img {
  position: absolute; inset: 0;
  width: 100%; height: 100%; object-fit: cover;
}
.page-hero-content {
  position: relative; width: 100%;
  padding-top: calc(var(--header-h) + 1rem);
  padding-bottom: 2rem;
  color: var(--on-dark);
  text-align: center;
}
.page-hero .hero-sub { margin-inline: auto; }
.crumb {
  font: 600 0.75rem/1 var(--font-body);
  letter-spacing: 0.08em; text-transform: uppercase;
  color: oklch(1 0 0 / 0.8);
  text-decoration: none;
  display: inline-block; margin-bottom: 1.2rem;
  position: relative;
  z-index: 2;
}
/* Was clamping smaller than a body h2 (ratio 0.82), inverting the hierarchy. */
.page-hero h1 {
  font-size: clamp(2.4rem, 5.4vw, 4.2rem);
  line-height: 1.04;
  letter-spacing: -0.032em;
  font-weight: 400; color: oklch(1 0 0);
}
.page-hero .hero-sub { margin-bottom: 0; margin-top: 0.5rem; }
/* Zero below is right where the subtitle ends the hero. On the pages that
   put buttons under it, the two were touching. */
.page-hero .hero-sub + .hero-actions { margin-top: clamp(1.5rem, 3vw, 2.25rem); }

.page-intro {
  font-size: 1.05rem; color: var(--ink-body);
  line-height: 1.75; max-width: 46rem;
}
.wrap > .page-intro {
  margin-inline: auto;
  text-align: center;
}

/* A centred wrapping row sizes every item to its own text, so one long value
   drags the whole strip out of line: 129, 167, 230 on one row and 444, 199 on
   the next. Equal columns instead, and a long value wraps inside its own cell
   rather than pushing the others around. */
.meta-bar {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 11.5rem), 1fr));
  gap: clamp(1rem, 2.4vw, 2rem);
  align-items: start;
  padding: 1.4rem 0;
  border-bottom: 1px solid var(--line);
}
.meta-bar > div {
  display: flex; align-items: flex-start; gap: 0.7rem;
  font-size: 0.8rem; color: var(--ink-muted);
  min-width: 0;
}
.meta-bar > div > span:last-child { min-width: 0; }
/* Sandra, senalando la barra del itinerario: "manten ese estilo del azul, ese
   es la referencia". Esta es la excepcion deliberada a "los iconos sin fondo":
   en la barra de datos el disco azul es lo que separa un dato del siguiente
   cuando van cinco en una fila sin filetes entre ellos. En tarjetas y filas el
   icono sigue desnudo. */
.meta-ic {
  display: inline-flex; align-items: center; justify-content: center;
  width: 38px; height: 38px; border-radius: 50%;
  background: var(--brand-050);
  color: var(--brand-700);
  flex-shrink: 0;
}
.meta-ic svg { width: 15px; height: 15px; }
.meta-bar strong {
  display: block;
  font: 600 0.95rem/1.4 var(--font-body);
  color: var(--ink);
}

.days {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 2rem;
}
.day {
  display: grid; grid-template-columns: 3.4rem 1fr;
  gap: 1.25rem;
  padding: 1.6rem 0;
  border-top: none;
  transition: background-color var(--t-med) var(--ease-out-expo);
  border-radius: var(--radius-btn);
  margin-inline: -0.5rem;
  padding-inline: 0.5rem;
}
.day:nth-child(n+3) {
  border-top: 1px solid var(--line);
}
@media (hover: hover) and (pointer: fine) {
  .day:hover { background: oklch(0.97 0.004 250); }
}
.day-num {
  font-family: var(--font-display);
  font-size: 0.95rem; color: var(--brand-600);
}
.day h3 { font-size: 1.05rem; margin-bottom: 0.4rem; }
.day p { font-size: 0.93rem; color: var(--ink-body); line-height: 1.7; max-width: 56ch; }

.levels {
  display: grid; grid-template-columns: repeat(3, 1fr);
  gap: 1rem;
  align-items: start;
}
.level-card {
  background: oklch(1 0 0);
  border: 1px solid var(--line);
  border-radius: var(--radius-card);
  padding: 1.75rem;
  position: relative;
  overflow: hidden;
  transition: transform var(--t-slow) var(--ease-out-expo),
              box-shadow var(--t-slow) var(--ease-out-expo);
}
.level-card.is-featured {
  border-color: var(--brand-600);
  box-shadow: 0 10px 32px oklch(0.2 0.06 250 / 0.14);
}
.level-card.is-featured::before {
  content: "";
  position: absolute; top: 0; left: 0; right: 0; height: 3px;
  background: var(--brand-600);
}
@media (hover: hover) and (pointer: fine) {
  .level-card:hover {
    transform: translateY(-4px);
    box-shadow: 0 16px 32px oklch(0.2 0.06 250 / 0.14);
  }
}
.level-tag {
  font: 600 0.7rem/1 var(--font-body);
  letter-spacing: 0.12em; text-transform: uppercase;
  color: var(--brand-600);
  display: block; margin-bottom: 0.5rem;
}
.level-card h3 { margin-bottom: 0.7rem; }
.level-card ul {
  list-style: none; margin: 0; padding: 0;
  display: grid; gap: 0.45rem;
}
.level-card li {
  position: relative; padding-left: 1.4rem;
  font-size: 0.88rem; color: var(--ink-body);
}
.level-card li::before {
  content: "\2713"; position: absolute; left: 0;
  font-weight: 700; color: var(--brand-600);
}

.cols-2 {
  display: grid; grid-template-columns: 1fr 1fr;
  gap: clamp(8rem, 20vw, 12rem);
  align-items: start;
  text-align: left;
  max-width: 1000px;
  margin-inline: auto;
  padding: 2rem;
}
.check-list, .cross-list {
  list-style: none; margin: 0; padding: 0;
  display: grid; gap: 0.5rem;
}
.check-list li, .cross-list li {
  position: relative; padding-left: 1.6rem;
  font-size: 0.95rem; line-height: 1.6;
  /* Was a hard-coded #ffffff. This list was built for the dark "What's
     included" band, so reusing it on a light section rendered white on white —
     invisible, and valid markup, so nothing flagged it. It inherits now, and
     the dark contexts set their own colour below. */
  color: var(--ink-body);
}
.check-list li strong { color: var(--ink); font-weight: 600; }
.check-list li + li, .cross-list li + li { margin-top: 0.55rem; }

.section-dark .check-list li, .section-dark .cross-list li,
.how .check-list li, .duo-dark .check-list li { color: var(--on-dark-body); }
.section-dark .check-list li strong { color: var(--on-dark); }

/* Sandra: "no quiero que uses aspas, quiero que uses iconos en todo donde haya
   aspas". El aspa era un caracter de texto pintado de un verde -- #5c9118 --
   que no esta en la paleta de la marca ni en ninguna otra. Ahora es una marca
   dibujada, con el mismo trazo que el resto de los iconos y en el color de
   acento. Va como mascara y no como imagen de fondo para que el color siga
   siendo CSS: asi hereda el blanco cuando la pieza se pinta de naranja al
   pasar el raton, cosa que un SVG incrustado no haria. */
.check-list li::before,
.cross-list li::before {
  content: "";
  position: absolute; left: 0; top: 0.3em;
  width: 1.05em; height: 1.05em;
  background-color: var(--accent);
  -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat;
  -webkit-mask-position: center; mask-position: center;
  -webkit-mask-size: contain; mask-size: contain;
}
.check-list li::before { -webkit-mask-image: var(--mark-check); mask-image: var(--mark-check); }
.cross-list li::before { -webkit-mask-image: var(--mark-cross); mask-image: var(--mark-cross); }
/* Sobre suelo oscuro la marca se aclara con el texto. */
.section-dark .check-list li::before,
.section-dark .cross-list li::before,
.how .check-list li::before,
.duo-dark .check-list li::before { background-color: var(--accent-soft); }

.prose {
  max-width: 55rem;
  margin-inline: auto;
  text-align: left;
  padding-inline: var(--pad-x);
}
.prose p { font-size: 0.98rem; color: var(--ink-body); line-height: 1.8; margin-bottom: 1.1rem; max-width: none; text-wrap: pretty; }
.prose h2 { font-size: 1.45rem; margin-top: 2.25rem; margin-bottom: 0.8rem; }
.prose ul {
  margin: 0 auto 1.1rem; padding-left: 1.2rem;
  color: var(--ink-body);
  display: inline-block; text-align: left;
  max-width: 36rem;
}
.prose li { margin-bottom: 0.4rem; font-size: 0.98rem; line-height: 1.7; }

/* ============ Precio destacado ============ */

/* ============ Section heading accent ============
   The multicolour dashed rule was removed at the client's request
   ("este diseño de líneas no siento que sume a la página"). */

/* ============ Trending — Lo que se vende ============ */

/* Editorial "what's selling" board: one feature + two stacked.
   Deliberately a different visual language from `.itin` — text sits
   *on* the photograph here, rather than beside it. */
/* Light ground so this doesn't merge with the dark CTA band above and the
   dark process band below — the photo cards carry the contrast themselves. */
.trending-section {
  padding-block: var(--section-y);
  color: var(--ink);
}
.trending-head {
  text-align: center;
  margin-bottom: clamp(2.25rem, 4vw, 3.25rem);
}
.trending-head .eyebrow {
  justify-content: center;
  color: var(--accent);
}
.trending-head h2 { color: var(--ink); margin-bottom: 0; }
.trending-head h2 em { color: var(--brand-600); }

.trending-grid {
  display: grid; grid-template-columns: 1.4fr 1fr;
  gap: clamp(0.6rem, 1.1vw, 1rem);
  margin-top: 0;
}
.trending-stack {
  display: grid; grid-template-rows: 1fr 1fr;
  gap: clamp(0.6rem, 1.1vw, 1rem);
}

.trending-card {
  position: relative;
  display: block;
  overflow: hidden;
  border-radius: var(--radius-lg);
  background: var(--stone);
  border: none;
  text-decoration: none;
  color: var(--on-dark);
  min-height: 220px;
  transition: none;
}
.trending-card-feature { min-height: clamp(420px, 46vw, 560px); }

.trending-card img {
  position: absolute; inset: 0;
  width: 100%; height: 100%; object-fit: cover;
  transition: transform 1400ms var(--ease-out-expo),
              opacity 700ms var(--ease-out-expo);
}
.trending-card::after {
  content: "";
  position: absolute; inset: 0;
  background: linear-gradient(0deg,
    oklch(0.13 0.012 259 / 0.92) 0%,
    oklch(0.13 0.012 259 / 0.45) 48%,
    oklch(0.13 0.012 259 / 0.05) 100%);
}
@media (hover: hover) and (pointer: fine) {
  .trending-card:hover img { transform: scale(1.06); opacity: 0.9; }
}

.trending-badge {
  display: inline-block;
  align-self: flex-start;
  font: 600 0.62rem/1 var(--font-body);
  letter-spacing: 0.18em; text-transform: uppercase;
  background: var(--accent-amber);
  color: var(--brand-900);
  padding: 0;
  margin-bottom: 0.85rem;
  border-radius: 0;
  position: static;
}
.trending-content {
  position: absolute; inset: auto 0 0 0;
  z-index: 1;
  display: flex; flex-direction: column;
  padding: clamp(1.3rem, 2.2vw, 2.25rem);
}
.trending-content h3 {
  font-family: var(--font-display);
  font-size: clamp(1.3rem, 2vw, 1.7rem);
  font-weight: 430;
  letter-spacing: -0.022em;
  margin-bottom: 0.55rem;
  color: var(--on-dark);
}
.trending-card-feature .trending-content h3 {
  font-size: clamp(1.9rem, 3.2vw, 2.75rem);
  margin-bottom: 0.85rem;
}
.trending-meta {
  display: flex; flex-wrap: wrap; gap: 0.6rem 1.1rem;
  font: 500 0.72rem/1 var(--font-body);
  color: oklch(1 0 0 / 0.72);
  text-transform: uppercase;
  letter-spacing: 0.13em;
  margin-bottom: 0;
  margin-top: 0.55rem;
  padding-top: 0.9rem;
  border-top: 1px solid oklch(1 0 0 / 0.2);
  font-variant-numeric: tabular-nums;
}
.trending-desc {
  font-size: 0.98rem; color: oklch(1 0 0 / 0.8);
  line-height: 1.7; flex-grow: 0;
  max-width: 42ch;
}
/* Secondary cards drop the description entirely — the feature carries the story */
.trending-stack .trending-desc { display: none; }

/* Value grid — now tailor-made.html's, not the home page's. The home page's
   value block was rebuilt as .value-spread; these rules stay because that
   page still renders a two-column grid of rule-topped cards. */
.value-grid {
  display: grid; grid-template-columns: repeat(2, 1fr);
  gap: clamp(2rem, 4vw, 3.25rem) clamp(2.5rem, 6vw, 5rem);
  max-width: 980px; margin-inline: auto;
}
/* No rule over each card. It was there to give a bare title-and-paragraph
   card an edge to sit on; with an icon above the title the card has its own
   anchor, and the rules only chopped the grid into strips. The column and row
   gaps do the separating. */
.value-card {
  text-align: left;
}
.value-card h3 {
  font-family: var(--font-display);
  font-size: clamp(1.2rem, 1.8vw, 1.5rem);
  font-weight: 430;
  letter-spacing: -0.02em;
  margin-bottom: 0.75rem;
  color: var(--ink);
}
.value-card p {
  font-size: 0.98rem;
  color: var(--ink-body);
  line-height: 1.78;
  max-width: 42ch;
}

/* ============ Propuesta de Valor ============
   The four values sit as one column beside the heading and its copy, each with
   its icon to the left of the title and caption.

   Flex with a .value-text wrapper, not grid placement: the icon, the title and
   the caption were siblings, so every attempt to lay them out directly left
   each band sized to its own content and centred, and the four bands started
   at four different x positions. Wrapping the copy makes each band exactly two
   children, so the icons share one left edge by construction.

   Icons are drawn at the site's own weight (24 viewBox, 1.5 stroke) so they
   sit with the arrows and check marks already on the page. */

.value-section {
  padding-block: var(--section-y-lg);
  background: var(--bg-page);
}
.value-spread {
  display: grid;
  grid-template-columns: minmax(0, 0.88fr) minmax(0, 1fr);
  gap: clamp(2.5rem, 5vw, 5rem);
  align-items: start;
}
.value-head .eyebrow { justify-content: flex-start; }
/* Left column: everything shares one left edge. The eyebrow still carried
   margin-inline:auto from the centred version, which inset it 15px past the
   heading, and the microcopy still carried a centre. */
.value-head .eyebrow,
.value-head .value-intro { margin-inline: 0; }
.value-head .value-micro { text-align: left; }
.value-section h2 { margin-bottom: 1.15rem; max-width: 16ch; }
.value-intro {
  font-size: clamp(1.02rem, 1.4vw, 1.18rem);
  color: var(--ink-body);
  line-height: 1.75;
  max-width: 46ch;
  margin: 0 0 clamp(1.75rem, 3vw, 2.4rem);
}
.value-head .value-micro { margin: 1rem 0 0; max-width: none; }

.value-items {
  list-style: none; margin: 0; padding: 0;
  display: grid;
  gap: clamp(1.6rem, 2.6vw, 2.1rem);
}
.value-item {
  display: flex;
  align-items: flex-start;
  gap: clamp(1rem, 1.8vw, 1.35rem);
}
/* No disc behind the glyph. It was a 3rem circle of --brand-050 built to give
   a 22px mark some presence; against a page that has no other filled circle
   on it, it read as a button that could not be pressed. The mark stands on
   its own at the size the card icons already use, and the flex gap beside it
   does what the disc's padding was doing. --accent-orange lands at 2.45:1
   here; the terracotta is 4.65:1 and is already the eyebrow's colour. */
.value-icon {
  flex: 0 0 auto;
  display: inline-flex; align-items: center; justify-content: center;
  width: 26px; height: 26px;
  color: var(--accent);
}
.value-icon svg { width: 26px; height: 26px; }
.value-text { min-width: 0; }
.value-item h3 {
  font-family: var(--font-display);
  font-size: clamp(1.02rem, 1.3vw, 1.16rem);
  font-weight: 500;
  letter-spacing: -0.015em;
  line-height: 1.35;
  margin-bottom: 0.3rem;
  color: var(--ink);
}
.value-item p {
  font-size: 0.94rem;
  color: var(--ink-body);
  line-height: 1.7;
  margin: 0;
}

@media (max-width: 900px) {
  .value-spread { grid-template-columns: 1fr; gap: clamp(2.25rem, 5vw, 3rem); }
  .value-section h2 { max-width: 20ch; }
  .value-intro { max-width: 58ch; }
  .value-items { max-width: 40rem; }
}

/* ============ Reveal on scroll ============ */

.reveal {
  opacity: 0;
  transform: translateY(26px);
  transition: opacity 1100ms var(--ease-out-expo) var(--d, 0s),
              transform 1100ms var(--ease-out-expo) var(--d, 0s);
}
.reveal.is-in { opacity: 1; transform: none; }

/* ============ Experience Cards (New) ============ */

.experience-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(340px, 1fr));
  gap: 2rem;
  margin-top: 2rem;
}

.experience-card {
  display: flex;
  flex-direction: column;
  background: var(--bg-page);
  border: 1px solid var(--line);
  border-radius: var(--radius-lg);
  overflow: hidden;
  transition: all var(--t-med) var(--ease-out-expo);
}

.experience-card:hover {
  border-color: var(--blue-brand);
  box-shadow: 0 8px 32px oklch(0.2 0.04 250 / 0.12);
  transform: translateY(-2px);
}

.exp-image {
  position: relative;
  width: 100%;
  height: 220px;
  overflow: hidden;
}

.exp-image img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform var(--t-med) var(--ease-out-expo);
}

.experience-card:hover .exp-image img {
  transform: scale(1.05);
}

.exp-content {
  display: flex;
  flex-direction: column;
  padding: 1.75rem;
  flex-grow: 1;
}

.exp-content h3 {
  font: 500 1.35rem/1.15 var(--font-display);
  color: var(--ink);
  margin-bottom: 0.35rem;
}

.exp-desc {
  font-size: 0.95rem;
  line-height: 1.65;
  color: var(--ink-body);
  margin-bottom: 1.25rem;
}

.exp-highlights {
  list-style: none;
  padding: 0;
  margin: 0 0 1.5rem;
  flex-grow: 1;
}

.exp-highlights li {
  font-size: 0.9rem;
  color: var(--ink-secondary);
  padding: 0.35rem 0;
  padding-left: 1.5rem;
  position: relative;
}

.exp-highlights li::before {
  content: "+";
  position: absolute;
  left: 0;
  color: var(--blue-brand);
  font-weight: 600;
}

.experience-card .link-arrow {
  margin-top: auto;
}

/* ============ Itinerary Grid (New) ============ */

.itinerary-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(360px, 1fr));
  gap: 2rem;
  margin-top: 2rem;
}

.itinerary-card {
  display: flex;
  flex-direction: column;
  background: var(--bg-page);
  border: 1px solid var(--line);
  border-radius: var(--radius-lg);
  overflow: hidden;
  transition: all var(--t-med) var(--ease-out-expo);
}

.itinerary-card:hover {
  border-color: var(--blue-brand);
  box-shadow: 0 12px 40px oklch(0.2 0.04 250 / 0.15);
  transform: translateY(-4px);
}

.itin-card-image {
  position: relative;
  width: 100%;
  height: 240px;
  overflow: hidden;
}

.itin-card-image img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform var(--t-med) var(--ease-out-expo);
}

.itinerary-card:hover .itin-card-image img {
  transform: scale(1.06);
}

.itin-badge {
  position: absolute;
  top: 1rem;
  right: 1rem;
  font: 600 0.75rem/1 var(--font-body);
  background: var(--accent-amber);
  color: var(--brand-900);
  padding: 0.45rem 0.85rem;
  border-radius: 20px;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  z-index: 2;
}

.itin-badge-featured {
  background: var(--blue-brand);
  color: var(--on-dark);
}

.itin-card-content {
  display: flex;
  flex-direction: column;
  padding: 1.75rem;
  flex-grow: 1;
}

.itin-card-content h3 {
  font: 500 1.35rem/1.15 var(--font-display);
  color: var(--ink);
  margin-bottom: 0.35rem;
}

.itin-meta-text {
  font: 600 0.85rem/1 var(--font-body);
  color: var(--ink-secondary);
  text-transform: uppercase;
  letter-spacing: 0.05em;
  margin-bottom: 0.75rem;
}

.itin-card-desc {
  font-size: 0.95rem;
  line-height: 1.65;
  color: var(--ink-body);
  margin-bottom: 1.25rem;
  flex-grow: 1;
}

.itin-card-highlights {
  list-style: none;
  padding: 0;
  margin: 0 0 1.5rem;
}

.itin-card-highlights li {
  font-size: 0.9rem;
  color: var(--ink-secondary);
  padding: 0.4rem 0;
  padding-left: 1.5rem;
  position: relative;
}

.itin-card-highlights li::before {
  content: "✓";
  position: absolute;
  left: 0;
  color: var(--blue-brand);
  font-weight: 600;
}

.itin-card-content .link-arrow {
  margin-top: auto;
}

.page-intro {
  max-width: 70ch;
  font-size: 1.05rem;
  line-height: 1.7;
  color: var(--ink-body);
  margin-bottom: 1rem;
}

/* ============ Reduced motion ============ */

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  .reveal { transform: none; transition-duration: 1ms; }
  .bento-card img, .itin-media img, .guide-card img, .duo-media img { transition: none; }
  .drawer { transition-duration: 1ms; }
  .hero-slide { transition-duration: 1ms; }
  .hero-slide.is-active img { animation: none; }
  .certs-track { animation: none; flex-wrap: wrap; justify-content: center; width: auto; }
  .hero-content h1, .page-hero h1, .hero-sub, .hero-actions,
  .hero-content .eyebrow, .page-hero .crumb { animation: none; }
  /* cueDrop ends at opacity 0 — without this the cue would vanish entirely */
  .guide-card { animation: none; }
  .hero-pause { display: none; }
  .wa-float { animation: none !important; }
  .form-success { animation: none; }
  .day:hover { transition: none; }
  .level-card { transition: none; }
}

/* ============ Responsive ============ */

@media (max-width: 1040px) {
  .section-head { grid-template-columns: 1fr; gap: 1.25rem; align-items: start; }  /* apiladas: no hay dos columnas que alinear */
  .section-head-lead { padding-bottom: 0; }
}

@media (max-width: 900px) {
  /* Tablet */
  .main-nav { display: none; }
  .nav-toggle { display: flex; margin-left: 0; }
  .header-actions { gap: 0.5rem; margin-left: auto; }
  .header-actions .btn { display: none; }

  /* All three stay visible on tablet; hiding a card to avoid an orphan
     costs the reader content, which is the worse trade. */
  .guides { grid-template-columns: repeat(2, 1fr); gap: 1.75rem; }

  /* Mosaic collapses to feature-over-pair-over-wide.
     grid-auto-rows sizes the implicit third row the wide card lands in. */
  .bento {
    grid-template-columns: 1fr 1fr;
    grid-template-rows: clamp(230px, 34vw, 300px) clamp(170px, 26vw, 220px);
    grid-auto-rows: clamp(170px, 26vw, 220px);
  }
  .bento-feature { grid-column: 1 / span 2; grid-row: 1; }
  .bento-wide { grid-column: 1 / span 2; grid-row: auto; }

  .experience-grid { grid-template-columns: repeat(2, 1fr); gap: 1.5rem; }
  .itinerary-grid { grid-template-columns: repeat(2, 1fr); gap: 1.5rem; }

  /* Feature-over-pair keeps the editorial hierarchy instead of 3 equal cards */
  .trending-grid { grid-template-columns: 1fr; }
  .trending-stack { grid-template-columns: 1fr 1fr; grid-template-rows: none; }
  .trending-card-feature { min-height: clamp(340px, 52vw, 440px); }

  .value-grid { grid-template-columns: 1fr; gap: 1.75rem; }
  .testimonial-grid { grid-template-columns: 1fr; gap: 2rem; max-width: 40rem; margin-inline: auto; }
  .footer-main { grid-template-columns: 1fr 1fr; row-gap: 1.5rem; }

  .duo-media img { height: clamp(300px, 42vw, 420px); aspect-ratio: 4 / 3; }
  .how-steps { grid-template-columns: 1fr 1fr; gap: 2.5rem; }
  .dest-feature { grid-template-columns: 1fr; gap: 1.75rem; }
  .dest-feature-media img { height: clamp(280px, 44vw, 400px); }
  .dest-grid { grid-template-columns: 1fr 1fr; grid-auto-rows: clamp(210px, 30vw, 260px); }
  .dest-card-tall { grid-column: 1 / span 2; grid-row: auto; }
  .dest-card-wide { grid-column: 1 / span 2; }
  .team-grid { grid-template-columns: 1fr 1fr; }
  .insight { grid-template-columns: clamp(130px, 24%, 180px) minmax(0, 1fr); gap: 1.5rem; }
  .contact-grid { grid-template-columns: 1fr 1fr; }
  .spec-grid { grid-template-columns: 1fr 1fr; }
  .fact-bar { grid-template-columns: 1fr 1fr; gap: 1.5rem 1rem; }
  .fact-bar li:nth-child(odd)::before { display: none; }
  /* No padding override here: the inset is symmetric now, and killing it
     on one side pulled those two columns 4-7px off their own centre. */
  .how-steps-4 { grid-template-columns: 1fr 1fr; }
  .article-layout { grid-template-columns: 1fr; }
  .article-aside { position: static; grid-template-columns: 1fr 1fr; display: grid; }
  .how-steps::before { display: none; }
  .final-cta-grid { grid-template-columns: 1fr; }
}

@media (max-width: 680px) {
  /* 48px against a bar that measures 60: the last 12px of every page sat
     under it. It is the bar's own height that has to clear. */
  body { padding-bottom: var(--mobile-bar-h); }

  /* Hero stays full-bleed and tall on mobile — it is the first impression */
  /* A floor, like the desktop rule: a phone held sideways is 390 wide and
     about 340 tall, and a fixed height there buries the headline. */
  .hero { min-height: clamp(540px, 100svh, 1000px); }
  .hero-content { padding-bottom: 6.5rem; }
  .hero-content h1 { max-width: 100%; }
  .hero-sub { margin-bottom: 2rem; }
  .hero-actions { width: 100%; }
  .hero-actions .btn { flex: 1 1 100%; }
  .hero-caption { display: none; }
  /* Two collisions here. The dots had been moved to the left edge to clear the
     floating WhatsApp bubble, but that bubble is hidden at this width and the
     pause button already owns that corner: measured at 390px they overlapped
     by 44px, the pause sitting on top of the first three dots. Pause left,
     dots right, as on the desktop. And both sat 35px inside the fixed bar at
     the foot of the screen, so both clear its height now. */
  /* Centred in the band between the buttons above and the bar below, rather
     than pushed against either: 25px of air one side and 15px the other read
     as crowding the bar. */
  .hero-pause { bottom: calc(var(--mobile-bar-h) + 1.4rem); }
  .hero-dots {
    bottom: calc(var(--mobile-bar-h) + 1.65rem);
    right: var(--pad-x); left: auto;
  }
  .hero-dots button { width: 26px; margin-left: 10px; margin-right: 0; }

  /* Trust: 2x2 so the figures stay large enough to read as claims */
  .trust-grid { grid-template-columns: 1fr 1fr; gap: 2.25rem 1rem; }
  .trust-item + .trust-item::before { display: none; }
  .trust-item:nth-child(even)::before {
    content: ""; display: block;
    position: absolute; left: -0.5rem; top: 50%;
    transform: translateY(-50%);
    width: 1px; height: 2.6rem; background: var(--line);
  }

  .bento {
    grid-template-columns: 1fr;
    grid-template-rows: none;
    gap: 0.6rem;
  }
  .bento-card { min-height: 210px; }
  .bento-feature { grid-column: 1; grid-row: auto; min-height: 300px; }
  .bento-wide { grid-column: 1; grid-row: auto; }

  .itin, .itin-reverse { grid-template-columns: 1fr; gap: 1.5rem; }
  .itin-reverse .itin-media { order: 0; }
  .itin-reverse .itin-body { order: 1; }
  .itin { margin-bottom: 3rem; }
  .itin-media img { height: clamp(250px, 62vw, 340px); }

  .how-steps { grid-template-columns: 1fr; gap: 2.25rem; }
  .how-steps::before { display: none; }
  /* The marker row owns this spacing now; putting it back on the numeral
     would drop it below the icon it is meant to sit beside. */
  .how-marker { margin-bottom: 0.9rem; }

  .duo-grid { grid-template-columns: 1fr; gap: 1.75rem; }
  .duo-dark .duo-media { order: 2; }
  .duo-media img { height: clamp(260px, 62vw, 340px); aspect-ratio: 4 / 3; }
  .stats-row { gap: 1.25rem; flex-wrap: wrap; }

  .certs-track img { height: 34px; }

  .guides { grid-template-columns: 1fr; gap: 2.25rem; }
  .guides-more { text-align: left; }
  .guide-categories { gap: 1.25rem; overflow-x: auto; flex-wrap: nowrap; }
  .guide-filter { white-space: nowrap; }

  .experience-grid { grid-template-columns: 1fr; }
  .itinerary-grid { grid-template-columns: 1fr; }

  .trending-grid { grid-template-columns: 1fr; }
  .trending-stack { grid-template-columns: 1fr; }
  .trending-card-feature { min-height: 380px; }

  .testimonial-lead blockquote { margin: 1.25rem 0 1.5rem; }

  .dest-feature { grid-template-columns: 1fr; gap: 1.5rem; }
  .dest-feature-media img { height: clamp(240px, 60vw, 320px); }
  .dest-facts { gap: 1.25rem 1.75rem; }
  .dest-grid { grid-template-columns: 1fr; grid-auto-rows: clamp(230px, 56vw, 280px); }
  .dest-card-tall, .dest-card-wide { grid-column: 1; grid-row: auto; }
    /* Two columns leaves the body column too narrow to set type in */
  .insight { grid-template-columns: 1fr; gap: 0.9rem; }
  .insight-label { margin-bottom: 0; }
  .team-grid { grid-template-columns: 1fr 1fr; gap: 1.25rem; }
  .team-photo img { height: clamp(180px, 44vw, 240px); }
  .contact-grid { grid-template-columns: 1fr; }
  .spec-grid { grid-template-columns: 1fr; gap: 1.5rem; }
  .fact-bar { grid-template-columns: 1fr 1fr; }
  .how-steps-4 { grid-template-columns: 1fr; }
  .article-layout { grid-template-columns: 1fr; gap: 2rem; }
  .article-aside { grid-template-columns: 1fr; position: static; }
  .page-hero-short { min-height: min(46svh, 300px); }
  .chip span { font-size: 0.78rem; padding: 0.5rem 0.8rem; }

  .final-cta-grid { grid-template-columns: 1fr; }
  .form-row { grid-template-columns: 1fr; }

  .day { grid-template-columns: 1fr; gap: 0.3rem; }
  .levels { grid-template-columns: 1fr; }
  .cols-2 { grid-template-columns: 1fr; }
  .meta-bar { gap: 1.25rem; }

  .footer-main { grid-template-columns: 1fr; }

  .mobile-bar { display: grid; }

  /* Botones más grandes en móvil */
  .btn {
    min-height: 50px;
    min-width: 48px;
    padding: clamp(0.85rem, 2vw, 1rem) clamp(1.1rem, 3vw, 1.5rem);
  }
  .wa-float { display: none; }
}

/* Days grid layout */

/* Inclusions grid layout */

.check-list,
.cross-list {
  list-style: none;
  padding: 0;
  margin: 0;
  display: flex;
  flex-direction: column;
  gap: 0.75rem;
}

/* ============ ACCESIBILIDAD: Respetar prefers-reduced-motion ============ */

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

/* ============ Accessibility pass ============ */

/* Disclosure button beside each nav link. Hover alone left the menu
   unreachable on touch, and its links tabbable while invisible. */
/* A closed menu must be out of the tab order, not merely invisible */
/* No :focus-within here — it kept the menu visible after Escape, because the
   disclosure button still holds focus. The button is the keyboard path. */

/* Touch targets: WCAG 2.5.5 asks for 44x44. Padding on the control itself
   is more reliable than an overlay, which the earlier pass only got to ~36px. */
.link-arrow  { padding-block: .85rem; min-height: 44px; align-items: center; }
.guide-filter{ padding-block: .95rem; min-height: 44px; }
/* Sandra: "que se vea continuo". El objetivo tactil de 44px -- nivel AAA --
   abria 50px por fila. Con raton basta el 24x24 del nivel AA: la caja de linea
   con un pelo de relleno da 29px. En tactil vuelve a 40. */
.footer-col a { padding-block: 0.15rem; min-height: 0; }
/* Por puntero y tambien por ancho: un movil que no declare puntero grueso
   seguiria con el objetivo de raton, y ahi el dedo si necesita los 40px. */
@media (pointer: coarse), (max-width: 680px) {
  .footer-col a { padding-block: 0.55rem; min-height: 40px; }
}

.brand { display: inline-flex; align-items: center; min-height: 44px; }
.testimonials-sub, .certs-title { line-height: 1.4; }

/* Focus: three components relied on the global outline, which disappears
   over photography and over the brand blue. */
.guide-filter:focus-visible,
.nav-toggle:focus-visible,
.nav-disclosure:focus-visible,
.trending-card:focus-visible,
.dest-card:focus-visible,
.bento-card:focus-visible {
  outline: 3px solid var(--brand-400);
  outline-offset: 3px;
  border-radius: 3px;
}
.trending-card:focus-visible,
.dest-card:focus-visible,
.bento-card:focus-visible {
  box-shadow: 0 0 0 3px oklch(1 0 0 / .9);
}

/* Form errors: a red border alone is invisible to anyone who cannot
   distinguish the colour, and silent to a screen reader. */
.field-error {
  margin-top: .4rem;
  font: 500 .8rem/1.5 var(--font-body);
  color: var(--form-error);
  display: flex; align-items: flex-start; gap: .35rem;
}
.field-error::before { content: "\26A0"; font-size: .9em; line-height: 1.4; }
.trip-form .is-invalid {
  border-color: var(--form-error);
  box-shadow: 0 0 0 3px oklch(0.55 0.19 27 / .14);
}
.trip-form button[aria-busy="true"] { opacity: .75; cursor: progress; }
.trip-form button:disabled { cursor: not-allowed; }
.form-success:focus { outline: 2px solid var(--brand-600); outline-offset: 3px; }

/* Mobile legibility: labels were rendering at 10.9px with 0.2em tracking. */
@media (max-width: 680px) {
  .eyebrow { font-size: .76rem; letter-spacing: .14em; }
  .hero-caption { font-size: .74rem; }
  .btn, .btn-label { font-size: .78rem; }
  .stat span, .trust-label, .dest-card-meta,
  .team-role, .guide-tag, .trending-badge, .insight-label,
  .testimonials-sub, .certs-title,   .link-arrow, .guide-filter { font-size: .78rem; }
  .form-note, .field-error { font-size: .8rem; }
  .bento-cue, .placeholder-tag, .itin-meta-clean,
  .hero-caption { font-size: .76rem; }
}

/* ============ 404 ============ */
.section-lost { padding-block: clamp(4rem, 12vh, 8rem) var(--section-y-lg); }
.section-lost h1 { font-size: clamp(2.2rem, 5vw, 3.6rem); margin-bottom: 1rem; }
.lost-lede { font-size: 1.05rem; line-height: 1.75; color: var(--ink-body); max-width: 46ch; }
.lost-links {
  display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 0; max-width: 780px;
  margin: clamp(2.5rem, 5vw, 3.75rem) 0 0;
  border-top: 1px solid var(--line);
}
.lost-link {
  display: grid; gap: .3rem;
  padding: 1.4rem 1.5rem 1.4rem 0;
  border-bottom: 1px solid var(--line);
  text-decoration: none;
  transition: padding-left 400ms var(--ease-out-expo), background-color 300ms var(--ease-out-expo);
}
.lost-link:nth-child(odd) { border-right: 1px solid var(--line); padding-right: 2rem; }
.lost-link:nth-child(even) { padding-left: 2rem; }
.lost-link-label {
  font-family: var(--font-display); font-weight: 430;
  font-size: clamp(1.15rem, 1.8vw, 1.4rem); letter-spacing: -.02em; color: var(--ink);
}
.lost-link-label::after { content: " \2192"; color: var(--brand-600); }
.lost-link-note { font-size: .92rem; line-height: 1.6; color: var(--ink-muted); }
@media (hover: hover) and (pointer: fine) {
  .lost-link:hover { padding-left: 1rem; }
  .lost-link:nth-child(even):hover { padding-left: 3rem; }
  .lost-link:hover .lost-link-label { color: var(--brand-600); }
}
.lost-help { margin-top: 2.5rem; font-size: .95rem; color: var(--ink-body); }
.lost-help a { color: var(--brand-600); }
@media (max-width: 680px) {
  .lost-links { grid-template-columns: 1fr; }
  .lost-link:nth-child(odd) { border-right: none; padding-right: 0; }
  .lost-link:nth-child(even) { padding-left: 0; }
  .lost-link:nth-child(even):hover { padding-left: 1rem; }
}

/* ============ Spacing utilities ============
   Replace the ad-hoc inline padding/margin that had accumulated on inner
   pages and made their vertical rhythm diverge from the system. */
.u-pt-0   { padding-top: 0; }
.u-pt-sm  { padding-top: clamp(1.25rem, 2vw, 1.75rem); }
.u-pb-0   { padding-bottom: 0; }
.u-mt-lg  { margin-top: clamp(2.5rem, 5vw, 3.5rem); }
.u-mb-md  { margin-bottom: clamp(1.5rem, 3vw, 2rem); }
.section-dark { background: var(--bg-dark); }
.section-dark h2, .section-dark h3 { color: var(--on-dark); }

/* Legacy card markup on inner pages carried its whole appearance inline. */
.legacy-card {
  text-decoration: none; color: var(--ink);
  display: flex; flex-direction: column; overflow: hidden;
  border-radius: var(--radius-lg);
  background: var(--bg-page); border: 1px solid var(--line);
  height: 100%;
  transition: border-color var(--t-med) var(--ease-out-expo),
              transform var(--t-med) var(--ease-out-expo);
}
@media (hover: hover) and (pointer: fine) {
  .legacy-card:hover { border-color: var(--brand-600); transform: translateY(-3px); }
}
.legacy-card > img { width: 100%; height: 240px; object-fit: cover; }
.legacy-card h3 { padding: 1.5rem 1.5rem .75rem; font-size: 1.1rem; margin: 0; }
.legacy-card p  { padding: 0 1.5rem 1.5rem; font-size: .95rem; line-height: 1.6; color: var(--ink-body); margin: 0; }
.lead-body { font-size: 1.02rem; line-height: 1.8; color: var(--ink-body); margin: 0 0 1rem; max-width: 70ch; }

.u-center { text-align: center; max-width: 800px; margin-inline: auto; }
/* The eyebrow is a flex row, so text-align on the parent does nothing to it. */
.u-center > .eyebrow { justify-content: center; }
.u-center-mb { text-align: center; margin-bottom: clamp(1.75rem, 3vw, 2.5rem); }
.media-tile { width: 100%; height: 220px; object-fit: cover; border-radius: var(--radius-lg); }
.media-tile-lg { width: 100%; height: 300px; object-fit: cover; border-radius: var(--radius-lg); margin-bottom: 1rem; }

/* Remaining one-off inline layout, collected into the system */
.u-narrow      { max-width: 900px; }
.u-mt-xl       { margin-top: clamp(2rem, 4vw, 3rem); }
.u-mt-xl-c     { margin-top: clamp(2rem, 4vw, 3rem); text-align: center; }
.u-mt-mb       { margin-top: clamp(1.75rem, 3vw, 2.5rem); margin-bottom: 1rem; }
.u-mb-c        { margin-bottom: clamp(1.5rem, 3vw, 2rem); text-align: center; }
.u-mb-xs       { margin-bottom: .5rem; }
.u-center-x    { justify-content: center; }
.u-h2-alt      { font-size: clamp(1.75rem, 3.2vw, 2.6rem); margin-bottom: 1.5rem; }
.u-lede        { font-size: 1.08rem; line-height: 1.8; margin-bottom: 1rem; }
.u-lede-2      { font-size: 1.05rem; line-height: 1.8; margin-bottom: 1.5rem; color: var(--ink-body); }
.u-body-wide   { font-size: 1.02rem; line-height: 1.8; color: var(--ink-body); margin: 0; max-width: 70ch; }
.u-body-muted  { font-size: .98rem; line-height: 1.8; color: var(--ink-muted); margin-bottom: 2rem; }
.u-grid-3      { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1.5rem; }
.u-grid-2      { display: grid; grid-template-columns: repeat(2, 1fr); gap: 1rem; }
.u-row-center  { display: flex; gap: 1rem; justify-content: center; flex-wrap: wrap; }
.u-row-center-sp { display: flex; gap: 1rem; justify-content: center; flex-wrap: wrap; margin-top: clamp(2.5rem, 6vw, 5rem); margin-bottom: 2rem; }
.u-body-65     { color: var(--ink-body); margin-bottom: 3rem; max-width: 65ch; }
.u-body-900    { color: var(--ink-body); font-size: 1rem; line-height: 1.8; max-width: 900px; }
.u-accent-b    { color: var(--brand-600); font-weight: 600; }
.section-band  { background: var(--bg-page); padding-block: var(--section-y); border-top: 1px solid var(--line); }
@media (max-width: 900px) { .u-grid-3 { grid-template-columns: 1fr 1fr; } }
@media (max-width: 680px) { .u-grid-3, .u-grid-2 { grid-template-columns: 1fr; } }

/* ============ Testimonials — single-quote carousel ============
   Follows the reference in the client's deck: one centred review at a time,
   arrows either side, rating, attribution, and a link out to the full set. */

.testimonials {
  position: relative; isolation: isolate;
  padding-block: var(--section-y-lg);
  background: var(--surface);
  text-align: center;
}
/* p15 · a photo behind the band. The wash over it used to run 88-93%, which
   left the picture invisible; it is gone, and the card carries its own ground
   instead of relying on the section being flattened first. */
.testimonials-bg {
  position: absolute; inset: 0;
  width: 100%; height: 100%; object-fit: cover;
  z-index: -1;
}
.testimonials .tq { box-shadow: var(--shadow-md); }
/* Opaque by default so the quote is legible wherever backdrop-filter is not
   available. Where it is, the card drops to 82% and blurs what is behind it —
   the blur is what keeps the text stable over a photo that is bright in one
   corner and dark in another, rather than decoration. At 82% over the darkest
   pixel the quote still reads 6.03:1. */
.testimonials .tq { background: oklch(1 0 0 / 0.94); }
@supports (backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px)) {
  .testimonials .tq {
    background: oklch(1 0 0 / 0.78);
    /* 14px smoothed the photo into a flat wash. Less blur keeps its texture
       readable through the card while still steadying the copy over it. */
    -webkit-backdrop-filter: blur(7px) saturate(1.08);
    backdrop-filter: blur(7px) saturate(1.08);
  }
}
/* --ink-muted is 4.28:1 on white before the card even turns translucent, and
   2.81:1 once it does. This line moves up to the body ink. */
.testimonials .tq-note { color: var(--ink-body); }
.tq {
  max-width: 760px; margin-inline: auto;
  display: grid; justify-items: center;
  padding: clamp(2.25rem, 5vw, 3.5rem) clamp(1rem, 4vw, 3rem);
  background: var(--bg-page);
  border-radius: var(--radius-lg);
}
.tq-mark { color: var(--brand-600); opacity: .55; margin-bottom: 1.25rem; }
.tq-title {
  font-size: clamp(1.5rem, 2.8vw, 2.15rem);
  margin-bottom: clamp(1.75rem, 3.5vw, 2.75rem);
}
.tq-title em { color: var(--brand-600); }

.tq-viewport {
  display: grid; grid-template-columns: auto minmax(0, 1fr) auto;
  align-items: center; gap: clamp(.5rem, 2vw, 1.75rem);
  width: 100%;
}
.tq-slides { display: grid; }
/* Every slide occupies the same cell so the block does not jump in height */
.tq-slide {
  grid-area: 1 / 1;
  margin: 0;
  opacity: 0; visibility: hidden;
  transition: opacity 500ms var(--ease-out-expo);
  display: grid; justify-items: center; gap: 1.1rem;
}
.tq-slide.is-current { opacity: 1; visibility: visible; }
.tq-slide blockquote { margin: 0; }
.tq-slide blockquote p {
  font-size: clamp(1.02rem, 1.5vw, 1.2rem);
  line-height: 1.75;
  color: var(--ink);
  margin: 0; max-width: 52ch;
}
.tq-slide blockquote p::before { content: "\201C"; }
.tq-slide blockquote p::after  { content: "\201D"; }
.tq-rating { display: flex; gap: 5px; }
.tq-rating span {
  width: 12px; height: 12px;
  background: var(--accent-soft);
  clip-path: polygon(50% 0%, 61% 35%, 98% 35%, 68% 57%, 79% 91%, 50% 70%, 21% 91%, 32% 57%, 2% 35%, 39% 35%);
}
.tq-slide figcaption { display: grid; gap: .2rem; }
.tq-slide cite {
  font: 600 .88rem/1.3 var(--font-body);
  font-style: normal; color: var(--ink);
}
.tq-slide figcaption span {
  font: 500 .7rem/1.4 var(--font-body);
  letter-spacing: .12em; text-transform: uppercase;
  color: var(--ink-muted);
}

.tq-arrow {
  width: 46px; height: 46px; min-width: 44px; min-height: 44px; flex: 0 0 auto;
  display: inline-flex; align-items: center; justify-content: center;
  background: none; border: 0; border-radius: 50%;
  color: var(--ink-muted); cursor: pointer;
  transition: color 300ms var(--ease-out-expo), background-color 300ms var(--ease-out-expo);
}
@media (hover: hover) and (pointer: fine) {
  .tq-arrow:hover { color: var(--brand-600); background: var(--surface); }
}
.tq-arrow:focus-visible { outline: 2px solid var(--brand-600); outline-offset: 2px; }

.tq-dots { display: flex; gap: 8px; margin-top: 1.75rem; }
.tq-dot {
  width: 30px; height: 2px; border: 0;
  /* Same as the hero dots: 30x2 was unhittable, especially on a phone.
     content-box, or the global border-box clamps the padding to height:2px. */
  box-sizing: content-box;
  padding-block: 21px;
  background-clip: content-box;
  background-color: var(--line);
  cursor: pointer;
  position: relative;
  transition: background-color 350ms var(--ease-out-expo);
}
.tq-dot::after {
  content: ""; position: absolute;
  left: 0; right: 0; top: 50%;
  transform: translateY(-50%);
  height: 44px;
}
.tq-dot.is-active { background-color: var(--brand-600); }
.tq-dot:focus-visible { outline: 2px solid var(--brand-600); outline-offset: 2px; }

.tq-more { margin-top: .5rem; }
.tq-note {
  margin-top: 1rem;
  font: 500 .7rem/1 var(--font-body);
  letter-spacing: .18em; text-transform: uppercase;
  color: var(--ink-muted);
}
.sr-only {
  position: absolute; width: 1px; height: 1px;
  padding: 0; margin: -1px; overflow: hidden;
  clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}

@media (max-width: 680px) {
  .tq { padding-inline: 1.1rem; }
  .tq-viewport { gap: .25rem; }
  .tq-arrow { width: 44px; height: 44px; }
  .tq-slide blockquote p { font-size: .98rem; }
}

/* Optional hero video — only paints once the file has loaded, so the photo
   carousel underneath is what shows until then (and always, if the client
   supplies no footage). */
.hero-video {
  position: absolute; inset: 0;
  width: 100%; height: 100%; object-fit: cover;
  opacity: 0; z-index: 0;
  transition: opacity 900ms var(--ease-out-expo);
}
.hero.has-video .hero-video { opacity: 1; }
.hero.has-video .hero-slides,
.hero.has-video .hero-dots,
.hero.has-video .hero-caption { display: none; }

/* ============ Rhythm after the hero ============
   The first section under a page hero was inheriting 0px or 28px of top
   padding on different pages, which read as cramped. One rule, everywhere. */
.page-hero + section,
.page-hero + .meta-bar-section + section { padding-top: var(--section-y); }
.page-hero + .meta-bar-section { padding-top: 0; }
.page-hero + section.u-pt-0,
.page-hero + section.u-pt-sm { padding-top: var(--section-y); }

/* The anchor index now sits between the hero and the first section, so the
   adjacency rules above stopped matching on every rebuilt page. Repeat them
   through .pagenav rather than loosening them into a general sibling match,
   which would also hit sections much further down. */
.pagenav + section,
.pagenav + .meta-bar-section + section,
.pagenav + section.u-pt-0,
.pagenav + section.u-pt-sm { padding-top: var(--section-y); }
.pagenav + .meta-bar-section { padding-top: 0; }

/* ============ Seams between sections ============
   Two sections that share a ground stack their paddings into a 230–282px gap
   with no change of colour to explain it — it reads as a hole, not as a
   separation. Where the ground does change, the double padding is doing real
   work and is left alone. */
.section-sand  + .section-sand:not(.u-pt-0),
/* Collapsing the gap between two bands of the same colour, so consecutive
   sections do not stack two paddings.

   .testimonials is no longer in this list. It used to be a flat --surface
   band, indistinguishable from .section-sand, so butting them made sense.
   It carries a photograph now: it is its own band, and on four pages the
   rule was cropping its top padding to zero — the picture began abruptly
   and the quote card sat flush against the edge, while the home page (which
   follows a .duo, not a .section-sand) kept its 166px and looked right. */
.testimonials  + .testimonials,
/* Two plain sections were never on this list, so thirteen pairs across six
   pages were stacking the same two paddings the rule above exists to stop —
   and removing the surplus tinted bands makes more of them. Same ground,
   same seam, same answer. */
.section:not(.section-sand):not(.section-dark):not(.how)
  + .section:not(.section-sand):not(.section-dark):not(.how):not(.u-pt-0),
.section-dark  + .section-dark:not(.u-pt-0) {
  /* Sandra: "agrega un poco de espacio, esta muy pegado, entre secciones".
     Era 0, que dejaba el hueco en los 80px del relleno inferior de arriba
     frente a los 158px entre bandas de distinto color. Medio paso da 120. */
  padding-top: calc(var(--section-y) * 0.5);
}

/* ============ Measure ============
   Several prose utilities were running past 100 characters on a 1440px
   viewport. Cap them at a comfortable measure. */
.u-body-900, .u-body-wide, .lead-body, .u-lede, .u-lede-2, .u-body-65,
.prose p, .article-body p { max-width: 68ch; }
.u-center .u-body-900, .u-center .lead-body { margin-inline: auto; }

/* ============ Vertical rhythm ============
   Section padding had drifted to five different values on some pages.
   Utilities now step off the same scale as .section. */
.u-pt-0  { padding-top: 0; }
.u-pt-sm { padding-top: var(--section-y-sm); }
.section-band { padding-block: var(--section-y); }

/* ============ Primary nav ============
   Structure is wp_nav_menu() output: ul.menu > li.menu-item > a + ul.sub-menu.
   The image mega-menu was dropped — a picture per menu item does not come out
   of wp_nav_menu without a custom Walker or ACF fields on menu items, and it
   also broke: six tiles in a five-column grid left an empty cell on row two. */

.main-nav .menu {
  list-style: none; margin: 0; padding: 0;
  display: flex; align-items: center; gap: 2.25rem;
}
.main-nav .menu-item { position: relative; display: flex; align-items: center; }
.main-nav .menu > .menu-item > a {
  display: inline-flex; align-items: center; gap: .4rem;
  font: 500 .78rem/1 var(--font-body);
  letter-spacing: .11em; text-transform: uppercase;
  color: var(--ink-body); text-decoration: none;
  padding: .85rem 0; white-space: nowrap; position: relative;
  transition: color 350ms var(--ease-out-expo);
}
.has-hero .site-header:not(.is-scrolled) .main-nav .menu > .menu-item > a { color: oklch(1 0 0 / .88); }
.main-nav .menu > .menu-item > a::after {
  content: ""; position: absolute; left: 0; right: 0; bottom: .45rem;
  height: 1px; background: currentColor;
  transform: scaleX(0); transform-origin: left;
  transition: transform 450ms var(--ease-out-expo);
}
@media (hover: hover) and (pointer: fine) {
  .main-nav .menu > .menu-item > a:hover { color: var(--brand-600); }
  .has-hero .site-header:not(.is-scrolled) .main-nav .menu > .menu-item > a:hover { color: oklch(1 0 0); }
  .main-nav .menu > .menu-item > a:hover::after { transform: scaleX(1); }
}
.main-nav .menu-item.is-active > a { color: var(--brand-600); }
.main-nav .menu-item.is-active > a::after { transform: scaleX(1); }
.has-hero .site-header:not(.is-scrolled) .main-nav .menu-item.is-active > a { color: oklch(1 0 0); }

/* Disclosure button, injected by JS so the PHP stays a plain wp_nav_menu call */
.sub-toggle {
  background: none; border: 0; padding: 0 .1rem;
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 28px; min-height: 44px;
  color: inherit; cursor: pointer;
}
.sub-toggle svg { transition: transform 350ms var(--ease-out-expo); opacity: .7; }
.sub-toggle[aria-expanded="true"] svg { transform: rotate(180deg); opacity: 1; }
.has-hero .site-header:not(.is-scrolled) .sub-toggle { color: oklch(1 0 0 / .88); }

.main-nav .sub-menu {
  display: none;
  position: absolute; top: calc(100% + .55rem); left: -1rem;
  list-style: none; margin: 0; padding: .5rem 0;
  min-width: 244px;
  background: var(--bg-page);
  border-radius: var(--radius-lg);
  box-shadow: 0 18px 44px oklch(0.2 0.02 259 / .16);
  z-index: 60;
}
.menu-item-has-children.is-open > .sub-menu,
.menu-item-has-children:hover > .sub-menu { display: block; }
.main-nav .sub-menu a {
  display: block; padding: .6rem 1.4rem;
  font: 400 .88rem/1.35 var(--font-body);
  letter-spacing: 0; text-transform: none;
  color: var(--ink-body); text-decoration: none;
  white-space: nowrap;
  transition: color 220ms var(--ease-out-expo), padding-left 300ms var(--ease-out-expo);
}
@media (hover: hover) and (pointer: fine) {
  .main-nav .sub-menu a:hover { color: var(--brand-600); padding-left: 1.7rem; }
}
.sub-toggle:focus-visible { outline: 2px solid var(--brand-400); outline-offset: 2px; }

/* ============ Mega menu ============
   Panels are rendered from data/nav.json (a WP_Query per CPT after migration).
   The column count comes from the data via --cards, so the row can never spill
   into an orphan second row the way the hand-built version did. */

.main-nav .menu-item[data-mega] > a { padding-right: .2rem; }

.mega {
  position: absolute; left: 0; right: 0; top: 100%;
  background: var(--bg-page);
  border-top: 1px solid var(--line);
  box-shadow: 0 24px 48px oklch(0.2 0.02 259 / .14);
  z-index: 60;
  animation: megaIn 300ms var(--ease-out-expo) both;
  /* Two rows of tall cards run past the fold on a 768px-high laptop — 875px
     against 768 — and the bottom row was simply unreachable. Cap it to what
     is left below the header and let it scroll. */
  max-height: calc(100vh - var(--header-h));
  max-height: calc(100dvh - var(--header-h));
  overflow-y: auto;
  overscroll-behavior: contain;
}
.mega[hidden] { display: none; }
@keyframes megaIn { from { opacity: 0; transform: translateY(-8px); } to { opacity: 1; transform: none; } }

.mega-inner {
  display: grid; grid-template-columns: clamp(170px, 16%, 240px) 1fr;
  gap: clamp(1.5rem, 4vw, 3.5rem);
  padding-block: clamp(2rem, 3.4vw, 3.25rem);
  align-items: start;
  /* Wider than .wrap's cap: the panel is the full bar, and at 1104px the cards
     came out 134px across, closer to a chip than to a picture. */
  max-width: min(1600px, 100% - 2 * var(--pad-x));
  margin-inline: auto;
}
.mega-side { display: grid; gap: .05rem; align-content: start; }
.mega-side-title {
  font: 600 .68rem/1 var(--font-body);
  letter-spacing: .2em; text-transform: uppercase;
  color: var(--brand-600); margin-bottom: .9rem;
}
/* The side entry that is driving the grid. */
.mega-side a.is-active { color: var(--brand-600); font-weight: 600; }
.mega-side a.is-active::before {
  content: ""; position: absolute; left: -0.7rem;
  width: 2px; height: 1.05em;
  background: var(--brand-600);
}
.mega-side a { position: relative; }
/* Groups stack in one cell so switching does not resize the panel. */
.mega-groups { display: grid; }
.mega-groups > .mega-cards { grid-area: 1 / 1; }
.mega-groups > .mega-cards[hidden] { display: none; }

.mega-side a {
  font: 500 .92rem/1.4 var(--font-body);
  color: var(--ink-body); text-decoration: none;
  min-height: 44px; display: flex; align-items: center;
  transition: color 300ms var(--ease-out-expo), padding-left 350ms var(--ease-out-expo);
}
@media (hover: hover) and (pointer: fine) {
  .mega-side a:hover { color: var(--brand-600); padding-left: .4rem; }
}

.mega-cards {
  display: grid;
  /* Was one track per card, so a seven-item section squeezed every tile down
     to 110px. A fixed minimum lets the row wrap instead, which is what the
     reference does — big pictures over two rows, not a strip of chips. */
  grid-template-columns: repeat(auto-fill, minmax(min(100%, 11rem), 1fr));
  gap: clamp(.6rem, 1.1vw, .9rem);
}
.mega-card {
  position: relative; display: block; overflow: hidden;
  border-radius: var(--radius-lg);
  /* 3/4 read as a thumbnail; the reference is a tall portrait. */
  aspect-ratio: 4 / 7;
  min-height: 190px;
  background: var(--stone);
  text-decoration: none;
}
/* A category the client has not sent a photo for: a plain brand tile carrying
   its name, so the menu still lists everything the section contains. */
.mega-card-bare {
  background: var(--brand-050);
  display: flex; align-items: center; justify-content: center;
}
.mega-card-bare > span {
  position: static; padding: 0.9rem;
  color: var(--brand-900); text-align: center;
}
.mega-card-bare::after { content: none; }
.mega-card img {
  position: absolute; inset: 0;
  width: 100%; height: 100%; object-fit: cover;
  transition: transform 1200ms var(--ease-out-expo), opacity 500ms var(--ease-out-expo);
}
.mega-card::after {
  content: ""; position: absolute; inset: 0;
  background: linear-gradient(0deg, oklch(0.15 0.012 259 / .80) 0%, oklch(0.15 0.012 259 / .18) 58%, transparent 100%);
}
.mega-card > span {
  position: absolute; inset: auto 0 0 0; z-index: 1;
  padding: .85rem .8rem;
  font: 600 .7rem/1.3 var(--font-body);
  letter-spacing: .09em; text-transform: uppercase;
  color: oklch(1 0 0);
  display: grid; gap: .18rem;
}
.mega-card > span em {
  font: 400 .66rem/1 var(--font-body);
  font-style: normal; letter-spacing: .12em;
  color: oklch(1 0 0 / .72);
}
@media (hover: hover) and (pointer: fine) {
  .mega-card:hover img { transform: scale(1.07); opacity: .9; }
}
.mega-card-all {
  background: var(--surface);
  display: flex; align-items: center; justify-content: center;
}
.mega-card-all::after { content: none; }
.mega-card-all > span {
  position: static; padding: 0; color: var(--ink); text-align: center;
}
/* Drawn, not typed. As a font glyph this arrow falls back inconsistently and
   renders on some machines as the tofu box with its own codepoint inside —
   the "92" the client was seeing next to VIEW ALL. A mask has no font
   dependency and still takes its colour from the rule. */
.mega-card-all > span::after {
  content: "";
  display: block;
  width: 1.15rem; height: 1.15rem;
  margin: 0.45rem auto 0;
  background: var(--brand-600);
  -webkit-mask: var(--icon-arrow-right) center / contain no-repeat;
  mask: var(--icon-arrow-right) center / contain no-repeat;
}
@media (hover: hover) and (pointer: fine) {
  .mega-card-all:hover { background: var(--brand-050); }
}

.mega-close {
  position: absolute; top: .9rem; right: clamp(1.25rem, 5vw, 3rem);
  width: 44px; height: 44px;
  display: inline-flex; align-items: center; justify-content: center;
  background: none; border: 0; cursor: pointer;
  color: var(--ink-muted); border-radius: 50%;
  transition: color 300ms var(--ease-out-expo), background-color 300ms var(--ease-out-expo);
}
@media (hover: hover) and (pointer: fine) {
  .mega-close:hover { color: var(--ink); background: var(--surface); }
}
.mega-close:focus-visible { outline: 2px solid var(--brand-400); outline-offset: 2px; }

/* Fewer columns before the cards get too narrow to read */
@media (max-width: 1180px) {
  .mega-cards { grid-template-columns: repeat(min(var(--cards, 5), 4), minmax(0, 1fr)); }
  .mega-cards .mega-card:nth-child(n+5) { display: none; }
  .mega-cards .mega-card-all { display: flex; }
}
@media (max-width: 900px) { .mega { display: none; } }

/* =====================================================================
   PAGE SKELETON — the structure the client decks ask for on Experiences,
   Destinations, destination detail and Itinerary. Written once, used by
   all four so the pages stop drifting apart.
   Refs in the decks: Black Tomato (structure), Original Travel (cards and
   carousels), Scott Dunn / Pangea (expert band, info panels).
   ===================================================================== */

:root { --pagenav-h: 52px; }

/* ---------- Anchor sub-nav under the hero -------------------------------
   "Imagen con H1 y menu/indice con estructura de la página" — appears in
   all four decks. Sticks below the site header; the active link is set by
   JS from an IntersectionObserver, so it is inert without scripting. */
.pagenav {
  position: sticky;
  top: var(--header-h);
  z-index: 40;
  background: var(--bg-page);
  border-bottom: 1px solid var(--line);
}
.pagenav-list {
  display: flex;
  /* Nine labels on a destination page overran the container by 12-28px
     between 1366 and 1920, so the bar scrolled and clipped the first
     and last words. This gap fits all nine from 1100 up. */
  gap: clamp(1rem, 2.05vw, 2.25rem);
  justify-content: flex-start;
  align-items: stretch;
  margin: 0; padding: 0;
  list-style: none;
  overflow-x: auto;
  scrollbar-width: none;
  -webkit-overflow-scrolling: touch;
}
.pagenav-list::-webkit-scrollbar { display: none; }
/* Only when it actually scrolls, so nothing is dimmed when all nine fit. */
.pagenav.is-scrollable .pagenav-list {
  mask-image: linear-gradient(to right, transparent 0, #000 20px,
                              #000 calc(100% - 20px), transparent 100%);
}
@media (min-width: 900px) { .pagenav-list { justify-content: center; } }
.pagenav a {
  display: inline-flex;
  align-items: center;
  min-height: var(--pagenav-h);
  padding-inline: 2px;
  white-space: nowrap;
  font: 500 0.7rem/1 var(--font-body);
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ink-secondary);
  text-decoration: none;
  border-bottom: 2px solid transparent;
  transition: color var(--t-med) var(--ease-out-expo),
              border-color var(--t-med) var(--ease-out-expo);
}
@media (hover: hover) and (pointer: fine) {
  .pagenav a:hover { color: var(--ink); }
}
.pagenav a[aria-current="true"] {
  color: var(--brand-900);
  border-bottom-color: var(--brand-600);
}
.pagenav a:focus-visible { outline: 2px solid var(--brand-400); outline-offset: -4px; }

/* Anchor targets must clear both sticky bars */
[id] { scroll-margin-top: calc(var(--header-h) + var(--pagenav-h) + 8px); }

/* ---------- Horizontal rail --------------------------------------------
   Blog guides, inspiration trips, "You might also like". Scroll-snap with
   real buttons; keyboard and touch both work without JS. */
.rail { position: relative; }
.rail-track {
  display: grid;
  grid-auto-flow: column;
  /* A fixed track width, not minmax: with minmax the columns shrink to fit
     the container, the row stops overflowing and the rail silently stops
     being a rail. Fixed widths keep the next card peeking. */
  grid-auto-columns: clamp(15rem, 72vw, 19rem);
  gap: clamp(1rem, 2vw, 1.5rem);
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  scroll-padding-left: var(--pad-x);
  padding-bottom: 0.5rem;
  scrollbar-width: none;
}
.rail-track::-webkit-scrollbar { display: none; }
.rail-track > * { scroll-snap-align: start; }
/* The section's "see everything" link shares this row, so it sits level with
   the arrows instead of adrift below them. margin-right:auto pushes the
   arrows to the far end; without a link the row is just the two of them. */
.rail-nav {
  display: flex;
  gap: 0.5rem;
  justify-content: flex-end;
  align-items: center;
  margin-top: 1.25rem;
}
/* El enlace abre el grupo aunque el JS meta la pausa como primer hijo. */
.rail-nav-link { order: -1; margin-right: 0.35rem; }
.rail-btn {
  width: 44px; height: 44px;
  display: inline-flex; align-items: center; justify-content: center;
  border: 1px solid var(--line);
  border-radius: 50%;
  background: var(--bg-page);
  color: var(--ink);
  cursor: pointer;
  transition: background-color var(--t-med) var(--ease-out-expo),
              border-color var(--t-med) var(--ease-out-expo);
}
@media (hover: hover) and (pointer: fine) {
  .rail-btn:hover { background: var(--brand-050); border-color: var(--brand-400); }
}
.rail-btn:disabled { opacity: var(--opacity-disabled); cursor: default; }
.rail-btn:focus-visible { outline: 2px solid var(--brand-400); outline-offset: 2px; }
/* display:flex y display:inline-flex ganan al [hidden] del navegador, asi que
   el script escondia las flechas y el navegador las seguia pintando: en un dia
   de una sola fotografia salian dos flechas muertas bajo la imagen. El mismo
   fallo que tuvo .form-success con su "Received", y se arregla igual. */
.rail-nav[hidden], .rail-btn[hidden] { display: none !important; }

/* Tall editorial card for the inspiration rail (BT "Explore our top trips") */
.tall-card {
  position: relative;
  display: block;
  aspect-ratio: 3 / 4.4;
  border-radius: var(--radius-card);
  overflow: hidden;
  text-decoration: none;
  color: var(--on-dark);
}
.tall-card img { width: 100%; height: 100%; object-fit: cover; transition: transform 700ms var(--ease-out-expo); }
.tall-card::after {
  content: "";
  position: absolute; inset: 0;
  background: linear-gradient(to top, oklch(0.185 0.016 259 / 0.88) 8%, oklch(0.185 0.016 259 / 0.1) 62%);
}
.tall-card-body { position: absolute; inset-inline: 1.1rem; bottom: 1.1rem; z-index: 1; }
.tall-card-eyebrow {
  /* A chip, not loose text: over photography a filled ground holds at any
     exposure, and navy on amber is 8.08:1. */
  display: inline-block;
  align-self: flex-start;
  font: 600 0.6rem/1 var(--font-body);
  letter-spacing: 0.14em; text-transform: uppercase;
  background: var(--accent-amber);
  color: var(--brand-900);
  padding: 0.34rem 0.6rem;
  border-radius: var(--radius-btn);
  margin-bottom: 0.7rem;
}
.tall-card h3 { color: var(--on-dark); font-size: 1rem; letter-spacing: 0.02em; margin-bottom: 0.75rem; }
/* The deck's cards carry a line of context under the title — duration and
   the places the trip covers — between the heading and the button. */
.tall-card-meta {
  display: block;
  margin-bottom: 0.85rem;
  font-size: 0.78rem;
  line-height: 1.4;
  color: oklch(1 0 0 / 0.82);
}
.tall-card-cue {
  display: inline-block;
  margin-top: 0.85rem;
  padding: 0.6rem 1.1rem;
  border: 1px solid oklch(1 0 0 / 0.7);
  border-radius: var(--radius-btn);
  font: 500 0.62rem/1 var(--font-body);
  letter-spacing: 0.12em; text-transform: uppercase;
}
@media (hover: hover) and (pointer: fine) {
  .tall-card:hover img { transform: scale(1.06); }
  .tall-card:hover .tall-card-cue { background: oklch(1 0 0 / 0.14); }
}

/* ---------- Benefits over a photograph ---------------------------------
   Ref Original Travel / Pangea: "A few of the benefits of travelling with
   us", a light panel laid over an image. */
.benefits {
  position: relative;
  border-radius: var(--radius-lg);
  overflow: hidden;
  isolation: isolate;
}
.benefits > img {
  position: absolute; inset: 0;
  width: 100%; height: 100%;
  object-fit: cover;
  z-index: -2;
}
.benefits::before {
  content: "";
  position: absolute; inset: 0;
  background: linear-gradient(105deg, oklch(0.185 0.016 259 / 0.9) 0 46%, oklch(0.185 0.016 259 / 0.45) 100%);
  z-index: -1;
}
.benefits-grid {
  display: grid;
  gap: clamp(1.5rem, 4vw, 3rem);
  padding: clamp(1.75rem, 4vw, 3.5rem);
  align-items: center;
}
@media (min-width: 860px) { .benefits-grid { grid-template-columns: 1.05fr 0.95fr; } }
.benefits-copy h2 { color: var(--on-dark); }
.benefits-copy h2 em { color: var(--brand-200); }
.benefits-copy p { color: var(--on-dark-body); }
.benefits-panel {
  background: var(--bg-page);
  border-radius: var(--radius-card);
  padding: clamp(1.25rem, 2.5vw, 2rem);
}
.benefits-panel h3 {
  font-size: 1.05rem;
  margin-bottom: 0.35rem;
}
.benefits-panel ul { list-style: none; margin: 0.85rem 0 0; padding: 0; }
.benefits-panel li {
  position: relative;
  padding: 0.55rem 0 0.55rem 1.6rem;
  font-size: 0.92rem;
  color: var(--ink-body);
}
.benefits-panel li::before {
  content: "";
  position: absolute; left: 0; top: 1.05rem;
  width: 6px; height: 6px;
  border-radius: 50%;
  background: var(--brand-600);
}

/* ---------- Value props (three columns) --------------------------------
   Deck, EXPERIENCES p3: "Nos adaptamos a tu bolsillo". */
.valueprops {
  display: grid;
  gap: clamp(1.5rem, 3vw, 2.5rem);
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 240px), 1fr));
}
.valueprop { padding-top: 0.25rem; }
.valueprop h3 { font-size: 1.2rem; }
.valueprop p { font-size: 0.92rem; color: var(--ink-body); }

/* ---------- Differentiation panels -------------------------------------
   Ref Black Tomato "HOW WE'VE HELPED FAMILIES": large blocks, display type,
   alternating grounds drawn from the brand ramp — no new hues. */
.panels {
  display: grid;
  gap: 2px;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr));
}
.panel {
  padding: clamp(1.75rem, 3.5vw, 3rem);
  min-height: clamp(220px, 26vw, 320px);
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  color: var(--on-dark);
}
.panel:nth-child(4n+1) { background: var(--brand-900); }
.panel:nth-child(4n+2) { background: var(--brand-700); }
.panel:nth-child(4n+3) { background: var(--brand-600); }
.panel:nth-child(4n+4) { background: var(--brand-950); }
.panel h3 {
  color: var(--on-dark);
  font-size: clamp(1.4rem, 2.4vw, 2rem);
  line-height: 1.12;
}
.panel p { color: var(--on-dark-body); font-size: 0.92rem; }
.panel-num {
  font: 500 0.65rem/1 var(--font-body);
  letter-spacing: 0.18em; text-transform: uppercase;
  color: var(--brand-200);
  margin-bottom: 1.5rem;
}

/* ---------- Speak to our experts ---------------------------------------
   Ref Scott Dunn "Meet Our Peru Experts": faces, one line, enquiry + phone.
   The ground is the palette celeste now, not the deep navy. The band sits
   between two pale sections and the dark slab read as a hole punched in the
   page; two tones of one celeste give it a surface without a second hue.
   Portraits are still to come, so the faces slot carries a drawn mark. */
.experts {
  background: var(--brand-150);
  border-radius: var(--radius-lg);
  padding: clamp(2rem, 4.4vw, 3.25rem) clamp(1.5rem, 4vw, 3.25rem);
  display: grid;
  gap: clamp(1.25rem, 3vw, 2.5rem);
  align-items: center;
}
/* Between 780 and 1080 the two buttons are wider than the column left for the
   copy, so the sentence breaks into four lines beside them. Give the actions
   their own row there and the copy reads in two. */
@media (min-width: 780px) { .experts { grid-template-columns: auto 1fr; }
  .experts-actions { grid-column: 1 / -1; }
/* Its section carries u-pt-0 so it does not double up on the one above, but
   that left the band touching whatever ends there — usually a photo. */
.experts { margin-top: clamp(2rem, 4vw, 3.5rem); } }
@media (min-width: 1080px) {
  .experts { grid-template-columns: auto 1fr auto; }
  .experts-actions { grid-column: auto; }
}

/* The drawn mark holds the slot the three portraits will take, so it draws
   what is coming: people. A bubble read as a second WhatsApp glyph. */
.experts-mark {
  display: grid; place-items: center;
  width: clamp(3rem, 5.5vw, 4.25rem);
  height: clamp(3rem, 5.5vw, 4.25rem);
  color: var(--brand-950);
  flex: none;
}
.experts-mark svg { width: 100%; height: 100%; }
.experts:has(.experts-faces img) .experts-mark { display: none; }

.experts-faces { display: flex; }
/* Placeholders only: hidden until the client sends portraits. Three dashed
   circles with a question mark in them read as failed images, and the band
   works without them. */
.experts-faces:has(.is-empty) { display: none; }
.experts-faces > * {
  width: 62px; height: 62px;
  border-radius: 50%;
  overflow: hidden;
  border: 2px solid var(--brand-150);
  background: var(--brand-700);
  margin-left: -16px;
  flex: none;
}
.experts-faces > *:first-child { margin-left: 0; }
.experts-faces img { width: 100%; height: 100%; object-fit: cover; }
.experts-faces .is-empty {
  display: grid; place-items: center;
  font: 500 0.6rem/1 var(--font-body);
  color: var(--on-dark-muted);
  background: var(--brand-950);
  border-style: dashed;
}
/* 11.1:1 on the celeste. */
.experts h2 {
  color: var(--brand-950);
  font-size: clamp(1.55rem, 2.9vw, 2.2rem);
  line-height: 1.15;
  letter-spacing: -0.02em;
  margin-bottom: 0.6rem;
}
/* 8.3:1. Tinted from the same hue as the ground, never grey. */
.experts p {
  color: var(--brand-900);
  font-size: clamp(0.95rem, 1.05vw, 1.05rem);
  line-height: 1.55;
  max-width: 48ch;
}
.experts-actions { display: flex; flex-wrap: wrap; gap: 0.75rem; align-items: center; }
/* Bigger than the page default: this is the band's whole purpose. */
/* Con 2,05rem a cada lado los dos botones juntos pedian 569 de los 936px de
   la banda y el titular se partia en tres lineas contra los 298 que quedaban.
   Mas justos caben en fila, que es donde deben ir. */
.experts .btn { padding: 0.95rem 1.5rem; font-size: 0.76rem; }

/* ---------- Tabsets ----------------------------------------------------
   Two uses from the decks: season tabs on a destination ("¿Cuándo visitar
   Perú?") and the Original Travel "Useful information" panel. Buttons are
   a real tablist; without JS every panel stays open and readable. */
.tabset { margin-top: 0.5rem; }
.tablist {
  display: flex;
  justify-content: center;
  gap: 0.5rem;
  overflow-x: auto;
  scrollbar-width: none;
  padding-block: 0.75rem;
  border-bottom: 1px solid var(--line);
}
.tablist::-webkit-scrollbar { display: none; }
.tab {
  flex: none;
  min-height: 44px;
  padding: 0.6rem 1.1rem;
  border: 1px solid var(--line);
  border-radius: 999px;
  background: var(--bg-page);
  color: var(--ink-secondary);
  font: 500 0.82rem/1 var(--font-body);
  cursor: pointer;
  white-space: nowrap;
  transition: var(--transition-med);
}
.tab[aria-selected="true"] {
  background: var(--brand-900);
  border-color: var(--brand-900);
  color: var(--on-dark);
}
@media (hover: hover) and (pointer: fine) {
  .tab:not([aria-selected="true"]):hover { border-color: var(--brand-400); color: var(--ink); }
}
.tab:focus-visible { outline: 2px solid var(--brand-400); outline-offset: 2px; }
.tabpanel { padding-top: clamp(1.5rem, 3vw, 2.25rem); }
.tabpanel[hidden] { display: none; }
/* A panel that is prose and nothing else: the 62ch measure cap left the whole
   right half of a 1104px row empty. The block is centred instead and its mark
   holds the left, so the two margins balance and the panel reads as placed
   rather than abandoned. */
/* :not([hidden]) is not decoration. Without it this rule ties .tabpanel[hidden]
   on specificity and, coming later, wins — every panel in the set rendered at
   once, stacked under the tabs. */
.tabpanel:not([hidden]):not(:has(.tabpanel-split)) {
  --mark-w: clamp(1.9rem, 3vw, 2.4rem);
  display: grid;
  /* A third column the width of the mark, left empty, or the grid centres as
     mark-plus-text and the copy itself sits off-centre by half the mark. */
  grid-template-columns: var(--mark-w) minmax(0, 1fr) var(--mark-w);
  justify-content: center;
  gap: clamp(1rem, 2.4vw, 1.75rem);
  align-items: start;
  max-width: 68rem;
  margin-inline: auto;
}
/* Two columns, so the copy fills the row instead of stopping at its measure
   cap halfway across and leaving the right half of the panel empty. */
.tabpanel-body {
  grid-column: 2;
  columns: 2;
  column-gap: clamp(1.75rem, 3.5vw, 3rem);
}
.tabpanel-body > p { max-width: none; margin: 0 0 1rem; }
.tabpanel-body > p:last-child { margin-bottom: 0; }
@media (max-width: 780px) { .tabpanel-body { columns: 1; } }
.tabpanel-mark {
  grid-row: 1 / -1;
  display: block;
  width: 100%;
  height: var(--mark-w, 2.4rem);
  color: var(--brand-600);
  margin-top: 0.15rem;
}
.tabpanel-mark svg { width: 100%; height: 100%; }
@media (max-width: 620px) {
  .tabpanel:not([hidden]):not(:has(.tabpanel-split)) { grid-template-columns: 1fr; }
  .tabpanel-body { grid-column: 1; }
  /* One column: width:100% would stretch the mark across the whole row and
     squash the drawing inside it. Square again. */
  .tabpanel-mark { grid-row: auto; width: var(--mark-w, 2.4rem); }
}
/* Three lines of copy beside a 380px photograph left the void entirely
   under the text. Centred, it splits above and below. */
.tabpanel-split { display: grid; gap: clamp(1.5rem, 3vw, 2.5rem); align-items: center; }
@media (min-width: 820px) { .tabpanel-split { grid-template-columns: 1fr 1fr; } }
.tabpanel-split img { border-radius: var(--radius-card); aspect-ratio: 4 / 3; object-fit: cover; width: 100%; max-height: 380px; }
.factlist { list-style: none; margin: 1.25rem 0 0; padding: 0; }
/* Every row still waiting on the client: the list keeps its top margin
   and pushes the column down for nothing. */
.factlist:not(:has(li:not([data-tbc]))) { display: none; }
.factlist li {
  display: grid;
  grid-template-columns: minmax(90px, 130px) 1fr;
  gap: 1rem;
  padding: 0.5rem 0;
  font-size: 0.9rem;
  color: var(--ink-body);
}
.factlist dt, .factlist .factlist-key {
  font: 500 0.66rem/1.4 var(--font-body);
  letter-spacing: 0.12em; text-transform: uppercase;
  color: var(--ink-secondary);
}

/* ---------- FAQ accordion ----------------------------------------------
   Ref Black Tomato. Native <details> so it works with scripting off and
   survives the move to WordPress without a JS dependency. */
.faq-head { text-align: center; margin-bottom: clamp(1.5rem, 3vw, 2.5rem); }
.faq-head .eyebrow { justify-content: center; }
.faq-head p { margin-inline: auto; }
.faqs { max-width: 880px; margin-inline: auto; }
/* No painted ground either: the rows are separated by a rule, not by a box.
   With a background they became white strips whose question sat 4px from the
   painted edge while the chevron sat 28px from the other — visibly lopsided. */
.faq {
  border-bottom: 1px solid var(--line);
}
.faq > summary {
  list-style: none;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1.5rem;
  min-height: 56px;
  padding: 1.15rem 0;
  font: 500 0.78rem/1.45 var(--font-body);
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--ink);
  transition: color var(--t-med) var(--ease-out-expo);
}
.faq > summary::-webkit-details-marker { display: none; }
.faq > summary::after {
  content: "";
  flex: none;
  width: 10px; height: 10px;
  border-right: 1.5px solid currentColor;
  border-bottom: 1.5px solid currentColor;
  transform: rotate(45deg) translate(-2px, -2px);
  transition: transform var(--t-med) var(--ease-out-expo);
  color: var(--ink-muted);
}
.faq[open] > summary::after { transform: rotate(-135deg) translate(-2px, -2px); }
.faq[open] > summary { color: var(--brand-900); }
@media (hover: hover) and (pointer: fine) {
  .faq > summary:hover { color: var(--brand-600); }
}
.faq > summary:focus-visible { outline: 2px solid var(--brand-400); outline-offset: -2px; }
.faq-body { padding: 0 0 1.5rem; }
.faq-body p { font-size: 0.95rem; color: var(--ink-body); max-width: 70ch; }
.faq-body p + p { margin-top: 0.75rem; }

/* ---------- Route map --------------------------------------------------
   "Your route through Peru". The map itself is an image supplied per trip;
   the stop list beneath it carries the same information as text. */
.routemap {
  display: grid;
  gap: 0;
  /* stretch, not centre: the media half is a picture that runs to the panel's
     own edge. Centred, it floated as a 240px band with 141px of ground above
     and below it, which read as an image stuck to the right rather than as
     half the panel. */
  align-items: stretch;
  border-radius: var(--radius-lg);
  overflow: hidden;
  background: var(--surface);
}
/* No align-items here: the media half is a picture that runs to the panel's
   top, right and bottom edges. Centred, it floated with panel ground above
   and below it while still touching the right, which is neither a bleed nor
   an inset. */
@media (min-width: 820px) { .routemap { grid-template-columns: 0.8fr 1.2fr; } }
.routemap-copy { padding: clamp(1.5rem, 3vw, 2.5rem); }
.routemap-copy h2 { font-size: clamp(1.5rem, 2.6vw, 2.1rem); }
.routemap-stops { list-style: none; margin: 1.25rem 0 0; padding: 0; }
.routemap-stops li {
  position: relative;
  padding: 0.4rem 0 0.4rem 1.5rem;
  font-size: 0.9rem;
  color: var(--ink-body);
}
.routemap-stops li::before {
  content: "";
  position: absolute; left: 2px; top: 0.95rem;
  width: 8px; height: 8px;
  border-radius: 50%;
  background: var(--accent);
}
.routemap-stops li:not(:last-child)::after {
  content: "";
  position: absolute; left: 5.5px; top: 1.6rem; bottom: -0.3rem;
  border-left: 1px dashed var(--brand-400);
}
/* The picture fills the height the copy sets, not the other way round. In
   flow, the file's own proportions decided: a 721x1280 portrait asked for
   1,176px of panel to hold 666px of list, and the box grew with the image.
   Out of flow it contributes no height at all, so the text column sets the
   row and the photograph crops into it. Swapping the file no longer moves
   the layout. */
/* The tag is absolute. Without a positioned parent it anchored to the section
   and landed 52px below the panel, full-bleed across the page. */
.routemap-media {
  position: relative;
  min-height: 240px;
  background: var(--brand-050);
}
.routemap-media img,
.routemap-media iframe {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  border: 0;
}
/* Stacked there is no text beside it to set the height, so give it one. */
@media (max-width: 819px) {
  .routemap-media { aspect-ratio: 16 / 10; }
}
.routemap-media[data-placeholder] { display: block; padding: 0; }
/* A photograph standing in until the route map exists. No wash over it: with
   the label gone, a half-desaturated picture just reads as broken. */

/* ---------- Day-by-day with a sticky map -------------------------------
   Deck, ITINERARIO p2: "Itinerario en vertical", ref Original Travel. The
   map holds while the days scroll past it. Single column on small screens,
   where a sticky map would eat the viewport. */
/* ---------- Day by day --------------------------------------------------
   An accordion on a timeline. The old shape was a two-column grid with a map
   panel on the left that had no map in it, and four days stacked open beside
   it — at eleven days that column would have run for four screens against an
   empty box. Collapsed, the route reads as a list of days whatever the count;
   the first is open so the page never starts closed. */
.routedays { list-style: none; margin: 0; padding: 0; }
.routeday { position: relative; padding-left: clamp(2.5rem, 4vw, 3.25rem); }
/* The line joins one marker to the next and stops at the last. */
.routeday:not(:last-child)::before {
  content: "";
  position: absolute; top: 2.2rem; bottom: -0.5rem;
  left: clamp(0.9rem, 1.45vw, 1.19rem);
  width: 1px;
  background: var(--line);
}
.routeday-item { border-bottom: 1px solid var(--line); }
.routeday:last-child .routeday-item { border-bottom: 0; }
.routeday-item > summary {
  list-style: none;
  cursor: pointer;
  display: flex; align-items: flex-start; gap: 1rem;
  padding: 1.1rem 0;
  transition: color var(--t-med) var(--ease-out-expo);
}
.routeday-item > summary::-webkit-details-marker { display: none; }
.routeday-n {
  position: absolute;
  left: 0; margin-top: 0.1rem;
  width: clamp(1.85rem, 2.9vw, 2.4rem);
  height: clamp(1.85rem, 2.9vw, 2.4rem);
  display: grid; place-items: center;
  border-radius: 50%;
  background: var(--bg-page);
  box-shadow: inset 0 0 0 1px var(--line);
  font: 500 0.8rem/1 var(--font-body);
  color: var(--ink-secondary);
  transition: background-color var(--t-med) var(--ease-out-expo),
              color var(--t-med) var(--ease-out-expo),
              box-shadow var(--t-med) var(--ease-out-expo);
}
.routeday-item[open] .routeday-n {
  background: var(--brand-900); color: var(--on-dark);
  box-shadow: inset 0 0 0 1px var(--brand-900);
}
.routeday-head { flex: 1; display: grid; gap: 0.2rem; }
.routeday-route {
  font-family: var(--font-display);
  font-size: clamp(1.02rem, 1.35vw, 1.2rem);
  font-weight: 430; line-height: 1.3;
  letter-spacing: -0.01em;
  color: var(--ink);
}
.routeday-brief {
  font: 400 0.82rem/1.4 var(--font-body);
  color: var(--ink-secondary);
}
/* Same chevron as the FAQ list, so the two behave alike. */
.routeday-item > summary::after {
  content: "";
  flex: none; align-self: center;
  width: 9px; height: 9px;
  border-right: 1.5px solid currentColor;
  border-bottom: 1.5px solid currentColor;
  transform: rotate(45deg) translate(-2px, -2px);
  transition: transform var(--t-med) var(--ease-out-expo);
  color: var(--ink-muted);
}
.routeday-item[open] > summary::after { transform: rotate(-135deg) translate(-2px, -2px); }
.routeday-item > summary:focus-visible { outline: 2px solid var(--brand-400); outline-offset: -2px; }
@media (hover: hover) and (pointer: fine) {
  .routeday-item > summary:hover .routeday-route { color: var(--brand-600); }
}
.routeday-body { padding: 0 0 1.5rem; }
.routeday-body > p,
.routeday-copy > p { font-size: 0.95rem; line-height: 1.7; color: var(--ink-body); max-width: 70ch; }
/* The eight-line group runs in two columns inside its own panel, so it does
   not tower over the three beside it. */

/* ---------- Suggestions ------------------------------------------------
   Deck, ITINERARIO p4: "Texto informativo sobre que otras actividades se
   pueden hacer en este viaje." */
.suggestions {
  background: var(--surface);
  border-radius: var(--radius-lg);
  padding: clamp(1.5rem, 3.5vw, 3rem);
}
/* A panel whose every child is still a placeholder drew as an empty slab the
   width of the page. If there is nothing to show, there is no panel. */
.suggestions:not(:has(> :not([data-tbc]))) { display: none; }
.suggestion { padding-block: clamp(1rem, 2vw, 1.5rem); }
.suggestion:first-of-type { padding-top: 0.25rem; }
.suggestion h3 {
  font-family: var(--font-body);
  font-weight: 500;
  font-size: 0.78rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--brand-900);
}
.suggestion p { font-size: 0.93rem; color: var(--ink-body); max-width: 76ch; }

/* ---------- Editorial alternating rows ---------------------------------
   Deck, DESTINATIONS p4: "Contenido dentro de la página con CTA que llevan
   a un formulario." Ref Black Tomato "What to see and do". */
.edrow {
  display: grid;
  gap: clamp(1.5rem, 4vw, 3rem);
  align-items: center;
  padding-block: clamp(1.75rem, 3.5vw, 3rem);
}
@media (min-width: 820px) {
  .edrow { grid-template-columns: 1fr 1fr; }
  .edrow-media { height: clamp(200px, 20vw, 260px); }
  .edrow-media img { height: 100%; aspect-ratio: auto; }
}
.edrow:first-of-type { padding-top: 0; }
.edrow img { width: 100%; aspect-ratio: 4 / 3; object-fit: cover; border-radius: var(--radius-card); }
@media (min-width: 820px) {
  .edrow-reverse .edrow-media { order: -1; }
}
.edrow h3 {
  font-family: var(--font-body);
  font-weight: 500;
  font-size: 0.78rem;
  letter-spacing: 0.13em;
  text-transform: uppercase;
  color: var(--brand-900);
  margin-bottom: 0.85rem;
}
.edrow p { font-size: 0.95rem; color: var(--ink-body); }
.edrow .btn { margin-top: 1.25rem; }

/* ---------- Places grid ------------------------------------------------
   Deck, DESTINATIONS p2: "Countries → Places", ref Black Tomato. Name laid
   over the photograph, nothing else. */
.places {
  display: grid;
  gap: clamp(0.85rem, 1.6vw, 1.25rem);
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 260px), 1fr));
}
/* Five places, three across: wider cards than the auto-fit default gives
   them, and no ragged row of one. */
.places-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
@media (max-width: 900px) { .places-3 { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 560px) { .places-3 { grid-template-columns: 1fr; } }

.place {
  position: relative;
  display: grid;
  place-items: center;
  aspect-ratio: 4 / 3;
  transition: transform var(--t-med) var(--ease-out-expo),
              box-shadow var(--t-med) var(--ease-out-expo),
              border-color var(--t-med) var(--ease-out-expo);
  border-radius: var(--radius-card);
  overflow: hidden;
  text-decoration: none;
  isolation: isolate;
}
.place img {
  position: absolute; inset: 0; z-index: -2;
  width: 100%; height: 100%; object-fit: cover;
  transition: transform 700ms var(--ease-out-expo);
}
.place::after {
  content: "";
  position: absolute; inset: 0; z-index: -1;
  background: oklch(0.185 0.016 259 / 0.32);
  transition: background-color var(--t-med) var(--ease-out-expo);
}
.place span {
  font: 500 0.78rem/1.3 var(--font-body);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--on-dark);
  text-align: center;
  padding: 0.5rem 1rem;
  text-shadow: 0 1px 12px oklch(0.185 0.016 259 / 0.7);
}
@media (hover: hover) and (pointer: fine) {
  /* Three things at once, or the change reads as a rendering glitch rather
     than an answer: the photograph pushes in, the veil lifts, and the card
     itself rises off the page. */
  .place:hover img { transform: scale(1.05); }
  .place:hover::after { background: oklch(0.185 0.016 259 / 0.15); }
  .place:hover {
    transform: translateY(-4px);
    box-shadow: 0 14px 32px oklch(0.255 0.060 259 / 0.18);
  }
  .place[data-placeholder]:hover { border-color: var(--brand-400); }
}
@media (prefers-reduced-motion: reduce) {
  .place, .place img { transition: none; }
  .place:hover { transform: none; }
  .place:hover img { transform: none; }
}
.place:focus-visible { outline: 2px solid var(--brand-400); outline-offset: 3px; }
/* Three of the seven places the client asked for have no photograph yet.
   The tile still exists so the set is complete, but it reads as unfinished
   rather than borrowing an image from somewhere else. */
.place[data-placeholder] {
  background: var(--surface);
  border: 1px dashed var(--line);
  flex-direction: column;
}
.place[data-placeholder]::after { content: none; }
.place[data-placeholder] span { color: var(--ink-secondary); text-shadow: none; }
.place-pending {
  display: block;
  margin-top: 0.6rem;
  font: 400 0.62rem/1.5 var(--font-body);
  letter-spacing: 0.04em;
  text-transform: none;
  color: var(--ink-secondary);
}

/* ---------- Overview trio ----------------------------------------------
   Deck, ITINERARIO p2: WHEN · PRICE · HOW LONG under the intro. */
.trio {
  display: grid;
  gap: clamp(1.25rem, 3vw, 2.5rem);
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 180px), 1fr));
  text-align: center;
  padding-block: clamp(1.5rem, 3vw, 2.25rem);
}
.trio-key {
  display: block;
  font: 500 0.66rem/1 var(--font-body);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--accent);
  margin-bottom: 0.65rem;
}
.trio-val { font-family: var(--font-display); font-size: 1.15rem; font-weight: 600; letter-spacing: -0.02em; color: var(--ink); }
.trio-note { display: block; font-size: 0.78rem; color: var(--ink-secondary); margin-top: 0.3rem; }
/* A cell whose figure is still a placeholder rendered as a label and a note
   with nothing between them. No figure, no cell. */
.trio > div:has(> .trio-val[data-tbc]) { display: none; }

/* ---------- Split intro with an image ----------------------------------
   Deck, EXPERIENCES p2: "Faltaría agregar una imagen referente a la
   experiencia." */
.introsplit { display: grid; gap: clamp(1.75rem, 4vw, 3.5rem); align-items: center; }
@media (min-width: 860px) {
  .introsplit { grid-template-columns: 0.95fr 1.05fr; }
  .introsplit-media { height: clamp(260px, 26vw, 360px); }
  .introsplit-media img { height: 100%; aspect-ratio: auto; }
}
.introsplit img { width: 100%; aspect-ratio: 4 / 3; object-fit: cover; border-radius: var(--radius-card); }
.introsplit-body p + p { margin-top: 1rem; }

/* ---------- Day facts and the included groups ---------------------------
   The client's itinerary carries a distance, an altitude line and the meals
   for each day, and lists what is included in four named groups. Both are
   their figures; the page only has to hold them legibly. */
.day-facts {
  list-style: none; margin: 1rem 0 0; padding: 0;
  display: grid; gap: 0.35rem;
  border-top: 1px solid var(--line);
  padding-top: 0.9rem;
}
.day-facts li {
  display: grid; grid-template-columns: minmax(70px, 90px) 1fr;
  gap: 0.9rem;
  font-size: 0.85rem; line-height: 1.5;
  color: var(--ink-body);
}
.day-fact-key {
  font: 500 0.64rem/1.5 var(--font-body);
  letter-spacing: 0.12em; text-transform: uppercase;
  color: var(--ink-secondary);
}
/* Eighteen lines against five put one column at 1,189px and the other at 434
   on a 1440 screen. Stacked instead, each half runs the full width and its own
   grid decides the shape, so the two lengths never have to match. */
.incblock + .incblock {
  margin-top: clamp(2rem, 4vw, 3.25rem);
  padding-top: clamp(2rem, 4vw, 3.25rem);
  border-top: 1px solid oklch(1 0 0 / 0.14);
}
.incblock h2 { margin-bottom: clamp(1.25rem, 2.4vw, 1.75rem); }
/* auto-fit, so four named groups sit four across and a trip with two or six
   still fills its row. */
.inc-groups {
  display: grid;
  gap: clamp(1.25rem, 2.6vw, 2.25rem);
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 210px), 1fr));
  align-items: start;
}
/* Five short lines under a full-width heading left the block looking thin
   against the eighteen above it. Heading and note hold one side, the list the
   other, so the row is used by what is actually there. */
.incblock-not { display: grid; gap: clamp(1rem, 2.5vw, 2.25rem); }
@media (min-width: 820px) {
  .incblock-not {
    grid-template-columns: minmax(0, 0.8fr) minmax(0, 2fr);
    align-items: start;
  }
  .incblock-not .cross-list { columns: 2; column-gap: clamp(1.5rem, 3vw, 2.5rem); }
  .incblock-not .cross-list li { break-inside: avoid; }
}
.incnot-head h2 { margin-bottom: 0.8rem; }
.incnot-head .inc-note { margin-top: 0; }
.inc-group h3 {
  font: 500 0.66rem/1.4 var(--font-body);
  letter-spacing: 0.14em; text-transform: uppercase;
  color: var(--brand-200);
  margin-bottom: 0.6rem;
}
.inc-note {
  margin-top: 1.25rem;
  font-size: 0.85rem; line-height: 1.6;
  color: var(--on-dark-muted);
  max-width: 46ch;
}

/* ---------- What to see and do -----------------------------------------
   One stop per slide, the slide the width of the viewport: copy on the left,
   photograph on the right, and the next stop arrives in its place. The track
   is full-bleed; the content inside each slide sits in the same container as
   the rest of the page, so nothing shifts as it advances. */
.seedo-rail .rail-track {
  grid-auto-columns: 100%;
  gap: 0;
  padding-inline: 0;
  scroll-padding-left: 0;
  padding-bottom: 0;
}
/* The slide is the full width of the track; the panel inside it is the page's
   own .wrap, so one slide reads as one object rather than as loose copy that
   happens to move. The photograph runs to the panel's own edge. */
.seedo-slide { display: block; }
.seedo-split {
  display: grid;
  align-items: stretch;
  padding: 0;
  background: var(--surface);
  border-radius: var(--radius-lg);
  overflow: hidden;
  transition: box-shadow var(--t-med) var(--ease-out-expo);
}
@media (min-width: 780px) { .seedo-split { grid-template-columns: 1fr 1.05fr; } }
.seedo-copy {
  padding: clamp(1.5rem, 3.2vw, 3rem);
  display: flex; flex-direction: column; justify-content: center;
}
.seedo-copy h3 { margin-bottom: 0.75rem; }
.seedo-copy p { color: var(--ink-body); max-width: 46ch; }
.seedo-copy .btn { align-self: flex-start; margin-top: 1.5rem; }
.seedo-media { min-height: clamp(220px, 30vw, 420px); }
.seedo-media img,
.seedo-media .media-pending {
  width: 100%; height: 100%;
  object-fit: cover;
  border-radius: 0;
}
.seedo-media img { transition: transform 800ms var(--ease-out-expo); }
@media (hover: hover) and (pointer: fine) {
  /* Not a link, so the answer stays quiet: the photograph pushes in and the
     panel lifts off the page a little. */
  .seedo-split:hover { box-shadow: 0 16px 40px oklch(0.255 0.060 259 / 0.14); }
  .seedo-split:hover .seedo-media img { transform: scale(1.04); }
}
@media (prefers-reduced-motion: reduce) {
  .seedo-media img, .seedo-split { transition: none; }
  .seedo-split:hover .seedo-media img { transform: none; }
}
/* The arrows belong to the slide above them, not to the section break. */
.seedo-rail .rail-nav {
  max-width: var(--wrap-max);
  margin: 1rem auto 0;
  padding-inline: var(--pad-x);
}

/* ---------- Photographs in the split intro ------------------------------
   The rail component with one photograph per slide: same track, same two
   script, so there is no second carousel to keep alive. No buttons: it moves
   on its own, and stops the moment the reader shows interest in it. */
.mediarail { position: relative; height: 100%; }
.mediarail .rail-track {
  grid-auto-columns: 100%;
  gap: 0;
  height: 100%;
  padding-bottom: 0;
  border-radius: var(--radius-card);
}
.mediarail .rail-track > img {
  width: 100%; height: 100%;
  object-fit: cover;
  border-radius: 0;
  scroll-snap-align: center;
}

/* ---------- Indicative price row --------------------------------------
   Deck, Machu Picchu p4: a row of "precio orientativo por persona" cards
   under the travel styles, each with its own enquiry button. */
.pricerow {
  display: grid;
  gap: clamp(0.75rem, 1.5vw, 1.25rem);
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 170px), 1fr));
  margin-top: clamp(1.5rem, 3vw, 2.5rem);
}
.pricecard {
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--radius-card);
  padding: clamp(1rem, 2vw, 1.5rem);
  display: flex;
  flex-direction: column;
  gap: 0.4rem;
}
.pricecard.is-featured { border-color: var(--brand-600); background: var(--brand-050); }
.pricecard-amount {
  font-family: var(--font-display);
  font-size: 1.4rem;
  color: var(--brand-900);
}
.pricecard-amount.is-pending {
  font-size: 0.8rem;
  font-family: var(--font-body);
  font-style: italic;
  color: var(--ink-secondary);
}
.pricecard-note { font-size: 0.72rem; color: var(--ink-secondary); line-height: 1.45; }
.pricecard .btn { margin-top: auto; padding: 0.8rem 1rem; font-size: 0.68rem; }

/* Placeholder media, used until the client supplies photographs */
.media-pending {
  display: grid;
  place-items: center;
  aspect-ratio: 4 / 3;
  border: 1px dashed var(--line);
  border-radius: var(--radius-card);
  background: var(--surface);
  padding: 1.5rem;
  text-align: center;
}

/* Hero microcopy — the reassurance line the Home deck asks for under the
   buttons: "Free personalized quote · Local Peru specialists · Support
   throughout your journey". */
.hero-microcopy {
  margin-top: 1.4rem;
  font-size: 0.82rem;
  color: oklch(1 0 0 / 0.78);
  max-width: none;
}
@media (max-width: 680px) { .hero-microcopy { font-size: 0.78rem; } }

.final-cta-micro, .how-micro, .responsible-micro, .value-micro, .guides-note {
  font-size: 0.82rem;
  line-height: 1.55;
  margin-block: 0.9rem 1.4rem;
  max-width: 52ch;
}
.final-cta-micro { color: var(--on-dark-muted); }
.how-micro { color: var(--on-dark-muted); }
.responsible-micro, .value-micro, .guides-note { color: var(--ink-secondary); }
.guides-note { margin-bottom: 0.9rem; max-width: 46ch; }

.footer-top-actions { display: flex; flex-wrap: wrap; gap: 0.75rem; }
.footer-badges {
  margin-top: 0.75rem;
  font-size: 0.78rem;
  color: var(--on-dark-muted);
}
.footer-contact-note {
  font-size: 0.85rem;
  line-height: 1.55;
  color: var(--on-dark-body);
  margin-bottom: 0.9rem;
  max-width: 34ch;
}
.footer-city { font-size: 0.85rem; color: var(--on-dark-muted); margin-top: 0.4rem; }
.footer-send { display: block; margin-top: 1rem; }
.footer-send strong { display: block; }
.footer-send span { display: block; font-size: 0.78rem; color: var(--on-dark-muted); }

/* ============ Spacing repairs ============
   Measured, not guessed: at 1280 these stacked siblings were between 0 and
   6px apart, so a tag, a title and a paragraph read as one block of text. */

/* Guide cards: tag, heading and description were all touching. */
.guide-card .guide-tag { margin-bottom: 0.6rem; }
.guide-card h3 { margin-bottom: 0.55rem; }

/* A heading and the lead paragraph under it, where the two stack. */
.trending-head h2 + .section-head-lead,
.section-head-main h2 + .section-head-lead { margin-top: 0.9rem; }

/* The utility this list asked for did not exist, so it inherited nothing. */
.u-mt-sm { margin-top: 1.1rem; }

/* Two paragraphs of footer blurb ran together. */
.footer-brand p + p { margin-top: 0.7rem; }

/* Role cards sat 6px above the portraits below them. */
.valueprops + .team-grid { margin-top: clamp(2rem, 4vw, 3rem); }

/* Hero: the reassurance line was 4px under the buttons. */
.hero-actions + .hero-microcopy { margin-top: 1.5rem; }

/* Footer link lists: 6px on a 1.7 line-height reads as a wall. */
.footer-col a { padding-block: 0.15rem; }

/* ============ Alignment and label repairs ============ */

/* Root cause of the misaligned heads: the eyebrow and the lead are <p>, and
   the global `p { max-width: 62ch }` caps them. Inside a centred block that
   cap leaves the box pinned left while the h2 — not a <p> — centres. Every
   centred head needs the auto inline margin the heading gets for free. */
.trending-head > p,
.faq-head > p,
.guides-more > p,
/* The interior hero has the same fault and was never on this list: its
   eyebrow measured 457px against a 1072px column, so the label sat hard left
   under a centred headline. */
.page-hero-content > p,
.u-center > p { margin-inline: auto; }

/* Amber badges got a background but kept padding:0, so the text touched the
   edges. A label on a ground needs room. */
.trending-badge {
  padding: 0.34rem 0.7rem;
  border-radius: var(--radius-btn);
  line-height: 1;
}
.experts-faces .is-empty { padding: 0; display: grid; place-items: center; }

/* Microcopy sat orphaned below its button. Tie it to the action it explains. */
.guides-more > .btn + p,
.value-micro, .how-micro {
  margin-top: 0.85rem;
  text-align: center;
}

/* Value cards were a rule, a title and a paragraph — nothing to look at.
   The icon sits above the rule and gives each card an anchor.

   Only the stacking differs from the base icon now: above the title rather
   than beside it. */
.value-card .value-icon {
  display: block;
  margin-bottom: 0.9rem;
}

/* Reassurance in the hero. Enrique's note was about what to convey, not a
   string to paste under every button — it appeared four times, three of them
   the same sentence reordered. It survives once, here, as a spaced row
   instead of a run-on caption. */
.hero-assurances {
  list-style: none;
  margin: 1.6rem 0 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: 0.4rem 1.5rem;
}
/* No tick marks. They were the only orange on the page and they sat in front
   of every line, so the eye read the row as five warnings rather than as one
   quiet band of facts. The gap alone separates them. */
.hero-assurances li {
  font-size: 0.84rem;
  color: oklch(1 0 0 / 0.82);
}
@media (max-width: 680px) {
  .hero-assurances { gap: 0.3rem 1rem; }
  .hero-assurances li { font-size: 0.79rem; }
}

/* ============ Deck layouts (pages 7-11) ============
   Three structures the deck draws that the copy pass alone could not create:
   the roles as a 2x2 block on a filled ground, the team as one large portrait
   beside three small ones, and Trending as three cards of equal weight. */

/* --- p7-8 · the four roles as photo cards: one large, three small.
   The deck asks for this block to read "similar a itinerarios de
   inspiración", so it borrows that block's scrim-over-photo treatment. --- */
.rolecards {
  display: grid;
  grid-template-columns: 1.15fr 1fr;
  gap: clamp(0.9rem, 1.8vw, 1.4rem);
  align-items: stretch;
  margin-bottom: clamp(2rem, 4vw, 3rem);
}
.rolecard-stack {
  display: grid;
  grid-template-rows: repeat(3, 1fr);
  gap: clamp(0.9rem, 1.8vw, 1.4rem);
}
.rolecard {
  position: relative;
  overflow: hidden;
  border-radius: var(--radius-lg);
  background: var(--stone);
  min-height: 150px;
}
.rolecard-feature { min-height: clamp(360px, 42vw, 520px); }
.rolecard img {
  position: absolute; inset: 0;
  width: 100%; height: 100%; object-fit: cover;
}
/* Same scrim as the inspiration cards, so white copy holds over any photo. */
.rolecard::after {
  content: ""; position: absolute; inset: 0;
  background: linear-gradient(to top,
    oklch(0.185 0.016 259 / 0.90) 8%,
    oklch(0.185 0.016 259 / 0.62) 46%,
    oklch(0.185 0.016 259 / 0.22) 100%);
}
.rolecard-body {
  position: absolute; inset-inline: 1.1rem; bottom: 1.05rem;
  z-index: 1;
}
.rolecard-body h3 {
  color: var(--on-dark);
  font-size: 1rem; letter-spacing: 0.02em;
  margin-bottom: 0.4rem;
  display: flex; align-items: baseline; gap: 0.55rem;
}
.rolecard-body h3::before {
  content: ""; flex: 0 0 auto;
  width: 1.4rem; height: 2px;
  background: var(--accent-amber);
  transform: translateY(-0.28em);
}
.rolecard-feature .rolecard-body h3 { font-size: 1.3rem; }
.rolecard-body p {
  color: oklch(1 0 0 / 0.88);
  font-size: 0.84rem; line-height: 1.5;
  margin: 0; max-width: 46ch;
}
.rolecard-feature .rolecard-body p { font-size: 0.92rem; }
@media (max-width: 900px) {
  .rolecards { grid-template-columns: 1fr; }
  .rolecard-feature { min-height: clamp(280px, 46vw, 380px); }
  .rolecard-stack { grid-template-rows: none; grid-template-columns: repeat(3, 1fr); }
}
@media (max-width: 620px) {
  .rolecard-stack { grid-template-columns: 1fr; }
  .rolecard { min-height: 180px; }
}

/* --- p9-10 · Trending as three cards of equal weight --------------------- */
/* The block is the site's rail component: it scrolls, and main.js reveals the
   arrows on its own as soon as the track overflows (and hides them when it
   does not). So the two modes come from one piece of markup.

   Wide enough for three: a plain three-track grid, nothing to scroll, arrows
   stay hidden — with only three cards, everything is already on screen and a
   carousel there would just be two dead buttons.

   Narrower: the rail takes over, fixed track widths so the next card peeks
   and the row genuinely overflows. Never two columns, which is what left one
   card orphaned on its own row. */
.ideagrid {
  grid-auto-columns: clamp(16rem, 74vw, 22rem);
  gap: clamp(1rem, 2vw, 1.6rem);
}
/* Home runs this grid inside a rail on small screens. The standalone
   listings do not, so they get real columns at every width. */
.ideagrid:not(.rail-track) {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  align-items: stretch;
}
@media (min-width: 1100px) {
  .ideagrid {
    grid-auto-flow: row;
    grid-template-columns: repeat(3, 1fr);
    overflow: visible;
  }
}
@media (max-width: 1040px) { .ideagrid:not(.rail-track) { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 620px)  { .ideagrid:not(.rail-track) { grid-template-columns: 1fr; } }

/* The same tall card as "Six ways to meet Peru", but six of them rather than
   eight, so three across leaves neither row ragged. align-items:start, not
   stretch: a stretched grid item takes its height from the row, and the card's
   aspect-ratio would then derive its WIDTH from that height. */
.ideagrid.tall-grid-exp {
  align-items: start;
  grid-template-columns: repeat(3, minmax(0, 1fr));
}
.ideagrid.tall-grid-exp > .tall-card-wide { aspect-ratio: 4 / 5.2; }
@media (max-width: 1040px) { .ideagrid.tall-grid-exp { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 620px)  { .ideagrid.tall-grid-exp { grid-template-columns: 1fr; } }

/* Eight cards want four across, and the wider container the six used to
   have: inside the 1200px cap they came out too small for the photographs.
   Carries the same :not() as the rule above it, or that one's extra class
   outweighs this and the grid silently stays at three. */
.ideagrid-4:not(.rail-track) { grid-template-columns: repeat(4, minmax(0, 1fr)); }
.wrap:has(> .ideagrid-4) { max-width: 1600px; }
@media (max-width: 1280px) { .ideagrid-4:not(.rail-track) { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
@media (max-width: 1040px) { .ideagrid-4:not(.rail-track) { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 620px)  { .ideagrid-4:not(.rail-track) { grid-template-columns: 1fr; } }

/* --- CTA rows introduced by the deck ------------------------------------ */
.final-cta-actions, .guides-more-actions {
  display: flex; flex-wrap: wrap; gap: 0.75rem;
  margin-bottom: 0.9rem;
}
.guides-more-actions { justify-content: center; }

/* --- p4 · the deck lists the trip length as its own line, between the tag
   and the title, so it stops being glued onto the meta line. --- */
.tall-card-days {
  display: block;
  font: 600 0.72rem/1 var(--font-body);
  letter-spacing: 0.14em; text-transform: uppercase;
  color: var(--on-dark);
  /* Top corner, out of the stack at the foot of the card: it is the one fact
     you scan a row of these for. Its own scrim, because the gradient below
     only darkens the bottom. */
  position: absolute; top: 0.9rem; right: 0.9rem; z-index: 2;
  margin: 0;
  padding: 0.32rem 0.55rem;
  background: oklch(0.185 0.016 259 / 0.55);
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  border-radius: var(--radius-btn);
}
/* --- p12 · the CTA that closes the value block --- */

/* ========================================================================
   Deck de septiembre — Tailor made · About us · Contact us · Responsible
   ======================================================================== */

/* --- The four facts under the hero copy. TAILOR MADE p2 sets them as a row
   of pairs, the label above and the qualifier below. .stats-row is the same
   idea but sized for a figure — "Cusco-based" at 2.6rem is a headline, not a
   fact — so these are their own, smaller and on a dark ground. --- */
.hero-facts {
  list-style: none;
  margin: clamp(1.5rem, 3vw, 2.25rem) 0 0;
  padding-top: clamp(1.25rem, 2.5vw, 1.75rem);
  border-top: 1px solid oklch(1 0 0 / 0.22);
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: clamp(0.75rem, 2vw, 2rem);
  text-align: left;
}
.hero-facts strong {
  display: block;
  font-family: var(--font-display);
  font-size: clamp(0.95rem, 1.5vw, 1.2rem);
  font-weight: 500; letter-spacing: -0.015em;
  color: var(--on-dark);
  margin-bottom: 0.3rem;
}
.hero-facts span {
  display: block;
  font-size: 0.76rem; line-height: 1.4;
  color: oklch(1 0 0 / 0.76);
}
@media (max-width: 680px) {
  /* Four across a phone gives each cell 80px, and "Before and during your
     trip" breaks to four lines in it. Two by two instead. */
  .hero-facts { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

/* --- .value-grid is fixed at two columns. Three cards in it leave one alone
   on the second row, which reads as a card that failed to load. --- */
.value-grid-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); max-width: 1100px; }
@media (max-width: 860px) { .value-grid-3 { grid-template-columns: 1fr; } }

/* --- "Found a starting point?" — a block that closes a set of cards by
   telling you what to do with them, so it is set apart from them rather than
   looking like a fifth card. --- */
/* Iba centrado, y centrado es lo que le daba ese aire desordenado: tres lineas
   de largos distintos colgando del eje, con la barra del pullquote a un lado
   sin nada que la sostenga. Alineado a la izquierda cada linea arranca en el
   mismo sitio y el bloque cierra. */

/* --- Traveler stories. Every quote is still a placeholder, and build.py marks
   those with data-tbc, so the cards are hidden — and with nothing left to
   introduce, the heading goes too. It all returns the moment real quotes
   land, with no CSS change. --- */
.quotes-section:not(:has(blockquote:not([data-tbc]))) { display: none; }
.quote-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: clamp(1.25rem, 2.5vw, 2rem);
}
@media (max-width: 860px) { .quote-grid { grid-template-columns: 1fr; } }
.quote-card {
  margin: 0;
  padding: clamp(1.5rem, 2.5vw, 2rem);
  background: var(--surface);
  border-radius: var(--radius-lg);
}
.quote-card p {
  font-family: var(--font-display);
  font-size: clamp(1rem, 1.4vw, 1.15rem);
  line-height: 1.55; font-weight: 400;
  color: var(--ink);
}
.quote-card p::before { content: "\201C"; }
.quote-card p::after { content: "\201D"; }
.quote-card cite {
  display: block; margin-top: 1.1rem;
  font: 600 0.78rem/1.4 var(--font-body);
  font-style: normal;
  letter-spacing: 0.06em; text-transform: uppercase;
  color: var(--ink-muted);
}

/* --- The two-step form. The bar is the only thing that says how much is
   left; without it a "Continue" button is a promise of unknown length. --- */
.formsteps-head { display: grid; gap: 0.6rem; margin-bottom: 0.4rem; }
.formsteps-count {
  font: 600 0.72rem/1 var(--font-body);
  letter-spacing: 0.12em; text-transform: uppercase;
  color: var(--ink-muted);
}
.formsteps-bar {
  display: block; height: 3px;
  background: var(--line);
  border-radius: 100px;
  overflow: hidden;
}
.formsteps-fill {
  display: block; height: 100%; width: 50%;
  background: var(--brand-900);
  border-radius: 100px;
  transition: width 420ms var(--ease-out-expo);
}
@media (prefers-reduced-motion: reduce) { .formsteps-fill { transition: none; } }
/* A fieldset is a block, and .trip-form's own gap does not reach inside one.
   Without this the step's fields sit flush against each other. */
.formstep { display: grid; gap: 1rem; }
.steps-back {
  justify-self: center;
  background: none; border: none;
  padding: 0.4rem;
  font: 500 0.82rem/1 var(--font-body);
  color: var(--ink-muted);
  cursor: pointer;
}
@media (hover: hover) and (pointer: fine) {
  .steps-back:hover { color: var(--brand-600); }
}

/* --- The people behind every journey. The deck provides the roles and the
   one-line introductions but the names and portraits are still to come, so
   build.py marks each card and CSS takes it down. A group heading over an
   empty row, or an empty row itself, reads as a page that failed to load —
   they come down with the cards and return with them. --- */
.team-group-title {
  font-family: var(--font-display);
  font-size: clamp(1.1rem, 1.6vw, 1.35rem);
  font-weight: 500; letter-spacing: -0.015em;
  color: var(--ink);
  margin-bottom: clamp(1.25rem, 2.5vw, 1.75rem);
}
.team-group-title + .team-grid { margin-bottom: clamp(2rem, 4vw, 3.25rem); }
.team-grid:not(:has(> :not([data-tbc]))) { display: none; }
/* This was written as :has(+ .team-grid:not(:has(…))) — a :has() inside a
   :has(), which CSS does not allow. The whole rule was invalid, the browser
   dropped it, and "Our travel team" and "Our guides" stood over nothing.
   Stated the other way round it is one level deep and legal: the title is
   hidden by default and appears when the grid behind it holds a real card. */
.team-group-title { display: none; }
.team-group-title:has(+ .team-grid > :not([data-tbc])) { display: block; }

/* The deck opens this section on "una fotografía grupal principal", before the
   portraits — and Ref 11 hangs a filled block off the picture's corner with
   the line that would otherwise float underneath it. */
.planta {
  display: grid;
  gap: clamp(2rem, 4vw, 3.5rem);
  align-items: center;
  margin-bottom: clamp(2.5rem, 5vw, 4rem);
}
.planta-media { position: relative; margin: 0; }
.planta-media img {
  width: 100%;
  height: clamp(300px, 38vw, 500px);
  object-fit: cover;
  border-radius: var(--radius-xl);
}
.planta-note {
  background: var(--brand-900);
  color: var(--on-dark);
  border-radius: var(--radius-xl);
  padding: clamp(1.1rem, 2vw, 1.5rem);
  font: 500 0.92rem/1.6 var(--font-body);
  max-width: 24rem;
  margin-top: 1rem;
}
@media (min-width: 900px) {
  .planta { grid-template-columns: 1.05fr 0.95fr; }
  /* Overhanging, as in the reference. The offset stays inside .wrap's own
     gutter — --pad-x is 45px at this width and grows from there — so the
     block never reaches the edge of the document. */
  .planta-note {
    position: absolute;
    left: clamp(-1.5rem, -2vw, -1rem);
    bottom: clamp(-1.5rem, -2vw, -1rem);
    margin-top: 0;
    max-width: 20rem;
  }
}

.quote-grid-1 { grid-template-columns: minmax(0, 720px); justify-content: center; }
/* Sandra: "no esta alineado a los demas elementos, el texto esta como
   centrado pero no contempla el ancho de los demas elementos, eso desentona".
   Medido en experiencias: este bloque arrancaba en x=344 y la seccion de
   debajo en x=75. La medida corta se queda -- un parrafo de entrada a 900px se
   lee mejor que a 1265 -- pero arranca donde arrancan todos los demas, no
   centrada en la pagina.
   Se mantiene el nombre de la clase para no tocar tres paginas por un
   margen. */
/* Estrechar el propio .wrap lo sacaba de su sitio: el contenedor dejaba de
   medir lo que miden los demas y su borde izquierdo caia en 64 mientras el
   resto de la pagina arranca en 104. Lo que se estrecha ahora es el contenido,
   no el contenedor, asi que la medida corta se conserva y el borde es el
   mismo de siempre. */
.wrap.u-narrow-c { max-width: var(--wrap-max, 1232px); margin-inline: auto; }
.wrap.u-narrow-c > * { max-width: 900px; }

/* --- A line the deck sets apart from the paragraphs around it: RESPONSIBLE
   p5, "The goal is not simply to travel less." --- */
.pullquote {
  margin-top: clamp(1.75rem, 3vw, 2.5rem);
  padding-left: clamp(1rem, 2vw, 1.5rem);
  border-left: 3px solid var(--brand-600);
  font-family: var(--font-display);
  font-size: clamp(1.05rem, 1.6vw, 1.3rem);
  line-height: 1.55;
  color: var(--ink);
}
/* Same reason as .factlist: a list whose every row is still waiting on the
   client keeps its gaps and pushes what follows down for nothing. The
   "Where we want to go next" block is held until management confirms it. */
.check-list:not(:has(li:not([data-tbc]))) { display: none; }

/* ========================================================================
   Referencias de Sandra — septiembre
   Three layouts taken from the references, over sections the decks filled.
   The site's own corners are 4-6px; these blocks are the only rounded ones
   on it, which is the reference's look and a decision worth confirming
   before it spreads to the other twelve pages.
   ======================================================================== */
:root { --radius-xl: 18px; }

/* --- The icon chip. Ref 1 and Ref 5 both set the glyph in a small tinted
   square rather than loose above the title. One definition, both uses. --- */
/* Sandra: "manejas dos estilos de iconos, uno con fondo y el otro sin fondo;
   en todo usalo sin fondo". Habia 49 .icon-chip en seis paginas con su caja
   gris, y .value-icon sin ella. Manda el desnudo: el mismo tamano, el mismo
   trazo y el color de acento de la marca, sin recuadro detras. */
.icon-chip {
  display: inline-flex; align-items: center; justify-content: center;
  flex: 0 0 auto;
  width: 28px; height: 28px;
  border-radius: 0;
  background: none;
  color: var(--accent);
}
.icon-chip svg { width: 26px; height: 26px; }

.quad-card {
  background: var(--bg-page);
  border-radius: var(--radius-xl);
  padding: clamp(1.25rem, 2.2vw, 1.75rem);
}
.quad-card h3 {
  font-family: var(--font-display);
  font-size: clamp(1.05rem, 1.5vw, 1.25rem);
  font-weight: 500; letter-spacing: -0.02em;
  color: var(--ink);
  margin: 1.1rem 0 0.5rem;
}
.quad-card p {
  font-size: 0.9rem; line-height: 1.6;
  color: var(--ink-body);
}

/* --- Ref 5 · photograph one side, the steps stacked as rows --- */
.process-split {
  display: grid;
  gap: clamp(2rem, 4vw, 3.5rem);
  align-items: center;
}
.process-media img {
  width: 100%;
  height: clamp(320px, 46vw, 560px);
  object-fit: cover;
  border-radius: var(--radius-xl);
}
.process-body h2 { margin-bottom: clamp(1.5rem, 3vw, 2.25rem); }
.process-steps {
  list-style: none; margin: 0; padding: 0;
  display: grid; gap: 0.5rem;
}
.process-step {
  display: flex;
  align-items: flex-start;
  gap: clamp(0.9rem, 1.6vw, 1.25rem);
  padding: clamp(0.9rem, 1.6vw, 1.25rem);
  border-radius: var(--radius-xl);
}
/* The reference marks the row you are on. Nothing here is interactive, so it
   marks the one a traveller actually starts at. The reference sets a grey row
   on a white page; this section is already tinted, so the row lifts to white
   instead — --surface on sand is a difference you have to look for. */
/* Sandra: "ese esta con fondo blanco y el icono azul, dejalo igual que los
   demas". El primer paso llevaba un suelo blanco y su icono en azul de
   reposo, asi que de tres filas iguales una parecia ya pulsada. Las tres
   arrancan iguales; lo unico que las distingue es el naranja del hover. */
.process-step.is-current { background: transparent; }
/* Sin fondo tambien aqui: la fila activa se distingue por su propio suelo,
   no por un recuadro tras el icono. */
.process-step.is-current .icon-chip { background: none; color: var(--accent); }
.process-step h3 {
  font-family: var(--font-display);
  font-size: clamp(1.1rem, 1.7vw, 1.35rem);
  font-weight: 500; letter-spacing: -0.02em;
  color: var(--ink);
  margin-bottom: 0.35rem;
}
.process-step p {
  font-size: 0.92rem; line-height: 1.6;
  color: var(--ink-body);
}
@media (min-width: 900px) {
  .process-split { grid-template-columns: 0.85fr 1.15fr; }
}

/* --- Ref 2 · the set's own way out sits on the heading line --- */
.section-head-cta {
  grid-template-columns: 1fr auto;
  /* Con align-items:start el boton se pegaba al techo de la fila y quedaba
     entre 29 y 53px por encima del centro de su titular, medido en cinco
     cabeceras. Centrado contra el bloque de la izquierda cae en la linea del
     titular, que es donde esta el ojo cuando busca la salida del conjunto. */
  align-items: center;
}
@media (max-width: 760px) {
  .section-head-cta { grid-template-columns: 1fr; }
  .section-head-cta .btn { justify-self: start; }
}

/* ========================================================================
   Segunda tanda de referencias — la rejilla de tarjetas macizas
   Ref 7 ("Por que fazer parte do ecossistema"): a set of value cards as
   filled tiles, the icon centred over a centred title and a short line.
   These sections were a rule and two lines of text each, which is what
   "no tiene ningun estilo" was about.
   ======================================================================== */
.value-grid {
  gap: clamp(0.85rem, 1.6vw, 1.25rem);
  max-width: 1100px;
}
.value-grid-3 { max-width: 1200px; }
.value-card {
  padding: clamp(1.6rem, 2.8vw, 2.1rem) clamp(1.25rem, 2.2vw, 1.75rem);
  text-align: center;
  /* The client's own brand navy, filled. On a page of white sections a set of
     short value props needs a ground of its own or it reads as loose text. */
  background: var(--brand-900);
  border-radius: var(--radius-xl);
  color: var(--on-dark);
}
.value-card .value-icon {
  margin-inline: auto;
  /* 7.35:1 on this navy — the palette's one accent that works on dark. */
  color: var(--brand-200);
}
.value-card h3 { color: var(--on-dark); }
.value-card p { color: var(--on-dark-body); font-size: 0.9rem; }

/* --- The commitments. Deck, ABOUT US p7 lists five; they were bullets under
   a bare h3, with the section's CTA loose beneath them. A panel, the row
   shape the process steps already use, and the CTA on the panel's own
   heading line, as Ref 2 does with a set's way out. --- */
.commit-panel {
  margin-top: clamp(2rem, 4vw, 3rem);
  padding: clamp(1.5rem, 3vw, 2.5rem);
  background: var(--surface);
  border-radius: var(--radius-xl);
}
.commit-head {
  display: grid;
  grid-template-columns: 1fr auto;
  gap: 1rem clamp(1.5rem, 3vw, 2.5rem);
  align-items: center;
  margin-bottom: clamp(1.25rem, 2.5vw, 1.75rem);
}
.commit-head h3 {
  font-family: var(--font-display);
  font-size: clamp(1.2rem, 2vw, 1.55rem);
  font-weight: 500; letter-spacing: -0.02em;
  color: var(--ink);
}
.commit-list {
  list-style: none; margin: 0; padding: 0;
  display: grid; gap: clamp(0.6rem, 1.2vw, 0.9rem);
}
.commit-list li {
  display: flex; align-items: flex-start;
  gap: clamp(0.85rem, 1.5vw, 1.15rem);
  padding: clamp(0.85rem, 1.5vw, 1.15rem);
  background: var(--bg-page);
  border-radius: var(--radius-xl);
}
.commit-list .icon-chip { background: none; }
.commit-list h4 {
  font: 600 0.98rem/1.35 var(--font-body);
  color: var(--ink);
  margin-bottom: 0.3rem;
}
.commit-list p { font-size: 0.9rem; line-height: 1.6; color: var(--ink-body); }
@media (max-width: 760px) {
  .commit-head { grid-template-columns: 1fr; }
  .commit-head .btn { justify-self: start; }
}

/* ========================================================================
   La placa de credenciales · y UN estándar de hover para todo
   ======================================================================== */

/* ========================================================================
   Hover — un solo estándar
   Sandra: "en algunas piezas se pinta todo el contenedor y en otras solo el
   icono, eso no sigue reglas UX." It did not. This is the rule, and every
   block on the site that is not a link now follows it:

     the block's own ground moves one step, AND its icon moves with it.
     Never the icon on its own, never the block on its own, never a lift —
     a block that rises under the cursor promises a click it has not got.

   Two grounds, so two steps. The grounds stay in the cool system — no warm
   background anywhere, on any page. The warmth is carried by the marks
   instead: the icon on a filled tile rests gold and goes amber, which is the
   same amber the trip tags already use.
     on a light ground   block -> --brand-050, chip -> --bg-page, glyph -> --brand-600
     on the filled navy  block -> --brand-700, icon -> --accent-amber

   Links and buttons keep the idiom they already had: buttons pop, cards that
   are anchors lift. One duration for all of it.
   ======================================================================== */
:root { --t-hover: 260ms; }

.process-title em,
.process-step, .process-step .icon-chip,
.commit-list li, .commit-list li .icon-chip,
.quad-card, .quad-card .icon-chip,
.value-card, .value-card .value-icon,
.icon-chip {
  transition: background-color var(--t-hover) var(--ease-out-expo),
              color var(--t-hover) var(--ease-out-expo);
}

/* The icon on a filled tile is warm, not celeste. The palette's cool half was
   doing all the work and the page had gone cold with it. */
.value-card .value-icon { color: var(--accent-soft); }

.process-title em { color: var(--ink); }
.process-title em:first-child { color: var(--brand-600); }

/* El estandar de hover vive al final de la hoja, no aqui: hay reglas de
   color de reposo declaradas mas abajo que pesan lo mismo que el y le
   ganaban por orden -- la linea de datos de la tarjeta se quedaba azul
   sobre el naranja. Buscar "Estandar de hover" al final del archivo. */
@media (prefers-reduced-motion: reduce) {
  .process-title em, .process-step, .process-step .icon-chip,
  .commit-list li, .quad-card, .value-card, .value-card .value-icon,
  .icon-chip { transition: none; }
}

/* --- A quality foundation: photograph and a timeline down the side ------
   It had been a filled navy panel with nothing to look at in it. The block
   takes the photograph its own closing sentence already names — the
   sanctuary — and the progression the deck asks for runs down the other
   side as a real timeline. Light ground, no panel. --- */
.quality-split {
  display: grid;
  gap: clamp(2rem, 4vw, 3.5rem);
  align-items: start;
}
@media (min-width: 900px) {
  .quality-split { grid-template-columns: 0.92fr 1.08fr; }
}
.quality-media { margin: 0; }
.quality-media img {
  width: 100%;
  height: clamp(300px, 40vw, 520px);
  object-fit: cover;
  border-radius: var(--radius-xl);
}
.quality-media figcaption {
  margin-top: 1.1rem;
  max-width: 54ch;
  font-size: 0.86rem; line-height: 1.65;
  color: var(--ink-muted);
}

.track {
  list-style: none; margin: 0; padding: 0;
  display: grid; gap: clamp(1.6rem, 3vw, 2.4rem);
}
.track li { position: relative; padding-left: 2.4rem; }
/* The dot sits on the line and punches a hole in it with a ring of the
   page's own ground, so the rule appears to run behind rather than through. */
.track li::before {
  content: "";
  position: absolute; left: 0; top: 0.34rem;
  width: 13px; height: 13px; border-radius: 50%;
  background: var(--accent);
  box-shadow: 0 0 0 4px var(--bg-page);
  z-index: 1;
}
.track li::after {
  content: "";
  position: absolute; left: 6px; top: 0.34rem;
  bottom: calc(-1 * clamp(1.6rem, 3vw, 2.4rem));
  width: 1px;
  background: var(--line);
}
.track li:last-child::after { content: none; }
.track strong {
  display: block;
  font-family: var(--font-display);
  font-size: clamp(1.05rem, 1.5vw, 1.28rem);
  font-weight: 500; letter-spacing: -0.02em;
  color: var(--ink);
}
.track > li > span {
  display: block; margin-top: 0.25rem;
  font: 600 0.68rem/1 var(--font-body);
  letter-spacing: 0.16em; text-transform: uppercase;
  color: var(--accent);
}
.track p {
  margin-top: 0.65rem;
  font-size: 0.93rem; line-height: 1.65;
  color: var(--ink-body);
}

/* --- La tarjeta, como la usa CONTACT US: a lead under the heading and
   a way out at the foot of every card. Ref 1 has both; About us had neither,
   because those four cards describe how we work and have nowhere to go. --- */
.quad-lead {
  margin-top: 1rem;
  max-width: 44ch;
  font-size: 0.98rem; line-height: 1.7;
  color: oklch(1 0 0 / 0.86);
}
.quad-card { display: flex; flex-direction: column; }
.quad-card p { flex: 1 1 auto; }
.quad-cue {
  display: inline-flex; align-items: center; gap: 0.5rem;
  margin-top: 1.1rem;
  font: 600 0.78rem/1.3 var(--font-body);
  color: var(--brand-600);
  text-decoration: none;
  word-break: break-word;
}
.quad-cue::after {
  content: "";
  width: 14px; height: 8px; flex: 0 0 auto;
  background: currentColor;
  clip-path: polygon(0 42%, 62% 42%, 62% 0, 100% 50%, 62% 100%, 62% 58%, 0 58%);
  transition: transform var(--t-hover) var(--ease-out-expo);
}
@media (hover: hover) and (pointer: fine) {
  .quad-cue:hover { text-decoration: underline; }
  .quad-card:hover .quad-cue::after { transform: translateX(3px); }
}
@media (prefers-reduced-motion: reduce) { .quad-cue::after { transition: none; } }

/* --- A destination card with no photograph yet. Deck, DESTINATIONS: six in
   two rows of three, and "no publicar páginas thin content solo para
   completar la cuadrícula" — so Arequipa and Lima keep their place in the
   grid at the same ratio and corners, on a brand ground, rather than
   borrowing someone else's picture. --- */
.tall-card-bare { background: var(--brand-050); }
.tall-card-bare::after { content: none; }
/* It keeps the photograph card's ratio, so the row is one set of six rather
   than four cards and two stubs -- measured, the alternative came out 102px
   tall against 442. The name sits in the middle of its own panel instead of
   at the foot of a picture it does not have. */
.tall-card-bare .tall-card-body {
  position: absolute; inset: 0;
  display: flex; flex-direction: column;
  align-items: flex-start; justify-content: center;
  padding: clamp(1.25rem, 2.2vw, 1.75rem);
}
.tall-card-bare h3 { color: var(--ink); }
.tall-card-bare .tall-card-cue { color: var(--ink); border-color: var(--line); }
@media (hover: hover) and (pointer: fine) {
  .tall-card-bare:hover { background: var(--brand-150); }
}

/* ========================================================================
   Itinerarios — una sola estructura para todos
   Sandra, sobre el día a día y el bloque de incluidos: "lo menciono para que
   la estructura sea la misma en todos los itinerarios". Un programa de once
   días y uno de uno escriben el mismo marcado; lo que cambia es lo que hay
   dentro, y el CSS decide la forma. Nadie tiene que elegir una variante.

     · un día con fotos abre una segunda columna; sin fotos, el párrafo
       ocupa la fila entera y no queda hueco
     · una foto se ve sola, varias se convierten en carrusel — el mismo
       marcado, porque las flechas solo aparecen si hay a dónde ir
     · "What's included" con títulos de grupo se reparte en columnas; sin
       títulos, el titular se pone al lado y los items a su derecha
   ======================================================================== */

/* ---------- El día, y las fotos a su lado ----------
   Sandra marcó en verde la mitad derecha vacía: el texto usaba 70ch de una
   fila de 1.200px y el resto era blanco. El cuerpo es una rejilla de dos
   columnas, pero solo cuando el día trae media — así un día sin fotografías
   sigue leyéndose como un párrafo a todo el ancho y no hay que escribirlo
   de otra manera. */
@media (min-width: 860px) {
  .routeday-body:has(.routeday-media) {
    display: grid;
    grid-template-columns: minmax(0, 1.15fr) minmax(0, 1fr);
    gap: clamp(1.5rem, 3vw, 2.75rem);
    align-items: start;
  }
  /* La columna ya limita la medida; el tope de 70ch encogía el texto una
     segunda vez y dejaba una franja muerta dentro de su propia columna. */
  .routeday-body:has(.routeday-media) .routeday-copy > p { max-width: none; }
  .routeday-body:has(.routeday-media) .day-facts { margin-top: 1.1rem; }
}
.routeday-media { margin-top: 1.25rem; }
@media (min-width: 860px) { .routeday-media { margin-top: 0; } }

.routeday-rail .rail-track {
  /* Una foto por vista, no la que asoma: aquí el carrusel es del día, no de
     la página, y media fotografía cortada al borde de un acordeón se lee
     como un fallo de maquetación. */
  grid-auto-columns: 100%;
  gap: 0.75rem;
  scroll-padding-left: 0;
  padding-bottom: 0;
}
.routeday-shot { margin: 0; }
.routeday-shot img {
  display: block;
  width: 100%;
  aspect-ratio: 3 / 2;
  object-fit: cover;
  border-radius: var(--radius-lg);
  background: var(--brand-050);
}
.routeday-shot figcaption {
  margin-top: 0.6rem;
  font: 400 0.78rem/1.5 var(--font-body);
  color: var(--ink-secondary);
}
/* El script esconde la fila entera cuando no hay scroll, así que un día de
   una sola foto no paga el alto de unas flechas que no hacen nada. */
.routeday-rail .rail-nav { margin-top: 0.85rem; }
.routeday-rail .rail-btn { width: 36px; height: 36px; }
.routeday-rail .rail-btn svg { width: 17px; height: 17px; }

/* ---------- Incluye / no incluye, con o sin títulos de grupo ----------
   Sandra: "en algunos itinerarios/programas no habrá título '2' y solo
   serían los item '3'". Los dos casos se escriben igual —

     <div class="inc-groups">
       <div class="inc-group">
         <h3>…</h3>        ← opcional
         <ul class="check-list">…</ul>
       </div>
     </div>

   — y el bloque cambia de forma según haya o no <h3>. */

/* Con títulos: la línea no se estira hasta los 600px que le tocarían con dos
   grupos en una fila de 1.200. */
.inc-group:has(h3) .check-list { max-width: 42ch; }
/* Grupos mezclados, unos con nombre y otros sin él: el hueco del título se
   reserva para que las listas arranquen a la misma altura en toda la fila.
   0,66rem de texto a 1,4 de interlínea más 0,6rem de margen, que es
   exactamente lo que ocupa un .inc-group h3. */
.inc-groups:has(h3) .inc-group:not(:has(h3))::before {
  content: "";
  display: block;
  height: 1.52rem;
}

/* Sin ningún título: un día suelto con tres líneas dejaba el titular de pie
   sobre una columna delgada y mucho azul vacío. El bloque gira — titular a
   la izquierda, items a la derecha en dos columnas — que es la forma que ya
   tenía "Not included" justo debajo. La banda queda del mismo alto por los
   dos lados, la escriba quien la escriba. */
@media (min-width: 820px) {
  .incblock:not(.incblock-not):not(:has(.inc-group h3)) {
    display: grid;
    grid-template-columns: minmax(0, 0.8fr) minmax(0, 2fr);
    gap: clamp(1rem, 2.5vw, 2.25rem);
    align-items: start;
  }
  .incblock:not(.incblock-not):not(:has(.inc-group h3)) > h2 { margin-bottom: 0; }
  .incblock:not(.incblock-not):not(:has(.inc-group h3))
    .inc-groups:has(.inc-group:only-child) .check-list {
    columns: 2;
    column-gap: clamp(1.5rem, 3vw, 2.5rem);
  }
  .incblock:not(.incblock-not):not(:has(.inc-group h3)) .check-list li { break-inside: avoid; }
}

/* ---------- Travel guides relacionadas ----------
   Documento Machu Picchu, §11: cuatro artículos elegidos a mano, con
   categoría, título, descripción y fecha de última revisión. Cuatro, no tres
   como en el índice del blog — y por debajo de 1.040 vuelven a los dos y al
   uno que ya usaba .guides, para no abrir un tercer juego de reglas. */
.guides-related { grid-template-columns: repeat(4, minmax(0, 1fr)); }
@media (max-width: 1040px) { .guides-related { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 620px)  { .guides-related { grid-template-columns: 1fr; } }
/* La fecha va donde el documento la pide, al pie de la tarjeta, en la misma
   línea de base que el "Read the guide". Mientras Enrique no mande las
   fechas reales el marcador la deja fuera de la página, no la inventa. */
.guide-card-rev {
  margin-top: 0.75rem;
  font: 400 0.72rem/1.5 var(--font-body);
  color: var(--ink-muted);
}

/* ========================================================================
   Machu Picchu — las piezas nuevas del documento de destino
   Cuatro reglas pequeñas, ninguna componente nueva: la línea de duración y
   exigencia sobre las tarjetas de "ways to visit", la lista con etiqueta
   dentro de los tabs, la nota de temporada y la fecha de revisión que el
   documento exige en el módulo de circuitos.
   ======================================================================== */

/* Documento, §3: "Incluir duración, exigencia física, forma de llegada y una
   sola línea descriptiva." Los tres primeros son una sola línea sobre la
   descripción, no tres etiquetas: leídos de un vistazo antes del párrafo.

   Va con la clase de la tarjeta delante a propósito. .quad-card p pesa
   una clase y un elemento, así que le gana a .quad-meta a secas por
   especificidad y no por orden: sin esto la línea salía a 14,4px en gris de
   cuerpo. Y ese mismo selector le da flex:1 1 auto a todos los <p> de la
   tarjeta, que estiraría esta línea como si fuese la descripción. */
.quad-card .quad-meta {
  flex: none;
  margin-bottom: 0.55rem;
  font: 500 0.72rem/1.5 var(--font-body);
  letter-spacing: 0.04em;
  /* --brand-400 es el celeste: 4,3:1 sobre el fondo claro de la tarjeta, por
     debajo del mínimo para un texto de este tamaño. --brand-600 es el azul de
     enlace y pasa de sobra. */
  color: var(--brand-600);
}

/* Las viñetas de los seis tabs. Casi todas del documento vienen como
   "Etiqueta: texto", así que el <strong> hace de clave y el resto corre
   detrás; las que no la llevan se leen igual. */
.tab-points {
  margin: 1rem 0 0;
  padding-left: 1.15rem;
  display: grid;
  gap: 0.6rem;
  font-size: 0.92rem;
  line-height: 1.65;
  color: var(--ink-body);
  max-width: 68ch;
}
.tab-points li::marker { color: var(--brand-400); }
.tab-points strong { color: var(--ink); font-weight: 600; }
.tabpanel-body .tab-points + .link-arrow { margin-top: 1.25rem; display: inline-flex; }

/* "Important distinction" del documento: el sitio abre todo el año, la red de
   Caminos Inka cierra en febrero. Es una salvedad, no una viñeta más, así que
   se separa del resto con su propio filete. */
.tab-note {
  margin-top: 1.25rem;
  padding-top: 1rem;
  border-top: 1px solid var(--line);
  font-size: 0.88rem;
  line-height: 1.65;
  color: var(--ink-secondary);
  max-width: 68ch;
}
.tab-note strong { color: var(--ink); }
.tab-pending { margin-top: 1.1rem; }

/* Documento, §6, "Dynamic information": el módulo de circuitos tiene que
   mostrar la fecha en que se revisó y enlazar a la información oficial. Las
   dos van marcadas mientras no lleguen, así que esta regla solo se ve el día
   que existan. */
.reviewed {
  margin-top: 0.9rem;
  font: 400 0.78rem/1.6 var(--font-body);
  color: var(--ink-muted);
}

/* La barra de datos nació con cuatro columnas fijas. "At a glance" del
   documento de Machu Picchu trae cinco datos, y el quinto se quedaba solo en
   una segunda fila con su filete colgando. Se cuentan los items en vez de
   pedir una clase nueva, así que cualquier destino que mande cinco datos cae
   de pie sin tocar el marcado. Por debajo de 900 la barra ya es de dos
   columnas y ahí 2+2+1 se lee como una lista, no como una fila rota. */
@media (min-width: 901px) {
  .fact-bar:has(li:nth-child(5)) { grid-template-columns: repeat(5, 1fr); }
}

/* ========================================================================
   Carruseles: el mismo comportamiento en todo el sitio
   Sandra: "todos los carruseles deben ser automaticos y tmb con flechitas",
   "los carruseles de todos, de todas las ventanas". Cada .rail lleva ya
   data-autoplay y su fila de flechas; el script las ensena solo cuando hay a
   donde ir, asi que un carril de una sola foto sigue sin mostrarlas.
   ======================================================================== */

/* --- La pieza del duo deja de ser una foto vertical suelta ---
   Sandra: "podemos hacer la imagen mas rectangular pero horizontal y hacerlo
   tipo carrusel". Pasa de un retrato 3/4 a un 3/2 apaisado y de una imagen a
   varias. Ya no es un enlace: dentro de un <a> las flechas no se pueden
   pulsar sin irse de la pagina, asi que el enlace se queda donde ya estaba,
   en la columna de texto. */
/* align-self: start, no center: era lo que dejaba el carrusel 197px por
   encima del texto en la portada. */
.duo-rail { display: block; align-self: start; width: 100%; }
.duo-rail .rail-track {
  grid-auto-columns: 100%;
  gap: 0.6rem;
  scroll-padding-left: 0;
  padding-bottom: 0;
  border-radius: var(--radius-lg);
}
.duo-rail .rail-track img {
  width: 100%; height: auto;
  aspect-ratio: 3 / 2;
  object-fit: cover;
  border-radius: var(--radius-lg);
  background: var(--brand-050);
}
.duo-rail .rail-nav { margin-top: 0.85rem; }
.duo-rail .rail-btn { width: 38px; height: 38px; }
/* Sobre el azul del bloque oscuro las flechas se dibujan al reves. */
.duo-dark .duo-rail .rail-btn {
  background: oklch(1 0 0 / 0.12);
  border-color: oklch(1 0 0 / 0.28);
  color: var(--on-dark);
}
@media (hover: hover) and (pointer: fine) {
  .duo-dark .duo-rail .rail-btn:hover {
    background: oklch(1 0 0 / 0.2); border-color: oklch(1 0 0 / 0.45);
  }
}

/* --- Cuatro tarjetas en una rejilla de tres ---
   Sandra: "se ve mal 3 y 1 abajo". .spec-grid son tres columnas fijas, asi que
   la cuarta se quedaba sola en una segunda fila con dos huecos al lado. Se
   cuentan los items, como en la barra de datos: con cuatro son dos y dos. */
@media (min-width: 760px) {
  .spec-grid:has(> :nth-child(4)):not(:has(> :nth-child(5))) {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

/* Siete tarjetas en tres columnas vuelven a dejar una sola en la ultima fila,
   que es exactamente lo que Sandra marco con las cuatro. Con siete, cuatro
   columnas reparten 4+3 y ninguna fila se queda coja. */
@media (min-width: 1040px) {
  .spec-grid:has(> :nth-child(7)):not(:has(> :nth-child(8))) {
    grid-template-columns: repeat(4, minmax(0, 1fr));
  }
}
/* Y tres tarjetas caben en tres columnas mucho antes de los 1040: por debajo
   de ahi la rejilla pasaba a dos y dejaba la tercera sola. */
@media (min-width: 760px) {
  .spec-grid:has(> :nth-child(3)):not(:has(> :nth-child(4))) {
    grid-template-columns: repeat(3, minmax(0, 1fr));
  }
}

/* ========================================================================
   Ref C — el mosaico bento
   La referencia de las tarjetas verdes: una sola rejilla donde conviven
   tarjetas macizas y tarjetas-foto, cada una con su icono arriba a la
   izquierda y su flecha en circulo arriba a la derecha, y el texto de las
   fotograficas apoyado abajo sobre la propia imagen.

   Sustituye a la galeria de "una ancha arriba y dos debajo", que ademas
   declaraba un `sizes` de 33vw para huecos de 1072 y 640 -- de ahi que se
   viera borrosa.
   ======================================================================== */
.bento {
  display: grid;
  gap: clamp(0.85rem, 1.6vw, 1.25rem);
  grid-template-columns: repeat(4, minmax(0, 1fr));
  grid-auto-rows: minmax(190px, auto);
}
.bento-tile {
  position: relative;
  display: flex; flex-direction: column; justify-content: flex-end;
  padding: clamp(1.25rem, 2.2vw, 1.75rem);
  border-radius: var(--radius-xl);
  overflow: hidden;
  isolation: isolate;
}
.bento-w2 { grid-column: span 2; }
.bento-h2 { grid-row: span 2; }

/* --- la variante fotografica: la imagen es el fondo, no un hijo mas --- */
.bento-photo > img {
  position: absolute; inset: 0; z-index: -2;
  width: 100%; height: 100%; object-fit: cover;
}
/* Un velo que solo pesa en la mitad baja, que es donde cae el texto: asi la
   fotografia se ve entera y la frase sigue legible. */
.bento-photo::after {
  content: ""; position: absolute; inset: 0; z-index: -1;
  background: linear-gradient(to top,
    oklch(0.215 0.02 259 / 0.82) 0%,
    oklch(0.215 0.02 259 / 0.45) 34%,
    oklch(0.215 0.02 259 / 0) 66%);
}
.bento-photo, .bento-photo h3, .bento-photo p { color: var(--on-dark); }
.bento-photo p { color: var(--on-dark-body); }

/* --- las macizas --- */
.bento-dark { background: var(--brand-900); color: var(--on-dark); }
.bento-dark h3 { color: var(--on-dark); }
.bento-dark p { color: var(--on-dark-body); }
.bento-light { background: var(--bg-page); box-shadow: inset 0 0 0 1px var(--line-soft); }

.bento-tile h3 {
  font-family: var(--font-display);
  font-size: clamp(1.05rem, 1.6vw, 1.35rem);
  font-weight: 430; line-height: 1.25; letter-spacing: -0.01em;
  margin-bottom: 0.45rem;
}
.bento-tile p {
  font-size: 0.87rem; line-height: 1.55;
  color: var(--ink-body);
  margin: 0; max-width: 42ch;
}

/* --- el icono arriba a la izquierda y la flecha arriba a la derecha --- */
.bento-mark {
  position: absolute; top: clamp(1.1rem, 2vw, 1.5rem); left: clamp(1.1rem, 2vw, 1.5rem);
  width: 28px; height: 28px; display: grid; place-items: center;
  border-radius: 0;
  background: none;
  color: var(--on-dark);
}
.bento-light .bento-mark { background: none; color: var(--accent); }
.bento-cue {
  position: absolute; top: clamp(1.1rem, 2vw, 1.5rem); right: clamp(1.1rem, 2vw, 1.5rem);
  width: 38px; height: 38px; display: grid; place-items: center;
  border-radius: 50%;
  border: 1px solid oklch(1 0 0 / 0.45);
  color: var(--on-dark);
  transition: background-color var(--t-hover) var(--ease-out-expo),
              border-color var(--t-hover) var(--ease-out-expo),
              color var(--t-hover) var(--ease-out-expo);
}
.bento-light .bento-cue { border-color: var(--line); color: var(--brand-600); }

/* El mismo estandar de siempre: la pieza se pinta y su marca se mueve con
   ella. Aqui la flecha es la marca. */
@media (hover: hover) and (pointer: fine) {
  a.bento-tile:hover .bento-cue,
  .bento-tile:hover .bento-cue {
    background: var(--accent-amber);
    border-color: var(--accent-amber);
    color: var(--brand-900);
  }
  .bento-light:hover { background: var(--brand-150); box-shadow: inset 0 0 0 1px transparent; }
  .bento-light:hover .bento-mark { background: var(--accent-amber); color: var(--brand-900); }
}

@media (max-width: 900px) {
  .bento { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .bento-w2 { grid-column: span 2; }
  .bento-h2 { grid-row: span 1; }
}
@media (max-width: 560px) {
  .bento { grid-template-columns: 1fr; }
  .bento-w2 { grid-column: span 1; }
}

/* ========================================================================
   Ref B — dos paneles y una insignia en la junta
   La referencia de la tarjeta de visita: una fotografia muy redondeada a un
   lado, un panel macizo al otro, y un circulo montado justo en la costura que
   cose los dos. Sirve para una declaracion que necesita peso y no solo
   parrafos -- que es lo que le faltaba a "To know Peru is also to care for it".
   ======================================================================== */
.splitb {
  position: relative;
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: clamp(0.85rem, 1.6vw, 1.25rem);
  align-items: stretch;
}
.splitb-media {
  border-radius: var(--radius-xl);
  overflow: hidden;
  min-height: clamp(300px, 38vw, 520px);
}
.splitb-media img { width: 100%; height: 100%; object-fit: cover; display: block; }
.splitb-panel {
  background: var(--brand-900);
  color: var(--on-dark);
  border-radius: var(--radius-xl);
  padding: clamp(1.9rem, 4vw, 3.4rem);
  display: flex; flex-direction: column; justify-content: center;
}
.splitb-panel .eyebrow { color: var(--accent-soft); }
.splitb-panel h2 { color: var(--on-dark); margin-bottom: 1.1rem; }
.splitb-panel p { color: var(--on-dark-body); font-size: 0.97rem; line-height: 1.75; max-width: 46ch; }
.splitb-panel p + p { margin-top: 0.9rem; }

/* El circulo se apoya en la costura, mitad sobre la foto y mitad sobre el
   panel. Es decorativo: no lleva texto que haga falta leer. */
.splitb-badge {
  position: absolute; z-index: 2;
  left: 50%; top: 50%; transform: translate(-50%, -50%);
  width: clamp(64px, 8vw, 104px); aspect-ratio: 1;
  border-radius: 50%;
  background: var(--bg-page);
  display: grid; place-items: center;
  color: var(--brand-700);
  box-shadow: 0 2px 18px oklch(0.215 0.02 259 / 0.18);
}
@media (max-width: 900px) {
  .splitb { grid-template-columns: 1fr; }
  .splitb-media { min-height: clamp(240px, 56vw, 360px); }
  /* Apilados, la costura es horizontal: el circulo baja a ella. */
  .splitb-badge { top: auto; left: 50%; transform: translate(-50%, -50%); }
}

/* ========================================================================
   La foto y el texto de al lado, alineados
   Sandra: "alinea la imagen con el texto del costado y eso hazlo en todos los
   elementos parecidos de todas las paginas". Medido antes de tocar nada, en
   las piezas de dos columnas de cuatro paginas:

     .quality-split   el pie de la foto caia 179px por debajo del texto
     .planta          la foto arrancaba 47px mas abajo
     .introsplit      30px de desfase
     .duo-grid        54px en una, 197px en la otra

   La regla: el texto manda la altura de la fila y la fotografia se ajusta a
   ella, asi que los dos bordes -- arriba y abajo -- quedan a ras. Un suelo
   minimo evita que un texto corto deje la foto convertida en una tira.
   Se queda fuera .planta, cuyo desfase es el diseno de la referencia 11: ahi
   el bloque cuelga de la esquina de la foto a proposito.
   ======================================================================== */
.quality-split,
.process-split,
.introsplit,
.splitb { align-items: stretch; }

.quality-media,
.process-media,
.introsplit-media,
.splitb-media {
  min-height: clamp(260px, 30vw, 440px);
  display: flex; flex-direction: column;
}
.quality-media img,
.process-media img,
.introsplit img,
.splitb-media img {
  width: 100%;
  height: 100%;
  min-height: 0;
  /* el aspect-ratio dejaria de mandar la altura y volveria a descuadrar */
  aspect-ratio: auto;
  object-fit: cover;
}
/* El pie de foto no entra en el reparto: se queda pegado debajo. */
.quality-media figcaption { flex: none; }

/* En el duo, con align-self:start la fotografia se quedaba en su 3/2 -- 366x245
   medidos -- dentro de una fila de 750 que marca el texto, y sobraban 500px de
   nada a su derecha. Se estira a la fila: el 3/2 pasa a ser el minimo y
   object-fit recorta, asi que la foto llena la columna en vez de flotar en
   ella. Arriba y abajo quedan a ras. */
.duo-grid { align-items: stretch; }
.duo-grid > .duo-body { align-self: center; }
.duo-grid > .duo-rail { align-self: stretch; display: flex; flex-direction: column; }
/* Cuando el texto es mucho mas alto que el tope de la foto, el sobrante se
   reparte arriba y abajo en vez de amontonarse debajo: centrada parece una
   decision, pegada arriba con 600px de blanco debajo parece un fallo. */
.duo-rail .rail-track { flex: 1 1 auto; min-height: 0; align-items: center; }
.duo-rail .rail-nav { flex: none; }
/* Estirar sin tope revivia un fallo que ya estaba documentado aqui: con una
   columna de texto de 925px la foto salia a 0.55 de proporcion, y a 700px de
   ventana a 0.29 -- una tira que parte por la mitad al sujeto de una foto
   apaisada. El tope es 3/4: la imagen crece con la fila hasta ahi y no mas.
   cqw mide contra el ancho del propio carril, asi que el limite es de
   proporcion y no de pixeles. */
.duo-rail { container-type: inline-size; }
.duo-rail .rail-track img {
  height: 100%;
  min-height: clamp(240px, 30vw, 420px);
  max-height: 165cqw;
  aspect-ratio: auto;
  object-fit: cover;
}
/* Si el navegador no entiende cqw, la foto se queda en su 3/2 de siempre. */
@supports not (max-height: 1cqw) {
  .duo-rail .rail-track img { max-height: none; aspect-ratio: 3 / 2; height: auto; }
}

@media (max-width: 900px) {
  /* Apiladas ya no hay "al lado" que alinear, y el suelo minimo estorba. */
  .quality-media, .process-media, .introsplit-media, .splitb-media { min-height: 0; }
  .quality-media img, .process-media img, .introsplit img, .splitb-media img { height: auto; aspect-ratio: 3 / 2; }
}
/* Cinco tarjetas en dos columnas vuelven a dejar una sola abajo. Con tres
   columnas salen 3+2 y la fila cierra. */
@media (min-width: 760px) {
  .spec-grid:has(> :nth-child(5)):not(:has(> :nth-child(6))) {
    grid-template-columns: repeat(3, minmax(0, 1fr));
  }
}

/* ========================================================================
   Dos formas que no son una tarjeta
   Sandra: "esta llena de cuadrados, no puedes organizar diferente la
   informacion". Cierto: arreglar "faltan iconos" metiendo todo en tarjetas
   dejo seis rejillas seguidas y treinta y seis recuadros iguales. Lo que
   faltaba no era otra caja, era otra forma.
   ======================================================================== */

/* --- Filas: icono, titulo y texto, separadas por un filete y sin suelo ---
   Para listas largas de cosas equivalentes. Se leen de corrido, ocupan la
   mitad de alto que la misma informacion en tarjetas y no compiten con las
   secciones que si son de tarjetas. */
.iconrows {
  list-style: none; margin: 0; padding: 0;
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  column-gap: clamp(2rem, 5vw, 4.5rem);
}
/* Sandra: "el primero muy pegado al texto, y no esta igual que los demas
   elementos [...] como que estan redondeados, e incluso los iconos estan muy
   pegados a la izquierda". Las tres eran ciertas: la fila no tenia relleno
   lateral, asi que el icono salia pegado al borde y el naranja del hover
   llegaba a ras; y las esquinas eran rectas mientras el resto del sitio va
   redondeado. Ahora la fila tiene relleno por los cuatro lados y el mismo
   radio que las tarjetas, y el filete separador se dibuja por dentro para que
   no pelee con las esquinas. */
.iconrows > li {
  position: relative;
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  gap: clamp(0.9rem, 1.6vw, 1.25rem);
  /* La marca va centrada contra TODO el texto de la fila, no pegada al titulo. */
  align-items: center;
  padding: clamp(1rem, 1.8vw, 1.35rem) clamp(1rem, 1.8vw, 1.35rem);
  border-radius: var(--radius-xl);
}
.iconrows > li::before {
  content: "";
  position: absolute; top: 0;
  left: clamp(1rem, 1.8vw, 1.35rem); right: clamp(1rem, 1.8vw, 1.35rem);
  border-top: 1px solid var(--line-soft);
}
/* La primera de cada columna no lleva filete arriba: seria una raya suelta. */
.iconrows > li:nth-child(-n+2)::before { content: none; }
/* Y con la fila pintada, el filete sobra. */
@media (hover: hover) and (pointer: fine) {
  .iconrows > li:hover::before { border-color: transparent; }
}
/* La primera fila no arranca pegada al parrafo que la precede. */
.iconrows { margin-top: clamp(1.5rem, 3vw, 2.25rem); }
.iconrows h3 {
  font-size: clamp(0.98rem, 1.35vw, 1.12rem);
  margin-bottom: 0.3rem;
}
.iconrows p { font-size: 0.89rem; line-height: 1.6; color: var(--ink-body); margin: 0; max-width: 46ch; }
.iconrows .icon-chip { margin: 0; }
@media (max-width: 820px) {
  .iconrows { grid-template-columns: 1fr; }
  .iconrows > li:nth-child(-n+2)::before { content: ""; }
  .iconrows > li:first-child::before { content: none; }
}

/* --- Una secuencia en horizontal, con su hilo ---
   Para lo que de verdad es un antes, un durante y un despues. Tres momentos
   colgados de una linea, no tres cajas apiladas. */
.flow {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: clamp(1.5rem, 3.5vw, 3rem);
  position: relative;
}
.flow-step { position: relative; padding-top: 3.4rem; }
/* El hilo pasa por detras de los numeros y se corta en el ultimo. */
.flow-step::before {
  content: "";
  position: absolute; top: 1.35rem; left: 2.9rem; right: calc(-1 * clamp(1.5rem, 3.5vw, 3rem));
  height: 1px; background: var(--line);
}
.flow-step:last-child::before { content: none; }
.flow-n {
  position: absolute; top: 0; left: 0;
  width: 2.7rem; height: 2.7rem;
  display: grid; place-items: center;
  border-radius: 50%;
  background: var(--brand-900); color: var(--on-dark);
  font: 500 0.82rem/1 var(--font-body);
}
.flow-step > h3 {
  font-family: var(--font-display);
  font-size: clamp(1.05rem, 1.6vw, 1.3rem);
  font-weight: 430; letter-spacing: -0.01em;
  margin-bottom: 0.9rem;
}
.flow-step .check-list li { font-size: 0.89rem; line-height: 1.6; }
@media (max-width: 900px) {
  .flow { grid-template-columns: 1fr; gap: 2rem; }
  .flow-step::before { content: none; }
  .flow-step { padding-top: 0; padding-left: 3.6rem; }
  .flow-n { top: -0.2rem; }
}
/* Variante sin titulo: cuando el documento da una frase y no un epigrafe, no
   se le inventa uno. La marca queda alineada con la primera linea. */
.iconrows-plain p { font-size: 0.95rem; line-height: 1.6; color: var(--ink); max-width: 44ch; }
/* Pieza de solo fotografia: el rotulo es el epigrafe del propio texto, sin
   parrafo debajo, asi que no hace falta reservarle sitio. */
.bento-photo figcaption { margin: 0; }
.bento-photo figcaption h3 { margin: 0; }
/* Una columna: dentro de la mitad de un duo no caben dos. */
.iconrows-1col { grid-template-columns: 1fr; }
.iconrows-1col > li:nth-child(2)::before { content: ""; }
/* El boton de pausa del carrusel. Va con las flechas, mas discreto que ellas
   porque no es la accion principal, pero del mismo tamano para que la fila de
   controles no quede coja. */
.rail-pause { margin-right: 0; }
.rail-pause[aria-pressed="true"] {
  background: var(--brand-050);
  border-color: var(--brand-400);
  color: var(--brand-700);
}

/* ========================================================================
   La cartilla de conversion, en banda
   Sandra: "hay varias de estas cartillas y la verdad estan muy feas [...]
   organiza los elementos para que no haya espacios vacios como los que
   tenemos ahora". El hueco venia de que el titular y el texto iban a la
   izquierda y los botones centrados: entre unos y otros quedaba media caja
   sin nada. Con botones, la cartilla se parte en dos columnas -- la
   pregunta a un lado, la respuesta al otro -- y se acaba el hueco.
   Sin botones sigue siendo una nota de una sola columna.
   ======================================================================== */
@media (min-width: 760px) {
  /* Dos items y no cuatro: el texto entero a un lado, las acciones al otro.
     Antes el titular y el parrafo eran items sueltos que caian en filas
     distintas, y los botones, al cruzarlas, las estiraban las dos. */
}

/* ========================================================================
   Un solo aire entre botones
   Sandra: "botones muy juntos". Medidos los ocho contenedores que ponen dos
   o mas botones en fila, en nueve paginas: casi todos a 12px, uno a 3 y otro
   a 0 -- dos botones pegados sin nada entre ellos. Un boton relleno junto a
   otro con borde a 12px se leen como una sola pieza partida.
   Un valor para todos, y el mismo tambien cuando se apilan.
   ======================================================================== */
.header-actions,
.hero-actions,
.guides-more-actions,
.footer-top-actions,
.final-cta-actions,
.experts-actions,
.form-success-actions,
.guides-more,
/* La barra del encabezado es la excepcion con motivo: ahi el espacio es
   escaso y los dos botones son la misma accion en dos formas. */
.header-actions { gap: 0.75rem; }
/* Y dos botones no se quedan pegados al texto que los precede. */

/* ========================================================================
   La cartilla de conversion, en pequeno
   Sandra, senalando el bloque "Go beyond the classic route": "puedes hacer
   algo asi pero pequeno, un call to action". Es la misma pieza -- fotografia
   a un lado, antetitulo, titular y boton al otro -- a la mitad de alto y sin
   el bloque colgado de la esquina, que es lo que la hacia grande.
   El suelo palido desaparece: la fotografia ya separa el bloque de lo que
   tiene encima, y una banda de color mas era otro corte de pantalla.
   ======================================================================== */
/* La columna derecha puede llevar mas de un parrafo: cuando los lleva es un
   bloque, no un <p>, y sus parrafos necesitan su propio aire. */
.section-head-lead > p { margin: 0; }
.section-head-lead > p + p { margin-top: 0.9rem; }

/* Lista con un icono por linea, sin tarjeta ni filete: para enumeraciones
   cortas donde una palomita repetida no significa nada -- cinco oficios no son
   cinco cosas marcadas, son cinco cosas distintas. Donde la marca si dice algo
   (incluido, no incluido, hazlo antes de viajar) la lista sigue siendo
   .check-list. */
.iconlist {
  list-style: none; margin: 0; padding: 0;
  display: grid; gap: 0.85rem;
}
.iconlist > li {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  gap: 0.8rem;
  align-items: center;
  font-size: 0.95rem; line-height: 1.5;
  color: var(--ink-body);
}
.iconlist-ic {
  display: inline-flex; align-items: center; justify-content: center;
  width: 20px; height: 20px;
  color: var(--accent);
  flex: 0 0 auto;
}

/* ========================================================================
   Ref B repartida en cuatro
   Sandra: "la quiero como la imagen pero con una en cada esquina, derecha e
   izquierda superior e inferior, y en el centro coloca algo, y quita la imagen
   de fondo". La tarjeta de visita de la referencia monta el disco en la
   costura de dos paneles; aqui hay cuatro, asi que el disco va en el cruce.
   ======================================================================== */
/* --- Ref 1 · the heading rides the photograph, the cards sit beside it --- */
.showcase {
  position: relative;
  border-radius: var(--radius-xl);
  overflow: hidden;
  isolation: isolate;
}
.showcase-bg {
  position: absolute; inset: 0;
  width: 100%; height: 100%;
  object-fit: cover;
  z-index: -2;
}
.showcase-scrim {
  position: absolute; inset: 0;
  z-index: -1;
  /* Pesaba a la izquierda, que es donde estaba el titular blanco. Con el
     titular arriba y las cuatro tarjetas cubriendo el ancho de abajo, el velo
     pasa a caer de arriba abajo. */
  background:
    linear-gradient(180deg, oklch(0.16 0.014 259 / 0.78) 0%,
                            oklch(0.16 0.014 259 / 0.5) 46%,
                            oklch(0.16 0.014 259 / 0.28) 100%);
}
.showcase-inner {
  display: grid;
  gap: clamp(1.75rem, 3.5vw, 3rem);
  padding: clamp(1.5rem, 3.2vw, 2.75rem);
}
.showcase-cards {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: clamp(0.85rem, 1.6vw, 1.25rem);
}
@media (min-width: 900px) {
  .showcase-inner { grid-template-columns: 1fr; }
  .showcase-copy { max-width: 60ch; }
}
@media (max-width: 1040px) {
  .showcase-cards { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 560px) {
  /* Two cards across a phone gives each about 140px, which breaks
     "Thoughtfully responsible" over three lines before the text starts. */
  .showcase-cards { grid-template-columns: 1fr; }
}
.showcase-lead {
  margin-top: 1rem;
  max-width: 44ch;
  font-size: 0.98rem; line-height: 1.7;
  color: oklch(1 0 0 / 0.86);
}
.showcase-copy { align-self: center; }
.showcase-copy h2 { color: var(--on-dark); margin-bottom: 0; }
.showcase-copy h2 em { color: var(--brand-200); }
/* La tarjeta es .quad-card. Aqui cae sobre una fotografia oscura, no sobre el
   fondo de pagina, asi que no necesita el filete que la hace existir alli. */
.showcase-cards > .quad-card { box-shadow: none; }

.quad {
  position: relative;
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: clamp(1.25rem, 3vw, 2.75rem);
}
/* .quad-card ya traia fondo, radio, tipografia y el hover naranja de arriba.
   Lo unico que cambia es que antes se recortaba contra una fotografia oscura
   y ahora cae sobre el fondo de pagina, que es casi el mismo blanco: sin
   filete la tarjeta no existiria. Es lo que le paso a .spec-item. */
.quad-card { box-shadow: inset 0 0 0 1px var(--line-soft); }
/* La esquina que mira al centro se aparta del disco, y solo donde el disco
   existe, que es donde hay cuatro cuadrantes. */
@media (min-width: 760px) {
  .quad > .quad-card:nth-child(1) { padding-right: clamp(2.5rem, 5vw, 4rem); padding-bottom: clamp(2rem, 4vw, 3rem); }
  .quad > .quad-card:nth-child(2) { padding-left:  clamp(2.5rem, 5vw, 4rem); padding-bottom: clamp(2rem, 4vw, 3rem); }
  .quad > .quad-card:nth-child(3) { padding-right: clamp(2.5rem, 5vw, 4rem); padding-top:    clamp(2rem, 4vw, 3rem); }
  .quad > .quad-card:nth-child(4) { padding-left:  clamp(2.5rem, 5vw, 4rem); padding-top:    clamp(2rem, 4vw, 3rem); }
}
/* El disco, igual en los dos sitios: en el cruce de las cuatro esquinas y en
   el borde del panel de Travel style.

   Sandra: "esas tres lineas en escala no tienen nada que ver, y las letras
   alrededor igual". Eran un glifo inventado por mi y un anillo de texto que
   repetia los tres niveles escritos justo debajo. Ahora los dos llevan el
   logotipo entero -- entero, no la cupula recortada, que se leia como un
   trozo.

   Blanco detras y no azul: el logotipo tiene cuatro bandas de azul, de claro a
   oscuro, y sobre el azul profundo las dos ultimas desaparecen. El aro navy le
   da el borde que el blanco no tiene contra una pagina casi del mismo color; el
   aro exterior, del color de lo que hay detras, es lo que lo hace parecer
   recortado. */
.quad-badge, .levels-seal {
  position: absolute; z-index: 2;
  aspect-ratio: 1; border-radius: 50%;
  background: oklch(1 0 0);
  display: grid; place-items: center;
}
.quad-badge img, .levels-seal img { display: block; width: 66%; height: auto; }

.quad-badge {
  left: 50%; top: 50%; transform: translate(-50%, -50%);
  width: clamp(88px, 9.5vw, 132px);
  box-shadow: inset 0 0 0 2px var(--brand-900),
              0 0 0 clamp(8px, 1vw, 12px) var(--bg-page);
}
.levels-seal {
  left: 50%; top: 0; transform: translate(-50%, -50%);
  width: clamp(92px, 10vw, 140px);
  box-shadow: inset 0 0 0 2px var(--brand-900),
              0 0 0 clamp(9px, 1.1vw, 14px) var(--sand);
}
@media (max-width: 759px) {
  /* Apiladas no hay cruce sobre el que apoyarlo. */
  .quad { grid-template-columns: 1fr; }
  .quad-badge { display: none; }
}

/* ========================================================================
   Travel style — Sandra: "usa este estilo"
   La referencia es un panel blanco con el disco montado en su borde superior
   y tres tarjetas dentro: numero grande arriba, texto abajo, la del medio
   rellena. Las tres paginas que llevan .levels -- destino, itinerario e
   itinerario-southern-peru -- cambian con esta misma regla.
   ======================================================================== */
.levels-panel {
  position: relative;
  background: oklch(1 0 0);
  border-radius: clamp(18px, 2.4vw, 32px);
  padding: clamp(3rem, 5vw, 4.5rem) clamp(1rem, 2.2vw, 1.75rem) clamp(1rem, 2.2vw, 1.75rem);
  margin-top: clamp(46px, 5.5vw, 70px);   /* la mitad del disco sobresale */
}
.levels { align-items: stretch; gap: clamp(0.6rem, 1.2vw, 1rem); }
.level-card {
  display: flex; flex-direction: column;
  background: var(--brand-050);
  border: 0;
  border-radius: clamp(12px, 1.6vw, 22px);
  padding: clamp(1.25rem, 2.4vw, 2rem);
  /* El panel ya separa la tarjeta del fondo; el salto al pasar por encima
     desentonaba con el resto del sitio, donde nada se mueve. */
  transform: none;
}
.level-n {
  font-family: var(--font-display);
  font-size: clamp(1.9rem, 4vw, 3.25rem);
  font-weight: 430; letter-spacing: -0.03em; line-height: 1;
  color: var(--brand-700);
  margin-bottom: clamp(1.4rem, 3vw, 2.5rem);
}
.level-card.is-featured { background: var(--brand-900); box-shadow: none; }
.level-card.is-featured::before { content: none; }
/* --brand-400 sobre el azul profundo da 2,77:1, por debajo del 3:1 que pide
   un numero de este tamano. El celeste de --brand-200 pasa con 6,5:1 y es
   el mismo acento que el sitio ya usa sobre fondo oscuro. */
.level-card.is-featured:not(:hover) .level-n { color: var(--brand-200); }
.level-card.is-featured:not(:hover) .level-tag { color: var(--accent-soft); }
.level-card.is-featured:not(:hover) h3 { color: var(--on-dark); }
.level-card.is-featured:not(:hover) li { color: var(--on-dark-body); }
/* Sandra: "no quiero que uses aspas, quiero que uses iconos". Era el caracter
   \2713 puesto como texto; pasa a la misma mascara que .check-list, asi el
   color lo sigue poniendo el CSS y hereda el blanco del hover. */
.level-card li::before {
  content: ""; position: absolute; left: 0; top: 0.3em;
  width: 1em; height: 1em;
  background-color: var(--accent);
  -webkit-mask: var(--mark-check) no-repeat center / contain;
  mask: var(--mark-check) no-repeat center / contain;
}
.level-card.is-featured:not(:hover) li::before { background-color: var(--accent-soft); }
/* Las marcas de lista se pintan con background-color sobre una mascara, no
   con color, asi que el estandar de hover no las alcanza solo. */
.level-card:hover li::before,
.packpanel-items > li:hover::before { background-color: #fff; }
@media (max-width: 720px) { .level-card { padding-block: clamp(1.1rem, 3vw, 1.5rem); }
                            .level-n { margin-bottom: 1rem; } }

/* ========================================================================
   Estandar de hover — el ultimo bloque de la hoja, a proposito
   Todo lo que se pinta al pasar por encima se declara aqui y solo aqui.
   Va al final para que gane por orden a cualquier color de reposo de la
   misma especificidad, ahora y cuando se anada el siguiente.
   ======================================================================== */
@media (hover: hover) and (pointer: fine) {
  /* The heading follows the pointer down the rows: one phrase per step. */
  .process-body:has(.process-step:hover) .process-title em:first-child { color: var(--ink); }
  .process-body:has(.process-step:nth-child(1):hover) .process-title em:nth-child(1),
  .process-body:has(.process-step:nth-child(2):hover) .process-title em:nth-child(2),
  .process-body:has(.process-step:nth-child(3):hover) .process-title em:nth-child(3) {
    color: var(--brand-600);
  }

  /* Light blocks — the same two moves everywhere. The extra selectors on the
     process rows are specificity, not decoration: .process-steps
     .process-step.is-current outranks a bare :hover and would otherwise keep
     the row you are actually on at its resting colour. */
  /* Sandra: "quiero que al pasar por encima de cada elemento se pinte de azul o
     amarillo o celeste; blanco es muy poco llamativo." Tenia razon: el suelo
     pasaba a --brand-050, que esta a 0.96 de luminosidad sobre una pagina que
     esta a 0.995 -- un paso de nada que no se veia.
     El suelo va ahora al celeste de la paleta y el icono al ambar, que son dos
     de los tres colores que pidio. Sigue siendo una sola regla: el bloque se
     mueve un paso y su icono se mueve con el. */
  /* Sandra, con la referencia del sitio coral: "ese rojo es cuando pasa el
     hover, ahi se revientan los colores con el boton o con el icono usado".
     Eso es: el color estalla en la MARCA, no en el suelo. Pintar el bloque
     entero de celeste era mucho fondo y poca senal.
     El suelo apenas se mueve -- lo justo para que se note que la pieza
     responde -- y el golpe de color se lo lleva el icono. */
  /* Sandra: "cuando pase el mouse quiero que todo se pinte de naranja y las
     letras y el icono cambien a blanco". Es una sola regla y se aplica igual a
     todas las piezas: la pieza se llena del naranja de la marca y todo lo que
     lleva dentro -- titulo, texto, icono, filete -- pasa a blanco.
     Blanco sobre ese naranja mide 5.21:1, por encima del minimo para texto
     normal, asi que el parrafo se sigue leyendo y no solo el titular. */
  .quad-card:hover,
  .packpanel-items > li:hover,
  .commit-list li:hover,
  .process-step:hover,
  .spec-item:hover,
  .level-card:hover,
  .iconrows > li:hover,
  .bento-light:hover,
  .process-steps:hover .process-step.is-current:hover {
    background: var(--accent);
    box-shadow: inset 0 0 0 1px var(--accent);
    border-color: transparent;
  }
  /* Se enumeraban las etiquetas -- h3, p, li -- y el titular de .commit-list
     es un h4, asi que se quedaba en negro sobre el naranja. Enumerar etiquetas
     es apostar a acertarlas todas; esto cubre lo que haya dentro, ahora y
     cuando se anada algo nuevo. */
  .quad-card:hover,
  .quad-card:hover *,
  .packpanel-items > li:hover,
  .packpanel-items > li:hover *,
  .commit-list li:hover,
  .commit-list li:hover *,
  .process-step:hover,
  .process-step:hover *,
  .spec-item:hover,
  .spec-item:hover *,
  .level-card:hover,
  .level-card:hover *,
  .iconrows > li:hover,
  .iconrows > li:hover *,
  .bento-light:hover,
  .bento-light:hover *,
  .process-steps:hover .process-step.is-current:hover,
  .process-steps:hover .process-step.is-current:hover * {
    color: #fff;
  }
  /* El icono va desnudo, asi que lo que se pinta es su trazo. */
  .quad-card:hover .icon-chip,
  .commit-list li:hover .icon-chip,
  .process-step:hover .icon-chip,
  .spec-item:hover .icon-chip,
  .level-card:hover .icon-chip,
  .iconrows > li:hover .icon-chip,
  .bento-light:hover .bento-mark,
  .process-steps:hover .process-step.is-current:hover .icon-chip {
    background: none;
    color: #fff;
  }
  /* El boton no sigue al resto. El estandar pinta de blanco todo lo que hay
     dentro, y el de la tarjeta rellena es claro: letra blanca sobre gris claro
     sobre naranja no se lee. Se invierte -- blanco con letra negra, 15,6:1 --
     y gana por especificidad, que son dos clases y un pseudo contra una clase
     y el universal. */
  .level-card:hover .level-cta,
  .level-card:hover .level-cta * {
    background: #fff;
    color: var(--ink);
    border-color: #fff;
  }

  /* La palomita verde de las listas tambien, o se queda gritando sobre naranja. */
  .spec-item:hover .check-list li::before,
  .level-card:hover .check-list li::before { color: #fff; }

  /* Sandra: "no vas a pintar el icono amarillo y el fondo celeste". Cierto: dos
     colores saturados a la vez se pelean y la pieza queda barata. Manda uno
     solo. Si el que se pinta es el suelo, la marca se mueve con el pero se
     queda en blanco, que sobre el celeste recorta limpio. El ambar se reserva
     para los iconos sobre suelo oscuro, que es donde no compite con nada -- la
     regla que ya tenian las piezas macizas. */
  /* El filete de la tarjeta desaparece cuando el suelo ya la define. */

  /* The resting tint leaves the row it was on as soon as the list is entered. */
  .process-steps:hover .process-step.is-current { background: transparent; }
  .process-steps:hover .process-step.is-current .icon-chip { background: none; }

  /* Filled tiles deepen within their own hue — a shade, not a repaint. */
  .value-card:hover { background: var(--brand-700); }
  .value-card:hover .value-icon { color: var(--accent-amber); }
}

/* La unica frase de la seccion que no es una opcion sino una regla. En una
   seccion clara, la unica pieza oscura es la que se lee primero. */
.ruleband {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  gap: clamp(1rem, 2vw, 1.5rem);
  align-items: center;
  /* Sandra: "estan muy pegados". Solo tenia margen arriba, asi que el
     carrusel de viajes que viene detras le quedaba pegado al canto. */
  margin-block: clamp(2rem, 4vw, 3.25rem);
  padding: clamp(1.5rem, 2.8vw, 2.25rem) clamp(1.5rem, 3vw, 2.5rem);
  background: var(--brand-900);
  border-radius: var(--radius-xl);
}
.ruleband .icon-chip { color: var(--accent-soft); margin: 0; }
.ruleband h3 {
  font: 430 clamp(1.1rem, 1.7vw, 1.4rem)/1.25 var(--font-display);
  letter-spacing: -0.02em;
  color: var(--on-dark);
  margin: 0 0 0.4rem;
}
.ruleband p {
  font-size: 0.95rem; line-height: 1.7;
  color: var(--on-dark-body);
  margin: 0; max-width: 78ch;
}
.ruleband strong { color: var(--on-dark); font-weight: 600; }
@media (max-width: 620px) {
  .ruleband { grid-template-columns: 1fr; gap: 0.9rem; }
}

/* ========================================================================
   El precio, en la misma banda que cierra Journey ideas
   Sandra: "donde va el precio no sigue el diseno que estamos manejando". Era
   un panel gris con degradado, filete rosado, dos sombras y todo centrado --
   nada de eso se usa ya en ninguna otra parte del sitio. Icono, cifra y boton
   en una fila, que es ademas el orden en que se leen.
   ======================================================================== */
.price-banner {
  margin-top: clamp(2rem, 4vw, 3.25rem);
  display: grid;
  grid-template-columns: auto minmax(0, 1fr) auto;
  gap: clamp(1rem, 2.4vw, 2rem);
  align-items: center;
  padding: clamp(1.5rem, 2.8vw, 2.25rem) clamp(1.5rem, 3vw, 2.5rem);
  background: var(--brand-900);
  border-radius: var(--radius-xl);
}
.price-banner .icon-chip { color: var(--accent-soft); margin: 0; }
.price-label {
  display: block;
  font: 600 0.72rem/1 var(--font-body);
  letter-spacing: 0.14em; text-transform: uppercase;
  color: var(--accent-soft);
  margin-bottom: 0.5rem;
}
.price-amount {
  font-family: var(--font-display);
  font-size: clamp(1.75rem, 3.2vw, 2.4rem);
  font-weight: 430; line-height: 1.05; letter-spacing: -0.02em;
  color: var(--on-dark);
  margin: 0 0 0.45rem;
}
.price-per {
  font-family: var(--font-body);
  font-size: 0.9rem; font-weight: 400; letter-spacing: 0;
  color: var(--on-dark-muted);
}
.price-conditions {
  font-size: 0.85rem; line-height: 1.65;
  color: var(--on-dark-body);
  margin: 0; max-width: 62ch;
}
.price-banner .btn { white-space: nowrap; }
@media (max-width: 860px) {
  .price-banner { grid-template-columns: 1fr; gap: 1.1rem; justify-items: start; }
}

/* La banda celeste titula con h2 en unas paginas y con h3 en otras -- donde
   viene de un callout, la seccion ya tiene su h2 y bajar el nivel romperia el
   orden del documento. La forma es la misma; solo cambia la etiqueta. */
.experts h3 {
  color: var(--brand-950);
  font-family: var(--font-display);
  font-size: clamp(1.55rem, 2.9vw, 2.2rem);
  font-weight: 430;
  line-height: 1.15;
  letter-spacing: -0.02em;
  margin: 0 0 0.6rem;
}
.experts .reviewed { color: var(--brand-900); }
.experts > div:not([class]) { min-width: 0; }

/* ========================================================================
   .splitb con contenido a los dos lados
   Sandra: "en un lado va una informacion y en la otra la otra info". En
   responsable la izquierda es una fotografia; aqui las dos llevan filas, asi
   que el lado claro necesita la forma de tarjeta que la fotografia le daba.
   ======================================================================== */
.splitb-side {
  background: var(--bg-page);
  border-radius: var(--radius-xl);
  box-shadow: inset 0 0 0 1px var(--line-soft);
  padding: clamp(1.9rem, 4vw, 3.4rem);
  display: flex; flex-direction: column; justify-content: center;
}
/* .splitb-panel p pesa una clase y un elemento, asi que le gana a .eyebrow a
   secas: el antetitulo del panel oscuro salia a 15,5px contra los 10,9px de
   todos los demas de la pagina. */
.splitb-side > .eyebrow, .splitb-duo .splitb-panel > .eyebrow {
  font: 500 0.68rem/1.4 var(--font-body);
  letter-spacing: 0.14em; text-transform: uppercase;
  margin-bottom: 0.35rem; max-width: none;
}
/* El disco mide 132px y la junta 20: entra 56px en cada panel, asi que la cara
   que mira al centro se aparta algo mas. */
@media (min-width: 760px) {
  .splitb-duo > .splitb-side  { padding-right: clamp(3.5rem, 6.5vw, 5.5rem); }
  .splitb-duo > .splitb-panel { padding-left:  clamp(3.5rem, 6.5vw, 5.5rem); }
}
/* El aro del disco toma el color de la seccion, que aqui es la arena. */
.quad-badge-sand {
  box-shadow: inset 0 0 0 2px var(--brand-900),
              0 0 0 clamp(8px, 1vw, 12px) var(--sand);
}
/* Las filas dentro del panel oscuro. */
.splitb-panel .iconrows h3 { color: var(--on-dark); }
.splitb-panel .iconrows p { color: var(--on-dark-body); }
.splitb-panel .iconrows .icon-chip { color: var(--accent-soft); }
.splitb-panel .iconrows > li::before { border-top-color: oklch(1 0 0 / 0.16); }
@media (max-width: 759px) {
  .splitb-duo > .quad-badge { display: none; }
}

/* La letra pequena de la banda: dentro de la copia, no colgando debajo. */
.experts-micro {
  margin: 0.85rem 0 0;
  font-size: 0.8rem; line-height: 1.5;
  color: var(--brand-900);
  opacity: 0.75;
}

/* ========================================================================
   What to pack — paneles largos, uno por grupo
   Enrique: "cambiar este formato por modales largos como estos ejemplos; la
   cantidad puede cambiar segun los dias del itinerario". Sus dos ejemplos: un
   panel ancho por grupo y, dentro, cada elemento en su cajita con el nombre en
   negrita y el motivo debajo. Apilados caben dos, cuatro o seis grupos sin
   tocar nada; la rejilla de 2x2 solo funcionaba con cuatro exactos.
   ======================================================================== */
.packpanels { display: grid; gap: clamp(0.9rem, 1.6vw, 1.25rem); }
.packpanel {
  background: var(--surface);
  border-radius: var(--radius-xl);
  padding: clamp(1.25rem, 2.4vw, 1.9rem);
}
.packpanel-head {
  display: flex; align-items: center; gap: 0.75rem;
  margin-bottom: clamp(0.9rem, 1.6vw, 1.2rem);
}
.packpanel-ic { flex: none; width: 26px; height: 26px; color: var(--accent); }
.packpanel-ic svg { display: block; width: 100%; height: 100%; }
.packpanel-head h3 {
  margin: 0;
  font: 500 clamp(1.1rem, 1.6vw, 1.3rem)/1.25 var(--font-display);
  letter-spacing: -0.02em;
  color: var(--ink);
}
.packpanel-items {
  list-style: none; margin: 0; padding: 0;
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(min(100%, 19rem), 1fr));
  gap: clamp(0.55rem, 1vw, 0.75rem);
}
.packpanel-items > li {
  position: relative;
  padding: 0.85rem 1rem 0.85rem 2.6rem;
  background: var(--bg-page);
  border-radius: var(--radius-lg);
  box-shadow: inset 0 0 0 1px var(--line-soft);
  transition: background-color var(--t-hover) var(--ease-out-expo),
              box-shadow var(--t-hover) var(--ease-out-expo);
}
/* La marca: la misma mascara que .check-list, asi el color lo pone el CSS y
   hereda el blanco del hover. */
.packpanel-items > li::before {
  content: "";
  position: absolute; left: 1rem; top: 0.95rem;
  width: 1rem; height: 1rem;
  background-color: var(--accent);
  -webkit-mask: var(--mark-check) no-repeat center / contain;
  mask: var(--mark-check) no-repeat center / contain;
}
.packpanel-items strong {
  display: block;
  font-weight: 600; font-size: 0.92rem; line-height: 1.4;
  color: var(--ink);
}
.packpanel-items span {
  display: block; margin-top: 0.2rem;
  font-size: 0.82rem; line-height: 1.5;
  color: var(--ink-body);
}

/* ========================================================================
   Travel style: el pie de cada tarjeta — precio orientativo y boton
   Enrique: "poner precios y CTA". El precio no tiene fuente todavia y va con
   el marcador del proyecto, que build.py oculta; el boton va visible. Empujado
   al fondo, los tres botones quedan en la misma linea aunque las listas no
   midan lo mismo.
   ======================================================================== */
.level-foot {
  margin-top: auto;
  padding-top: clamp(1.1rem, 2vw, 1.5rem);
  display: grid; gap: 0.75rem;
  /* Sandra: "centra el precio". La cifra, su leyenda y el boton como un solo
     bloque centrado; centrar solo la cifra los dejaria descuadrados entre si. */
  justify-items: center; text-align: center;
}
/* Como en la referencia que marco Enrique: la cifra grande y en color, la
   leyenda pequena debajo, y el boton a su ancho, no estirado. */
.level-price {
  margin: 0;
  font: 500 clamp(1.6rem, 2.8vw, 2.1rem)/1.05 var(--font-display);
  letter-spacing: -0.02em;
  color: var(--accent);
}
.level-price-note {
  display: block; margin-top: 0.35rem;
  font: 400 0.78rem/1.4 var(--font-body);
  letter-spacing: 0;
  color: var(--ink-body);
}
/* --accent sobre el azul profundo mide ~2,6:1; --accent-soft pasa con 5,2. */
.level-card.is-featured:not(:hover) .level-price { color: var(--accent-soft); }
.level-card.is-featured:not(:hover) .level-price-note { color: var(--on-dark-body); }
.level-cta { width: auto; white-space: nowrap; }

/* La flecha del boton, como en la referencia de Enrique ("Quiero viajar →").
   Misma punta que ya usa .quad-cue, para no dibujar una segunda. */
.level-cta { display: inline-flex; align-items: center; gap: 0.6rem; }
.level-cta::after {
  content: "";
  width: 14px; height: 8px; flex: 0 0 auto;
  background: currentColor;
  clip-path: polygon(0 42%, 62% 42%, 62% 0, 100% 50%, 62% 100%, 62% 58%, 0 58%);
  transition: transform var(--t-hover) var(--ease-out-expo);
}
.level-card:hover .level-cta::after { transform: translateX(3px); }

/* La condicion que quedaba en la banda de precio: sin cifras, y ahora debajo
   de las tres tarjetas, que es donde estan los precios. */
.levels-note {
  margin: clamp(1rem, 2vw, 1.4rem) auto 0;
  max-width: 62ch;
  text-align: center;
}

/* El pie del bloque Responsible travel. Sandra: "el CTA no esta alineado" y
   "poner [la lista] en una sola linea, en bold".

   Los dos colgaban en el borde de la columna mientras el contenido de las
   filas de encima arranca en el relleno de su tarjeta. Van a ese mismo borde,
   y envueltos para que se muevan juntos: si uno se sangra y el otro no, quedan
   descuadrados entre ellos. */
.duo-foot {
  padding-left: clamp(1rem, 1.8vw, 1.35rem);
  margin-top: clamp(1.1rem, 2vw, 1.6rem);
  display: grid; justify-items: start;
  gap: clamp(0.7rem, 1.2vw, 1rem);
}
.duo-foot .responsible-micro {
  margin: 0;
  font-size: 0.79rem;
  font-weight: 600;
  /* Heredaba 52ch de la regla que comparte con otros cuatro textos pequenos:
     328px para una linea que mide 377, asi que con el tope no cabria nunca. */
  max-width: none;
  white-space: nowrap;
}
@media (max-width: 880px) {
  /* Por debajo de aqui la columna no da los 377px; partirse es mejor que
     desbordar. */
  .duo-foot .responsible-micro { white-space: normal; max-width: 52ch; }
}

/* El enlace ya no necesita su margen: dentro de .duo-foot el hueco lo pone el
   contenedor, y sumados daban 48px donde se piden 16. */
.duo-foot .link-arrow { margin-top: 0; }

/* ========================================================================
   "Planning a tailor-made journey" — los cuatro apuntes de Sandra
   ======================================================================== */

/* 1. La entradilla se veia muy arriba: centrada contra el titular, su primera
   linea empieza por encima de la de el. Se apoya en la base. Solo en este
   bloque; los demas section-head se quedan centrados. */
.how .section-head { align-items: end; }

/* 2. "Esta muy largo de ancho, o sea alinealo al title": el parrafo corria los
   325px de la columna entera. Se recoge a 28 caracteres, que lo deja del orden
   del titular de encima. Sin marco: "encuadrar" no era poner caja. */
.how-steps { --how-col: 22ch; position: relative; }
.how-step p { max-width: none; }
@media (min-width: 901px) {
  /* Solo en escritorio: por debajo mandan las reglas de 900 y 680, que pasan a
     dos columnas y a una. Sin la condicion, esta ganaba por orden y en un movil
     salian tres columnas de 90px con parrafos de once lineas. */
  .how-steps {
    grid-template-columns: repeat(3, minmax(0, var(--how-col)));
    justify-content: space-between;
    gap: clamp(2rem, 5vw, 4.5rem);
  }
}

/* 3. Las flechas se dibujan desde la rejilla, no colgando de cada ficha: asi
   caen en el centro real de cada hueco. Con tres columnas iguales de ancho c,
   los dos cruces estan en 25% + c/4 y en 75% - c/4. */
.how-steps::before, .how-steps::after {
  content: "";
  position: absolute;
  top: 50%;                        /* el centro de la fila, no la del numero */
  width: 22px; height: 22px;
  /* 2,5px el navegador los redondea a 2 en pantallas sin escalado. */
  border-top: 3px solid var(--on-dark);
  border-right: 3px solid var(--on-dark);
  transform: translate(-50%, -50%) rotate(45deg);
  opacity: 0.75;
}
.how-steps::before { left: calc(25% + var(--how-col) / 4); }
.how-steps::after  { left: calc(75% - var(--how-col) / 4); }
@media (max-width: 900px) {
  /* Apiladas o en dos columnas apuntarian al vacio. */
  .how-steps::before, .how-steps::after { display: none; }
}

/* 4. La linea de abajo tenia 13,6px bajo el boton. Va con el contenedor y
   el hermano delante porque quien mandaba era .guides-more > .btn + p, que
   pesa dos clases y un elemento: .how .how-micro, con dos clases, perdia. */
.how .guides-more > .btn + .how-micro { margin-top: clamp(1.4rem, 2.4vw, 2rem); }

/* ========================================================================
   Paneles con mapas — el documento de Machu Picchu dentro de las pestañas
   Sandra: "¿esto puede ser más amplio según el contenido?" y "¿aquí podría
   añadir imágenes y mapas?". El panel normal parte el texto en dos columnas,
   que es lo que hace falta para tres párrafos; con mapas y listas largas de
   por medio, una columna sola lee mejor y deja sitio a la imagen.
   ======================================================================== */
.tabpanel-rich { columns: auto; }
.tabpanel-rich > p { max-width: 72ch; }
.tabpanel-rich h3 {
  font: 500 clamp(1.05rem, 1.5vw, 1.25rem)/1.3 var(--font-display);
  letter-spacing: -0.02em;
  color: var(--ink);
  margin: 1.75rem 0 0.6rem;
}
.tabpanel-rich > .tab-points { max-width: 72ch; }

/* El mapa, con su pie. Los siete salen del PDF del cliente a unos 1470px, así
   que el mayor candidato cubre de sobra el hueco declarado. */
.tab-figure { margin: 1.4rem 0 0; max-width: 660px; }
.tab-figure img {
  display: block; width: 100%; height: auto;
  border-radius: var(--radius-lg);
}
.tab-figure figcaption {
  margin-top: 0.55rem;
  font: 400 0.8rem/1.5 var(--font-body);
  color: var(--ink-secondary);
}

/* Cada ruta: el mapa a un lado y lo que se ve al otro. */
.routecard {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: clamp(1.25rem, 2.6vw, 2.25rem);
  align-items: start;
  margin-top: clamp(1.75rem, 3vw, 2.5rem);
  padding-top: clamp(1.75rem, 3vw, 2.5rem);
  border-top: 1px solid var(--line-soft);
}
.routecard .tab-figure { margin: 0; max-width: none; }
.routecard h3 { margin-top: 0; }
.routecard-hi {
  margin: 1rem 0 0;
  font: 600 0.72rem/1.4 var(--font-body);
  letter-spacing: 0.12em; text-transform: uppercase;
  color: var(--accent);
}
.routecard .tab-points { margin-top: 0.5rem; }
@media (max-width: 760px) { .routecard { grid-template-columns: 1fr; } }

/* La tabla de grupos de Huayna Picchu. */
.tab-table {
  width: 100%; max-width: 660px;
  margin-top: 1.25rem;
  border-collapse: collapse;
  font-size: 0.88rem;
}
.tab-table caption {
  text-align: left;
  font: 600 0.72rem/1.4 var(--font-body);
  letter-spacing: 0.12em; text-transform: uppercase;
  color: var(--accent);
  margin-bottom: 0.5rem;
}
.tab-table th, .tab-table td {
  padding: 0.6rem 0.75rem;
  border-bottom: 1px solid var(--line-soft);
  text-align: left;
}
.tab-table thead th {
  font-weight: 600; color: var(--ink);
  border-bottom-color: var(--line);
}
.tab-table tbody th { font-weight: 600; color: var(--ink); }
.tab-table td { color: var(--ink-body); }

/* Sandra: "no llega a destacar en la página". El bloque de pestañas era texto
   suelto sobre el fondo. Sobre su propia superficie se lee como una pieza, y
   de paso los mapas tienen dónde apoyarse. */
.tabset {
  background: var(--surface);
  border-radius: var(--radius-xl);
  padding: clamp(0.5rem, 1.6vw, 1.25rem) clamp(1rem, 2.6vw, 2.25rem)
           clamp(1.5rem, 3vw, 2.25rem);
}
/* Con nueve pestañas la barra se desplazaba 12px: lo justo para cortar la
   última y no lo bastante para que se note que hay más. Envuelve. */
@media (min-width: 761px) {
  .tablist { flex-wrap: wrap; overflow-x: visible; }
}

/* Sandra: "dos secciones super pegadas" y despues "sigue muy pegado, y ademas
   no hay un title para el carrusel". En el resto del sitio un carrusel siempre
   viene detras de una cabecera; este salia a pelo. Ahora lleva la suya, y el
   aire va entre el bloque de arriba y ese titulo. */
/* La cabecera del carrusel: la misma pieza que "Journey ideas / Make Machu
   Picchu part of something bigger", que es lo que Sandra senalo. Sigue siendo
   h3 -- el h2 de la seccion esta encima -- y solo toma su tamano. */
.section-head-rail { margin-top: clamp(4rem, 8vw, 7rem); }
.section-head-rail h3 {
  font-family: var(--font-display);
  font-size: clamp(1.85rem, 3.6vw, 2.8rem);
  font-weight: 430;
  line-height: 1.06;
  letter-spacing: -0.035em;
  color: var(--ink);
  margin: 0;
}
.section-head-rail h3 em { color: var(--brand-600); font-style: normal; }
.splitb + .rail { margin-top: clamp(2rem, 4vw, 3.25rem); }

/* ========================================================================
   Los paneles de pestañas, revisados
   Sandra: "mejora visualmente la información de todas estas categorías;
   ordena, alinea; si hay imágenes que sean vistosas, no pequeñas; agrega
   color, iconos; diferencia cada cosa de otra; da espacio."
   ======================================================================== */

/* El icono del panel iba en azul y pequeño. Naranja, como todos los iconos
   desnudos del sitio, y de un tamaño que se vea. */
.tabpanel:not([hidden]):not(:has(.tabpanel-split)) { --mark-w: clamp(2.2rem, 3.4vw, 2.9rem); }
.tabpanel-mark { color: var(--accent); }

/* El panel con mapas suelta la tercera columna vacía: esa columna existe para
   centrar el texto cuando el panel es solo prosa, y aquí solo estrecha las
   imágenes. */
@media (min-width: 621px) {
  .tabpanel:not([hidden]):has(.tabpanel-rich) {
    grid-template-columns: var(--mark-w) minmax(0, 1fr);
    gap: clamp(1rem, 2.2vw, 1.75rem);
  }
}

/* Cada asunto, separado del siguiente por un filete y aire, para que no se
   lean como un bloque continuo. */
.tabpanel-rich h3 {
  margin-top: clamp(2.25rem, 3.6vw, 3rem);
  padding-top: clamp(1.25rem, 2.2vw, 1.75rem);
  border-top: 1px solid var(--line-soft);
}
.tabpanel-rich > *:first-child { margin-top: 0; }

/* Las imágenes, al ancho del panel. Antes estaban topadas a 660px, que dentro
   de un panel de 1000 se veían pequeñas. */
/* 700px es el techo real: la variante mayor de estos mapas es 1400-1440px
   (el original del cliente mide 1431-1472), y a doble densidad 700 pide 1400.
   Un pixel mas y se ablandan en un portatil retina. */
.tab-figure { max-width: 700px; margin-top: clamp(1.5rem, 2.6vw, 2rem); }
.tab-figure img { box-shadow: inset 0 0 0 1px var(--line-soft); }
.tab-figure figcaption {
  margin-top: 0.7rem;
  padding-left: 0.9rem;
  border-left: 2px solid var(--accent);
  color: var(--ink-body);
}

/* Las listas dejan el punto por una marca, como el resto del sitio. */
.tab-points { list-style: none; padding-left: 0; gap: 0.7rem; }
.tab-points li { position: relative; padding-left: 1.85rem; }
.tab-points li::before {
  content: "";
  position: absolute; left: 0; top: 0.3em;
  width: 1.05em; height: 1.05em;
  background-color: var(--accent);
  -webkit-mask: var(--mark-check) no-repeat center / contain;
  mask: var(--mark-check) no-repeat center / contain;
}
/* En dos columnas, una lista partida por la mitad no se entiende. */
.tabpanel-body .tab-points, .tabpanel-body p { break-inside: avoid; }

/* Cada ruta: el mapa manda, y la ficha se separa de la anterior. */
.routecard {
  grid-template-columns: minmax(0, 1.15fr) minmax(0, 1fr);
  gap: clamp(1.5rem, 3vw, 2.75rem);
  margin-top: clamp(2.25rem, 4vw, 3.25rem);
  padding-top: clamp(2.25rem, 4vw, 3.25rem);
}
.routecard .tab-figure figcaption { display: none; }

/* ========================================================================
   Un solo sistema para los nueve paneles
   Sandra: "hay cosas que colocas solo en una columna y otras en dos, no se
   nota la división; hay información más larga que las imágenes y no se
   adapta; hay cosas que están solo alineadas a la izquierda y queda mucho
   espacio al lado derecho, parece documento; inspírate de los diseños que
   tenemos."

   Todos con el mismo esqueleto — entradilla, tarjetas, mapa a lo ancho, nota —
   y con las piezas que el sitio ya usa: la rejilla de tarjetas es la de What
   to pack.
   ======================================================================== */

/* Fuera las dos columnas de prosa: eran la mitad de la inconsistencia. */
.tabpanel-body { columns: auto; }
.tabpanel-body > p { max-width: 68ch; }

/* Los puntos de cada panel, en tarjetas. Rellenan el ancho, así que ya no
   queda media columna vacía a la derecha. */
.tab-points {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 19rem), 1fr));
  gap: clamp(0.55rem, 1vw, 0.8rem);
  max-width: none;
  margin-top: clamp(1.1rem, 2vw, 1.5rem);
}
.tab-points li {
  padding: 0.9rem 1rem 0.9rem 2.6rem;
  background: var(--bg-page);
  border-radius: var(--radius-lg);
  box-shadow: inset 0 0 0 1px var(--line-soft);
  font-size: 0.9rem;
}
.tab-points li::before { left: 1rem; top: 1rem; }

/* Cada asunto largo, una tarjeta. El filete y el aire sueltos no marcaban
   división suficiente; una caja sí. */
.tabcards {
  display: grid;
  /* Sandra: "colocalo todo en una sola columna, no en dos". */
  grid-template-columns: minmax(0, 1fr);
  gap: clamp(0.85rem, 1.6vw, 1.25rem);
  align-items: start;
  margin-top: clamp(1.5rem, 2.6vw, 2rem);
}
.tabcard {
  background: var(--bg-page);
  border-radius: var(--radius-xl);
  box-shadow: inset 0 0 0 1px var(--line-soft);
  padding: clamp(1.25rem, 2.2vw, 1.75rem);
}
.tabpanel-rich .tabcard h3 {
  margin: 0 0 0.6rem;
  padding-top: 0;
  border-top: 0;
  font-size: clamp(1.05rem, 1.5vw, 1.2rem);
}
.tabcard > p:last-child { margin-bottom: 0; }
/* Sandra: "no es necesario poner cada uno en un recuadro". Dentro de una
   tarjeta la caja de cada punto es una caja dentro de otra: no anade division,
   solo ruido. La marca ya separa un punto del siguiente. */
.tabcard .tab-points > li {
  background: none;
  box-shadow: none;
  padding: 0.15rem 0 0.15rem 1.85rem;
}
.tabcard .tab-points > li::before { left: 0; top: 0.35em; }
.tabcard .tab-points { gap: 0.55rem 2rem; }

/* La ficha de cada ruta ocupa la fila entera: el mapa arriba, a lo ancho de la
   tarjeta, y debajo lo que se ve. Antes el texto era más largo que el mapa y
   quedaban descuadrados. */
.routecard.tabcard {
  grid-column: 1 / -1;
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: clamp(1rem, 2vw, 1.5rem);
  margin-top: 0;
  padding-top: clamp(1.25rem, 2.2vw, 1.75rem);
  border-top: 0;
}
/* Sandra: "las rutas colocalas a todo el ancho, no en columnas". El mapa
   arriba y debajo lo que se ve; partirlo en dos dejaba la lista en una tira
   estrecha de un solo punto por linea. */
.routecard.tabcard {
  /* 700 del mapa + el relleno de la ficha a cada lado */
  max-width: calc(700px + 2 * clamp(1.25rem, 2.2vw, 1.75rem));
  margin-inline: auto;
}
.routecard.tabcard .tab-figure { margin: 0; max-width: none; }
.routecard.tabcard h3 { margin-top: 0; }

/* ========================================================================
   Los paneles, editables desde WordPress
   Sandra: "recuerda que luego debe adaptarse a otra información si es que lo
   modifico desde WP, así que ten cuidado el elemento que uses."

   Lo de arriba se apoya en clases que yo escribo a mano (.tab-points,
   .tab-figure, .tabcard…) y el editor de WordPress no las va a poner: de él
   salen <p>, <h3>, <ul>, <figure>, <img>, <table> pelados. Así que el sistema
   se declara también por elemento, y un panel escrito desde el editor cae solo
   en la misma forma. Lo que sí trae clase manda, por especificidad.
   ======================================================================== */

/* Una lista escrita en el editor = la rejilla de tarjetas. */
.tabpanel-body ul:not([class]) {
  list-style: none;
  margin: clamp(1.1rem, 2vw, 1.5rem) 0 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 19rem), 1fr));
  gap: clamp(0.55rem, 1vw, 0.8rem);
}
.tabpanel-body ul:not([class]) > li {
  position: relative;
  padding: 0.9rem 1rem 0.9rem 2.6rem;
  background: var(--bg-page);
  border-radius: var(--radius-lg);
  box-shadow: inset 0 0 0 1px var(--line-soft);
  font-size: 0.9rem;
  line-height: 1.65;
  color: var(--ink-body);
}
.tabpanel-body ul:not([class]) > li::before {
  content: "";
  position: absolute; left: 1rem; top: 1rem;
  width: 1.05em; height: 1.05em;
  background-color: var(--accent);
  -webkit-mask: var(--mark-check) no-repeat center / contain;
  mask: var(--mark-check) no-repeat center / contain;
}
.tabpanel-body ol:not([class]) { margin: clamp(1.1rem, 2vw, 1.5rem) 0 0; padding-left: 1.3rem; }
.tabpanel-body ol:not([class]) > li { margin-bottom: 0.5rem; color: var(--ink-body); font-size: 0.9rem; }

/* Un encabezado escrito en el editor abre bloque, con su aire y su filete. */
.tabpanel-body > h3:not([class]), .tabpanel-body > h4:not([class]) {
  margin: clamp(2rem, 3.4vw, 2.75rem) 0 0.6rem;
  padding-top: clamp(1.1rem, 2vw, 1.5rem);
  border-top: 1px solid var(--line-soft);
  font: 500 clamp(1.05rem, 1.5vw, 1.25rem)/1.3 var(--font-display);
  letter-spacing: -0.02em;
  color: var(--ink);
}
.tabpanel-body > *:first-child { margin-top: 0; padding-top: 0; border-top: 0; }

/* Cualquier imagen del editor: al ancho útil, nunca estirada, y con el mismo
   tope de nitidez que los mapas. */
.tabpanel-body :is(figure, p) > img,
.tabpanel-body > img {
  display: block;
  /* Llena su caja. El tope de 700 que habia aqui dejaba un cuarto del ancho en
     blanco a la derecha, que es lo que Sandra marcaba. */
  width: 100%; max-width: 100%; height: auto;
  border-radius: var(--radius-lg);
  box-shadow: inset 0 0 0 1px var(--line-soft);
}
.tabpanel-body figure:not([class]) { margin: clamp(1.5rem, 2.6vw, 2rem) 0 0; }
.tabpanel-body figure:not([class]) figcaption {
  margin-top: 0.7rem;
  padding-left: 0.9rem;
  border-left: 2px solid var(--accent);
  font: 400 0.8rem/1.5 var(--font-body);
  color: var(--ink-body);
}

/* Una tabla del editor, con la misma forma que la de Huayna Picchu. */
.tabpanel-body table:not([class]) {
  width: 100%; max-width: 700px;
  margin-top: 1.25rem;
  border-collapse: collapse;
  font-size: 0.88rem;
}
.tabpanel-body table:not([class]) :is(th, td) {
  padding: 0.6rem 0.75rem;
  border-bottom: 1px solid var(--line-soft);
  text-align: left;
}
.tabpanel-body table:not([class]) thead th { font-weight: 600; color: var(--ink); border-bottom-color: var(--line); }
.tabpanel-body table:not([class]) td { color: var(--ink-body); }

/* Un bloque de cita del editor. */
.tabpanel-body blockquote:not([class]) {
  margin: clamp(1.25rem, 2.2vw, 1.75rem) 0 0;
  padding-left: 1.1rem;
  border-left: 2px solid var(--accent);
  color: var(--ink);
  font-size: 0.98rem;
}

/* ========================================================================
   Los paneles, al ancho de la sección
   Sandra: "quitemos el fondo gris; la información no estás que la colocas en
   el ancho de la sección, está muy pequeña algunas y otras muy extensas; hay
   espacios en blanco, imágenes pequeñas, cosas desalineadas."

   La causa de fondo era la rejilla del panel: una columna para el icono, otra
   para el texto y una tercera vacía para centrarlo. Entre las dos laterales se
   comían 146px de 1120 y todo lo de dentro arrancaba desviado. Fuera las tres:
   el icono pasa a ser una marca encima y el contenido ocupa la sección entera,
   con un solo borde izquierdo para todo.
   ======================================================================== */
.tabset { background: none; padding: 0; }

.tabpanel:not([hidden]),
.tabpanel:not([hidden]):not(:has(.tabpanel-split)),
.tabpanel:not([hidden]):has(.tabpanel-rich) {
  display: block;
}
.tabpanel-mark {
  grid-row: auto;
  width: clamp(2.2rem, 3.4vw, 2.9rem);
  height: clamp(2.2rem, 3.4vw, 2.9rem);
  margin: 0 0 clamp(0.9rem, 1.6vw, 1.25rem);
}
.tabpanel-body { grid-column: auto; }

/* Las imágenes llenan su caja. El tope de 700 dejaba un cuarto del ancho en
   blanco a su derecha; con la variante de 1440 llenar 1064 se ve nítido en una
   pantalla normal. En una retina cae a 1,4 veces la densidad: para llenarla
   del todo harían falta originales de 2400, que el cliente aún no manda. */
.tab-figure { max-width: none; }
.routecard.tabcard { max-width: none; margin-inline: 0; }

/* ========================================================================
   Icono a la izquierda, texto al lado — en todo el panel
   Sandra: "esos textos colócalos al lado del icono" (la entradilla) y "es
   información, colócala de igual forma de la que tiene iconos y el texto al
   costado" (las tarjetas). Una sola forma para las dos cosas.
   ======================================================================== */
.tabpanel-lead {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  gap: clamp(0.9rem, 1.8vw, 1.4rem);
  align-items: start;
}
.tabpanel-lead .tabpanel-mark { margin: 0; }
.tabpanel-lead > div > p:last-child { margin-bottom: 0; }

.tabcard-ic-row {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  gap: clamp(0.8rem, 1.5vw, 1.1rem);
  align-items: start;
}
.tabcard-ic {
  flex: none;
  width: 26px; height: 26px;
  color: var(--accent);
}
.tabcard-ic svg { display: block; width: 100%; height: 100%; }
.tabcard-ic-row h3 { margin-top: 0; }

/* El título de cada panel. Sandra: "hay iconos sin título ni texto, no sé qué
   estoy viendo" — el icono de Huayna Picchu había quedado solo junto al mapa. */
.tabpanel-lead .tabpanel-title {
  margin: 0 0 0.5rem;
  padding-top: 0;
  border-top: 0;
  font: 500 clamp(1.15rem, 1.7vw, 1.4rem)/1.25 var(--font-display);
  letter-spacing: -0.02em;
  color: var(--ink);
}
.tabpanel-lead { margin-bottom: clamp(1.5rem, 2.6vw, 2.25rem); }

/* El pie de la imagen, alineado con ella. La barra naranja lo empujaba 0,9rem
   a la derecha y quedaba descolgado del texto de abajo. */
.tab-figure figcaption {
  margin-top: 0.85rem;
  padding-left: 0;
  border-left: 0;
  position: relative;
  padding-top: 0.6rem;
}
.tab-figure figcaption::before {
  content: "";
  position: absolute; left: 0; top: 0;
  width: 2.25rem; height: 2px;
  background: var(--accent);
}

/* Aire entre los bloques del panel: estaba todo pegado. */
.tabpanel-body > * + * { margin-top: clamp(1.5rem, 2.6vw, 2.25rem); }
.tabpanel-body > .tabcards + *, .tabpanel-body > * + .tabcards { margin-top: clamp(1.75rem, 3vw, 2.5rem); }

/* La tabla de franjas: dos columnas, mañana y tarde. Se ajusta a su contenido
   en vez de estirarse, y las celdas vacías de la tarde -- hay seis franjas de
   mañana y tres de tarde -- no dibujan filete, para que no parezcan un fallo. */
.tab-table-slots { width: auto; min-width: min(100%, 30rem); }
.tab-table-slots td:empty { border-bottom-color: transparent; }
.tab-table-slots :is(th, td) { padding-right: clamp(1.25rem, 3vw, 2.5rem); }

/* La marca y el titulo, a la misma altura. */
.tabpanel-lead { align-items: start; }
.tabpanel-lead .tabpanel-mark { margin-top: 0.1rem; }


/* Sandra: "bájalas debajo del title". La entradilla cuelga del titular en vez
   de ir a su derecha. Acotada con su propia clase: .section-head reparte en dos
   columnas en el resto del sitio y eso no se toca. */
.section-head-stack {
  grid-template-columns: minmax(0, 1fr);
  /* Los 72px del hueco separan dos columnas; en una sola pasarían a ser
     separación vertical entre titular y texto. */
  gap: clamp(0.9rem, 1.6vw, 1.25rem);
}
.section-head-stack .section-head-lead { max-width: 72ch; padding-bottom: 0; }

/* "Ten cuidado, después de bajar ese texto, que quede mucho espacio en bottom":
   el margen inferior de la cabecera existe para separarla de lo que viene
   detrás, y en estas dos secciones no viene nada. Lo decide :has(), no una
   clase, así que vuelve solo el día que alguien meta contenido debajo. */
.section:has(> .wrap > .section-head:only-child) .section-head { margin-bottom: 0; }
