/* =========================================================
   THE LOCAL TEMPERATURE — GLOBAL STYLES
   "Not where to go — but how a place feels."
   ========================================================= */

@import url('https://fonts.googleapis.com/css2?family=Anton&family=Poppins:wght@300;400;500;600&display=swap');
/* Anton + Antonio are also loaded via <link> tags in each page's <head> — see FIX 1 */

/* ---------- ROOT VARIABLES ---------- */
:root {
  --font-display: 'Anton', sans-serif;
  --font-body: 'Antonio', sans-serif;
  --font-ui: 'Poppins', sans-serif;

  /* RU-mode fonts — Anton/Antonio/Poppins above don't cover Cyrillic (or don't cover it well),
     see the [data-lang="ru"] override block further down for how these get swapped in. */
  --font-display-ru: 'Rubik Mono One', sans-serif;
  --font-body-ru: 'PT Sans', sans-serif;

  /* nature-tone palette */
  --forest:   #1E2A14;
  --olive:    #3D4A2A;
  --olive-m:  #4A5A30;
  --ocean:    #2E4A52;
  --sky:      #7A9BA8;
  --ochre:    #C8A050;
  --wine:     #6B1F2A;
  --terra:    #8B4A2A;
  --sand:     #C8A870;
  --cream-t:  rgba(245,237,216,0.12);
  --black:    #0D0D0D;

  /* legacy aliases kept so older markup patterns still resolve */
  --olive-dark: var(--olive);
  --color-primary: var(--olive);
  --color-accent: var(--ochre);
  --color-wine: var(--wine);
  --color-ocean: var(--ocean);
  --color-forest: var(--forest);
  --color-text: var(--forest);

  --max-width: 1400px;
  --nav-height: 76px;

  --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
}

/* ---------- RESET ---------- */
* , *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }

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

body {
  /* was var(--forest) (the old dark-olive design) — every page's sections now set their own
     explicit background, but any vertical margin between sections still exposed this old
     color as a stripe (found on shop.html: .shop-product's own top/bottom margin, see below).
     Switching the page-wide default to navy is the one-shot site-wide fix for that class of bug,
     instead of patching every section's margin individually. */
  background: var(--about-navy);
  color: #EDE7D8;
  font-family: var(--font-body);
  line-height: 1.6;
  overflow-x: hidden;
  -webkit-font-smoothing: antialiased;
}

img { max-width: 100%; display: block; }
a { color: inherit; text-decoration: none; }
ul { list-style: none; }
button { font: inherit; cursor: pointer; background: none; border: none; color: inherit; }
input, textarea { font: inherit; color: inherit; }

h1, h2, h3, h4 {
  font-family: var(--font-display);
  font-weight: normal;
  line-height: 1.05;
  letter-spacing: 0.01em;
}

em, i { font-style: italic; }
::selection { background: var(--ochre); color: var(--forest); }

/* ---------- UTILITIES ---------- */
.container { max-width: var(--max-width); margin: 0 auto; padding: 0 6vw; }

.rule { height: 1px; background: var(--ochre); border: none; width: 100%; opacity: 0.6; }
.rule-thick { height: 2px; opacity: 1; }
.rule-center { width: 80px; margin: 2rem auto; }
.rule-animate { width: 0; transition: width 1.2s var(--ease-out); }
.rule-animate.in-view { width: 100%; }
.rule-animate.rule-center.in-view { width: 80px; }

/* color-cycling divider: ochre -> wine -> sky -> olive -> ochre */
.rule-cycle {
  height: 2px; width: 100%; border: none;
  background: linear-gradient(90deg, var(--ochre), var(--wine), var(--sky), var(--olive), var(--ochre));
  background-size: 300% 100%;
  animation: cycleShift 14s linear infinite;
  opacity: 0.85;
}

.section-label {
  font-family: var(--font-ui); font-weight: 500; font-size: 0.85rem;
  letter-spacing: 0.25em; color: var(--ochre); text-transform: uppercase;
}
.label-row { display: flex; align-items: center; gap: 0.9rem; margin-bottom: 0.5rem; }
.accent-bar { width: 4px; height: 40px; flex-shrink: 0; display: block; }
.accent-bar.ochre { background: var(--ochre); }
.accent-bar.wine { background: var(--wine); }
.accent-bar.sky { background: var(--sky); }
.accent-bar.olive { background: var(--olive-m); }
.accent-bar.terra { background: var(--terra); }

/* photo containers */
.photo-slot {
  position: relative; width: 100%; height: 100%; min-height: 320px;
  display: flex; align-items: center; justify-content: center;
  color: rgba(237,231,216,0.55); font-family: var(--font-ui); font-size: 0.85rem;
  letter-spacing: 0.08em; text-align: center; overflow: hidden;
  filter: contrast(1.12) saturate(0.9) sepia(0.08);
}
.photo-slot span { position: relative; z-index: 2; background: rgba(13,13,13,0.35); padding: 0.5em 1em; }

.photo-fill {
  position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover;
  filter: contrast(1.12) saturate(0.9) sepia(0.08);
}
.photo-overlay-dark { position: absolute; inset: 0; background: linear-gradient(180deg, rgba(13,13,13,0.1) 0%, rgba(13,13,13,0.7) 100%); }
.photo-overlay-dark.overlay-soft { background: linear-gradient(180deg, rgba(13,13,13,0.05) 0%, rgba(13,13,13,0.45) 100%); }

.photo-gradient-1 { background: linear-gradient(160deg, var(--forest) 0%, var(--ocean) 100%); }
.photo-gradient-2 { background: linear-gradient(200deg, var(--olive) 0%, var(--terra) 100%); }
.photo-gradient-3 { background: linear-gradient(135deg, var(--wine) 0%, var(--forest) 100%); }
.photo-gradient-4 { background: linear-gradient(180deg, var(--ocean) 0%, var(--sky) 100%); }
.photo-gradient-5 { background: radial-gradient(circle at 30% 20%, var(--terra) 0%, var(--forest) 70%); }
.photo-gradient-6 { background: linear-gradient(160deg, var(--wine) 0%, var(--ochre) 120%); }
.photo-gradient-ochre { background: linear-gradient(160deg, var(--ochre) 0%, var(--terra) 130%); }

/* section background alternation: forest -> olive -> ocean -> wine -> forest */
.bg-forest { background: var(--forest); }
.bg-olive { background: var(--olive); }
.bg-ocean { background: var(--ocean); }
.bg-wine { background: var(--wine); }

/* ---------- BUTTONS ---------- */
.btn {
  display: inline-block; font-family: var(--font-ui); font-size: 0.85rem;
  letter-spacing: 0.12em; text-transform: uppercase; padding: 1em 1.8em;
  transition: all 0.3s var(--ease-out); white-space: nowrap; border: 1px solid transparent;
}
.btn-outline { border-color: var(--ochre); color: var(--ochre); background: transparent; }
.btn-outline:hover { background: var(--ochre); color: var(--forest); }
.btn-filled { background: var(--wine); color: #EDE7D8; border-color: var(--wine); }
.btn-filled:hover { background: var(--ochre); border-color: var(--ochre); color: var(--forest); }

/* ---------- NAV ---------- */
/* Always transparent — no bar/container ever, on any page. There used to be a dark olive
   `.site-nav.scrolled` background here (residue from the very first design iteration, long
   since gone from the Canva file); removed per explicit instruction. `nav.classList.add
   ('scrolled')` in js/main.js still runs on scroll (harmless, kept for anything else that
   might key off it), it just no longer paints anything. */
.site-nav { position: fixed; top: 0; left: 0; right: 0; z-index: 1000; background: transparent; }
.nav-inner {
  max-width: var(--max-width); margin: 0 auto; height: var(--nav-height); padding: 0 6vw;
  display: flex; align-items: center; justify-content: space-between; gap: 1.5rem;
}
.logo { font-family: var(--font-display); font-size: 1.5rem; color: var(--ochre); letter-spacing: 0.05em; }
.nav-right { display: flex; align-items: center; gap: 2.2rem; margin-left: auto; }
.nav-links { display: flex; gap: 2.2rem; }
.nav-links a {
  font-family: var(--font-ui); font-size: 0.85rem; letter-spacing: 0.12em; text-transform: uppercase;
  color: #EDE7D8; position: relative; padding-bottom: 4px;
}
.nav-links a::after { content: ''; position: absolute; left: 0; bottom: 0; width: 0; height: 1px; background: var(--ochre); transition: width 0.3s var(--ease-out); }
.nav-links a:hover::after { width: 100%; }
.nav-links a:hover { color: var(--ochre); }

.nav-shop {
  font-family: var(--font-ui); font-size: 0.68rem; letter-spacing: 0.12em; text-transform: uppercase;
  color: rgba(237,231,216,0.4); transition: color 0.3s var(--ease-out);
}
.nav-shop:hover { color: var(--ochre); }

.hamburger { display: none; flex-direction: column; gap: 5px; width: 32px; z-index: 1100; }
.hamburger span { display: block; height: 2px; width: 100%; background: var(--ochre); transition: transform 0.3s var(--ease-out), opacity 0.3s var(--ease-out); }
.hamburger.open span:nth-child(1) { transform: translateY(7px) rotate(45deg); }
.hamburger.open span:nth-child(2) { opacity: 0; }
.hamburger.open span:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }

