/* =========================================================
   TRE™ in Singapore — interactive layer (2026-09-29)
   Loaded after style.css on every page.
   - hero system (.hx): real session photo + navy wash + pointer lens,
     tremor-line field (canvas) that trembles under the pointer and settles
   - drawn SVG icons replace text arrows / plus glyphs
   - button pointer glow + magnetic pull (fine pointers only)
   - phone menu sheet
   - shared building blocks for page scripts (.lx-*)
   Motion is rich but calm: breath-paced, exponential ease-out, no springs.
   Everything is visible by default and still under prefers-reduced-motion.
   ========================================================= */

:root{
  --ease-breath:cubic-bezier(.45,.05,.35,1);
  --ink-wash:15,31,61;             /* --navy-ink as rgb */
  --deep-wash:19,43,86;            /* --navy-deep as rgb */
  --i-arrow:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12h14M13 6l6 6-6 6'/%3E%3C/svg%3E");
  --i-plus:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.75' stroke-linecap='round'%3E%3Cpath d='M12 5v14M5 12h14'/%3E%3C/svg%3E");
  --i-chev:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.75' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m9 6 6 6-6 6'/%3E%3C/svg%3E");
  --i-close:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='1.75' stroke-linecap='round'%3E%3Cpath d='M6 6l12 12M18 6 6 18'/%3E%3C/svg%3E");
}

