/* ===========================================================================
   Hipcamp BODY LIFE — body-life.css
   ---------------------------------------------------------------------------
   The shared BODY-motion + CTA floor for hipcamp sites — the body-side sibling
   of hero-life.css. forge_assemble injects it into every hipcamp site's
   assets/ alongside hero-life. Scoped to #design-mount so it layers over ANY
   composed body without collision, and SELF-DISABLES (see body-life.js) where
   the composed body already implements its own motion — a no-op on rich builds
   (carsners), a floor for thin wave builds that shipped flat.

   Why this exists: the 2026-06-15 wave subagents universally dropped the
   TRIAD-2 parallax, several dropped scroll-reveals, and most left the
   Book-on-Hipcamp CTA as a browser-default blue <a> link. All passed the gate
   because the hero canvas alone satisfied the global motion-delta. This layer
   is the permanent floor so a thin body can never again ship without the
   signature body motion + a real CTA button.

   Three jobs, each IDEMPOTENT by construction:
   (1) CTA button-floor — styles ONLY class-less anchors. A bare <a href> with
       no class IS the "blue link" failure; a site's own .a-key / .hl-book /
       etc. carry a class and are never touched.
   (2) Scroll-reveal — fade + rise as a block enters (body-life.js opts blocks
       in via [data-bl-reveal]; revealed = [data-bl-seen]). Necessary rhythm,
       but NOT the TRIAD-2 satisfier on its own.
   (3) Parallax — real scroll-linked Y-translate on body images (body-life.js
       sets --bl-py per frame); scale headroom prevents edge reveal. THIS is
       the genuine scroll-driven motion that satisfies TRIAD-2 / CIN-1.
   =========================================================================== */

/* (1) CTA BUTTON-FLOOR — class-less EXTERNAL anchors only (the real CTAs:
   Book-on-Hipcamp et al.). A site's own styled buttons carry a class, so
   :not([class]) skips them; restricting to href^="http" also skips class-less
   IN-PAGE nav/jump links (#story, #gallery) — buttonising those was wrong.
   Purely additive → idempotent (a no-op on carsners, which has zero bare <a>). */
#design-mount a[href^="http"]:not([class]){
  display:inline-flex; align-items:center; gap:.5em;
  padding:14px 30px; min-height:48px;          /* >=44px tap-target floor */
  border-radius:10px;
  font-family:var(--font-display, "Cormorant Garamond", Georgia, "Times New Roman", serif);
  font-weight:500; font-size:clamp(15px,2vw,18px); letter-spacing:.02em;
  line-height:1.1; text-decoration:none;
  color:var(--bl-cta-ink, #fdf3e2);
  background:var(--bl-cta-bg, linear-gradient(135deg,#6a7b52,#3d4a2a));
  box-shadow:0 6px 22px rgba(8,12,20,.22);
  transition:transform .18s ease, box-shadow .18s ease, filter .18s ease;
}
@media (hover:hover) and (pointer:fine){
  #design-mount a[href^="http"]:not([class]):hover{
    transform:translateY(-2px); box-shadow:0 10px 28px rgba(8,12,20,.30); filter:brightness(1.05);
  }
}
#design-mount a[href^="http"]:not([class]):focus-visible{
  outline:3px solid var(--bl-cta-ink, #fdf3e2); outline-offset:3px;
}
/* the external Book-on-Hipcamp link gets a slow ambient pulse so the eye
   catches it as the conversion target (CTA-1; >=3s cycle). */
#design-mount a[href*="hipcamp" i]:not([class]){
  animation:bl-cta-pulse 4.5s ease-in-out infinite;
}
@keyframes bl-cta-pulse{
  0%,100%{ box-shadow:0 6px 22px rgba(8,12,20,.22); }
  50%    { box-shadow:0 9px 30px rgba(106,123,82,.46); }
}

/* (2) SCROLL-REVEAL — only on blocks body-life.js opted in ([data-bl-reveal]).
   JS adds the attribute, so if JS never runs NOTHING is hidden (fail-open). */
#design-mount [data-bl-reveal]{
  opacity:0; transform:translateY(26px);
  transition:opacity .7s cubic-bezier(.22,.61,.36,1),
             transform .7s cubic-bezier(.22,.61,.36,1);
}
#design-mount [data-bl-reveal][data-bl-seen]{ opacity:1; transform:none; }

/* (3) PARALLAX — body-life.js clips the frame and drives --bl-py per scroll
   frame. scale(1.10) gives translate headroom so the image never reveals an
   edge gap. transform-only → GPU-composited, never a layout prop. */
#design-mount [data-bl-parallax-frame]{ overflow:hidden; }
#design-mount [data-bl-parallax]{
  transform:translateY(var(--bl-py,0px)) scale(1.10);
  will-change:transform; transition:transform .08s linear;
}

/* Reduced motion: reveals resolve to their visible state, parallax + the CTA
   pulse are stilled. (body-life.js also bails before opting blocks in, so this
   is belt-and-suspenders for the CSS-only CTA pulse.) */
@media (prefers-reduced-motion: reduce){
  #design-mount [data-bl-reveal]{ opacity:1; transform:none; transition:none; }
  #design-mount [data-bl-parallax]{ transform:none; }
  #design-mount a[href*="hipcamp" i]:not([class]){ animation:none; }
}