.mobile-menu {
  position: fixed; inset: 0; background: var(--forest); display: flex; align-items: center; justify-content: center;
  transform: translateY(-100%); transition: transform 0.5s var(--ease-out), visibility 0s linear 0.5s; z-index: 1050;
  visibility: hidden; pointer-events: none;
}
.mobile-menu.open { transform: translateY(0); visibility: visible; pointer-events: auto; transition: transform 0.5s var(--ease-out); }
.mobile-menu ul { text-align: center; }
.mobile-menu li { margin: 1.5rem 0; }
.mobile-menu a { font-family: var(--font-display); font-size: 2.5rem; color: #EDE7D8; }
.mobile-menu a:hover { color: var(--ochre); }
.mobile-menu .menu-secondary { margin-top: 1rem; }
.mobile-menu .menu-secondary a { font-family: var(--font-ui); font-size: 0.85rem; letter-spacing: 0.14em; text-transform: uppercase; color: rgba(237,231,216,0.4); }
.mobile-menu .menu-secondary a:hover { color: var(--ochre); }
.mobile-menu .lang-switch-mobile { margin-top: 2rem; justify-content: center; }
.mobile-menu .lang-switch-mobile button { font-size: 12px; padding: 5px 12px; }

/* ---------- HERO (HOME) — floral dreamscape ---------- */
.hero { position: relative; min-height: 100vh; background: var(--forest); display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; overflow: hidden; padding: 0 4vw; }
.hero-content { position: relative; z-index: 3; max-width: 100%; }

.hero-bloom-bg {
  position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; object-position: center;
  filter: brightness(0.42) saturate(1.15); z-index: 0; pointer-events: none;
}
.manifesto-bloom-bg {
  position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; object-position: center;
  filter: brightness(0.35) saturate(1.1) sepia(0.15); z-index: 0; pointer-events: none;
}
.smells-bloom-bg {
  /* full original brightness — no filter — per v5: the bloom photo IS the design.
     negative z-index so it sits behind the section's content without needing to
     touch every child element's stacking */
  position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; object-position: center;
  z-index: -1; pointer-events: none;
}
.floral-layer { position: absolute; inset: -5%; width: 110%; height: 110%; z-index: 0; filter: blur(18px); }
.floral-layer .petal { animation: petalDrift 34s ease-in-out infinite; transform-origin: center; }
.floral-layer .petal:nth-child(3n) { animation-duration: 40s; }
.floral-layer .petal:nth-child(3n+1) { animation-duration: 30s; animation-direction: reverse; }
.floral-overlay { display: none; } /* superseded by hero-frosted-card — see v5 fixes */

/* v14/v16 homepage redesign — Canva 1:1: wavy orange-line pattern PNGs (exported as-is, not
   redrawn) as full-bleed section backgrounds, navy/orange/mustard/cream palette. Navy text
   directly on the pattern, per the Canva mockup. Three distinct oranges are used across the
   site on purpose (homepage / about-page / vol.02-input) — kept exact, not unified. */
:root {
  --home-navy: #0a064c;
  --home-orange: #f57b2e;
  --home-orange-2: #fc7712;
  --home-orange-3: #ff7100;
  --home-mustard: #ffde59;
  --home-cream: #f9ffd7;
  --home-olive: #958b51;
}

/* index.html-only nav COLOR (navy text over the light hero) — layout order used to be mirrored
   here (logo top-right via row-reverse) as a one-off for this page; standardized site-wide this
   round instead (logo always top-left, nav+toggle always top-right, identical on all 4 pages —
   see the shared .site-nav markup and PROJECT_LOG.md), so the row-reverse/margin overrides that
   used to live here are gone. */
body.page-home .logo, body.page-home .nav-links a { color: var(--home-navy); }
body.page-home .nav-links a::after { background: var(--home-navy); }
body.page-home .nav-links a:hover { color: var(--home-orange); }

.hero-floral {
  /* the cover DOES use the wavy pattern (confirmed against the source Canva file this round —
     it was dropped by mistake last round); actual background-image is set inline in
     index.html with !important, same convention as every other patterned section on this page */
  background-image: url('../images/homepage/main_page.png');
  background-size: cover;
  background-position: center;
  background-attachment: fixed;
  background-color: #fff;
}

.hero-eyebrow { position: relative; font-family: var(--font-ui); font-weight: 700; font-style: normal; color: var(--home-navy); font-size: 16px; margin-bottom: 1.4rem; }
.hero-title-main {
  position: relative; font-family: var(--font-display); font-size: clamp(3.5rem, 11vw, 9rem); color: var(--home-navy); line-height: 0.9;
}
.hero-tagline-new { position: relative; font-family: var(--font-ui); font-weight: 700; font-style: normal; color: var(--home-navy); font-size: clamp(1rem, 2.5vw, 1.3rem); margin: 1.2rem 0 2.2rem; }
.hero-tagline-new em { font-style: normal; }

.scroll-cta { position: relative; }

/* pill button — navy fill, white text (hero CTA, chapter CTA, form submit share the family) */
.btn-pill-cream {
  display: inline-block; background: var(--home-navy); border: 1.5px solid var(--home-navy); color: #fff;
  border-radius: 999px; padding: 1.05em 2.2em; font-family: var(--font-ui); font-size: 0.85rem; letter-spacing: 0.03em;
  transition: background 0.3s var(--ease-out), transform 0.2s var(--ease-out);
}
.btn-pill-cream:hover { background: #211a6e; transform: translateY(-2px); }

.btn-pill-dark {
  display: inline-block; background: var(--home-navy); border: 1.5px solid var(--home-navy); color: #fff;
  border-radius: 999px; padding: 1.05em 2.2em; font-family: var(--font-ui); font-size: 0.85rem; letter-spacing: 0.03em; font-weight: 500;
  transition: background 0.3s var(--ease-out), transform 0.2s var(--ease-out);
}
.btn-pill-dark:hover { background: #211a6e; transform: translateY(-2px); }

/* ---------- "THIS IS NOT A GUIDE" — solid orange band, not the wavy pattern (per current Canva) ---------- */
.manifesto {
  background: var(--home-orange); padding: clamp(2.2rem, 5vw, 3.6rem) 6vw; text-align: left;
}
.manifesto-inner { max-width: 780px; text-align: left; margin: 0; }
.manifesto-title { font-size: clamp(2rem, 4.6vw, 3rem); color: var(--home-navy); margin-bottom: 1rem; text-align: left; }
.manifesto-body { font-family: var(--font-ui); font-weight: 700; font-style: normal; font-size: clamp(17px, 1.8vw, 21px); line-height: 1.7; color: var(--home-navy); white-space: pre-line; max-width: 680px; margin: 0; text-align: left; }
.manifesto-body:first-of-type { margin-top: 0; }
.manifesto .rule { margin: 2rem 0 0; background: var(--home-navy); opacity: 0.35; }

/* five-petal CSS flowers either side of the manifesto text (see Canva mockup) */
.flower-decoration { display: flex; justify-content: center; align-items: flex-end; gap: 32px; margin-bottom: 1.5rem; position: relative; z-index: 1; }
.flower { position: relative; width: 120px; height: 190px; flex-shrink: 0; }
.flower .petal { position: absolute; top: 40px; left: 50%; width: 60px; height: 38px; border-radius: 50%; transform-origin: 0% 50%; margin-left: -60px; }
.flower .petal:nth-child(1) { transform: rotate(0deg) translateX(60px); }
.flower .petal:nth-child(2) { transform: rotate(60deg) translateX(60px); }
.flower .petal:nth-child(3) { transform: rotate(120deg) translateX(60px); }
.flower .petal:nth-child(4) { transform: rotate(180deg) translateX(60px); }
.flower .petal:nth-child(5) { transform: rotate(240deg) translateX(60px); }
.flower .petal:nth-child(6) { transform: rotate(300deg) translateX(60px); }
.flower .flower-center { position: absolute; top: 26px; left: 50%; width: 22px; height: 22px; margin-left: -11px; border-radius: 50%; background: #fff; z-index: 2; }
.flower .stem { position: absolute; top: 50px; left: 50%; width: 3px; height: 140px; background: #7A8560; transform-origin: top center; }
.flower-grey .petal { background: #B0A99A; }
.flower-grey .stem { transform: rotate(-3deg); }
.flower-red .petal { background: #C03020; }
.flower-red .stem { transform: rotate(2deg); }
.flower-pink .petal { background: #D4607A; }
.flower-pink .stem { transform: rotate(-2deg); }
.flower-yellow .petal { background: #F5C218; }
.flower-yellow .stem { transform: rotate(4deg); }
.flower-red, .flower-pink { margin-top: 40px; } /* slightly taller center flowers, per mockup */

/* ---------- MAP SECTION (base — also reused by about.html's reader map, do not scope colors here) ---------- */
.map-section { background: var(--forest); padding: clamp(3rem, 8vw, 5rem) 6vw; text-align: center; }
.map-section .section-label { display: block; margin-bottom: 0.6rem; }
.map-headline { font-size: clamp(1.8rem, 4.5vw, 2.4rem); color: #fff; margin-bottom: 0.5rem; }
.map-sublabel { font-family: var(--font-body); font-style: italic; font-size: 14px; color: var(--sand); margin-bottom: 2rem; }

/* ---------- CHOOSE YOUR DESTINATION — own white section, two columns: legend left, map right.
   Real interactive jsVectorMap (see index.html <script> + initHomeMap() in js/main.js) — no
   card/border/background around the map itself, it sits directly on the section's white bg. */
.destination-section { background: #fff; padding: clamp(3rem, 6vw, 5rem) 6vw; }
.destination-section .map-headline {
  font-family: var(--font-display); text-transform: uppercase; color: var(--home-navy);
  font-size: clamp(2rem, 5vw, 3rem); margin-bottom: clamp(1.6rem, 4vw, 2.6rem);
}
/* Restructured from a side-by-side row to legend-above-map: the map's actual rendered SIZE
   turned out to be driven entirely by its container's WIDTH (jsVectorMap fits the map to the
   container at a fixed ~2:1 aspect ratio and centers it — a taller container just adds empty
   space above/below, it does not draw a bigger map, confirmed by measuring the rendered SVG
   before/after). A 220px legend sitting beside the map was capping how wide — and therefore how
   big — the map could ever get. Stacking the legend above frees the full section width for it. */
.destination-grid-layout { display: flex; flex-direction: column; gap: clamp(1.6rem, 4vw, 2.6rem); }
.destination-legend-col > .section-label { display: block; margin-bottom: 1rem; color: var(--home-navy); font-weight: 700; opacity: 0.85; }
.destination-map-col { width: 100%; min-width: 0; }

/* legend stars, colored per the current Canva legend: olive = available, navy = coming soon, mustard = not yet explored — laid out as a horizontal row now that it sits above the map instead of in a narrow side column */
.map-legend { display: flex; flex-direction: row; flex-wrap: wrap; gap: clamp(1.6rem, 4vw, 3rem); }
/* stars + labels ~2x the previous 19px/13px, per an earlier round's brief */
/* label text half the previous 26px, per the brief — the star icons themselves (::before below) are unchanged */
.map-legend-item { display: flex; align-items: center; gap: 14px; font-family: var(--font-ui); font-size: 13px; color: var(--home-navy); }
.map-legend-item::before { content: '\2726'; font-size: 38px; line-height: 1; }
.map-legend-item.legend-available::before { color: var(--home-olive); }
.map-legend-item.legend-soon::before { color: var(--home-navy); }
.map-legend-item.legend-unexplored::before { color: var(--home-mustard); text-shadow: 0 0 0 1px rgba(10,6,76,0.2); }

/* ~1.75x the previous clamp(420px, 46vw, 640px), per the brief's 1.5-2x ask */
/* ROOT CAUSE of "the map won't get bigger no matter what height I set" (found this round via
   live measurement — the CSS clamp() value here was never actually taking effect):
   jsVectorMap ships its own stylesheet (loaded via <link> in <head>, AFTER css/style.css) with
   `.jvm-container { height:100% }` — and jsVectorMap adds that exact class directly onto
   #chaptersMap itself (same element, not a child), not onto some inner wrapper. Both rules are
   single-class selectors (equal specificity), so the one that loads LATER in the document wins —
   which is theirs, not this file's. #chaptersMap's real height was collapsing toward its
   flex-row parent's auto height, and the map's own JS was then sizing its SVG off that
   already-collapsed height (measured live: 173px, not the 1120px this rule said). Fixed by
   targeting the id too — #chaptersMap.chapters-map has higher specificity than a single class,
   so this wins regardless of <link> order from now on. */
/* aspect-ratio instead of a fixed height: jsVectorMap fits the map to ~2:1 regardless of how
   tall the container is, so a disconnected height value just adds empty space above/below (this
   was confirmed by screenshot — see the root-cause comment above). aspect-ratio keeps the
   container exactly the height the map actually needs at its current (now much wider, full
   section width) size, with zero dead space, and it stays correct at any viewport width. */
#chaptersMap.chapters-map { width: 100%; aspect-ratio: 2 / 1; height: auto; }
.chapters-map .jvm-container { background: transparent !important; }
.world-map-caption { text-align: center; font-family: var(--font-ui); font-style: italic; font-size: 12.5px; color: var(--home-navy); opacity: 0.7; margin-top: 1rem; }
/* jsVectorMap tooltip, recolored to match the site */
.jvm-tooltip { background: var(--home-navy) !important; color: #fff !important; font-family: var(--font-ui) !important; font-size: 12px !important; border: none !important; padding: 6px 12px !important; border-radius: 20px !important; }
#world-map { width: 100%; height: auto; display: block; min-height: 500px; }
#world-map path { transition: stroke-width 0.2s ease; } /* smooth hover feedback — outline only, no fill */
.map-d3-tooltip {
  display: none; position: absolute; background: #1A1208; color: #fff; padding: 8px 14px;
  border-radius: 999px; font-family: var(--font-ui); font-size: 12px; font-weight: 500; letter-spacing: 0.02em;
  pointer-events: none; min-width: 160px; z-index: 100; text-align: center; white-space: nowrap;
}
.map-d3-fallback { text-align: center; padding: 40px; font-family: var(--font-ui); font-size: 13px; color: #1A1208; }
.map-d3-fallback a { color: #1A1208; font-weight: 600; }

/* ---------- EN / RU LANGUAGE SWITCHER (FIX 7) ---------- */
[data-ru] { display: none; }
[data-lang="ru"] [data-ru] { display: inline; }
[data-lang="ru"] [data-en] { display: none; }
[data-lang="en"] [data-en] { display: inline; }
[data-lang="en"] [data-ru] { display: none; }
/* block-level content (whole paragraphs/headings used as the sole content of their parent) still needs to read as inline so it doesn't break flow inside h1/h2/p */
h1 [data-en], h1 [data-ru], h2 [data-en], h2 [data-ru], p [data-en], p [data-ru], em[data-en], em[data-ru] { display: inline; }
[data-lang="ru"] h1 [data-en], [data-lang="ru"] h2 [data-en], [data-lang="ru"] p [data-en], [data-lang="ru"] em[data-en] { display: none; }
[data-lang="ru"] h1 [data-ru], [data-lang="ru"] h2 [data-ru], [data-lang="ru"] p [data-ru], [data-lang="ru"] em[data-ru] { display: inline; }
/* for a whole block-level element (heading, paragraph) that should just be OMITTED in RU
   entirely, with no RU replacement — unlike [data-ru], which fills in on the attribute itself,
   this hides the element outright rather than leaving an empty same-space placeholder. */
[data-lang="ru"] .en-only { display: none; }

/* RU typeface swap — Anton/Antonio don't cover Cyrillic well, and redefining the shared
   --font-display/--font-body/--font-ui custom properties here (rather than overriding every
   individual selector across the whole stylesheet) means every h1-h3/.section-label/button/nav
   link/paragraph on every page automatically picks up the right font the moment <html> gets
   data-lang="ru", with zero per-selector changes.
   Rubik Mono One (blocky, mostly-uppercase display face) goes on --font-display/--font-ui —
   headlines, labels, buttons, nav — short strings where that's a feature, not a readability
   problem. Long-form paragraphs (--font-body: bio text, quotes, the Uluwatu essay sections) get
   PT Sans instead, a plain readable Cyrillic sans — Rubik Mono One in a multi-paragraph block
   would be genuinely hard to read. Flagging this split explicitly per the brief rather than
   just picking one font everywhere: if full Rubik Mono One (including paragraphs) turns out to
   be the preference after seeing this, that's a one-line change to add --font-body to the swap. */
[data-lang="ru"] {
  --font-display: var(--font-display-ru);
  --font-ui: var(--font-display-ru);
  --font-body: var(--font-body-ru);
}
/* "The Local Temperature" / "TLT" never translate (per the brief) and shouldn't change typeface
   either — these are the site's wordmark, not page copy. Rubik Mono One is also noticeably wider
   per character than Anton, and .hero-title-main's size is tuned tight to Anton's proportions —
   without this override the homepage h1 overflowed its container in RU mode. Pinned back to the
   original fonts regardless of language. */
[data-lang="ru"] .hero-title-main,
[data-lang="ru"] .logo,
[data-lang="ru"] .footer-logo {
  font-family: 'Anton', sans-serif;
}

.lang-switch { display: flex; gap: 2px; align-items: center; margin-left: 20px; }
.lang-switch button {
  background: none; border: 0.5px solid var(--ochre); color: var(--ochre);
  font-family: var(--font-ui); font-size: 10px; padding: 3px 8px; cursor: pointer; letter-spacing: 0.08em;
}
.lang-switch button:first-child { border-radius: 4px 0 0 4px; border-right: none; }
.lang-switch button:last-child { border-radius: 0 4px 4px 0; }
.lang-switch button.active { background: var(--ochre); color: var(--forest); }
.map-wrap { position: relative; max-width: 980px; margin: 0 auto; aspect-ratio: 2 / 1; }
.world-map { width: 100%; height: auto; display: block; }
.world-map .landmass { fill: var(--olive-m); stroke: var(--sky); stroke-width: 0.6; opacity: 0.75; }

.map-pin { position: absolute; transform: translate(-50%, -100%); cursor: pointer; }
.map-pin-dot {
  width: 12px; height: 12px; border-radius: 50%; position: relative;
  animation: pinPulse 2.2s ease-in-out infinite;
}
.map-pin.available .map-pin-dot { background: var(--ochre); animation-duration: 1.5s; }
.map-pin.soon .map-pin-dot { background: var(--sky); }
.map-pin.reader-dot .map-pin-dot { background: var(--terra); width: 8px; height: 8px; animation-duration: 3s; }

.map-tooltip {
  position: absolute; bottom: calc(100% + 10px); left: 50%; transform: translateX(-50%);
  background: var(--forest); border: 1px solid var(--ochre); border-radius: 6px;
  padding: 0.6rem 0.9rem; white-space: nowrap; font-family: var(--font-ui); font-size: 0.72rem;
  color: #EDE7D8; opacity: 0; pointer-events: none; transition: opacity 0.25s var(--ease-out); z-index: 5;
}
.map-pin:hover .map-tooltip, .map-pin:focus .map-tooltip { opacity: 1; }
.map-tooltip .tt-vol { color: var(--ochre); display: block; }

/* the country-pill reader cloud + its initReaderMap() JS were superseded by the real Leaflet
   community pin map on about.html (v15) — removed together, see PROJECT_LOG.md */

.map-mobile-list { display: none; }
.map-mobile-list .map-list-card {
  display: block; background: var(--olive); border: 1px solid rgba(200,160,80,0.2); border-radius: 6px;
  padding: 1rem 1.2rem; margin-bottom: 0.8rem; font-family: var(--font-ui);
}
.map-mobile-list .map-list-card .mc-title { color: #fff; font-size: 0.95rem; display: block; }
.map-mobile-list .map-list-card .mc-sub { color: var(--sky); font-size: 0.75rem; }

/* destination cards — replaces the interactive map (see CHANGELOG v4) */
.destination-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 16px; margin-top: 2rem; }
.dest-card {
  display: block; background: var(--olive); border: 1px solid rgba(200,160,80,0.2); border-radius: 10px;
  padding: 28px 24px; transition: transform 0.25s var(--ease-out), background 0.25s var(--ease-out), border-color 0.25s var(--ease-out);
}
.dest-card:not(.dest-available) { opacity: 0.7; }
.dest-card:hover { transform: translateY(-3px); }
.dest-available { border-color: var(--ochre); cursor: pointer; }
.dest-available:hover { background: var(--olive-m); }
.dest-vol { display: block; font-family: var(--font-ui); font-size: 9px; color: var(--ochre); letter-spacing: 0.18em; margin-bottom: 10px; }
.dest-city { display: block; font-family: var(--font-display); font-size: 32px; color: #fff; line-height: 1; }
.dest-city-soon { color: rgba(255,255,255,0.5); }
.dest-place { display: block; font-family: var(--font-ui); font-size: 11px; color: var(--sky); margin-top: 6px; }
.dest-place-soon { color: var(--olive-m); }
.dest-cta { display: block; margin-top: 20px; font-family: var(--font-ui); font-size: 11px; color: var(--ochre); letter-spacing: 0.05em; }
.dest-card .badge { margin-top: 16px; }

/* ---------- LATEST CHAPTER ---------- */
.latest-chapter {
  position: relative; overflow: hidden; padding: 0; min-height: 500px;
}
.latest-chapter .section-label.chapter-label-corner {
  position: absolute; top: 1.5rem; right: 6vw; z-index: 3; margin-bottom: 0; color: var(--home-navy); font-weight: 600;
}
.chapter-card {
  position: absolute; inset: 0; display: flex; flex-wrap: wrap; border-radius: 0; overflow: hidden;
}
.chapter-photo { flex: 1 1 50%; position: relative; height: 100%; display: flex; flex-direction: column; justify-content: flex-start; padding: 2.2rem; }
/* This exact photo slot has been the single most recurring crop bug in this project — fixing
   it permanently here: the parent has an explicit height (100% of .latest-chapter's fixed
   min-height, itself pinned since .chapter-card is position:absolute so it never grows with
   content), so the crop is deterministic at every viewport width. object-position is tuned to
   this specific photo (two people low in a portrait-orientation frame) — scoped to
   .chapter-photo only, NOT the shared base .photo-fill rule other photos rely on. */
.chapter-photo .photo-fill { object-position: center 78%; }
.chapter-photo-scrim { position: absolute; inset: 0; background: linear-gradient(155deg, rgba(0,0,0,0.55) 0%, rgba(0,0,0,0.15) 45%, transparent 65%); }
.chapter-vol { position: relative; z-index: 1; font-family: var(--font-ui); font-size: 10px; color: rgba(255,255,255,0.7); letter-spacing: 0.15em; }
.chapter-name { position: relative; z-index: 1; font-family: var(--font-display); color: #fff; font-size: 44px; line-height: 1; margin: 0.3rem 0; }
.chapter-loc { position: relative; z-index: 1; font-family: var(--font-ui); color: rgba(255,255,255,0.75); font-size: 12px; letter-spacing: 0.08em; }
/* found during this round's QA, not previously reported: .chapter-info never had its own
   background, so its navy text (.chapter-info p / .chapter-price-line, both var(--home-navy))
   was sitting directly on the page's own background — invisible now that body's default is also
   navy (see the site-wide body-background fix in the shop.html round), and poor contrast even
   before that. Cream matches the same card treatment used on the contact form below. */
.chapter-info {
  flex: 1 1 50%; padding: 48px 36px; display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 1.4rem; text-align: center; background: var(--home-cream);
}
.chapter-info p { font-family: var(--font-display); font-size: clamp(1.2rem, 2.4vw, 1.7rem); color: var(--home-navy); line-height: 1.25; text-transform: uppercase; }
.chapter-price-line { font-family: var(--font-body); font-size: 14px; color: var(--home-navy); opacity: 0.7; margin: 10px 0 0; letter-spacing: 0.05em; display: block; }

/* ---------- COMING SOON GRID ---------- */
.places-grid-section { padding: clamp(3rem, 8vw, 6rem) 6vw; background: var(--forest); }
.places-grid-section .section-label { display: block; margin-bottom: 2rem; }
.places-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1.5rem; }
.place-card { background: var(--olive); border: 0.5px solid rgba(200,160,80,0.2); padding: 2.2rem 1.8rem; display: flex; flex-direction: column; gap: 0.8rem; transition: transform 0.35s var(--ease-out), border-color 0.35s var(--ease-out); }
.place-card:hover { transform: scale(1.02); border-color: var(--ochre); }
.place-city { font-family: var(--font-display); font-size: clamp(1.6rem, 3vw, 2.1rem); color: #fff; }
.place-date { font-family: var(--font-ui); font-size: 0.85rem; color: var(--sky); }
.badge { align-self: flex-start; font-family: var(--font-ui); font-size: 0.68rem; letter-spacing: 0.1em; text-transform: uppercase; color: #fff; background: var(--wine); padding: 0.35em 0.8em; margin-top: 0.4rem; }

/* ---------- SOCIAL PROOF ---------- */
/* ---------- WHAT READERS SAY — cream bg, dark speech bubbles ---------- */
.social-proof {
  /* plain white per the source design — no pattern here (it had been applied by mistake) */
  position: relative; overflow: hidden; padding: clamp(3rem, 7vw, 5rem) 6vw;
  background-color: #fff;
}
.social-proof > * { position: relative; z-index: 1; }
.testimonials-label-heading { display: block; text-align: center; margin-bottom: 2.5rem; font-size: clamp(1.8rem, 4vw, 2.6rem); color: var(--home-navy); }
.testimonials-grid { display: flex; gap: 12px; align-items: flex-start; justify-content: center; max-width: 1100px; margin: 0 auto 3rem; flex-wrap: wrap; }

/* 5-point star, real CSS clip-path (not a redrawn bubble) — orange fill, white text centered
   in the star's wide middle band. Fixed square box so the star shape stays a true star at any
   content length; text that overruns the safe area is accepted the same way the Canva source
   does (a star is not a rectangle — some crowding near the points is expected/intentional). */
.testimonial-bubble {
  position: relative;
  flex: 0 0 320px;
  width: 320px;
  aspect-ratio: 1;
  background: var(--home-orange);
  color: #fff;
  clip-path: polygon(50% 0%, 61% 35%, 98% 35%, 68% 57%, 79% 91%, 50% 70%, 21% 91%, 32% 57%, 2% 35%, 39% 35%);
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
}
.testimonials-grid > .testimonial-bubble:nth-child(2) { margin-top: 30px; }
/* closed by default: just the hint, centered over the whole star */
/* constrained to the star's actual visible safe-zone (same ~52%/54% box .testimonial-inner
   uses) rather than the full inset:0 bounding box — the star's concave shape clips anything
   wider than that at this vertical band, which the RU hint text ("tap to read" translates to a
   longer phrase) was running into and getting cut off by. */
.testimonial-hint {
  position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 52%; height: 54%;
  z-index: 1; display: flex; flex-direction: column; align-items: center;
  justify-content: center; gap: 0.4rem; font-family: var(--font-ui); font-size: 11px; letter-spacing: 0.06em;
  text-transform: uppercase; color: #fff; opacity: 0.9; transition: opacity 0.3s var(--ease-out); text-align: center;
}
.testimonial-hint-icon { font-size: 26px; letter-spacing: 0; }
.testimonial-bubble.is-open .testimonial-hint { opacity: 0; pointer-events: none; }
/* text is constrained to a box in the visual center of the star (~52% of its bounding box),
   not the star's own padding — that's what was letting it spill into the points/heading above */
.testimonial-inner {
  width: 52%; height: 54%; overflow: hidden;
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  text-align: center; font-family: var(--font-body); font-size: 10.5px; line-height: 1.45;
  opacity: 0; transition: opacity 0.35s var(--ease-out); pointer-events: none;
}
.testimonial-bubble.is-open .testimonial-inner { opacity: 1; pointer-events: auto; }
.testimonial-text { margin: 0 0 0.6rem; color: #fff; font-style: normal; }
.testimonial-author { font-style: normal; font-size: 11px; opacity: 0.8; display: block; color: #fff; flex-shrink: 0; }

.counter-bar { text-align: center; font-family: var(--font-ui); font-size: 0.8rem; color: var(--home-navy); }
.flag-row { font-size: 1.1rem; letter-spacing: 0.15em; margin-top: 0.5rem; }

/* ---------- EMAIL SIGNUP ---------- */
/* ---------- SAY HELLO (contact form) ---------- */
.say-hello-section {
  position: relative; overflow: hidden; padding: clamp(3.5rem, 8vw, 6rem) 6vw; text-align: center;
  background-image: url('../images/homepage/say_hello.png'); background-size: cover; background-position: center; background-attachment: fixed;
  background-color: #fff;
}
.say-hello-inner { position: relative; z-index: 1; max-width: 540px; margin: 0 auto; }
.say-hello-title { font-family: var(--font-body); font-style: italic; text-transform: none; font-size: clamp(2rem, 5.5vw, 3.2rem); color: var(--home-navy); }
.say-hello-sub { font-family: var(--font-body); font-style: italic; font-size: 15px; color: var(--home-navy); margin: 1rem 0 2.4rem; line-height: 1.6; }

.contact-form-card { background: var(--home-cream); border-radius: 12px; padding: 44px 40px; text-align: left; }
.contact-field { margin-bottom: 1.6rem; }
.contact-field label { display: block; font-family: var(--font-body); font-size: 14px; color: var(--home-navy); margin-bottom: 0.5rem; }
.contact-field input, .contact-field textarea {
  width: 100%; background: rgba(255,255,255,0.6); border: 1px solid var(--home-navy); border-radius: 6px;
  padding: 0.8em 1em; font-family: var(--font-ui); font-size: 0.85rem; color: var(--home-navy);
}
.contact-field input:focus, .contact-field textarea:focus { outline: none; background: #fff; }
.contact-field textarea { resize: vertical; }
.contact-submit-btn {
  width: 100%; text-align: center; background: var(--home-navy); color: #fff; border-radius: 999px;
  padding: 1em; font-family: var(--font-body); font-style: italic; font-size: 1rem; border: none;
  cursor: pointer; transition: background 0.3s var(--ease-out);
}
.contact-submit-btn:hover { background: #211a6e; }
.contact-alt-link { display: block; margin-top: 1rem; font-family: var(--font-ui); font-size: 12px; color: var(--home-navy); text-align: center; }
.contact-alt-link a { text-decoration: underline; }
.contact-form-note { display: none; margin-top: 1rem; font-family: var(--font-ui); font-size: 12.5px; text-align: center; }
.contact-form-note.show { display: block; }
.contact-form-note.ok { color: #2e7d32; }
.contact-form-note.err { color: #b3261e; }

.signup-section { background: var(--wine); padding: clamp(3rem, 8vw, 5rem) 6vw; text-align: center; }
.signup-title { font-size: 28px; color: #fff; }
.signup-sub { font-family: var(--font-body); font-style: italic; font-size: 14px; color: var(--sand); margin: 0.8rem 0 1.6rem; }
.signup-form { display: flex; flex-wrap: wrap; justify-content: center; gap: 0.7rem; max-width: 460px; margin: 0 auto; }
.signup-input {
  flex: 1 1 220px; background: rgba(13,13,13,0.25); border: 1px solid rgba(237,231,216,0.35); color: #fff;
  padding: 0.9em 1.1em; font-family: var(--font-ui); font-size: 0.85rem; border-radius: 4px;
}
.signup-input::placeholder { color: rgba(237,231,216,0.5); }
.signup-input:focus { outline: none; border-color: var(--ochre); }
.signup-btn { background: var(--ochre); color: var(--forest); border-radius: 4px; }
.signup-btn:hover { background: #fff; }
.signup-feedback { display: none; margin-top: 1rem; font-family: var(--font-ui); font-size: 0.85rem; color: var(--ochre); }
.signup-feedback.show { display: block; }

/* homepage-only "Don't Miss Vol.02" — solid navy, index.html only. Scoped to .vol2-flower so
   shop.html's and about.html's reuse of .signup-section/.signup-btn etc. stay exactly as they
   were (see v6/v7 changelog for why this matters). This section + the footer directly below it
   are now visually one continuous navy block (per the current Canva design) — same bg color,
   no border/gap between them, even though they're still two separate DOM elements. */
.vol2-flower {
  background: var(--home-navy);
}
.vol2-flower .signup-title { color: #fff; }
.vol2-flower .signup-sub { font-style: normal; color: var(--home-orange-2); }
.vol2-flower .signup-input {
  background: var(--home-orange-3); color: #fff; border: none; border-radius: 50px; padding: 14px 28px;
}
.vol2-flower .signup-input::placeholder { color: rgba(255,255,255,0.75); }
.vol2-flower .signup-btn { background: var(--home-orange-3); color: #fff; border-radius: 50px; }
.vol2-flower .signup-btn:hover { background: #d95f00; }
.vol2-flower .signup-feedback { color: #fff; }

/* shop.html-only "Get early access to Vol.02" — white bg, huge bold navy headline (matches the
   "THE SHOP" cover treatment), orange #ff7100 pill input/button. Reuses the exact same
   #vol2Form/#vol2Email/#vol2Feedback ids + Supabase vol2_subscribers table as the homepage's
   .vol2-flower form (see js/main.js) — this is a styling-only modifier, no separate JS. */
.signup-shop {
  background: #fff;
}
.signup-shop .signup-title { color: var(--about-navy); font-size: clamp(2.2rem, 5.5vw, 3.6rem); }
.signup-shop .signup-sub { font-style: normal; font-weight: 700; color: var(--about-navy); font-family: var(--font-ui); }
.signup-shop .signup-input {
  background: #ff7100; color: #fff; border: none; border-radius: 50px; padding: 14px 28px;
}
.signup-shop .signup-input::placeholder { color: rgba(255,255,255,0.8); }
.signup-shop .signup-btn { background: #ff7100; color: #fff; border-radius: 50px; }
.signup-shop .signup-btn:hover { background: #d95f00; }
.signup-shop .signup-feedback { color: var(--about-navy); }

/* ---------- FOOTER — one shared component across all 4 pages now (.footer-navy), per this
   round's brief. index.html's .footer-golden (deco pattern/flower PNGs, author photo circles)
   and shop.html's .footer-pattern-navy (say_hello.png strip) were both retired along with the
   HTML that used them — about.html's plain solid-navy version was the one declared correct, and
   uluwatu.html's page-scoped override (var(--u-navy), #1f1347) was removed too so this rule is
   now the single source of truth on every page. ---------- */
.site-footer { background: var(--forest); border-top: 1px solid rgba(200,160,80,0.15); }
.site-footer.footer-navy { background: #0a064c; border-top: none; }
.footer-main { max-width: var(--max-width); margin: 0 auto; padding: 3.5rem 6vw 2rem; display: flex; flex-wrap: wrap; gap: 2rem; justify-content: space-between; align-items: center; }
.footer-logo { font-family: var(--font-display); font-size: 1.5rem; color: var(--ochre); }
.footer-tagline { font-family: var(--font-body); font-style: italic; color: var(--sand); font-size: 0.85rem; margin-top: 0.3rem; }
.footer-center { display: flex; gap: 1.2rem; }
.footer-center a, .footer-right a { font-family: var(--font-ui); font-size: 0.85rem; letter-spacing: 0.06em; color: var(--sky); }
.footer-center a:hover, .footer-right a:hover { color: var(--ochre); }
.footer-right { display: flex; gap: 1.2rem; }
.footer-bottom { text-align: center; padding: 1.2rem 6vw 2rem; font-family: var(--font-ui); font-size: 0.75rem; letter-spacing: 0.1em; color: var(--ochre); }
/* .footer-navy intentionally only sets the background above — .footer-logo/.footer-tagline/
   .footer-center a/.footer-right a/.footer-bottom already use --ochre/--sand/--sky (this site's
   original gold/tan/grey-blue palette) from the base rules right above, which is exactly the
   correct look confirmed against the reference screenshot (about.html's footer) — no navy-mode
   text-color override needed or wanted here. */

/* =========================================================
   ULUWATU CHAPTER PAGE
   ========================================================= */

.chapter-hero { position: relative; height: 100vh; background: linear-gradient(180deg, var(--forest) 0%, var(--ocean) 100%); overflow: hidden; }
.chapter-hero .photo-overlay-dark { background: linear-gradient(to bottom, rgba(10,18,8,0.3), rgba(10,18,8,0.7)); }
.chapter-hero-content { position: absolute; left: 6vw; bottom: 4rem; z-index: 3; max-width: 90%; }
.chapter-tag { font-family: var(--font-ui); font-size: 10px; letter-spacing: 0.15em; color: var(--ochre); }
.chapter-title-huge { font-family: var(--font-display); font-size: clamp(5rem, 15vw, 10rem); color: #fff; line-height: 0.85; }
.chapter-coords { font-family: var(--font-ui); font-size: 11px; color: var(--sky); }
.scroll-indicator { position: absolute; bottom: 2rem; left: 50%; transform: translateX(-50%); width: 1px; height: 40px; background: linear-gradient(180deg, rgba(255,255,255,0) 0%, #fff 50%, rgba(255,255,255,0) 100%); z-index: 3; }

/* generic split layout (story / sounds / looks) */
.split { display: flex; flex-wrap: wrap; }
.split-photo { position: relative; overflow: hidden; min-height: 480px; }
.split-photo.w-42 { flex: 1 1 42%; }
.split-photo.w-45 { flex: 1 1 45%; }
.split-text { padding: clamp(2.5rem, 6vw, 60px) clamp(2rem, 5vw, 50px); display: flex; flex-direction: column; justify-content: center; gap: 1.2rem; }
.split-text.w-58 { flex: 1 1 58%; }
.split-text.w-55 { flex: 1 1 55%; }
.split-text .rule { width: 50px; margin: 0; }
.split-text p { font-size: 15px; color: var(--sand); white-space: pre-line; line-height: 1.85; }
.split-text h3 { font-size: clamp(1.7rem, 3.6vw, 2.4rem); color: #fff; }
.split-quote { font-family: var(--font-body); font-style: italic; font-size: 13px; color: var(--sky); margin-top: 0.6rem; }

.story-section { background: var(--forest); min-height: 80vh; }

/* stacked photos (kept for possible reuse, no longer used by How It Looks — see .looks-photo-grid) */
.stacked-photos { display: flex; flex-direction: column; }
.stacked-photos .photo-slot { min-height: 240px; position: relative; overflow: hidden; }

/* read slowly */
.manifesto-box { background: #6B1F2A; padding: 50px 6vw; text-align: center; display: flex; justify-content: center; }
.manifesto-box-inner { max-width: 600px; }
.manifesto-box h2 { font-size: 3rem; color: #fff; margin-bottom: 1.2rem; }
.manifesto-box p { font-size: 15px; font-style: italic; color: #F0E8D8; }

/* playlist */
/* LISTEN FIRST — editorial music player, left info / right track list */
.playlist-section-v2 { background: #1A1208; display: flex; flex-wrap: wrap; }
.playlist-left {
  flex: 1 1 40%; min-width: 280px; padding: clamp(3rem, 6vw, 5rem) clamp(2rem, 4vw, 3.5rem);
  display: flex; flex-direction: column; align-items: flex-start; gap: 1.1rem;
}
.playlist-right { flex: 1 1 60%; min-width: 300px; padding: clamp(3rem, 6vw, 5rem) clamp(2rem, 4vw, 3.5rem); display: flex; flex-direction: column; justify-content: center; }
.playlist-big-headline { font-size: 2.5rem; line-height: 1.05; }
.playlist-big-headline span { display: block; }
.playlist-big-headline .pl-white { color: #fff; }
.playlist-big-headline .pl-ochre { color: var(--ochre); }
.playlist-quote { font-family: var(--font-body); font-style: italic; font-size: 13px; color: #A09070; }

.track-list-v2 { display: flex; flex-direction: column; max-width: 620px; }
.track-row-v2 { display: flex; justify-content: space-between; align-items: center; gap: 1rem; border-bottom: 0.5px solid rgba(200,160,80,0.15); padding: 1.2rem 0; }
.track-info { display: flex; align-items: baseline; gap: 1rem; }
.track-info .track-num { font-family: var(--font-display); font-size: 18px; color: var(--ochre); flex-shrink: 0; }
.track-meta { display: flex; flex-direction: column; gap: 0.2rem; }
.track-meta .track-title { font-family: var(--font-ui); font-weight: 500; font-size: 15px; color: #fff; }
.track-meta .track-artist { font-family: var(--font-ui); font-size: 12px; color: #7A9BA8; }
.track-meta .track-mood { font-family: var(--font-body); font-style: italic; font-size: 12px; color: #5A7040; }
.track-arrow { font-size: 1.3rem; color: var(--ochre); flex-shrink: 0; transition: transform 0.2s var(--ease-out), color 0.2s var(--ease-out); }
.track-arrow:hover { transform: translateX(4px); color: #fff; }

.qr-code-block { flex-shrink: 0; }
.qr-box { display: inline-block; padding: 6px; background: #1A1208; border: 1px solid var(--ochre); border-radius: 4px; }
.qr-code-img { display: block; border-radius: 4px; }
.qr-fallback {
  display: none; width: 140px; height: 140px; background: var(--olive); border-radius: 4px;
  align-items: center; justify-content: center; text-align: center; padding: 8px;
}
.qr-fallback a { color: var(--ochre); font-family: var(--font-ui); font-size: 11px; }
.qr-caption { font-family: var(--font-ui); font-size: 9px; color: var(--ochre); margin-top: 8px; letter-spacing: 0.05em; }
.playlist-warning { font-family: var(--font-ui); font-size: 8px; color: #5A7040; margin: 0.15rem 0; }

/* how it sounds */
.sounds-section { background: #2A3820; padding: 0; }
.sounds-inner { display: flex; flex-wrap: wrap; }
.sounds-text { flex: 1 1 55%; padding: clamp(2.5rem, 6vw, 60px) clamp(2rem, 5vw, 50px); }
.sounds-photo { flex: 1 1 45%; position: relative; overflow: hidden; min-height: 460px; }
.sounds-headline {
  font-size: clamp(2rem, 5vw, 3.5rem); color: #fff; line-height: 1; margin: 1rem 0;
  word-spacing: 0.06em; white-space: normal; word-break: normal; overflow-wrap: break-word; letter-spacing: 0.01em;
}
.sounds-lede { font-family: var(--font-body); font-style: italic; font-size: 14px; color: var(--ochre); }
.sounds-body { font-size: 15px; color: var(--sand); line-height: 1.8; white-space: pre-line; margin: 1.2rem 0; }
.sounds-quote { font-family: var(--font-body); font-style: italic; font-size: 13px; color: var(--sky); border-left: 2px solid var(--sky); padding-left: 1rem; }

/* video section */
.video-section { position: relative; height: 60vh; min-height: 380px; overflow: hidden; background: var(--forest); }
.video-section video, .video-section .photo-slot { width: 100%; height: 100%; object-fit: cover; display: block; }
.video-caption-overlay { position: absolute; left: 0; right: 0; bottom: 0; height: 30%; background: linear-gradient(to top, rgba(10,18,8,0.8), transparent); z-index: 2; display: flex; flex-direction: column; justify-content: flex-end; padding: 1.5rem 2rem; }
.video-caption-overlay .vc-label { font-family: var(--font-ui); font-size: 10px; color: var(--ochre); letter-spacing: 0.1em; }
.video-caption-overlay .vc-sub { font-family: var(--font-body); font-style: italic; font-size: 13px; color: #fff; margin-top: 0.3rem; }

/* how it smells — v10: real full-screen photo, no cards, just type floating on the image */
.smells-section { position: relative; overflow: hidden; min-height: 100vh; display: flex; align-items: center; justify-content: center; }
.smells-bg-photo { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.smells-overlay { position: absolute; inset: 0; background: rgba(20,30,14,0.6); }
.smells-content-v2 { position: relative; z-index: 1; max-width: 800px; margin: 0 auto; padding: 2rem; text-align: center; }
.smells-content-v2 .section-label { display: block; margin-bottom: 1.5rem; }

.smell-word-stack { margin-bottom: 1.5rem; }
.smell-word-stack .smell-word-line { font-family: var(--font-display); display: block; line-height: 1.05; }
.smell-word-stack .sw-zinc { color: #7A9BA8; font-size: clamp(3rem, 8vw, 6rem); }
.smell-word-stack .sw-coffee { color: var(--ochre); font-size: clamp(3rem, 8vw, 6rem); }
.smell-word-stack .sw-ocean { color: #C8A870; font-size: clamp(2.5rem, 6vw, 5rem); }

.smell-word.freedom {
  position: relative; display: block; font-family: var(--font-display); color: #fff;
  font-size: clamp(4rem, 12vw, 8rem); line-height: 1; z-index: 1;
}
.smell-word.freedom::before {
  content: 'FREEDOM'; position: absolute; top: 0.05em; left: 0.03em; transform: scale(1.04);
  color: rgba(255,255,255,0.06); z-index: -1;
}

.smells-content-v2 .smell-freedom-line { font-family: var(--font-body); font-style: italic; font-size: 16px; color: #fff; margin-top: 1.6rem; text-shadow: 0 1px 8px rgba(0,0,0,0.4); }
.smells-content-v2 .smell-freedom-accent { font-family: var(--font-body); font-size: 14px; color: var(--ochre); margin-top: 0.3rem; }

.smell-scatter-v2 { font-family: var(--font-ui); font-size: 11px; color: rgba(255,255,255,0.65); text-align: center; line-height: 2; margin-top: 2rem; text-shadow: 0 1px 6px rgba(0,0,0,0.4); }

/* interactive widgets (smell response / leave a trace) */
.widget-section { background: var(--forest); padding: clamp(3rem, 7vw, 5rem) 6vw; text-align: center; }
.widget-inner { max-width: 600px; margin: 0 auto; }
.widget-title { font-size: 28px; color: #fff; margin: 0.6rem 0; }
.widget-sub { font-family: var(--font-body); font-style: italic; font-size: 14px; color: var(--sand); margin-bottom: 1.6rem; }
.widget-form { display: flex; flex-wrap: wrap; gap: 0.7rem; justify-content: center; }
.widget-input, .widget-textarea {
  flex: 1 1 320px; background: var(--olive); border: 0.5px solid var(--ochre); color: #fff;
  padding: 0.9em 1.2em; font-family: var(--font-ui); font-size: 0.85rem; border-radius: 3px;
}
.widget-textarea { flex-basis: 100%; resize: vertical; min-height: 96px; font-family: var(--font-body); }
.widget-input::placeholder, .widget-textarea::placeholder { color: rgba(237,231,216,0.4); }
.widget-input:focus, .widget-textarea:focus { outline: none; border-color: var(--sand); }
.widget-btn { background: var(--wine); color: #fff; border-radius: 3px; }
.widget-btn:hover { background: var(--ochre); color: var(--forest); }
.widget-credit { display: block; font-family: var(--font-ui); font-size: 9px; color: var(--sky); letter-spacing: 0.1em; margin: 2rem 0 0.8rem; }

.word-cloud { display: flex; flex-wrap: wrap; gap: 0.5rem; justify-content: center; }
.word-pill { font-family: var(--font-ui); font-size: 12px; color: #fff; border-radius: 20px; padding: 0.4rem 0.9rem; }
.word-pill.p1 { background: var(--olive); }
.word-pill.p2 { background: var(--ocean); }
.word-pill.p3 { background: var(--wine); }

.trace-list { display: flex; flex-direction: column; gap: 0.9rem; text-align: left; }
.trace-item { font-family: var(--font-body); font-style: italic; font-size: 13px; color: var(--sand); border-left: 2px solid var(--ochre); padding-left: 1rem; }

/* paywall */
.paywall-wrapper { position: relative; }
.fade-mask { position: absolute; bottom: 0; left: 0; right: 0; height: 220px; background: linear-gradient(to bottom, transparent, var(--forest)); pointer-events: none; z-index: 4; }
.paywall-card {
  position: relative; z-index: 10; background: var(--forest); border: 1px solid var(--ochre); border-radius: 12px;
  padding: 50px 40px; max-width: 480px; margin: -80px auto 0; text-align: center;
}
.paywall-card .section-label { display: block; }
.paywall-title { font-size: 32px; color: #fff; margin: 0.6rem 0 1rem; }
.paywall-list { font-family: var(--font-body); font-style: italic; font-size: 14px; color: var(--sand); margin-bottom: 1rem; }
.paywall-price { font-family: var(--font-display); font-size: 52px; color: var(--ochre); }
.paywall-sub { font-family: var(--font-ui); font-size: 11px; color: var(--sky); }
.paywall-btn { background: var(--wine); color: #fff; font-family: var(--font-display); font-size: 16px; padding: 18px 40px; border-radius: 6px; display: block; width: 100%; margin-top: 1.4rem; text-align: center; }
.paywall-btn:hover { background: var(--ochre); color: var(--forest); }
.paywall-via { font-family: var(--font-ui); font-size: 10px; color: var(--sky); margin-top: 0.7rem; }
.password-toggle { display: inline-block; margin-top: 1rem; font-family: var(--font-ui); font-size: 11px; color: rgba(237,231,216,0.5); border-bottom: 1px dotted rgba(237,231,216,0.4); }
.password-toggle:hover { color: var(--ochre); }
.password-form { display: none; margin-top: 1rem; gap: 0.6rem; flex-wrap: wrap; justify-content: center; }
.password-form.show { display: flex; }
.password-input { background: var(--olive); border: 0.5px solid var(--ochre); color: #fff; padding: 0.7em 1em; font-family: var(--font-ui); font-size: 0.8rem; border-radius: 3px; }
.password-error { display: none; color: var(--terra); font-family: var(--font-ui); font-size: 0.75rem; margin-top: 0.5rem; }
.password-error.show { display: block; }
.password-success { display: none; color: #4caf6e; font-family: var(--font-ui); font-size: 0.75rem; margin-top: 0.5rem; font-weight: 600; }
.password-success.show { display: block; }

/* locked content — gated until unlock. Was blur(7px)/opacity(0.35) — a reader reported this was
   still clearly readable (confirmed via screenshot: 7px blur barely softens large bold headings,
   and 0.35 opacity still leaves real contrast). Pushed both further so locked text/photos read
   as genuinely illegible, not just "a bit soft" — see the page-specific override below too,
   which is the one that actually wins on uluwatu.html (higher specificity). */
.locked-content { position: relative; pointer-events: none; user-select: none; filter: blur(16px); opacity: 0.2; transition: filter 0.6s var(--ease-out), opacity 0.6s var(--ease-out); }
body.unlocked .locked-content { pointer-events: auto; user-select: auto; filter: none; opacity: 1; }
body.unlocked .paywall-card, body.unlocked .fade-mask { display: none; }

/* sunrise/sunset */
.sun-split { display: flex; flex-wrap: wrap; min-height: 70vh; }
.sun-half { flex: 1 1 50%; min-height: 55vh; position: relative; display: flex; align-items: center; overflow: hidden; }
.sun-half.sunrise { background: #060D14; justify-content: flex-start; }
.sun-half.sunset { justify-content: flex-end; }
.sun-half canvas { position: absolute; inset: 0; width: 100%; height: 100%; }
.sun-text { position: relative; z-index: 3; padding: 3rem; max-width: 420px; color: #fff; }
.sun-title { font-size: clamp(2.2rem, 5.5vw, 3.6rem); }
.sun-text p { font-family: var(--font-body); font-style: italic; font-size: 14px; margin-top: 1.4rem; white-space: pre-line; }
.sun-half.sunrise .sun-text p { color: var(--sand); }
.sun-half.sunset .sun-text p { color: var(--ochre); }

/* the local — repurposed as Ilham, Part 1 (see .ilham-* rules further down) */
.local-section { display: flex; flex-wrap: wrap; background: #1A1208; }
.local-photo { flex: 1 1 55%; min-height: 480px; position: relative; overflow: hidden; }
.local-text { flex: 1 1 45%; background: #1A1208; padding: 70px 50px; }
.local-text .rule { width: 50px; margin: 1rem 0 1.6rem; }
.local-name { font-size: 3.5rem; color: #fff; line-height: 1; }
.local-meta { font-family: var(--font-ui); color: var(--sky); font-size: 11px; margin-top: 0.4rem; }
.local-quote { font-family: var(--font-body); font-style: italic; font-size: 16px; color: var(--sand); margin: 1.6rem 0; max-width: 520px; }
.local-things-label { font-family: var(--font-ui); letter-spacing: 0.1em; color: var(--sky); font-size: 9px; margin-bottom: 0.8rem; }
.local-things li { font-family: var(--font-body); color: var(--sand); margin-bottom: 0.5rem; font-size: 14px; }
.local-handle { margin-top: 1.5rem; font-family: var(--font-ui); color: var(--ochre); font-size: 10px; }

/* ---------- ILHAM — Part 1 additions ---------- */
.ilham-badge {
  position: absolute; top: 1.2rem; left: 1.2rem; z-index: 2; background: #1A1208; color: var(--ochre);
  font-family: var(--font-ui); font-size: 9px; letter-spacing: 0.08em; padding: 6px 12px;
}
.ilham-surname { font-family: var(--font-display); font-size: 2rem; color: var(--ochre); margin-top: 0.2rem; }
.ilham-role { font-family: var(--font-ui); font-size: 12px; color: #7A9BA8; margin-top: 0.6rem; display: block; }
.ilham-location { font-family: var(--font-ui); font-size: 11px; color: #5A7040; margin-top: 0.3rem; display: block; }
.ilham-quote { font-family: var(--font-body); font-style: italic; font-size: 18px; color: #C8B898; line-height: 1.7; margin: 1.6rem 0; }

.senses-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1.2rem; margin: 1.6rem 0; }
.sense-item { text-align: left; }
.sense-icon { font-size: 1.3rem; display: block; margin-bottom: 0.4rem; }
.sense-label { font-family: var(--font-display); font-size: 14px; color: var(--ochre); display: block; margin-bottom: 0.3rem; }
.sense-item p { font-family: var(--font-body); font-size: 13px; color: #fff; line-height: 1.6; }

.ilham-ig-link { display: inline-block; margin-top: 1rem; font-family: var(--font-ui); font-size: 11px; color: #EDE7D8; }
.ilham-ig-link:hover { color: var(--ochre); }

/* ---------- ILHAM — Part 2 (a normal day, places, annoys/hopes) ---------- */
.ilham-part2-section { background: var(--forest); padding: clamp(3rem, 7vw, 5rem) 6vw clamp(2rem, 5vw, 3rem); }
.day-label { display: block; text-align: center; margin-bottom: 2rem; }

.day-timeline { display: flex; justify-content: center; align-items: flex-start; flex-wrap: wrap; gap: 0; margin-bottom: 2.5rem; }
.day-step { display: flex; flex-direction: column; align-items: center; text-align: center; width: 120px; position: relative; }
.day-step-connector { flex: 1 1 24px; height: 1px; background: linear-gradient(90deg, rgba(122,155,168,0.5), rgba(122,155,168,0.15)); margin-top: 22px; min-width: 16px; }
.day-icon { font-size: 1.5rem; }
.day-num { font-family: var(--font-ui); font-size: 9px; color: var(--ochre); letter-spacing: 0.08em; margin-top: 0.4rem; }
.day-step-label { font-family: var(--font-display); font-size: 14px; color: #fff; margin-top: 0.2rem; }
.day-step-sub { font-family: var(--font-body); font-style: italic; font-size: 11px; color: var(--sand); margin-top: 0.2rem; }

.day-pull-quote { font-family: var(--font-body); font-style: italic; font-size: 22px; color: #C8B898; text-align: center; max-width: 700px; margin: 0 auto 3rem; line-height: 1.6; }

.ilham-bottom-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 1.6rem; }
.places-loves-col .section-label { display: block; margin-bottom: 1rem; }
.place-pills { display: flex; flex-wrap: wrap; gap: 0.6rem; margin-bottom: 1.2rem; }
.place-pill { font-family: var(--font-ui); font-size: 11px; color: #EDE7D8; background: rgba(200,160,80,0.12); border: 1px solid rgba(200,160,80,0.3); border-radius: 20px; padding: 0.4em 0.9em; }
.places-loves-photo { width: 100%; height: 200px; object-fit: cover; border-radius: 8px; display: block; }
.never-take-card { margin-top: 1rem; }
.never-take-card .nt-label { display: block; font-family: var(--font-ui); font-size: 9px; color: #C84818; letter-spacing: 0.06em; margin-bottom: 0.4rem; }
.never-take-card p { font-family: var(--font-body); font-size: 13px; color: #fff; }

.ilham-side-col { display: flex; flex-direction: column; gap: 1.2rem; }
.annoys-card, .hopes-card { border-radius: 8px; overflow: hidden; }
.annoys-card { background: #2A2010; }
.annoys-card .card-photo { width: 100%; height: 120px; object-fit: cover; display: block; }
.annoys-card .card-body, .hopes-card .card-body { padding: 24px; }
.hopes-card { background: #1A2A20; }
.annoys-card .card-label { display: block; font-family: var(--font-ui); font-size: 9px; color: var(--ochre); letter-spacing: 0.06em; margin-bottom: 0.5rem; }
.hopes-card .card-label { display: block; font-family: var(--font-ui); font-size: 9px; color: #5A8060; letter-spacing: 0.06em; margin-bottom: 0.5rem; }
.annoys-card p, .hopes-card p { font-family: var(--font-body); font-size: 14px; color: #fff; line-height: 1.6; }

.ilham-bottom-bar {
  background: #0E1208; margin: clamp(3rem, 7vw, 5rem) -6vw -3rem; padding: 2rem 6vw;
  display: flex; flex-wrap: wrap; justify-content: space-between; align-items: center; gap: 1rem;
}
.ilham-bottom-bar .ibb-question { font-family: var(--font-body); font-size: 13px; color: #7A9BA8; max-width: 260px; }
.ilham-bottom-bar .ibb-answer { font-family: var(--font-body); font-size: 13px; color: #fff; max-width: 420px; flex: 1 1 300px; }
.ilham-bottom-bar .ibb-follow { font-family: var(--font-ui); font-size: 12px; color: #fff; white-space: nowrap; }
.ilham-bottom-bar .ibb-follow:hover { color: var(--ochre); }

/* two places */
.two-places-section { padding: clamp(3.5rem, 8vw, 6rem) 6vw; background: #1E2A14; }
.two-places-sub { font-size: clamp(1.6rem, 3.6vw, 2.3rem); color: #fff; margin: 0.6rem 0 2.4rem; }
.places-cards-v2 { display: grid; grid-template-columns: 1fr 1fr; gap: 0; }
.place-card-v2 { display: flex; flex-direction: column; border-radius: 0; overflow: hidden; }
.place-card-photo { height: 320px; position: relative; overflow: hidden; }
.place-card-body { padding: 28px; }
.place-card-body.panel-forest { background: var(--forest); }
.place-card-body.panel-ocean { background: #1A2A30; }
.place-card-body h4 { font-family: var(--font-display); color: var(--ochre); font-size: 22px; margin-bottom: 0.6rem; }
.place-card-body p { font-family: var(--font-body); font-size: 14px; color: var(--sand); line-height: 1.75; white-space: pre-line; }

/* Copy Place collage — main photo + smaller secondary photo overlapping bottom-right */
.copyplace-collage { position: relative; height: 100%; width: 100%; }
.copyplace-collage .cp-main { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.copyplace-collage .cp-secondary {
  position: absolute; bottom: 16px; right: 16px; width: 42%; height: 45%; object-fit: cover;
  border: 3px solid #1A1208; border-radius: 4px; box-shadow: 0 6px 20px rgba(0,0,0,0.4);
}

/* how it looks — v10: centered text block on top, full-bleed 3-col photo grid below */
.looks-section { background: #1E2A14; position: relative; }
.looks-text-block { max-width: 700px; margin: 0 auto; padding: 60px 40px 20px; text-align: center; }
.looks-text-block h2 { font-size: clamp(2rem, 5vw, 3.5rem); color: #fff; margin: 1rem 0; }
.looks-text-block p { font-family: var(--font-body); font-size: 15px; color: #C8B898; line-height: 1.8; white-space: pre-line; }
.looks-photo-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 0; }
.looks-photo-grid img { width: 100%; height: 55vh; object-fit: cover; display: block; filter: contrast(1.05) saturate(0.9) sepia(0.05); }

/* sunset — full screen, photo breathes, gradient only in bottom 25% */
.sunset-fullscreen { position: relative; height: 100vh; overflow: hidden; }
.sunset-fullscreen img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.sunset-fullscreen .sunset-gradient { position: absolute; left: 0; right: 0; bottom: 0; height: 25%; background: linear-gradient(to top, rgba(10,8,4,0.8), transparent); }
.sunset-fullscreen .sunset-text { position: absolute; left: 6vw; bottom: 3rem; z-index: 2; max-width: 480px; }
.sunset-fullscreen .sunset-title { font-size: clamp(3rem, 9vw, 7rem); color: #fff; line-height: 0.9; }
.sunset-fullscreen .sunset-text p { font-family: var(--font-body); font-style: italic; font-size: 15px; color: #fff; line-height: 1.7; margin-top: 1rem; white-space: pre-line; }

/* if you go */
.tips-section { background: var(--wine); padding: clamp(3.5rem, 8vw, 6rem) 6vw; }
.tips-title { font-size: 32px; color: #fff; margin: 0.6rem 0 0.5rem; }
.tips-sub { font-family: var(--font-body); font-style: italic; font-size: 14px; color: var(--sand); margin-bottom: 2.2rem; }
.tips-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1.2rem; }
.tip-card { background: var(--forest); border-top: 2px solid var(--ochre); border-radius: 8px; padding: 20px; }
.tip-icon { font-size: 1.4rem; }
.tip-title { font-family: var(--font-ui); font-weight: 500; font-size: 13px; color: #fff; display: block; margin: 0.5rem 0 0.3rem; }
.tip-card p { font-family: var(--font-body); font-size: 12px; color: var(--sand); line-height: 1.65; }

/* author's column */
.author-section { background: var(--forest); padding: clamp(4rem, 9vw, 6rem) 6vw; display: flex; justify-content: center; }
.author-inner { max-width: 780px; width: 100%; }
.author-title { font-size: 28px; color: #fff; margin: 1rem 0 1.6rem; }
.author-body { font-size: 15px; color: var(--sand); line-height: 1.9; white-space: pre-line; }

/* Author's Column — split into a quote card + a two-column personal story w/ photo (v5 FIX 8) */
.author-note-card {
  background: rgba(30,42,20,0.7); border-radius: 10px; padding: 36px 40px; border-left: 4px solid var(--ochre); margin-bottom: 48px;
}
.author-note-label { display: block; font-family: var(--font-ui); font-size: 9px; color: var(--ochre); letter-spacing: 0.18em; margin-bottom: 20px; }
.author-note-text { font-family: var(--font-body); font-size: 16px; color: #F0E8D8; line-height: 1.9; margin: 0; white-space: pre-line; }

.author-divider { display: flex; align-items: center; gap: 20px; margin: 0 0 48px; }
.author-divider-line { flex: 1; height: 0.5px; background: rgba(200,160,80,0.3); }
.author-divider-label { font-family: var(--font-ui); font-size: 9px; color: var(--ochre); letter-spacing: 0.18em; white-space: nowrap; }

.author-grid { display: grid; grid-template-columns: 280px 1fr; gap: 48px; align-items: start; }
.author-photo-col img { width: 100%; border-radius: 8px; filter: contrast(1.05) saturate(0.9) sepia(0.06); }
.author-photo-caption { font-family: var(--font-ui); font-size: 10px; color: var(--ochre); letter-spacing: 0.1em; margin-top: 12px; text-align: center; }
.author-story-col p { font-family: var(--font-body); font-size: 15px; color: #F0E8D8; line-height: 1.9; margin: 0; }
.author-story-accent { color: var(--ochre); }

@media (max-width: 768px) {
  .author-grid { grid-template-columns: 1fr; }
}

/* closing */
.closing-section { background: var(--forest); min-height: 60vh; display: flex; align-items: center; justify-content: center; text-align: center; padding: 4rem 6vw; }
.closing-title { font-size: clamp(2.2rem, 7vw, 5.5rem); color: #fff; }
.closing-quote { font-family: var(--font-body); font-style: italic; color: #fff; font-size: clamp(1rem, 1.8vw, 1.3rem); }
.closing-quote p { margin: 0.3rem 0; }
.closing-credit { font-family: var(--font-ui); font-size: 0.75rem; letter-spacing: 0.1em; color: rgba(237,231,216,0.4); margin-top: 1.5rem; }

/* weather widget */
.weather-widget {
  position: absolute; top: calc(var(--nav-height) + 1.2rem); right: 6vw; z-index: 4;
  background: rgba(30,42,20,0.9); border-radius: 8px; padding: 10px 14px; text-align: right;
}
.weather-widget .ww-label { font-family: var(--font-ui); font-size: 9px; color: var(--ochre); letter-spacing: 0.08em; }
.weather-widget .ww-value { font-family: var(--font-ui); font-size: 12px; color: #fff; margin-top: 0.2rem; }
.weather-widget .ww-sub { font-family: var(--font-body); font-style: italic; font-size: 9px; color: var(--sky); margin-top: 0.15rem; }

/* =========================================================
   ABOUT PAGE (v15 — Canva 1:1 rebuild)
   ========================================================= */
:root {
  --about-navy: #0a064c;
  --about-navy-2: #0d005c;
  --about-orange: #fc7712;
}

/* RESTORED (was accidentally deleted entirely in an earlier about.html editing pass, along
   with everything relying on it — this is why the header pattern background stopped rendering:
   .page-hero.page-hero-about sets align-items:flex-start etc. but with no display:flex on the
   base rule, those properties did nothing, and more importantly shop.html's OWN header (which
   uses this exact shared class, just with its own inline background/min-height override) lost
   its centering/padding/layout too. Restored to its original values. */
.page-hero {
  position: relative; background: var(--olive); min-height: 42vh; display: flex; flex-direction: column;
  align-items: center; justify-content: center; text-align: center; padding: 8rem 6vw 3rem; overflow: hidden;
}
.page-hero .photo-fill { z-index: 0; }
.page-hero .photo-overlay-dark { z-index: 1; }
.page-hero h1, .page-hero p { position: relative; z-index: 2; }
.page-hero h1 { font-size: clamp(4rem, 12vw, 8rem); color: var(--ochre); line-height: 0.85; }
.page-hero p { font-family: var(--font-body); font-style: italic; margin-top: 1rem; font-size: 18px; color: #fff; }

/* .page-hero is shared with shop.html — this scoped modifier keeps shop.html's copy exactly as
   it was (do not edit the base .page-hero rule above for this page's colors/background).
   FOUND THIS ROUND (unrelated to the Netlify case-sensitivity audit that prompted the check,
   but caught by it): this pointed at images/about/The_person_behind_The_Local_Temperature.png,
   which doesn't exist on disk under ANY capitalization — not a case mismatch, just genuinely
   missing (confirmed: images/about/ only contains Iana_Kallina.png). This would have been
   silently broken locally too, not just on Netlify. Reused main_page.png (the same wavy-pattern
   asset + single-image/no-repeat treatment already used for shop.html's header, fixed in an
   earlier round for the same "tiling instead of one image" reason) rather than leaving this
   pointed at a file that no longer exists. */
.page-hero.page-hero-about {
  background-image: url('../images/homepage/main_page.png');
  background-repeat: no-repeat; background-size: cover; background-position: center;
  background-color: #fff; min-height: 258px; padding: 7rem 6vw 2.5rem; text-align: left; align-items: flex-start;
}
.page-hero.page-hero-about h1 { color: var(--about-navy); font-size: clamp(3.5rem, 9vw, 6rem); }
.page-hero.page-hero-about p { color: var(--about-navy); font-style: normal; font-family: var(--font-body); font-size: 16px; }

/* shop.html header — same wavy-pattern strip as the rest of the site, this time centered
   (about.html's is left-aligned; the Canva reference for this page centers "THE SHOP"). Reuses
   the base .page-hero's centering, only overrides background/colors/sizing. */
/* was main_page.png with background-repeat:repeat-x/auto 258px — that treats it like the thin
   abstract wavy-line motif it's used as elsewhere, but at this header's actual width that tiled
   into 2-3 visibly duplicated copies of the image side by side. Switched to say_hello.png (the
   same asset used once, full-bleed, on the homepage's contact section) shown as a single
   image — background-size:cover, no repeat — per the brief. */
.page-hero.page-hero-shop {
  background-image: url('../images/homepage/say_hello.png');
  background-repeat: no-repeat; background-size: cover; background-position: center;
  background-color: #fff; min-height: 258px; padding: 7rem 6vw 2.5rem;
}
.page-hero.page-hero-shop h1 { color: var(--about-navy); font-size: clamp(3rem, 8vw, 5.5rem); }
.page-hero.page-hero-shop p { color: var(--about-navy); font-style: normal; font-weight: 700; font-family: var(--font-ui); font-size: 16px; margin-top: 0.6rem; }

/* ---------- WHO I AM ---------- */
.about-who { display: flex; flex-wrap: wrap; background: #fff; min-height: 640px; }
.about-who-photo { flex: 1 1 45%; position: relative; min-height: 420px; overflow: hidden; }
.about-who-photo img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.about-who-info { flex: 1 1 55%; padding: clamp(3rem, 6vw, 5rem) clamp(2rem, 5vw, 4rem); display: flex; flex-direction: column; justify-content: center; }
.about-who-info .section-label { color: var(--about-navy); font-weight: 700; }
.about-who-info .label-underline { display: block; width: 54px; height: 3px; background: var(--about-orange); margin: 0.6rem 0 1.6rem; border: none; }
.about-who-info h2.about-name { font-family: var(--font-display); color: var(--about-orange); font-size: clamp(2.6rem, 5vw, 3.6rem); line-height: 1; margin-bottom: 0.8rem; }
.about-who-info .about-meta { display: block; font-family: var(--font-ui); font-weight: 700; color: var(--about-navy); font-size: 15px; margin-bottom: 2rem; }
.about-who-info .find-me-label { display: block; font-family: var(--font-ui); font-weight: 600; color: var(--about-navy); font-size: 14px; margin-bottom: 1rem; }
.find-me-stars { display: flex; flex-wrap: wrap; gap: clamp(2rem, 5vw, 3.2rem); }
.find-me-star { display: flex; flex-direction: column; align-items: center; gap: 0.6rem; color: var(--about-orange); transition: transform 0.2s var(--ease-out); }
.find-me-star:hover { transform: translateY(-3px); }
/* ~4x the previous 2rem, per the brief */
.find-me-star .star-icon { font-size: 8rem; line-height: 1; }
.find-me-star .star-label { font-family: var(--font-ui); font-size: 13px; color: var(--about-navy); letter-spacing: 0.03em; }

/* ---------- BIO — two italic paragraphs, deliberately alternating alignment ----------
   max-width was previously set directly on this element alongside its own background, which
   constrained the WHITE BACKGROUND to 1100px too — on any viewport wider than that (most
   laptops/desktops), the page's default dark body background showed through as bare strips on
   either side. Background now spans the full section width; content is centered to the same
   1100px via padding instead of margin, so the white fill reaches every edge regardless of
   viewport width. */
/* tightened line-height/gap/padding vs the original 1.9/2.5-4rem/3-5.5rem — brief wants this
   closer to a one-screen fit like Canva; full parity isn't achievable at every viewport (this is
   a lot of copy), but this gets noticeably closer without hurting readability. */
/* padding uses 100vw instead of the more usual 50% so the navy-card breakout below can cancel
   it exactly — a child's own `%` padding/margin resolves against ITS containing block's content
   width (i.e. .about-bio's width MINUS this same padding), not this element's outer width, so
   the two "50% - 550px" expressions would silently compute to different pixel values even
   though they look identical (found this round via computed-style measurement, not assumed:
   the child's negative margin was only cancelling 84px of this rule's actual 150px). vw is
   always relative to the viewport regardless of nesting, so both sides now agree exactly. */
.about-bio { background: #fff; padding: clamp(2rem, 5vw, 3.5rem) max(6vw, calc((100vw - 1100px) / 2)); display: flex; flex-direction: column; gap: clamp(1.5rem, 3.5vw, 2.4rem); }
.about-bio p { font-family: var(--font-body); font-style: italic; color: var(--about-navy); font-size: clamp(14px, 1.5vw, 16px); line-height: 1.6; white-space: pre-line; max-width: 640px; }
.about-bio p.align-left { text-align: left; align-self: flex-start; }
.about-bio p.align-right { text-align: right; align-self: flex-end; }
.about-bio p strong { color: var(--about-orange); font-style: normal; font-weight: 700; }
/* first paragraph gets its own navy card behind it, per Canva — text switches to cream/white
   for contrast, its bold accent switches to the lighter --about-orange-on-navy pairing already
   used elsewhere (orange reads fine on navy site-wide).
   v21: was a single <p> capped at max-width:680px, sitting in a column with ~1100px of actual
   available width — left a large dead gap to its right that read as "too narrow", while its
   padding (clamp 1.6-2.4rem on every side, on top of a 680px cap forcing more line-wraps than
   necessary) made it look oversized for its own text. A single element can't have "background
   spans full width" AND "text stays a comfortable reading width" at the same time via padding
   alone — align-self:flex-start sizes a flex item to its own content, so a negative-margin
   breakout on the <p> itself only ever pulled its (content-sized) box to the left edge, not
   both edges (confirmed via computed-style measurement, not assumed). Split into a wrapper
   (full-bleed background, breaks out of .about-bio's own padding — same trick already used for
   the homepage's orange manifesto band) + the inner <p> (unchanged reading width). */
.about-bio .navy-card-wrap {
  background: var(--about-navy);
  margin-left: calc(-1 * max(6vw, calc((100vw - 1100px) / 2))); margin-right: calc(-1 * max(6vw, calc((100vw - 1100px) / 2)));
  padding: clamp(1.4rem, 3vw, 2rem) max(6vw, calc((100vw - 1100px) / 2));
}
.about-bio .navy-card-wrap p.navy-card {
  max-width: 680px; color: rgba(255,255,255,0.92);
}

/* ---------- PRINCIPLES BAND (orange, was .beliefs-section) ---------- */
.beliefs-section { background: var(--about-orange); padding: clamp(3.5rem, 8vw, 6rem) 6vw; }
.beliefs-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 2.2rem; }
.belief-num { font-family: var(--font-ui); font-size: 10px; color: rgba(255,255,255,0.85); display: block; margin-bottom: 0.6rem; letter-spacing: 0.06em; }
.belief-item h3 { font-size: 18px; color: #fff; margin-bottom: 0.5rem; }
.belief-item p { font-family: var(--font-body); color: rgba(255,255,255,0.9); font-size: 13px; }

/* ---------- COMMUNITY PIN MAP (Leaflet) ---------- */
.pin-map-section { background: #fff; padding: clamp(3rem, 7vw, 5rem) 6vw; text-align: center; }
.pin-map-section .section-label { color: var(--about-navy); }
.pin-map-section .map-headline { color: var(--about-navy); }
.pin-map-card {
  max-width: 900px; margin: 2rem auto 0; border-radius: 14px; overflow: hidden;
  border: 1px solid rgba(10,6,76,0.15); background: var(--about-navy); padding: 10px;
}
#readerPinMap { width: 100%; height: 420px; border-radius: 8px; background: var(--about-navy); }
/* dark-tint the OSM tiles to match the site's navy/olive aesthetic without a paid custom tile provider */
#readerPinMap .leaflet-tile-pane { filter: saturate(0.55) brightness(0.75) contrast(1.05) hue-rotate(180deg); }
.leaflet-popup-content-wrapper, .leaflet-popup-tip { background: var(--about-navy); color: #fff; }
.pin-map-actions { display: flex; flex-direction: column; align-items: center; gap: 0.7rem; margin-top: 1.4rem; }
.pin-map-hint { font-family: var(--font-ui); font-style: italic; font-size: 12px; color: var(--about-navy); opacity: 0.7; display: none; }
.pin-map-hint.show { display: block; }
.pin-map-count { font-family: var(--font-ui); font-size: 11px; letter-spacing: 0.08em; color: var(--about-navy); opacity: 0.6; margin-top: 0.6rem; }

/* =========================================================
   SHOP PAGE — v17: matches the current Canva file, except the purchase-flow panel
   (.shop-info/.shop-price/BUY button), which the brief explicitly flagged as an old
   screenshot of the site's previous design rather than a current-style mockup — redesigned
   that piece to the site's navy/orange language instead of copying it, everything else here
   follows Canva exactly.
   ========================================================= */
.shop-product { display: flex; flex-wrap: wrap; max-width: var(--max-width); margin: 0 auto; min-height: 400px; }
.shop-photo { flex: 1 1 50%; min-height: 400px; position: relative; overflow: hidden; }
/* redesigned purchase panel: cream card, navy text, orange price + pill button — consistent
   with the "Read this chapter" card on the homepage and the unlock button on the Uluwatu
   chapter, rather than the old dark-panel/wine-button look from the previous design */
.shop-info { flex: 1 1 50%; background: var(--about-navy); padding: clamp(2.5rem, 5vw, 50px) 40px; display: flex; flex-direction: column; gap: 0.8rem; justify-content: center; }
.shop-info .section-label { color: #ff801f; }
.shop-info h2 { font-size: 44px; color: #fff; }
.shop-info p.desc { font-family: var(--font-body); font-style: italic; font-size: 14px; color: rgba(255,255,255,0.75); }
.shop-price { font-family: var(--font-display); font-size: 56px; color: #ff801f; margin: 0.4rem 0; }
.shop-note { font-family: var(--font-ui); font-size: 10px; color: rgba(255,255,255,0.6); text-align: center; margin-top: 0.4rem; }
.shop-note.faint { color: rgba(255,255,255,0.4); }
.shop-info .btn-pill-shop {
  display: inline-block; text-align: center; background: #ff801f; color: #fff; border-radius: 999px;
  padding: 1em 1.8em; font-family: var(--font-ui); font-size: 0.85rem; font-weight: 600; letter-spacing: 0.03em;
  margin-top: 0.6rem; transition: background 0.3s var(--ease-out), transform 0.2s var(--ease-out);
}
.shop-info .btn-pill-shop:hover { background: #e56f10; transform: translateY(-2px); }

/* ---------- NEXT CHAPTERS — navy bg, orange star shapes (same clip-path recipe as the Uluwatu
   chapter's testimonial stars, reused for visual consistency) ---------- */
.upcoming-section { background: var(--about-navy); padding: clamp(3rem, 7vw, 5rem) 6vw; margin: 0; }
.upcoming-section .section-label { display: block; margin-bottom: 0.3rem; color: #ff801f; font-size: clamp(2.2rem, 6vw, 3.6rem); font-family: var(--font-display); text-transform: none; letter-spacing: 0; }
.upcoming-subtitle { display: block; font-family: var(--font-display); text-transform: uppercase; font-size: clamp(1.3rem, 3vw, 1.8rem); color: #ff801f; margin-bottom: clamp(2rem, 5vw, 3.5rem); }
.upcoming-grid { display: flex; flex-wrap: wrap; justify-content: center; gap: 20px; }
.upcoming-card {
  position: relative; flex: 0 0 320px; width: 320px; aspect-ratio: 1;
  background: #ff801f; color: #fff;
  clip-path: polygon(50% 0%, 61% 35%, 98% 35%, 68% 57%, 79% 91%, 50% 70%, 21% 91%, 32% 57%, 2% 35%, 39% 35%);
  display: flex; align-items: center; justify-content: center; text-align: center;
  opacity: 1; border: none; padding: 0;
}
.upcoming-card h3 { font-family: var(--font-display); font-size: 1.8rem; color: #fff; }
.upcoming-card p { font-family: var(--font-ui); font-size: 0.85rem; color: #fff; margin-top: 0.4rem; background: none; display: block; padding: 0; opacity: 0.85; }

/* =========================================================
   SCROLL REVEAL
   ========================================================= */
.reveal { opacity: 0; transform: translateY(24px); transition: opacity 0.9s var(--ease-out), transform 0.9s var(--ease-out); }
.reveal.in-view { opacity: 1; transform: translateY(0); }
.fade-up-delay-1.in-view { transition-delay: 0.12s; }
.fade-up-delay-2.in-view { transition-delay: 0.24s; }
.fade-up-delay-3.in-view { transition-delay: 0.36s; }

.letters { display: inline-block; overflow: hidden; }
.letters .letter { display: inline-block; opacity: 0; transform: translateY(0.5em); transition: opacity 0.5s var(--ease-out), transform 0.5s var(--ease-out); }
.letters.in-view .letter { opacity: 1; transform: translateY(0); }

/* =========================================================
   RESPONSIVE
   ========================================================= */
@media (max-width: 900px) {
  .testimonials-grid { flex-direction: column; align-items: center; }
  .testimonial-bubble { flex-basis: auto; width: 260px; }
  .testimonials-grid > .testimonial-bubble:nth-child(2) { margin-top: 0; }
  .tips-grid { grid-template-columns: repeat(2, 1fr); }
  .upcoming-grid { grid-template-columns: 1fr; }
}

@media (max-width: 768px) {
  .nav-right .nav-links, .nav-right .nav-shop, .nav-right .lang-switch { display: none; }
  .hamburger { display: flex; }

  .split, .sounds-inner, .local-section, .about-who, .shop-product { flex-direction: column; }
  .split-photo, .local-photo, .shop-photo, .sounds-photo { min-height: 300px; }
  .split-photo.w-42, .split-photo.w-45, .split-text.w-58, .split-text.w-55 { flex: 1 1 100%; }

  .chapter-card { position: static; flex-direction: column; }
  .chapter-photo, .chapter-info { flex: 1 1 100%; min-height: 320px; height: auto; }
  .latest-chapter { min-height: 0; }
  .latest-chapter .section-label.chapter-label-corner { position: static; display: block; padding: 2rem 6vw 0; }

  .places-grid, .beliefs-grid, .contact-grid, .tips-grid, .places-cards-v2 { grid-template-columns: 1fr; }

  /* about.html v15 — mobile */
  .about-bio p.align-left, .about-bio p.align-right { text-align: left; align-self: stretch; max-width: none; }
  .find-me-stars { flex-wrap: wrap; row-gap: 1rem; }
  .page-hero.page-hero-about { background-size: cover; }
  #readerPinMap { height: 320px; }

  /* Uluwatu v10 rebuild — mobile */
  .playlist-section-v2 { flex-direction: column; }
  .looks-photo-grid { grid-template-columns: 1fr; }
  .looks-photo-grid img { height: 40vh; }
  .senses-grid { grid-template-columns: 1fr; gap: 1.6rem; }
  .day-timeline { flex-direction: column; align-items: center; gap: 1.2rem; }
  .day-step-connector { display: none; }
  .ilham-bottom-grid { grid-template-columns: 1fr; }
  .ilham-bottom-bar { flex-direction: column; align-items: flex-start; margin: 2rem -6vw -3rem; }
  .copyplace-collage .cp-secondary { width: 48%; height: 40%; }
  .sunset-fullscreen .sunset-text { left: 5vw; right: 5vw; max-width: none; }

  .sun-split { flex-direction: column; }
  .sun-half { flex: 1 1 100%; min-height: 55vh; }

  .footer-main { flex-direction: column; align-items: flex-start; text-align: left; }
  .track-row { grid-template-columns: 2rem 1fr; }
  .track-link { grid-row: auto; grid-column: 1 / -1; justify-self: start; margin-top: 0.5rem; }

  .map-wrap { display: none; }
  .map-mobile-list { display: block; }

  .weather-widget { position: static; margin: 1.5rem auto 0; width: fit-content; text-align: center; }

  .paywall-card { margin-top: -40px; padding: 40px 24px; }

  .floral-layer { filter: blur(10px); }

  /* v6 homepage rebuild — mobile */
  .testimonials-grid > .testimonial-card:nth-child(2) { margin-top: 0; }
  .flower-decoration { display: none !important; }
  .contact-form-card { padding: 32px 24px; }
}

/* =========================================================
   PRINT
   ========================================================= */
@media print {
  .site-nav, .site-footer, .hamburger, .mobile-menu, .sun-half canvas, .scroll-indicator,
  .film-grain::after, .floral-layer, .weather-widget, .video-section video, .map-wrap { display: none !important; }
  body { background: #fff; color: #000; }
  * { animation: none !important; transition: none !important; }
  .photo-slot, .chapter-photo, .place-card-photo { filter: none; background: #eee !important; color: #000; }
  .photo-fill { filter: none; }
  .locked-content { filter: none !important; opacity: 1 !important; }
  section { break-inside: avoid; }
}

/* =========================================================
   ULUWATU REDESIGN (v11) — scoped entirely under body.ulu-redesign
   so none of it can ever touch index/about/shop. New page-local
   custom properties live on the body selector itself (CSS vars
   cascade to every descendant), and every rule below is nested
   under that one ancestor class. Bare class names are reused on
   purpose (.section-label, .widget-section, .btn, .paywall-card,
   .locked-content …) for elements that ARE the site's shared
   components — the body scope keeps the redecoration local to
   this page without forking the components themselves.
   ========================================================= */
body.ulu-redesign {
  --u-cream:   #f9ffd7;
  --u-cream-2: #feffdc;
  --u-cream-3: #feffdd;
  --u-navy:    #1f1347;
  --u-cyan:    #aef4f7;
  --u-olive:   #6d682c;
  --u-gold:    #eddd70;
  --u-mustard: #c7b326;
  --u-pblue:   #d1eaec;
  --u-tan:     #c9a87e;
  --u-teal:    #77c0c3;
  --u-sage:    #d9e394;
  --u-red:     #ad1b45;

  background: var(--u-navy);
  color: var(--u-cream);
}

body.ulu-redesign .logo { cursor: pointer; }

body.ulu-redesign h1, body.ulu-redesign h2, body.ulu-redesign h3 { text-transform: uppercase; }

body.ulu-redesign .u-section { padding: clamp(4rem, 8vw, 7rem) 6vw; position: relative; }
body.ulu-redesign .u-narrow { max-width: 820px; margin: 0 auto; }
body.ulu-redesign .u-center { text-align: center; }

/* Fix #0B, consolidated: every "full-bleed background photo" section on this page now shares
   ONE rule instead of each section re-deriving its own sizing. The failure mode being fixed was
   never actually a broken .photo-fill rule (that pattern — position:absolute; inset:0; width/
   height:100%; object-fit:cover — is correct and proven on the hero) — it's any section that
   forgets to give its OWN wrapper an explicit height + position:relative + overflow:hidden,
   which leaves the absolutely-positioned photo with nothing to size itself against. Apply
   .u-photo-bleed to the <section> and it's guaranteed correct regardless of what's inside. */
body.ulu-redesign .u-photo-bleed { position: relative; width: 100%; overflow: hidden; }
body.ulu-redesign .u-photo-bleed > .photo-fill { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }

body.ulu-redesign .section-label { color: var(--u-cyan); }
body.ulu-redesign .rule { background: var(--u-cyan); }

/* ---------- BUTTONS (reusing .btn, restyled) ---------- */
body.ulu-redesign .btn.u-btn-cyan { background: var(--u-cyan); color: var(--u-navy); border-radius: 3px; font-weight: 600; }
body.ulu-redesign .btn.u-btn-cyan:hover { background: var(--u-gold); }
body.ulu-redesign .btn.u-btn-outline { border-color: var(--u-cyan); color: var(--u-cyan); }
body.ulu-redesign .btn.u-btn-outline:hover { background: var(--u-cyan); color: var(--u-navy); }

/* ---------- 1. COVER ---------- */
body.ulu-redesign .u-cover {
  position: relative; min-height: 100vh; display: flex; flex-direction: column; justify-content: center;
  gap: 1.6rem; padding: calc(var(--nav-height) + 2rem) 6vw 3rem;
}
body.ulu-redesign .u-cover-line {
  font-family: var(--font-display); line-height: 1.02;
  font-size: clamp(2.4rem, 7vw, 5rem);
}
/* RU runs wider than the EN original at the same font-size — Rubik Mono One (the RU display
   font) is wider per character than Anton, and the RU words themselves ("ЗАГУГЛИТЬ") are longer
   than their EN equivalents ("GOOGLE") — together that was overflowing the viewport. Scaled
   down to visually match the EN version's proportions instead of literally sharing its size. */
[data-lang="ru"] body.ulu-redesign .u-cover-line {
  font-size: clamp(1.6rem, 5vw, 3.2rem);
}
body.ulu-redesign .u-cover-line.dim { color: rgba(249,255,215,0.35); }
body.ulu-redesign .u-cover-sub {
  font-family: var(--font-body); font-style: italic; font-size: clamp(14px, 1.6vw, 18px);
  color: var(--u-cream); max-width: 620px; margin-top: 0.4rem;
}
/* Fix #0A: this badge was `position: fixed`, so it rode along on top of every section as the
   page scrolled and collided with whatever heading happened to be underneath it. Simplest
   correct fix (per the brief): show it ONLY on the cover — `position: absolute` anchored to
   `.u-cover` (which is now `position: relative` above), so it physically cannot exist outside
   that one section's box, fixed or otherwise. */
body.ulu-redesign .u-status-bar {
  position: absolute; top: calc(var(--nav-height) + 14px); left: 6vw; z-index: 5;
  display: inline-flex; flex-wrap: wrap; gap: 0.3rem 0.5rem; align-items: center; max-width: 46vw;
  font-family: var(--font-ui); font-size: 9.5px; letter-spacing: 0.06em; color: var(--u-cyan);
  border: 1px solid rgba(174,244,247,0.35); border-radius: 20px; padding: 0.5em 0.9em;
  background: rgba(31,19,71,0.55); backdrop-filter: blur(4px);
}
body.ulu-redesign .u-status-bar b { color: var(--u-cream); font-weight: 600; }
body.ulu-redesign .u-enter-btn { margin-top: 1rem; }

/* ---------- 2. CLOSE YOUR EYES (video + audio) ---------- */
body.ulu-redesign .u-video-section {
  position: relative; min-height: 100vh; display: flex; align-items: center; justify-content: center;
  overflow: hidden; text-align: center;
}
body.ulu-redesign .u-video-section video {
  position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; filter: brightness(0.55) saturate(0.9);
}
body.ulu-redesign .u-video-content { position: relative; z-index: 1; max-width: 560px; padding: 2rem; }
body.ulu-redesign .u-video-content .section-label { display: block; margin-bottom: 0.6rem; }
body.ulu-redesign .u-video-content h2 { font-size: clamp(1.8rem, 4vw, 2.6rem); color: #fff; margin-bottom: 2rem; }
body.ulu-redesign .u-audio-btn {
  width: 84px; height: 84px; border-radius: 50%; border: 1.5px solid var(--u-cyan);
  display: flex; align-items: center; justify-content: center; margin: 0 auto 1.6rem;
  color: var(--u-cyan); font-size: 1.6rem; transition: background 0.25s var(--ease-out), color 0.25s var(--ease-out);
  background: rgba(174,244,247,0.06);
}
body.ulu-redesign .u-audio-btn:hover { background: var(--u-cyan); color: var(--u-navy); }
body.ulu-redesign .u-audio-btn .icon-pause { display: none; }
body.ulu-redesign .u-audio-btn.playing .icon-play { display: none; }
body.ulu-redesign .u-audio-btn.playing .icon-pause { display: inline; }
body.ulu-redesign .u-word-scatter {
  font-family: var(--font-ui); font-size: 12px; letter-spacing: 0.1em; color: rgba(255,255,255,0.7);
  line-height: 2.2;
}

/* ---------- 3. NOW OPEN YOUR EYES — shrunk to fit content, no forced viewport height ---------- */
body.ulu-redesign .u-transition-line {
  display: flex; align-items: center; justify-content: center; text-align: center;
  padding: clamp(2.2rem, 5vw, 3.5rem) 6vw;
}
body.ulu-redesign .u-transition-line h2 { font-size: clamp(1.6rem, 3.6vw, 2.4rem); max-width: 760px; margin: 0 auto; }

/* ---------- 4. MEET ILHAM — one section, 50/50 split (not photo-left/text-right stacked above a grid) ---------- */
body.ulu-redesign .u-ilham-split { display: flex; min-height: 100vh; }
body.ulu-redesign .u-ilham-left {
  flex: 1 1 50%; position: relative; overflow: hidden; background: var(--u-navy);
  min-height: 480px;
}
/* v20: the photo + CSS-positioned label/card/quote overlay is gone — this is now one
   pre-composed image with the text already baked in (see the HTML comment above this section).
   This column's height is forced to match .u-ilham-right (min-height:100vh split evenly, flex
   default align-items:stretch) regardless of the image's own aspect ratio, so object-fit:cover
   was cropping it — how much, and on which edge, depends on the exact viewport shape (confirmed
   via measurement: at one viewport it's a few px off the sides, at others enough to cut into
   "MEET A LOCAL PERSON" baked into the top of the image, per the brief's report). Switched to
   object-fit:contain, which guarantees zero cropping at any viewport — the tradeoff is a bit of
   letterboxing on whichever edge doesn't match, filled with the same navy as the column beside
   it (was cream) so it reads as an intentional dark margin, not empty space. */
body.ulu-redesign .u-ilham-left img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: contain; }
/* the follow link now lives in its own line after "Who will immediately get Uluwatu?" instead
   of sitting on top of the photo — cream-2 background continues that section's color with no
   visible seam, rather than exposing the page's own navy background in the gap. */
body.ulu-redesign .u-ig-follow-line { background: var(--u-cream-2); text-align: center; padding: 1.4rem 6vw; }
body.ulu-redesign .u-ig-follow {
  font-family: var(--font-ui); font-size: 11.5px; letter-spacing: 0.06em; color: var(--u-navy);
  text-decoration: underline;
}
body.ulu-redesign .u-ig-follow:hover { color: var(--u-red); }

body.ulu-redesign .u-ilham-right { flex: 1 1 50%; background: var(--u-navy); padding: clamp(1.6rem, 3vw, 2.6rem); display: flex; flex-direction: column; }
body.ulu-redesign .u-day-label { display: block; margin-bottom: 1.2rem; color: var(--u-cream); }
body.ulu-redesign .u-day-strip { flex: 1; display: grid; grid-template-columns: repeat(2, 1fr); grid-template-rows: repeat(3, 1fr); gap: 0.7rem; }
body.ulu-redesign .u-day-tile { position: relative; border-radius: 3px; overflow: hidden; min-height: 110px; cursor: pointer; }
body.ulu-redesign .u-day-tile img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; filter: contrast(1.08) saturate(0.92); }
body.ulu-redesign .u-day-tile::after { content: ''; position: absolute; inset: 0; background: linear-gradient(to top, rgba(10,6,26,0.85) 0%, rgba(10,6,26,0.05) 55%); }
body.ulu-redesign .u-day-tile-text { position: absolute; left: 0; right: 0; bottom: 0; z-index: 1; padding: 0.7em 0.8em; opacity: 0; transition: opacity 0.4s var(--ease-out); }
body.ulu-redesign .u-day-tile.is-revealed .u-day-tile-text { opacity: 1; }
body.ulu-redesign .u-day-tile-num { display: block; font-family: var(--font-ui); font-size: 9px; color: var(--u-gold); letter-spacing: 0.1em; }
body.ulu-redesign .u-day-tile-action { display: block; font-family: var(--font-display); font-size: 16px; color: #fff; text-transform: uppercase; }
body.ulu-redesign .u-day-tile-sub { display: block; font-family: var(--font-body); font-style: italic; font-size: 10px; color: var(--u-cyan); }

/* Puzzle-piece reveal: a solid navy cover with just a big number sits on top of the photo until
   clicked, then crossfades away independently per tile, in any order. */
body.ulu-redesign .u-day-tile-cover {
  position: absolute; inset: 0; z-index: 2; background: var(--u-navy);
  display: flex; align-items: center; justify-content: center;
  transition: opacity 0.45s var(--ease-out); opacity: 1;
}
body.ulu-redesign .u-day-tile-cover span { font-family: var(--font-display); font-size: clamp(1.6rem, 3vw, 2.2rem); color: var(--u-cyan); }
body.ulu-redesign .u-day-tile.is-revealed .u-day-tile-cover { opacity: 0; pointer-events: none; }

/* ---------- 5. ULUWATU THROUGH HIS SENSES — navy blob column + stacked full-bleed photos ---------- */
body.ulu-redesign .u-senses-split { display: flex; min-height: 100vh; }
body.ulu-redesign .u-senses-left {
  flex: 1 1 50%; background: var(--u-navy); position: relative; overflow: hidden;
  padding: clamp(2rem, 4vw, 3.2rem); min-height: 480px;
  display: flex; flex-direction: column; justify-content: center; gap: clamp(1.8rem, 4vh, 3rem);
}
body.ulu-redesign .u-senses-left > h2 {
  text-align: left; color: var(--u-cream); font-size: clamp(2rem, 3.8vw, 2.8rem);
  margin-bottom: clamp(0.5rem, 2vh, 1rem);
}
/* Clean evenly-spaced vertical stack — colors are the only thing that has to stay pinned to
   meaning (cyan=smells, pale-blue=sounds, cream=looks); layout itself is free to be simple.
   Font sizes bumped up across the board — this section read noticeably smaller than the rest
   of the page. */
body.ulu-redesign .u-sense-blob-row { display: flex; align-items: center; gap: 1.6rem; }
body.ulu-redesign .u-sense-blob-label { flex-shrink: 0; width: 6.5rem; font-family: var(--font-ui); font-size: 15px; letter-spacing: 0.08em; color: var(--u-cream); }
body.ulu-redesign .u-sense-blob {
  border-radius: 18px; flex: 1; min-height: 6.5rem;
  display: flex; align-items: center; padding: 1.4rem 1.8rem;
}
body.ulu-redesign .u-sense-blob p { font-family: var(--font-body); font-size: 18px; color: var(--u-navy); line-height: 1.4; }
body.ulu-redesign .u-sense-blob.cyan { background: var(--u-cyan); }
body.ulu-redesign .u-sense-blob.pblue { background: var(--u-pblue); }
body.ulu-redesign .u-sense-blob.cream { background: var(--u-cream); border: 1px solid rgba(31,19,71,0.15); }

body.ulu-redesign .u-senses-right { flex: 1 1 50%; display: flex; flex-direction: column; }
body.ulu-redesign .u-senses-right > div { position: relative; flex: 1; min-height: 33.33vh; overflow: hidden; }
/* object-position pulled down toward the bottom of the frame for the top/bottom photos — both
   are tall portrait shots with their subject low in the frame. The middle photo (aerial surf
   shot) has its subject roughly centered, so it gets plain center-center instead — previously
   all three shared one bottom-weighted value, which was cutting the middle photo's subject out. */
body.ulu-redesign .u-senses-right img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; object-position: center 82%; filter: contrast(1.08) saturate(0.9); }
body.ulu-redesign .u-senses-right > div:nth-child(2) img { object-position: center center; }

/* ---------- 6. WHO WILL GET IT — text left, full-height photo right, cream bg
   (min-height matches the senses/ilham sections right above/below it — was 60vh, which read as
   a sudden size drop right after two 100vh sections) ---------- */
/* .u-get-text/.u-get-photo now both flex:1 1 50%, exactly matching .u-senses-left/.u-senses-right
   above — they were 420px/360px bases, which drift to different actual widths than a straight
   50/50 split at most viewport widths, producing a visible seam where the photo column narrows
   right at the section boundary. 50/50 on both sides of that boundary makes it seamless. */
body.ulu-redesign .u-get-split { display: flex; flex-wrap: wrap; min-height: 100vh; background: var(--u-cream-2); }
body.ulu-redesign .u-get-text {
  flex: 1 1 50%; display: flex; flex-direction: column; justify-content: center;
  padding: clamp(2.5rem, 5vw, 4rem) clamp(6vw, 8vw, 6vw) clamp(2.5rem, 5vw, 4rem) 8vw;
}
body.ulu-redesign .u-get-text h2 { color: var(--u-navy); font-size: clamp(1.6rem, 3.4vw, 2.3rem); margin-bottom: 1.2rem; }
body.ulu-redesign .u-get-text p { font-family: var(--font-body); font-style: italic; font-size: clamp(1rem, 1.8vw, 1.25rem); color: #1f1347; max-width: 520px; }
body.ulu-redesign .u-get-photo { flex: 1 1 50%; position: relative; overflow: hidden; min-height: 480px; }
body.ulu-redesign .u-get-photo img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; filter: contrast(1.05) saturate(0.85); }

/* ---------- 7. ONE PLACE. MANY TRUTHS — 3 full-width navy bands on the cream page bg ---------- */
body.ulu-redesign .u-truths-section { background: var(--u-cream); padding: clamp(3rem, 6vw, 5rem) 0; }
body.ulu-redesign .u-truths-heading { padding: 0 6vw; margin-bottom: 2rem; color: var(--u-navy); }
body.ulu-redesign .u-truths-heading .section-label { color: var(--u-red); }
body.ulu-redesign .u-truths-heading h2 { font-size: clamp(1.6rem, 3.4vw, 2.3rem); margin-top: 0.3rem; }
body.ulu-redesign .u-truths-bands { display: flex; flex-direction: column; }
body.ulu-redesign .u-truths-band {
  background: var(--u-navy); display: flex; align-items: center; gap: clamp(1.2rem, 3vw, 2.5rem);
  padding: clamp(1.2rem, 2.5vw, 1.8rem) 6vw; border-bottom: 1px solid rgba(174,244,247,0.12);
}
body.ulu-redesign .u-truths-band-photo { flex-shrink: 0; width: clamp(80px, 9vw, 120px); height: clamp(80px, 9vw, 120px); border-radius: 4px; overflow: hidden; }
body.ulu-redesign .u-truths-band-photo img { width: 100%; height: 100%; object-fit: cover; filter: contrast(1.08) saturate(0.9); }
body.ulu-redesign .u-truths-band-body { max-width: 560px; }
body.ulu-redesign .u-truths-band-body h4 { color: var(--u-gold); font-size: 1.1rem; margin-bottom: 0.6rem; }
body.ulu-redesign .u-truths-band-body ul { display: flex; flex-direction: column; gap: 0.35rem; font-family: var(--font-body); font-size: 14px; color: var(--u-cream-2); }
body.ulu-redesign .u-truths-band-body ul li { padding-left: 1rem; position: relative; }
body.ulu-redesign .u-truths-band-body ul li::before { content: '—'; position: absolute; left: 0; color: var(--u-cyan); }

/* ---------- 8. YOU'VE SEEN ONE TEMPERATURE — the paywall gate, its own section
   *** THIS SECTION MUST NEVER BE DELETED IN A FUTURE REWRITE OF THIS PAGE — it has been
   accidentally dropped twice already. See PROJECT_LOG.md. *** ---------- */
body.ulu-redesign .u-gate-section { position: relative; overflow: hidden; display: flex; flex-wrap: wrap; min-height: 70vh; }
body.ulu-redesign .u-gate-section > .photo-fill { z-index: 0; }
body.ulu-redesign .u-gate-tint { position: absolute; inset: 0; z-index: 1; background: rgba(199,179,38,0.88); }
body.ulu-redesign .u-gate-left, body.ulu-redesign .u-gate-right { position: relative; z-index: 2; }
/* display:flex column added so .u-gate-testimonial can be pushed to the bottom of this column
   with margin-top:auto below, instead of sitting directly under "Instant access..." with only
   a small fixed gap */
body.ulu-redesign .u-gate-left { flex: 1 1 420px; display: flex; flex-direction: column; padding: clamp(2.5rem, 5vw, 4rem) clamp(2rem, 4vw, 3rem); }
body.ulu-redesign .u-gate-left .section-label { color: var(--u-navy); }
body.ulu-redesign .u-gate-left h2 { color: var(--u-navy); font-size: clamp(1.8rem, 3.6vw, 2.6rem); margin: 0.4rem 0 1rem; }
body.ulu-redesign .u-gate-left p.u-gate-copy { font-family: var(--font-body); font-size: 15px; color: #241a08; max-width: 480px; margin-bottom: 1.6rem; }
body.ulu-redesign .u-pay-btn { display: inline-block; text-align: center; border-radius: 30px; padding: 1em 2em; font-family: var(--font-ui); font-size: 13px; letter-spacing: 0.06em; }
body.ulu-redesign .u-pay-btn.gumroad { background: var(--u-navy); color: var(--u-cream); font-weight: 600; }
body.ulu-redesign .u-pay-btn.gumroad:hover { background: #2c1c66; }
body.ulu-redesign .u-pay-btn.tbank { border: 1.5px solid var(--u-navy); color: var(--u-navy); }
body.ulu-redesign .u-pay-btn.tbank:hover { background: rgba(31,19,71,0.08); }
body.ulu-redesign .paywall-via { font-family: var(--font-ui); font-size: 10px; color: #241a08; opacity: 0.6; margin-top: 0.6rem; }
/* margin-top:auto pushes this to the bottom of the (now flex-column) .u-gate-left, per the
   brief — it used to just follow directly under "Instant access..." with a small 1.2rem gap,
   reading as crammed together instead of a separate block near the bottom of the section. */
body.ulu-redesign .u-gate-testimonial { font-family: var(--font-body); font-style: italic; font-size: 13px; color: #241a08; max-width: 440px; margin-top: auto; padding-top: clamp(2rem, 6vw, 3.5rem); line-height: 1.6; }
/* justify-content:space-between (was center) pushes the TOC list to the top and
   .u-gate-countries to the bottom, same reasoning as .u-gate-left above — its own
   border-top/padding-top divider still applies on top of whatever gap space-between leaves. */
body.ulu-redesign .u-gate-right {
  flex: 1 1 300px; background: rgba(31,19,71,0.1); display: flex; flex-direction: column;
  justify-content: space-between; gap: 1.1rem; padding: clamp(2.5rem, 5vw, 4rem) clamp(2rem, 4vw, 3rem);
}
body.ulu-redesign .u-gate-right span { font-family: var(--font-ui); font-size: 12.5px; letter-spacing: 0.08em; color: var(--u-navy); border-top: 1px solid rgba(31,19,71,0.25); padding-top: 1.1rem; }
body.ulu-redesign .u-gate-right span:first-child { border-top: none; padding-top: 0; }
body.ulu-redesign .u-gate-countries { border-top: 1px solid rgba(31,19,71,0.25); padding-top: 1.1rem; display: flex; flex-direction: column; gap: 0.5rem; }
body.ulu-redesign .u-gate-countries span { border-top: none; padding-top: 0; }
body.ulu-redesign .u-gate-flags { font-size: 15px; letter-spacing: 0.15em; }

/* Payment modal — opened by the single "$5" button, holds both payment choices + access code */
body.ulu-redesign .u-gate-modal {
  display: none; position: fixed; inset: 0; z-index: 2000; align-items: center; justify-content: center;
  background: rgba(10,6,26,0.75); padding: 1.5rem;
}
body.ulu-redesign .u-gate-modal.is-open { display: flex; }
body.ulu-redesign .u-gate-modal-panel {
  background: var(--u-cream); color: var(--u-navy); border-radius: 8px; max-width: 420px; width: 100%;
  padding: clamp(1.8rem, 4vw, 2.6rem); position: relative; text-align: center;
}
body.ulu-redesign .u-gate-modal-close {
  position: absolute; top: 0.9rem; right: 1rem; font-size: 1.3rem; color: var(--u-navy); line-height: 1;
}
body.ulu-redesign .u-gate-modal-panel h3 { font-size: 1.4rem; margin-bottom: 1.4rem; }
body.ulu-redesign .u-gate-modal-panel .u-pay-btn { display: block; width: 100%; margin-bottom: 0.8rem; }
body.ulu-redesign .u-gate-modal-panel .password-toggle { display: inline-block; margin-top: 1rem; color: var(--u-navy); opacity: 0.7; }
body.ulu-redesign .u-gate-modal-panel .password-toggle:hover { opacity: 1; }
body.ulu-redesign .u-gate-modal-panel .password-form { margin-top: 0.8rem; justify-content: center; }
body.ulu-redesign .u-gate-modal-panel .password-form.show { display: flex; }
body.ulu-redesign .u-gate-modal-panel .password-input { background: rgba(31,19,71,0.06); border: 1px solid var(--u-navy); color: var(--u-navy); }
body.ulu-redesign .u-gate-modal-panel .password-error { color: var(--u-red); }
body.ulu-redesign .u-gate-modal-panel .btn.widget-btn { background: var(--u-navy); color: var(--u-cream); border-radius: 3px; font-weight: 600; }
body.ulu-redesign .u-gate-modal-panel .btn.widget-btn:hover { background: #2c1c66; }

body.ulu-redesign .locked-content { filter: blur(18px); opacity: 0.18; }
/* extra solid scrim on top of the blur, for insurance against any high-contrast edge that
   survives the blur alone (a photo horizon line, a bold headline stroke) — belt and suspenders,
   since "genuinely illegible" was the explicit ask, not just "softer than before". */
body.ulu-redesign .locked-content::after {
  content: ''; position: absolute; inset: 0; z-index: 3; pointer-events: none;
  background: rgba(31,19,71,0.55);
}
body.ulu-redesign.unlocked .locked-content { filter: none; opacity: 1; }
body.ulu-redesign.unlocked .locked-content::after { display: none; }
body.ulu-redesign.unlocked .u-gate-section { display: none; }

/* floating "still locked" badge — see the HTML comment next to #lockBadge for why this is one
   fixed-position element instead of a per-section label. Shown/hidden by initPaywall() via the
   .show class, in lockstep with the same unlock state everything else here uses. */
.u-lock-badge {
  display: none; position: fixed; left: 50%; bottom: 1.6rem; transform: translateX(-50%);
  z-index: 900; background: var(--u-navy, #1f1347); color: #fff; border-radius: 999px;
  padding: 0.8em 1.4em; font-family: var(--font-ui); font-size: 0.78rem; letter-spacing: 0.04em;
  box-shadow: 0 6px 20px rgba(10,6,26,0.35); pointer-events: none; white-space: nowrap;
}
.u-lock-badge.show { display: block; }
@media (max-width: 600px) {
  .u-lock-badge { white-space: normal; text-align: center; width: calc(100% - 3.2rem); font-size: 0.72rem; }
}

/* ---------- 9. TWO PLACES ---------- */
body.ulu-redesign .u-places-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 2rem; }
body.ulu-redesign .u-place-card img { width: 100%; height: 300px; object-fit: cover; border-radius: 4px; filter: contrast(1.05) saturate(0.92); }
body.ulu-redesign .u-place-card h4 { color: var(--u-gold); font-size: 1.3rem; margin: 1rem 0 0.5rem; }
body.ulu-redesign .u-place-card p { font-family: var(--font-body); font-size: 14.5px; color: var(--u-cream-2); }

/* ---------- 10. QUOTE STRIP — now a single pre-composed image (text baked in), just needs a
   height — no more overlay text rule, .u-quote-strip p is gone from the HTML. ---------- */
/* aspect-ratio instead of a viewport-relative height: a fixed vh height doesn't match the
   pre-composed image's own proportions at every viewport shape, and object-fit:cover crops
   whatever doesn't match — confirmed via screenshot that this was slicing a few pixels off the
   very top of "SUNSET" on the sunset section below. The three replaced full-bleed images (quote,
   sunset, transition/moments) were all exported at the same ~1.787:1 ratio, so matching the
   container to that exactly means zero cropping at any viewport width, not just this one. */
body.ulu-redesign .u-quote-strip { aspect-ratio: 1434 / 802; height: auto; }

/* ---------- 17. TRANSITION PHOTO — now a single pre-composed image, same aspect-ratio approach ---------- */
body.ulu-redesign .u-transition-photo { aspect-ratio: 1442 / 806; height: auto; }

/* ---------- 11. HOW IT SOUNDS / PLAYLIST — Spotify embed, replaces Yandex QR + track list ---------- */
body.ulu-redesign .u-playlist { display: flex; flex-wrap: wrap; gap: 3rem; align-items: center; }
body.ulu-redesign .u-playlist-left { flex: 1 1 280px; }
body.ulu-redesign .u-playlist-left h2 { font-size: clamp(1.8rem, 4vw, 2.6rem); margin: 0.5rem 0 0.8rem; color: var(--u-cyan); }
body.ulu-redesign .u-playlist-left p.italic { font-family: var(--font-body); font-style: italic; font-size: 14px; color: var(--u-cream-2); margin-bottom: 1.6rem; }
body.ulu-redesign .u-qr-box { display: inline-block; padding: 8px; background: #fff; border-radius: 4px; }
body.ulu-redesign .u-qr-box img { display: block; border-radius: 2px; }
body.ulu-redesign .u-qr-caption { font-family: var(--font-ui); font-size: 10px; color: var(--u-gold); margin-top: 0.6rem; letter-spacing: 0.06em; }
body.ulu-redesign .u-playlist-right { flex: 1 1 320px; min-width: 280px; }
body.ulu-redesign .u-playlist-right iframe { width: 100%; display: block; border-radius: 16px; }

/* ---------- 12. HOW IT SMELLS — expand-in-place cards ---------- */
/* "HOW IT SMELLS LIKE" / "HOW IT LOOKS" are meant to be key visual anchors, not blend in at the
   normal small-caps .section-label size — bumped to a real display headline just for these two. */
body.ulu-redesign .u-key-label {
  display: block; font-family: var(--font-display); text-transform: uppercase;
  font-size: clamp(2rem, 5.5vw, 3.4rem); letter-spacing: 0; color: var(--u-cyan); margin-bottom: 0.8rem;
}
body.ulu-redesign .u-smells-intro { font-family: var(--font-body); font-style: italic; font-size: 14px; color: var(--u-cream-2); max-width: 640px; margin: 0.8rem auto 2.6rem; text-align: center; }
body.ulu-redesign .u-smell-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 1.4rem; }
body.ulu-redesign .u-smell-card { border: 1.5px solid var(--u-red); border-radius: 6px; padding: 1.6rem 1.8rem; cursor: pointer; color: var(--u-navy); transition: transform 0.2s var(--ease-out); }
body.ulu-redesign .u-smell-card:hover { transform: translateY(-2px); }
body.ulu-redesign .u-smell-card.zinc { background: var(--u-pblue); }
body.ulu-redesign .u-smell-card.coffee { background: var(--u-tan); }
body.ulu-redesign .u-smell-card.ocean { background: var(--u-teal); }
body.ulu-redesign .u-smell-card.freedom { background: var(--u-sage); }
body.ulu-redesign .u-smell-name { font-family: var(--font-display); font-size: 1.7rem; display: block; }
body.ulu-redesign .u-smell-tag { font-family: var(--font-ui); font-size: 10px; letter-spacing: 0.1em; opacity: 0.7; display: block; margin-bottom: 0.4rem; }
body.ulu-redesign .u-smell-caption { font-family: var(--font-body); font-size: 14.5px; margin-top: 0.5rem; }
body.ulu-redesign .u-smell-detail { display: grid; grid-template-rows: 0fr; opacity: 0; transition: grid-template-rows 0.35s var(--ease-out), opacity 0.3s var(--ease-out); margin-top: 0; }
body.ulu-redesign .u-smell-detail-inner { overflow: hidden; }
body.ulu-redesign .u-smell-card.is-expanded .u-smell-detail { grid-template-rows: 1fr; opacity: 1; margin-top: 0.9rem; }
body.ulu-redesign .u-smell-detail p { font-family: var(--font-body); font-size: 13.5px; line-height: 1.7; padding-top: 0.7rem; border-top: 1px solid rgba(31,19,71,0.2); }
body.ulu-redesign .u-smell-more { display: inline-block; margin-top: 0.6rem; font-family: var(--font-ui); font-size: 11px; letter-spacing: 0.06em; text-decoration: underline; }
body.ulu-redesign .u-smell-toggle { font-family: var(--font-ui); font-size: 11px; letter-spacing: 0.08em; opacity: 0.6; }
body.ulu-redesign .u-hear-ocean-btn { margin-top: 0.7rem; background: var(--u-navy); color: #fff; border-radius: 3px; padding: 0.6em 1.1em; font-size: 11px; }
body.ulu-redesign .u-hear-ocean-btn:hover { background: rgba(31,19,71,0.8); }
body.ulu-redesign .u-smell-route { display: block; margin-top: 0.7rem; font-family: var(--font-ui); font-size: 10.5px; letter-spacing: 0.04em; }

/* ---------- 14. HOW IT LOOKS — left-aligned heading, rounded photos with visible gaps, normal margins ---------- */
/* margin-bottom added — this grid sat flush against SUNSET right after it with zero gap */
body.ulu-redesign .u-looks-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; margin: 2.6rem 0 clamp(2.5rem, 6vw, 4rem); padding: 0 6vw; }
body.ulu-redesign .u-looks-grid img { width: 100%; height: 48vh; object-fit: cover; border-radius: 8px; filter: contrast(1.06) saturate(0.9) sepia(0.04); }
/* Each source photo is a tall portrait shot cropped into a short landscape cell — default
   center-center was cutting off the actual subject in all three; tuned per-photo instead. */
body.ulu-redesign .u-looks-grid img:nth-child(1) { object-position: center 22%; }
body.ulu-redesign .u-looks-grid img:nth-child(2) { object-position: center 55%; }
body.ulu-redesign .u-looks-grid img:nth-child(3) { object-position: center 90%; }

/* ---------- 15. SUNSET — now a single pre-composed image (headline baked in, own color grading
   already done in Canva) — dropped the contrast/saturate filter and the darkening gradient that
   were there to make CSS text legible over a raw photo; neither is needed or wanted on a
   finished composition. Just needs a height. ---------- */
body.ulu-redesign .u-sunset-full { aspect-ratio: 1436 / 804; height: auto; }

/* ---------- 16. IF YOU GO — expand-in-place circles ---------- */
body.ulu-redesign .u-go-layout { display: flex; flex-wrap: wrap; gap: 2.5rem; align-items: flex-start; }
body.ulu-redesign .u-go-photo { flex: 1 1 320px; }
body.ulu-redesign .u-go-photo img { width: 100%; height: 100%; min-height: 340px; object-fit: cover; border-radius: 4px; filter: contrast(1.06) saturate(0.9); }
body.ulu-redesign .u-go-grid { flex: 2 1 480px; display: grid; grid-template-columns: repeat(3, 1fr); gap: 1.2rem; }
/* plain pale-yellow circles, no border, no emoji — the previous navy+red-border+emoji look
   read as generic rather than intentional; this matches the site's actual design language
   (same --u-cream used on the Ilham cards and the two reader widgets above). Click-to-expand
   behavior is unchanged, only the visual style. */
body.ulu-redesign .u-go-circle {
  border-radius: 50%; aspect-ratio: 1; display: flex; flex-direction: column;
  align-items: center; justify-content: center; text-align: center; padding: 1rem; cursor: pointer;
  background: var(--u-cream); transition: background 0.2s var(--ease-out);
}
body.ulu-redesign .u-go-circle:hover { background: #fff; }
body.ulu-redesign .u-go-title { font-family: var(--font-ui); font-size: 11px; letter-spacing: 0.05em; color: var(--u-navy); font-weight: 600; }
body.ulu-redesign .u-go-detail { display: none; font-family: var(--font-body); font-size: 11.5px; color: var(--u-navy); opacity: 0.8; margin-top: 0.4rem; line-height: 1.4; }
body.ulu-redesign .u-go-circle.is-expanded .u-go-detail { display: block; }
body.ulu-redesign .u-go-circle.is-expanded { border-radius: 16px; aspect-ratio: auto; }

/* ---------- 18. AUTHOR'S COLUMN — quote only, flanked left/right by two full-height photos ---------- */
/* Photos enlarged, text column capped with a hard max-width (not just a flex ratio, which
   doesn't stop the line length growing on very wide screens) for a comfortable reading measure. */
body.ulu-redesign .u-author-columns { display: flex; align-items: stretch; justify-content: center; gap: clamp(1.2rem, 3vw, 2.4rem); min-height: 75vh; }
body.ulu-redesign .u-author-columns .u-author-photo { flex: 1 1 32%; position: relative; overflow: hidden; border-radius: 4px; min-height: 320px; }
body.ulu-redesign .u-author-columns .u-author-photo img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; filter: contrast(1.06) saturate(0.92); }
/* was a single <p> — split into two (see HTML) per the brief, so the wrapper is now a flex
   column div; the flex-item sizing/border that used to live on the <p> moved up here, text
   styling is inherited down to both <p> children. */
body.ulu-redesign .u-author-note {
  flex: 1 1 36%; max-width: 520px; display: flex; flex-direction: column; justify-content: center; gap: 1.3rem;
  font-family: var(--font-body); font-style: italic;
  font-size: 15px; line-height: 1.9; color: var(--u-cream-2); border-left: 2px solid var(--u-cyan);
  border-right: 2px solid var(--u-cyan); padding: 0 1.8rem;
}
body.ulu-redesign .u-author-note strong { color: var(--u-gold); font-style: normal; }

/* ---------- 20. CLOSING ---------- */
body.ulu-redesign .closing-section { background: var(--u-navy); }
body.ulu-redesign .closing-title { color: var(--u-cream); }
body.ulu-redesign .closing-credit { color: var(--u-gold); }

/* FOOTER — this page-specific override is retired now that all 4 pages share one footer
   component (.footer-navy, applied directly in the HTML on every page including this one — see
   PROJECT_LOG.md). It used to set this page's footer to var(--u-navy) (#1f1347, this page's own
   accent) instead of the site's #0a064c; kept as dead history here rather than silently vanished:
   body.ulu-redesign .site-footer { background: var(--u-navy); } — removed because, at equal-ish
   specificity with a `body` type selector in the mix, it would have kept winning over
   .footer-navy and silently reintroduced the exact inconsistency this round fixed. */

/* ---------- WIDGETS (13, 19) — restyle shared widget-section ---------- */
/* "How did it smell for you?" + "Leave a trace" both use the shared .widget-section — was still
   the old dark-olive leftover from an earlier design pass. Now the same pale-yellow --u-cream
   used correctly elsewhere on this page (e.g. the Ilham section's card background), with text
   flipped to navy to match (the old white/cream text was tuned for the dark olive bg and would
   have vanished on a light one). */
body.ulu-redesign .widget-section { background: var(--u-cream); }
body.ulu-redesign .widget-title { color: var(--u-navy); }
body.ulu-redesign .widget-sub { color: var(--u-navy); opacity: 0.75; }
body.ulu-redesign .widget-input, body.ulu-redesign .widget-textarea { background: #fff; border: 1px solid rgba(31,19,71,0.3); color: var(--u-navy); }
body.ulu-redesign .widget-input::placeholder, body.ulu-redesign .widget-textarea::placeholder { color: rgba(31,19,71,0.4); }
body.ulu-redesign .widget-credit { color: var(--u-navy); opacity: 0.6; }
body.ulu-redesign .word-pill { background: var(--u-navy); color: var(--u-cyan); }
body.ulu-redesign .trace-item { color: var(--u-navy); border-left-color: var(--u-navy); }

/* ---------- MOBILE ---------- */
@media (max-width: 900px) {
  body.ulu-redesign .u-places-grid, body.ulu-redesign .u-looks-grid,
  body.ulu-redesign .u-smell-grid { grid-template-columns: 1fr; }
  body.ulu-redesign .u-go-grid { grid-template-columns: repeat(2, 1fr); }
  body.ulu-redesign .u-ilham-split, body.ulu-redesign .u-senses-split { flex-direction: column; }
  body.ulu-redesign .u-ilham-left { min-height: 70vh; }
  body.ulu-redesign .u-senses-right > div { min-height: 42vh; }
  body.ulu-redesign .u-author-columns { flex-direction: column; }
  body.ulu-redesign .u-author-columns .u-author-photo { min-height: 220px; }
  body.ulu-redesign .u-author-note { border-left: none; border-right: none; border-top: 2px solid var(--u-cyan); border-bottom: 2px solid var(--u-cyan); padding: 1.6rem 0; }
}
@media (max-width: 768px) {
  body.ulu-redesign .u-day-strip { grid-template-columns: repeat(2, 1fr); }
  body.ulu-redesign .u-playlist { flex-direction: column; }
  body.ulu-redesign .u-go-layout { flex-direction: column; }
  body.ulu-redesign .u-go-grid { grid-template-columns: repeat(2, 1fr); }
  body.ulu-redesign .u-truths-band { flex-direction: column; align-items: flex-start; gap: 1rem; }
  body.ulu-redesign .u-status-bar { font-size: 8.5px; max-width: 60vw; padding: 0.4em 0.7em; }
  body.ulu-redesign .u-sense-blob-row { flex-direction: column; align-items: flex-start; gap: 0.5rem; }
  body.ulu-redesign .u-sense-blob-label { width: auto; }
  body.ulu-redesign .u-gate-modal-panel .u-pay-btn { font-size: 12px; }
}
@media (prefers-reduced-motion: reduce) {
  body.ulu-redesign * { transition-duration: 0.01ms !important; animation-duration: 0.01ms !important; }
}