/* ---------- Browser surfaces ---------- */
html{scrollbar-color:var(--bronze-soft) var(--cream);accent-color:var(--navy)}
input,textarea,select{caret-color:var(--orange)}
.hx ::selection,.site-footer ::selection{background:rgba(201,164,92,.45);color:#fff}
main a:not(.btn):not(.link-arrow):not([class]){text-decoration:underline;text-decoration-color:rgba(28,61,122,.3);text-underline-offset:.22em;text-decoration-thickness:1px;transition:text-decoration-color var(--d1) var(--ease)}
main a:not(.btn):not(.link-arrow):not([class]):hover{text-decoration-color:currentColor}
table,time,.countdown,.event-price,.date-chip{font-variant-numeric:tabular-nums}

/* ---------- No eyebrow labels above headings (craft floor) ---------- */

/* ---------- Drawn icons instead of text glyphs ---------- */
.btn-primary::after,.link-arrow::after{
  content:"";display:inline-block;width:1.05em;height:1.05em;flex:none;margin-left:.1rem;
  background:currentColor;-webkit-mask:var(--i-arrow) center/contain no-repeat;mask:var(--i-arrow) center/contain no-repeat;
}
.link-arrow::after{background:var(--bronze)}
.faq summary::after{
  content:"";width:22px;height:22px;flex:none;background:var(--bronze);
  -webkit-mask:var(--i-plus) center/contain no-repeat;mask:var(--i-plus) center/contain no-repeat;
  transition:transform var(--d2) var(--ease-out)
}
.faq details[open] summary::after{transform:rotate(45deg)}

/* ---------- Buttons: pointer glow + magnetic (JS sets --bx/--by and translate) ---------- */
@media (hover:hover) and (pointer:fine){
  .btn:hover{background-image:radial-gradient(150px circle at var(--bx,50%) var(--by,50%),color-mix(in srgb,currentColor 18%,transparent),transparent 65%)}
  .btn{transition:transform var(--d2) var(--ease-out),translate .45s var(--ease-out),box-shadow var(--d2) var(--ease),background-color var(--d2) var(--ease),color var(--d2) var(--ease),border-color var(--d2) var(--ease)}
  .btn.is-magnet{transition:transform var(--d2) var(--ease-out),translate .12s linear,box-shadow var(--d2) var(--ease),background-color var(--d2) var(--ease),color var(--d2) var(--ease),border-color var(--d2) var(--ease)}
}

/* =========================================================
   HERO SYSTEM (.hx)
   <section class="page-hero hx">
     <div class="hx-media" aria-hidden="true"><img class="hx-photo" …></div>
     <div class="hx-wash" aria-hidden="true"></div>
     <canvas class="hx-tremor" aria-hidden="true"></canvas>
     <div class="container hx-inner">…h1, lead, buttons…</div>
     <p class="hx-credit">…</p>
   </section>
   The photo's sizes="(max-width: 760px) 50vw, 100vw" makes phones take the 960px copy whatever their pixel density:
   under the navy wash the 1600px copy adds weight, not visible detail.
   ========================================================= */
.hx{
  position:relative;isolation:isolate;overflow:hidden;color:#fff;
  background:var(--navy-ink);
  min-height:calc(clamp(500px,68vh,720px) + var(--head-room,0px));display:flex;align-items:center;
  padding:calc(var(--s8) + 8px + var(--head-room,0px)) 0 calc(var(--s8) + 24px);   /* --head-room: the see-through header's height when this hero sits under it */
}
.hx::before,.hx::after{content:none!important}               /* retire the old drifting blobs */
.hx-media{position:absolute;inset:-3%;left:calc(-3% + var(--shift,0%));z-index:-3;overflow:hidden;-webkit-mask-image:linear-gradient(90deg,transparent 0,#000 var(--feather,0%));mask-image:linear-gradient(90deg,transparent 0,#000 var(--feather,0%))}
.hx-photo{
  width:100%;height:100%;max-width:none;object-fit:cover;
  object-position:var(--fx,62%) var(--fy,45%);
  translate:var(--px,0px) var(--py,0px);scale:1.05;
  animation:hx-push 32s var(--ease-breath) infinite alternate;
  will-change:scale,translate;
}
@keyframes hx-push{from{scale:1.04}to{scale:1.12}}
.hx-wash{
  position:absolute;inset:0;z-index:-2;pointer-events:none;
  background:
    linear-gradient(90deg,rgba(var(--ink-wash),.92) 0%,rgba(var(--ink-wash),.8) 34%,rgba(var(--deep-wash),.36) 62%,rgba(var(--deep-wash),.1) 100%),
    linear-gradient(0deg,rgba(var(--ink-wash),.55) 0%,rgba(var(--ink-wash),0) 36%),
    linear-gradient(180deg,rgba(var(--ink-wash),.28) 0%,rgba(var(--ink-wash),0) 18%);
  /* the lens: where the pointer rests over the photo, the wash thins to reveal the room */
  -webkit-mask-image:radial-gradient(circle calc(280px * var(--lens,0)) at var(--lx,50%) var(--ly,50%),rgba(0,0,0,.38) 0%,rgba(0,0,0,.62) 55%,#000 100%);
  mask-image:radial-gradient(circle calc(280px * var(--lens,0)) at var(--lx,50%) var(--ly,50%),rgba(0,0,0,.38) 0%,rgba(0,0,0,.62) 55%,#000 100%);
}
.hx-tremor{position:absolute;inset:0;z-index:-1;width:100%;height:100%;display:block;pointer-events:none}
.hx .container,.hx-inner{position:relative;z-index:1;width:100%}
.hx h1{color:#fff;max-width:12.036em;text-shadow:0 2px 28px rgba(var(--ink-wash),.45)}
.hx p{color:var(--on-navy);max-width:600px}
.hx .lead{font-size:1.16rem;line-height:1.6}
.hx .crumbs,.hx .breadcrumb{color:var(--on-navy-2)}
.hx .crumbs a,.hx .breadcrumb a{color:#fff}
.hx .btn-row{margin-top:1.9rem}
.hx .hx-credit{
  position:absolute;right:max(var(--s5),calc((100vw - var(--max)) / 2 + var(--s5)));top:calc(var(--s5) + var(--head-room,0px));z-index:1;margin:0;
  display:flex;align-items:center;gap:.6rem;max-width:min(360px,44vw);
  font-size:.74rem!important;line-height:1.35;color:rgba(255,255,255,.78)!important;text-align:right;
}
.hx .hx-credit::before{content:"";width:22px;height:1px;flex:none;background:var(--gold)}
/* entrance: the copy settles out of a soft blur, staggered; visible by default */
.hx .hx-inner > *{animation:hx-in .95s var(--ease-out) both}
.hx .hx-inner > :nth-child(2){animation-delay:.09s}
.hx .hx-inner > :nth-child(3){animation-delay:.18s}
.hx .hx-inner > :nth-child(4){animation-delay:.27s}
.hx .hx-inner > :nth-child(5){animation-delay:.36s}
.hx .hx-inner > :nth-child(n+6){animation-delay:.45s}
.hx .hx-credit{animation:hx-in 1.2s .6s var(--ease-out) both}
@keyframes hx-in{from{opacity:0;translate:0 14px;filter:blur(6px)}to{opacity:1;translate:0 0;filter:blur(0)}}
/* retire the old per-child rise on page heroes that became .hx */
.page-hero.hx > .container > *{opacity:1;transform:none}

/* split variant: copy left, a second real photo framed on the right (event poster, facilitator portrait) */
.hx-split{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(0,.85fr);gap:clamp(28px,5vw,72px);align-items:center}
.hx-window{
  position:relative;margin:0;border-radius:var(--radius);overflow:hidden;background:var(--navy-ink);
  box-shadow:0 30px 70px -28px rgba(0,0,0,.7),0 0 0 1px rgba(255,255,255,.14);
}
.hx-window img{display:block;width:100%;height:100%;object-fit:cover;translate:var(--wx,0px) var(--wy,0px);scale:1.05;transition:translate .6s var(--ease-out)}
.hx-window.poster{aspect-ratio:16/9}
.hx-window.fp-photo{aspect-ratio:1/1}

/* hero furniture shared by the JS-rendered event (.hx-evt) and facilitator (.hx-fp) heroes */
.hx strong{color:#fff}
.hx p a:not(.btn),.hx .lead a{color:var(--gold);text-decoration:underline;text-underline-offset:3px}
.hx p a:not(.btn):hover{color:#fff}
.hx h1 em{color:var(--gold);font-style:italic}
.hx .crumbs{font-size:.86rem;margin-bottom:1.2rem}
.hx .crumbs a{opacity:.85}.hx .crumbs a:hover{opacity:1;color:var(--gold)}
.hx .badges{display:flex;gap:.5rem;flex-wrap:wrap;margin-bottom:1rem}
.hx .badge{background:rgba(255,255,255,.14);color:#fff;border:1px solid rgba(255,255,255,.22)}
.hx .badge.cat,.hx .badge.gold{background:var(--gold);color:var(--navy-ink);border-color:var(--gold)}
.hx .badge.soldout{background:var(--red);color:#fff;border-color:var(--red)}
.hx .role{color:var(--gold);font-weight:700;font-size:1rem;line-height:1.5;margin-bottom:.9rem}
.hx .btn-row .btn svg{width:15px;height:15px;flex:0 0 15px}
.hx-evt h1,.hx-fp h1{max-width:14.16em}   /* hero h1 widths: Nch of Plus Jakarta Sans Bold (0 = .708em) written in em, so the fallback font cannot change the line breaks */
.hx-fp .hx-split{grid-template-columns:minmax(0,1fr) minmax(260px,340px)}
.hx .prep{margin-top:1.3rem;font-size:.92rem;color:var(--on-navy-2)}

/* home: parallax on the video layer too */
.hero-full .hero-full-media{inset:-3%;width:auto;height:auto;translate:var(--px,0px) var(--py,0px)}  /* style.css sets 100% sizes; auto lets the -3% bleed reach every edge */

/* home: the full-screen video hero joins the system */
.hero-full .hx-tremor{z-index:1}
.hero-full .hero-full-content{z-index:2}

/* phones: compact hero sized to its content; the photo stays visible */
@media (max-width:760px){
  .hx{min-height:0;display:block;padding:calc(var(--s7) + 4px + var(--head-room,0px)) 0 calc(var(--s7) + 40px)}
  .hx-wash{background:
    linear-gradient(180deg,rgba(var(--ink-wash),.55) 0%,rgba(var(--ink-wash),.78) 45%,rgba(var(--ink-wash),.9) 100%)}
  .hx-photo{object-position:var(--fx-m,var(--fx,60%)) var(--fy-m,30%)}
  .hx h1{max-width:none}
  .hx .hx-credit{left:var(--s5);right:auto;top:auto;bottom:var(--s4);max-width:calc(100vw - 110px);justify-content:flex-start;text-align:left}
  .hx-media{left:-3%;-webkit-mask-image:none;mask-image:none}
  .hx-split,.hx-fp .hx-split{grid-template-columns:1fr}
  .hx-window{max-width:420px}
  .hx-fp .hx-window{order:-1;max-width:260px}
}
@media (min-width:761px) and (max-width:900px){.hx-split,.hx-fp .hx-split{grid-template-columns:1fr}.hx-window{max-width:520px}.hx-fp .hx-window{order:-1;max-width:300px}}

/* =========================================================
   PHONE MENU SHEET (≤980px): the dropdown becomes a full-screen navy sheet
   ========================================================= */
@media (max-width:980px){
  .site-header{z-index:80}
  .nav-toggle{position:relative;z-index:92}
  .nav{
    display:flex!important;position:fixed;inset:0;z-index:90;top:0;
    padding:calc(96px + env(safe-area-inset-top)) var(--s5) calc(var(--s6) + env(safe-area-inset-bottom));
    background:radial-gradient(120% 70% at 100% 0%,rgba(42,99,168,.45),transparent 60%),var(--navy-ink);
    border:0;box-shadow:none;max-height:none;overflow-y:auto;
    flex-direction:column;align-items:stretch;justify-content:flex-start;gap:0;
    visibility:hidden;opacity:0;clip-path:circle(0 at calc(100% - 44px) 40px);
    transition:clip-path .55s var(--ease-out),opacity .3s var(--ease),visibility 0s linear .55s;
  }
  .nav.open{visibility:visible;opacity:1;clip-path:circle(150% at calc(100% - 44px) 40px);transition:clip-path .6s var(--ease-out),opacity .2s var(--ease),visibility 0s}
  .nav a{
    font-size:clamp(1.5rem,6.2vw,2rem);font-weight:700;letter-spacing:-.02em;color:#fff;
    padding:.55rem 0;border-bottom:1px solid rgba(255,255,255,.1);min-height:56px;
    opacity:0;transform:translateY(10px);animation:none;
  }
  .nav.open a{animation:mm-in .5s var(--ease-out) forwards}
  .nav.open a:nth-child(1){animation-delay:.08s}.nav.open a:nth-child(2){animation-delay:.12s}.nav.open a:nth-child(3){animation-delay:.16s}
  .nav.open a:nth-child(4){animation-delay:.2s}.nav.open a:nth-child(5){animation-delay:.24s}.nav.open a:nth-child(6){animation-delay:.28s}
  .nav.open a:nth-child(7){animation-delay:.32s}.nav.open a:nth-child(8){animation-delay:.38s}
  .nav a.active{color:var(--gold)}
  .nav a:hover{color:var(--gold)}
  .nav .btn{margin-top:var(--s6);min-height:54px;font-size:1rem;letter-spacing:0;border-bottom:2px solid var(--orange)}
  .nav-extra{margin-top:auto;padding-top:var(--s6);display:grid;gap:.4rem;color:#9fb0cc;font-size:.92rem;opacity:0}
  .nav.open .nav-extra{animation:mm-in .5s .44s var(--ease-out) forwards}
  .nav-extra a{font-size:.98rem!important;font-weight:600!important;min-height:44px!important;border:0!important;padding:0!important;color:var(--on-navy)!important;opacity:1!important;transform:none!important;animation:none!important}
  html.menu-open .nav-toggle span{background:#fff}
  html.menu-open .site-header{background:transparent;border-color:transparent;box-shadow:none}
  html.menu-open .brand{position:relative;z-index:92}
  html.menu-open .brand-logo{filter:brightness(0) invert(1)}
  html.menu-open{overflow:hidden}
}
@media (min-width:981px){.nav-extra{display:none}}
@keyframes mm-in{to{opacity:1;transform:none}}

/* =========================================================
   SHARED BUILDING BLOCKS for page scripts (prefix .lx-)
   ========================================================= */
/* scroll reveal: a softer settle than before (content visible without JS) */
.js .reveal{transition-property:opacity,transform,filter}   /* keeps style.css durations + stagger delays */
.js .reveal:not(.in){filter:blur(4px)}                     /* only when JS runs: no-JS pages stay sharp */

/* a real photo in a rounded window, optional caption; [data-parallax] drifts it on scroll */
.lx-media{position:relative;margin:0;border-radius:var(--radius);overflow:hidden;background:var(--navy-ink);box-shadow:var(--shadow-2)}
.lx-media img{display:block;width:100%;height:100%;object-fit:cover;scale:1.06;translate:0 var(--par,0px);transition:scale 1.2s var(--ease-out)}
.lx-media:hover img{scale:1.09}
.lx-media figcaption{position:absolute;left:0;right:0;bottom:0;padding:1.4rem 1rem .8rem;font-size:.8rem;line-height:1.4;color:#fff;background:linear-gradient(transparent,rgba(var(--ink-wash),.82))}

/* horizontal photo strip (scroll-snap, drag on desktop) */
.lx-strip{display:grid;grid-auto-flow:column;grid-auto-columns:clamp(220px,26vw,340px);gap:var(--s4);overflow-x:auto;overscroll-behavior-x:contain;scroll-snap-type:x mandatory;padding:4px 4px var(--s4);scrollbar-width:thin;cursor:grab}
.lx-strip.is-drag{cursor:grabbing;scroll-snap-type:none}
.lx-strip > *{scroll-snap-align:start}
.lx-strip .lx-media{aspect-ratio:4/5}
.lx-strip .lx-media.wide{aspect-ratio:auto}

/* lightbox (built by TRELayer.lightbox) */
.lx-lightbox{position:fixed;inset:0;z-index:200;display:grid;place-items:center;padding:clamp(16px,4vw,48px);margin:0;background:rgba(10,20,40,.92);opacity:0;animation:lx-fade .3s var(--ease-out) forwards}
.lx-lightbox img{max-width:min(1200px,92vw);max-height:78vh;width:auto;height:auto;border-radius:var(--radius-sm);box-shadow:0 30px 80px rgba(0,0,0,.5)}
.lx-lightbox figcaption{margin-top:1rem;color:var(--on-navy);font-size:.92rem;text-align:center;max-width:60ch}
.lx-lightbox .lx-lb-count{position:absolute;top:22px;left:24px;color:rgba(255,255,255,.7);font-size:.8rem;font-variant-numeric:tabular-nums}
.lx-lightbox button{position:absolute;width:48px;height:48px;border-radius:50%;border:1px solid rgba(255,255,255,.22);background:rgba(255,255,255,.08);cursor:pointer;display:grid;place-items:center;transition:background var(--d1) var(--ease)}
.lx-lightbox button:hover{background:rgba(255,255,255,.18)}
.lx-lightbox button::before{content:"";width:22px;height:22px;background:#fff;-webkit-mask:var(--i-chev) center/contain no-repeat;mask:var(--i-chev) center/contain no-repeat}
.lx-lightbox .lx-lb-close{top:16px;right:16px}
.lx-lightbox .lx-lb-close::before{-webkit-mask-image:var(--i-close);mask-image:var(--i-close)}
.lx-lightbox .lx-lb-prev{left:16px;top:50%;translate:0 -50%}
.lx-lightbox .lx-lb-prev::before{transform:scaleX(-1)}
.lx-lightbox .lx-lb-next{right:16px;top:50%;translate:0 -50%}
@keyframes lx-fade{to{opacity:1}}

/* drawn lines: any SVG path with [data-draw] draws with scroll progress (TRELayer.draw) */
[data-draw]{stroke-dasharray:var(--len,1000);stroke-dashoffset:calc(var(--len,1000) * (1 - var(--p,1)))}

/* a small drawn node ring used by flows and timelines */

/* ---------- Reduced motion: still, complete, legible ---------- */
@media (prefers-reduced-motion:reduce){
  .hx .hx-inner > *,.hx .hx-credit{animation:none!important}
  .hx-photo{animation:none!important;scale:1.04;translate:none}
  .js .reveal:not(.in),.reveal{filter:none}
  .lx-media img{transition:none;scale:1}
  [data-draw]{stroke-dashoffset:0}
}
@media (prefers-reduced-motion:reduce) and (max-width:980px){
  .nav,.nav.open,.nav.open a,.nav.open .nav-extra{transition:none!important;animation:none!important;opacity:1;transform:none;clip-path:none}
  .nav:not(.open){visibility:hidden}
}

/* ---------- Print: heroes print as clean black-on-white headers ---------- */
@media print{
  .hx{min-height:0!important;display:block;background:#fff!important;color:#000!important;padding:12px 0 18px!important}
  .hx-media,.hx-wash,.hx-tremor,.hx .hx-credit,.hx .btn,.hero-full .hero-full-media,.hero-full .hero-full-overlay{display:none!important}
  .hx h1,.hx p,.hx .lead,.hx .crumbs,.hx .crumbs a,.hx .role{color:#000!important;text-shadow:none!important}
  .hx .hx-inner > *{animation:none!important;opacity:1!important;filter:none!important}
}

/* ---------- QA batch 1: contrast + legibility floor (real-browser audit, 2026-09-29) ---------- */
.site-header .nav .btn-primary:not(.is-quiet){color:var(--navy-ink)}    /* 6.1:1 on orange (was ink-2 at 3.6:1) */
.event-status.new,.st-new{color:#9a5510}                                 /* "New": 5.5:1 on white/cream */
.event-status.past{color:var(--muted)}                                  /* "Completed": 5.3:1 */
table.price .note{color:var(--ink-2)}                                   /* note on the highlighted gold row */
.badge,.post-meta .badge,.countdown span,.event-media .date-chip span,.fac-photo .feat-badge,.fac-sample{font-size:.72rem}
/* the orange CTA gets a neutral, offset depth instead of an orange glow (reads cleanly on navy panels) */
.btn-primary{box-shadow:0 8px 18px -12px rgba(15,31,61,.6)}
.btn-primary:hover{box-shadow:0 14px 26px -14px rgba(15,31,61,.6)}
/* footer column titles are h2 (top-level sections of the footer, so no page skips a level - incl. the 404), styled as before */
.site-footer h2{color:#fff;font-family:var(--font-display);font-weight:700;font-size:.78rem;letter-spacing:.06em;text-transform:uppercase;margin:0 0 .8rem}

/* ---------- Finish review fixes (2026-09-29) ---------- */
/* one world: every hero photo is graded toward the palette's navy while staying sharp (the user asked for a
   high-quality image IN the background, so the photo is not blurred); luminance and detail stay the photo's own */
.hx-media::after,.hero-full .hero-full-media::after{content:"";position:absolute;inset:0;background:var(--navy);mix-blend-mode:color;opacity:.42;pointer-events:none}
/* home: the text side lands on navy ink, not slate */
.hero-full .hero-full-overlay{background:linear-gradient(90deg,rgba(15,31,61,.94) 0%,rgba(15,31,61,.82) 40%,rgba(19,43,86,.42) 100%)}
.hx .hx-credit{text-shadow:0 1px 10px rgba(15,31,61,.65)}
/* orange stays the colour of the one primary action; its label is navy ink (6.1:1 on #e08a2e, 4.6:1 on the hover fill).
   Pure CSS so it holds without JavaScript; every rule that repaints a primary navy sets its own white label */
.btn-primary,.btn-primary:hover{color:var(--navy-ink)}
/* while another orange action is on screen, the header's "Book a call" steps back to navy (layer.js sets .is-quiet) */
@media (min-width:981px){
  .site-header .nav .btn-primary{transition:background-color .35s var(--ease),border-color .35s var(--ease),color .35s var(--ease),box-shadow .35s var(--ease),transform var(--d2) var(--ease-out)}
  .site-header .nav .btn-primary.is-quiet{background:var(--navy);border-color:var(--navy);color:#fff;box-shadow:none}
  .site-header .nav .btn-primary.is-quiet:hover{background:var(--navy-deep);border-color:var(--navy-deep);color:#fff}
}
/* JS-rendered heroes: badges follow the title (no label above the H1) */
.hx h1 + .badges,.hx .role + .badges{margin:-.1rem 0 1rem}

/* closing panels: the gold pointer glow appears only under a pointer (parked at rest it read as a grey smudge on navy) */
.cta-band::before{opacity:0}
@media (hover:hover){.cta-band:hover::before{opacity:.9}}

/* crawlable copies of the event / facilitator records and lists (build.py): read by search and AI crawlers
   and by visitors without JavaScript; hidden while JavaScript renders the full interactive version */
.js .rec-static{display:none}
/* until main.js has drawn the event or profile (.is-drawn), hold a hero's height and a screen below it, so the footer is
   not painted near the top and then pushed away (a layout shift of the whole viewport) */
.js #event-page:not(.is-drawn),.js #facilitator-page:not(.is-drawn){min-height:calc(100vh + 240px);background:linear-gradient(var(--navy-ink),var(--navy-ink)) top/100% calc(clamp(520px,68vh,720px) + var(--head-room,0px)) no-repeat}
@media (max-width:760px){.js #event-page:not(.is-drawn),.js #facilitator-page:not(.is-drawn){background-size:100% calc(600px + var(--head-room,0px))}}
.rec-static{padding-block:var(--s6)}
.rec-static h2{margin:var(--s6) 0 var(--s3)}
.rec-static ul{padding-left:1.2rem;margin:0 0 var(--s4)}
.rec-static li{margin:.35rem 0}
/* 404 */
.nf-404{padding-block:var(--s8)}
.nf-404 .nf-links{list-style:none;padding:0;margin:var(--s5) 0 0;display:grid;gap:.6rem}
.nf-404 .nf-links a{font-weight:600}

/* ---------- Motion switch (layer.js, 2026-10-02): pause / play for everything that moves on its own (WCAG 2.2.2) ----------
   One control in every hero and on every ribbon; they all drive one site-wide, remembered switch. Not shown under
   prefers-reduced-motion (nothing moves there). Without JavaScript the ribbons and the photo drift stay still. */
.mo-btn{
  position:absolute;z-index:3;width:44px;height:44px;padding:0;border-radius:50%;display:grid;place-items:center;cursor:pointer;
  color:#fff;background:rgba(var(--ink-wash),.55);border:1px solid rgba(255,255,255,.3);box-shadow:0 6px 16px -8px rgba(0,0,0,.55);
  transition:background-color var(--d1) var(--ease),border-color var(--d1) var(--ease),color var(--d1) var(--ease)
}
.mo-btn::before{content:"";position:absolute;inset:-4px;border-radius:50%}      /* a 44px+ target even where the disc is smaller */
.mo-btn:hover{background:rgba(var(--ink-wash),.82);border-color:var(--gold);color:var(--gold)}
.mo-i{display:grid;place-items:center}
.mo-btn svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.mo-play svg{fill:currentColor;stroke-width:1.2;translate:1px 0}
.mo-btn .mo-play,.motion-paused .mo-btn .mo-pause{display:none}
.motion-paused .mo-btn .mo-play{display:grid}
/* heroes: bottom right over the photo; the home hero bottom left, clear of the floating WhatsApp button */
.mo-hero{right:max(var(--s5),calc((100vw - var(--max)) / 2 + var(--s5)));bottom:var(--s5)}
.hero-full .mo-hero{right:auto;left:max(var(--s5),calc((100vw - var(--max)) / 2 + var(--s5)));bottom:22px}
/* ribbons: at the right end; the words slide under a navy fade */
.mo-strip{right:max(var(--s4),calc((100vw - var(--max)) / 2 + var(--s4)));top:50%;translate:0 -50%;width:38px;height:38px;
  background:var(--navy-ink);border-color:rgba(255,255,255,.24);box-shadow:-30px 0 22px 2px var(--navy-ink)}
.mo-strip:hover{background:var(--navy-ink)}
.marquee:focus-within .marquee-track{animation-play-state:paused}
.motion-paused .hx-photo,.motion-paused .marquee-track,.motion-paused .hero-full-media img,.motion-paused .hero-full-media video,
.motion-paused .snd-fab.on::after{animation-play-state:paused!important}
html:not(.js) .hx-photo,html:not(.js) .marquee-track{animation:none}
/* home video: fades in over its identical still once it plays (layer.js adds .is-on) */
.hero-full-media video{opacity:0;transition:opacity 1s var(--ease)}
.hero-full-media video.is-on{opacity:1}
@media print{.mo-btn{display:none!important}}

/* ---------- Touch targets (audit 2026-10-02): small links reach 44px without moving the text ---------- */
.footer-contact li:has(> a){align-items:center;margin-bottom:0}
.footer-contact li > a{display:inline-flex;align-items:center;min-height:44px}
.footer-contact li:has(> a) svg{margin-top:0}
.fac-card .fac-body > .link-arrow{min-height:44px;margin:calc(-.15rem - 10.5px) 0 calc(.1rem - 10.5px)}   /* 23px label, 44px target */
.hx-article .ar-crumb{display:inline-flex;align-items:center;min-height:44px;margin:-13px 0}

/* ---------- See-through header over the hero (2026-10-02) ----------
   build.py marks every page whose content opens with a hero: <body class="hero-head">, and .under-head on that hero
   (or on the event / profile container main.js draws it into). The hero slides up under the header - --head-room adds
   the header's height to its top padding and height, so photo, copy and buttons keep their places - and the header
   stays see-through with white type until the hero has scrolled out from under it (main.js sets body.past-hero), then
   it turns back into the white bar. A soft navy scrim behind the bar keeps the links legible over bright photos.
   Without JavaScript nothing changes. */
:root{--head-h:79px}                                      /* header bar 78px + 1px border */
@media (max-width:480px){:root{--head-h:69px}}
.js .under-head{--head-room:var(--head-h);margin-top:calc(-1 * var(--head-h))}
.js .hero-full.under-head{min-height:100vh;min-height:100svh;padding-top:var(--head-h)}
.site-header::before{
  content:"";position:absolute;inset:0 0 -36px;z-index:-1;pointer-events:none;opacity:0;
  background:linear-gradient(180deg,rgba(var(--ink-wash),.74) 0%,rgba(var(--ink-wash),.5) 60%,rgba(var(--ink-wash),0) 100%);
  transition:opacity var(--d2) var(--ease)
}
.brand-logo{transition:transform var(--d2) var(--ease),filter var(--d2) var(--ease)}
.js body.hero-head:not(.past-hero) .site-header{background:transparent;border-color:transparent;box-shadow:none}
.js body.hero-head:not(.past-hero) .site-header::before{opacity:1}
.js body.hero-head:not(.past-hero) .brand-logo{filter:brightness(0) invert(1)}
.js body.hero-head:not(.past-hero) .nav-toggle span{background:#fff}
.js body.hero-head:not(.past-hero) .nav-toggle:hover{background:rgba(255,255,255,.14)}
@media (min-width:981px){
  .js body.hero-head:not(.past-hero) .nav a:not(.btn){color:#fff}
  .js body.hero-head:not(.past-hero) .nav a:not(.btn):hover{color:var(--gold)}
  /* the hero's own orange action is on screen, so the header CTA steps back - here as a light outline, not navy on navy */
  .js body.hero-head:not(.past-hero) .site-header .nav .btn-primary.is-quiet{background:rgba(var(--ink-wash),.3);border-color:rgba(255,255,255,.62);color:#fff}
  .js body.hero-head:not(.past-hero) .site-header .nav .btn-primary.is-quiet:hover{background:rgba(var(--ink-wash),.55);border-color:#fff;color:#fff}
}
@media print{.site-header::before{display:none}}

/* form delivery failed (main.js): the problem and the way to still send the message */
.form-fail{margin-top:1rem;padding:1rem 1.2rem;border-radius:var(--radius-sm);background:#fbefe9;border:1px solid #f0cdbf;color:#7d2a17;line-height:1.55}
.form-fail a{color:#7d2a17;font-weight:700;text-decoration:underline;text-underline-offset:3px}
.form-fail[hidden]{display:none}

/* event blog posts (build.py + _src/event_posts.py): the draft banner and the note in a recap draft */
.draft-banner{position:relative;z-index:5;background:#fff4e0;color:var(--navy-ink);border-bottom:1px solid var(--gold);padding:.65rem var(--s4);text-align:center;font-size:.9rem}
.draft-note{background:var(--cream);border:1px dashed var(--bronze);border-radius:var(--radius-sm,10px);padding:var(--s3) var(--s4);margin:0 0 var(--s5);color:var(--ink)}
.bl-events{margin-top:var(--s8)}
.bl-events-h{margin:0 0 var(--s5)}

/* 2026-10-16: yellow buttons carry white text (client request) */
.btn-primary, .btn-primary:hover, .btn-primary:focus-visible, .site-header .nav .btn-primary:not(.is-quiet) { color: #fff !important; }
