/*
Theme Name: Cool Gool
Theme URI: https://malcolmcallus.com
Author: TechMagic
Author URI: https://techmagic.info
Description: Bespoke "School of Rock" full-site-editing block theme for Cool Gool Music — Malcolm Callus's guitar, bass, ukulele and music-theory tuition. Warm near-black stage, ember-orange accents, film grain and stage-light vignette. No build step, no plugins.
Version: 1.2.6
Requires at least: 6.5
Tested up to: 7.0
Requires PHP: 8.0
License: GNU General Public License v2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
Text Domain: coolgool
Tags: full-site-editing, block-patterns, one-column, custom-colors, custom-logo, custom-menu, editor-style, education, blog
*/

/* ============================================================
   COOL GOOL MUSIC — "School of Rock" block theme
   Display: Anton  ·  Body: Archivo  ·  Technical labels: Space Mono
   Accent: electric ember-orange with crimson spark
   ============================================================ */

:root{
  --black:#0a0806;
  --coal:#12100d;
  --char:#1b1815;
  --smoke:#2a2521;
  /* 2026-08-03: raised from #4b433c for AA contrast (4.5:1) — used by
     .card .idx and form placeholder text, both on near-black backgrounds. */
  --ash:#888079;
  --bone:#f5ede1;
  --bone-dim:#c7bcab;
  --muted:#8f857a;

  --ember:#ff5a1e;      /* primary electric orange */
  --amber:#ffb23e;      /* warm highlight / stage glow */
  --crimson:#e01b39;    /* secondary spark */

  --stage-1:#2a1206;
  --stage-2:#1a0d06;

  --edge:rgba(245,237,225,.10);
  --edge-soft:rgba(245,237,225,.06);

  /* Fully-transparent twin of --black, for gradients that fade OUT to the
     page colour. A bare `transparent` cannot be used: it is rgba(0,0,0,0),
     so on a light skin the ramp interpolates through translucent BLACK and
     shows a grey bloom. Every skin must override this alongside --black.
     Used by the pricing-table swipe fade. */
  --fade-clear:rgba(10,8,6,0);

  --shadow-lg:0 40px 80px -30px rgba(0,0,0,.85);
  --glow:0 0 0 1px rgba(255,90,30,.35), 0 18px 50px -12px rgba(255,90,30,.45);

  --maxw:1220px;
  --ease:cubic-bezier(.22,.61,.36,1);
}

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

/* UX-2026-08-05 L-38: header.nav is sticky and 74px tall, so an in-page
   #anchor used to land underneath it. 90px clears the bar plus a little
   breathing room. (Added by the CSS-UX pass; if the other agent's pass also
   added one, keep a single declaration — do not stack two.) */
html{scroll-behavior:smooth;scroll-padding-top:90px}
@media (prefers-reduced-motion:reduce){
  html{scroll-behavior:auto}
  *,*::before,*::after{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important}
  .reveal,.reveal-load{opacity:1!important;transform:none!important}
}

body{
  margin:0;
  background:var(--black);
  color:var(--bone);
  font-family:"Archivo",-apple-system,BlinkMacSystemFont,sans-serif;
  font-size:clamp(16px,1.05vw,18px);
  line-height:1.62;
  -webkit-font-smoothing:antialiased;
  text-rendering:optimizeLegibility;
  overflow-x:hidden;
}

/* Warm stage vignette behind everything */
body::before{
  content:"";
  position:fixed;inset:0;z-index:-2;pointer-events:none;
  background:
    radial-gradient(90vw 60vh at 78% -8%, rgba(255,90,30,.20), transparent 60%),
    radial-gradient(70vw 55vh at 10% 8%, rgba(224,27,57,.12), transparent 58%),
    radial-gradient(120vw 90vh at 50% 120%, rgba(255,178,62,.08), transparent 60%),
    linear-gradient(180deg,var(--black),#080605 60%,var(--black));
}
/* Film grain */
body::after{
  content:"";
  position:fixed;inset:0;z-index:9998;pointer-events:none;
  opacity:.06;mix-blend-mode:overlay;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
}

a{color:inherit;text-decoration:none}
img{max-width:100%;display:block}

::selection{background:var(--ember);color:var(--black)}
:focus-visible{outline:2px solid var(--amber);outline-offset:3px;border-radius:2px}

/* block-theme normalisation */
.wp-site-blocks{overflow-x:clip}
.wp-site-blocks>*{margin-block:0}
.wp-block-template-part{margin:0}
main.wp-block-group{margin-block:0}

.wrap{width:100%;max-width:var(--maxw);margin-inline:auto;padding-inline:clamp(20px,5vw,48px)}

.kicker{
  font-family:"Space Mono",monospace;
  font-size:.72rem;letter-spacing:.34em;text-transform:uppercase;
  color:var(--amber);
  display:inline-flex;align-items:center;gap:.7em;
}
.kicker::before{content:"";width:26px;height:1px;background:linear-gradient(90deg,var(--ember),transparent)}

h1,h2,h3{margin:0;font-family:"Anton",Impact,sans-serif;font-weight:400;text-transform:uppercase;line-height:.92;letter-spacing:.005em}

/* ---------- NAV ---------- */
header.nav{
  position:sticky;top:0;z-index:900;
  backdrop-filter:blur(14px) saturate(120%);
  background:linear-gradient(180deg,rgba(10,8,6,.86),rgba(10,8,6,.55));
  border-bottom:1px solid var(--edge-soft);
  transition:box-shadow .3s var(--ease),background .3s var(--ease);
}
header.nav.scrolled{box-shadow:0 14px 40px -20px rgba(0,0,0,.9);background:rgba(9,7,5,.92)}
/* UX-2026-08-05 C-7: gap 24px -> 18px. Part of reclaiming the ~58px by which
   the desktop nav overran .wrap's content box (see the C-7 note at the
   max-width:1200px block below). Visually indistinguishable at this scale. */
.nav-inner{display:flex;align-items:center;justify-content:space-between;gap:18px;height:74px}

.brand{display:flex;align-items:center;gap:12px;flex-shrink:0}
.brand .mark{
  width:38px;height:38px;flex-shrink:0;border-radius:9px;
  display:grid;place-items:center;
  background:linear-gradient(150deg,var(--ember),var(--crimson));
  box-shadow:var(--glow);
  font-family:"Anton",sans-serif;font-size:1.25rem;color:var(--black);
  transform:rotate(-6deg);
}
.brand .name{font-family:"Anton",sans-serif;font-size:1.18rem;letter-spacing:.02em;text-transform:uppercase;line-height:1;display:block}
.brand .name span{color:var(--ember)}
/* UX-2026-08-05 M-57: was font-size:.56rem (8.96px) — the smallest text on the
   site and the worst offender in the sub-12px sweep. Raised to the 12px
   decorative floor. The tracking is cut .24em -> .05em in the SAME change on
   purpose, and it is load-bearing, not cosmetic: this tagline is the widest
   item in .brand (measured 236.7px vs 118px for the wordmark itself), so it
   sets the whole brand lockup's width and therefore the nav's fit budget.
   At 12px/.24em it would have grown to ~318px and re-broken C-7 above 1200px.
   Space Mono advances 0.6em, so 12px + .05em lands at ~241px — within ~4px of
   the old footprint, i.e. legible at no cost to the nav arithmetic. */
.brand .sub{font-family:"Space Mono",monospace;font-size:12px;letter-spacing:.05em;color:var(--muted);text-transform:uppercase;margin-top:2px;display:block}

/* UX-2026-08-05 C-7 + M-58: gap 6px -> 2px and link padding 14px -> 10px
   inline, reclaiming 8x8 + 7x4 = 92px so the full desktop bar fits inside
   .wrap once it is allowed to render (see the max-width:1200px block).
   white-space:nowrap is M-58: "At Yours" is the only two-word label and was
   wrapping to two lines at EVERY width >=768px (measured 62.6px tall against
   40.3px for every other link), breaking the header baseline. nowrap also
   stops a future longer label silently reintroducing the C-7 overflow. */
nav.links{display:flex;align-items:center;gap:2px}
nav.links a{
  font-size:.86rem;font-weight:600;letter-spacing:.02em;
  padding:9px 10px;border-radius:8px;color:var(--bone-dim);
  position:relative;transition:color .2s var(--ease);
  white-space:nowrap;
}
nav.links a:hover{color:var(--bone)}
nav.links a::after{
  /* UX-2026-08-05 C-7: inset tracks the link padding above (14px -> 10px) */
  content:"";position:absolute;left:10px;right:10px;bottom:5px;height:2px;
  background:var(--ember);transform:scaleX(0);transform-origin:left;
  transition:transform .28s var(--ease);
}
nav.links a:hover::after{transform:scaleX(1)}
/* 2026-08-03: home for the mobile-only "Gift voucher" nav link (added in
   parts/header.html) — hidden in the desktop bar, shown only in the mobile
   drawer (see nav.links.mobile .mobile-only-link below) */
.mobile-only-link{display:none}

.btn{
  display:inline-flex;align-items:center;gap:.6em;justify-content:center;
  font-family:"Archivo",sans-serif;font-weight:700;letter-spacing:.02em;
  font-size:.9rem;
  padding:12px 22px;border-radius:10px;cursor:pointer;border:1px solid transparent;
  transition:transform .18s var(--ease),box-shadow .25s var(--ease),background .25s var(--ease),color .2s;
  white-space:nowrap;
}
.btn-primary{
  background:linear-gradient(135deg,var(--ember),var(--crimson));
  color:#fff;box-shadow:var(--glow);
}
.btn-primary:hover{transform:translateY(-2px);box-shadow:0 0 0 1px rgba(255,90,30,.5),0 24px 60px -14px rgba(255,90,30,.65)}
.btn-ghost{
  background:transparent;color:var(--bone);border-color:var(--edge);
}
.btn-ghost:hover{border-color:var(--ember);color:var(--amber);transform:translateY(-2px)}
.nav-cta{display:flex;align-items:center;gap:10px}

.burger{display:none;background:none;border:1px solid var(--edge);border-radius:9px;width:44px;height:44px;cursor:pointer;padding:0}
.burger span{display:block;width:20px;height:2px;background:var(--bone);margin:4px auto;transition:.3s var(--ease)}
.burger.open span:nth-child(1){transform:translateY(6px) rotate(45deg)}
.burger.open span:nth-child(2){opacity:0}
.burger.open span:nth-child(3){transform:translateY(-6px) rotate(-45deg)}

/* ---------- HERO ---------- */
/* UX-2026-08-05 H-23: padding-top ceiling 86px -> 56px. One of five trims that
   together lift the "Book a lesson" CTA above the fold on a 1366x657 laptop
   (measured bottom edge was y=828, target <=640). */
.hero{position:relative;overflow:hidden;isolation:isolate;padding-top:clamp(40px,7vw,56px);padding-bottom:clamp(48px,7vw,96px)}
.hero-bg{
  position:absolute;inset:0;z-index:-1;overflow:hidden;
  background-color:var(--stage-2);
}
.hero-bg img{
  position:absolute;inset:0;width:100%;height:100%;
  object-fit:cover;object-position:38% 28%;
}
/* Scrim: was baked into the old inline background-image as 4 gradient
   layers stacked over the photo (photo as the bottommost layer). The
   photo is now a real <img> (LCP win), so the scrim moves here. It can't
   live on .hero-bg's own background any more — a stacking context's own
   background always paints below all of its children regardless of
   z-index, so the only way to keep it visually on top of the <img> is a
   pseudo-element, explicitly raised above the img's implicit stack level. */
.hero-bg::before{
  content:"";position:absolute;inset:0;z-index:1;
  background-image:
    linear-gradient(90deg,rgba(8,6,5,.94) 0%,rgba(8,6,5,.88) 20%,rgba(8,6,5,.72) 30%,rgba(10,7,5,.34) 40%,rgba(10,7,5,.32) 48%,rgba(10,7,5,.52) 62%,rgba(10,7,5,.62) 100%),
    radial-gradient(70vw 80vh at 82% 18%,rgba(255,90,30,.30),transparent 60%),
    radial-gradient(55vw 60vh at 18% 96%,rgba(224,27,57,.20),transparent 62%),
    linear-gradient(0deg,#0a0806 2%,transparent 40%);
}
.hero-bg::after{
  content:"";position:absolute;inset:0;z-index:2;
  background:radial-gradient(60vw 60vh at 82% 26%,rgba(255,90,30,.28),transparent 62%);
  mix-blend-mode:screen;
}
.hero-grid{display:grid;grid-template-columns:minmax(0,1.35fr) minmax(0,.85fr);gap:48px;align-items:center;min-height:min(76vh,660px)}

.hero-eyebrow{margin-bottom:10px} /* UX-2026-08-05 H-23: was 22px */
/* 2026-07-31 SEO pass: the H1 now carries the keyword line
   ("Guitar, Bass & Ukulele Lessons in London SE16 & Online") instead of the
   4-word brand line, so it is 3 lines of up to 23 chars rather than 2 of 11.
   The cap drops 8.4rem -> 4.6rem to keep the longest line inside the 719px
   hero column at --maxw; total headline mass is unchanged because the brand
   line lives on below as .hero-strap. Floor 2rem keeps it inside 375px. */
/* UX-2026-08-05 H-23 + H-59/M-59: clamp ceiling 4.6rem (73.6px) -> 3.6rem
   (57.6px), line-height .92 -> .88.

   H-59 first, because it explains the exact number. The H1 is three .line
   spans; the third, "in London SE16 & Online", measures 9.027px of width per
   1px of font-size (measured, not estimated). The hero column is 660px at
   every viewport >=1220px, and 636px at 1180px. At the old 73.6px ceiling the
   line needed 664.4px — it overflowed 660px by just 4.4px, which is why it
   broke to a 4th line and orphaned "ONLINE" on its own. The threshold to stay
   on one line is 660/9.027 = 73.1px at >=1220px, and 636/9.027 = 70.4px at
   1180px. 57.6px needs only 520px, so all three .line spans now set on one
   line each at every width from 375px up — the orphan is gone by construction
   rather than by asking text-wrap:balance to guess.

   H-23 second: 4 lines x 67.7px = 271px collapses to 3 x 50.7px = 152px,
   which is 119px of the ~188px the CTA needed to clear the fold. */
.hero h1{
  font-size:clamp(2rem,6.2vw,3.6rem);
  line-height:.88;
  letter-spacing:-.01em;
  text-shadow:0 2px 40px rgba(0,0,0,.6);
}
.hero h1 .line{display:block;overflow:hidden}
.hero h1 em,
.hero-strap em{
  font-style:normal;color:transparent;
  background:linear-gradient(120deg,var(--amber),var(--ember) 55%,var(--crimson));
  -webkit-background-clip:text;background-clip:text;
  position:relative;
}
/* Demoted brand strapline — keeps "Learn to play quick." and its gradient
   treatment directly under the keyworded H1, without spending the H1 on it. */
.hero-strap{
  margin:12px 0 0; /* UX-2026-08-05 H-23: was 18px */
  font-family:"Anton",Impact,sans-serif;font-weight:400;text-transform:uppercase;
  font-size:clamp(1.45rem,3.2vw,2.4rem);line-height:1;letter-spacing:.005em;
}
/* UX-2026-08-05 H-23: margin-top 22px -> 16px, max-width 44ch -> 62ch.
   The copy is 319 characters, which at 44ch (500px measured) set as 5-6 lines
   and was the second-biggest block of vertical spend in the hero. 62ch lets it
   use the full 660px column and drops it to ~4 lines with no content change.
   NOTE for the content team: trimming this paragraph to 2-3 sentences is the
   real fix — CSS can only re-flow it, not shorten it. */
.hero-sub{
  margin:12px 0 0;max-width:62ch;
  font-size:clamp(1.02rem,1.6vw,1.24rem);color:var(--bone-dim);
}
.hero-sub strong{color:var(--bone);font-weight:700}
/* Crawlable phone high on the homepage. Visible string stays the mandated
   "Call +44 7983 868507 (please don't Whatsapp)"; only the number is the
   dial link, same split as parts/footer.html and patterns/cta-band.php. */
.hero-tel{margin:16px 0 0;font-size:.95rem;color:var(--bone-dim)}
/* UX-2026-08-05 M-56: the dial link was bare 16px inline text 16px tall — the
   lowest-friction conversion action on a local-service site was also the
   hardest thing on the page to hit. The whole anchor is the string
   "Call +44 7983 868507" (the trailing "(please don't Whatsapp)" is outside
   it), so it can carry button chrome without breaking the sentence. Sized to
   an effective 44px via padding rather than a hard height so it still wraps
   with the surrounding copy on a narrow phone. Deliberately a bordered chip,
   not .btn-primary: the hero already owns one primary CTA and a second solid
   button beside it would split the click. */
.hero-tel a{
  display:inline-flex;align-items:center;
  min-height:44px;padding:6px 14px;margin:2px 0;
  border:1px solid var(--edge);border-radius:10px;
  color:var(--bone);font-weight:700;
  text-decoration:underline;text-decoration-color:var(--ember);text-underline-offset:3px;
  transition:border-color .2s var(--ease),color .2s var(--ease);
}
.hero-tel a:hover{color:var(--ember);border-color:var(--ember)}
.hero-cta{display:flex;flex-wrap:wrap;gap:14px;margin-top:18px} /* UX-2026-08-05 H-23: was 34px */
.hero-meta{
  margin-top:30px;display:flex;flex-wrap:wrap;gap:10px 22px;
  font-family:"Space Mono",monospace;font-size:.74rem;letter-spacing:.08em;color:var(--muted);text-transform:uppercase;
}
.hero-meta span{display:inline-flex;align-items:center;gap:.55em}
.hero-meta span::before{content:"";width:6px;height:6px;border-radius:50%;background:var(--ember);box-shadow:0 0 10px var(--ember)}

/* Hero side "gig card" */
.gigcard{
  position:relative;border:1px solid var(--edge);border-radius:18px;overflow:hidden;
  background:linear-gradient(180deg,rgba(27,24,21,.75),rgba(10,8,6,.8));
  box-shadow:var(--shadow-lg);
  backdrop-filter:blur(4px);
}
/* gradient stand-in for the missing gig photo (fretboard under ember light) */
.gc-media{
  height:230px;position:relative;overflow:hidden;
  background:
    repeating-linear-gradient(90deg,rgba(245,237,225,.09) 0 1px,transparent 1px 46px),
    repeating-linear-gradient(0deg,rgba(245,237,225,.04) 0 1px,transparent 1px 20px),
    radial-gradient(120% 90% at 82% 8%, rgba(255,90,30,.40), transparent 55%),
    linear-gradient(160deg,#2a1d13,#0f0b08);
}
.gc-media::after{content:"";position:absolute;inset:0;background:radial-gradient(60% 55% at 50% 120%,rgba(255,178,62,.28),transparent 60%)}
.gigcard .gc-body{padding:20px 22px 24px}
.gigcard .gc-tag{font-family:"Space Mono",monospace;font-size:.66rem;letter-spacing:.24em;color:var(--amber);text-transform:uppercase}
.gigcard h3{font-size:1.5rem;margin-top:8px;line-height:.98}
.gc-rows{margin-top:16px;display:grid;gap:10px}
.gc-row{display:flex;align-items:baseline;justify-content:space-between;gap:12px;padding-bottom:10px;border-bottom:1px dashed var(--edge);font-size:.9rem}
.gc-row:last-child{border-bottom:0;padding-bottom:0}
.gc-row b{font-family:"Space Mono",monospace;color:var(--ember);font-size:.95rem}
.gc-row .lbl{color:var(--bone-dim)}

/* ---------- staggered load-in ---------- */
.reveal-load{opacity:0;transform:translateY(22px);animation:loadIn .9s var(--ease) forwards}
@keyframes loadIn{to{opacity:1;transform:none}}
.d1{animation-delay:.05s}.d2{animation-delay:.16s}.d3{animation-delay:.28s}
.d4{animation-delay:.4s}.d5{animation-delay:.52s}.d6{animation-delay:.66s}.d7{animation-delay:.8s}

/* ---------- section frame ---------- */
section{position:relative}
.band{padding-block:clamp(64px,9vw,120px)}
#formats{padding-top:0}
.sec-head{max-width:720px;margin-bottom:clamp(34px,5vw,56px)}
.sec-head h2{font-size:clamp(2.3rem,6vw,4.4rem);margin-top:16px}
.sec-head p{margin:18px 0 0;color:var(--bone-dim);font-size:1.06rem;max-width:56ch}
.sec-head.center{margin-inline:auto;text-align:center}
.sec-head.center .kicker{justify-content:center}

/* ---------- TRUST BAR ---------- */
.trust{border-block:1px solid var(--edge-soft);background:linear-gradient(180deg,rgba(27,24,21,.5),rgba(10,8,6,.2))}
.trust-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:0}
.stat{padding:34px 26px;text-align:center;position:relative}
.stat + .stat::before{content:"";position:absolute;left:0;top:22%;height:56%;width:1px;background:var(--edge)}
.stat .num{font-family:"Anton",sans-serif;font-size:clamp(2.6rem,4.6vw,3.7rem);line-height:1;
  color:transparent;background:linear-gradient(120deg,var(--amber),var(--ember));-webkit-background-clip:text;background-clip:text}
.stat .num small{font-size:.42em;-webkit-text-fill-color:var(--bone);color:var(--bone);margin-left:.15em}
.stat .lbl{margin-top:10px;font-family:"Space Mono",monospace;font-size:.72rem;letter-spacing:.14em;text-transform:uppercase;color:var(--bone-dim)}
.stat .lbl b{color:var(--ember);font-weight:700}

/* ---------- SERVICES ---------- */
.cards{display:grid;grid-template-columns:repeat(3,1fr);gap:18px}
.card{
  position:relative;padding:30px 26px 28px;border-radius:16px;overflow:hidden;
  background:linear-gradient(180deg,var(--char),var(--coal));
  border:1px solid var(--edge);
  transition:transform .3s var(--ease),border-color .3s var(--ease),box-shadow .3s var(--ease);
}
.card::before{
  content:"";position:absolute;inset:0;z-index:0;opacity:0;
  background:radial-gradient(70% 60% at 50% 0%,rgba(255,90,30,.16),transparent 70%);
  transition:opacity .3s var(--ease);
}
.card:hover{transform:translateY(-6px);border-color:rgba(255,90,30,.45);box-shadow:0 30px 60px -30px rgba(0,0,0,.9)}
.card:hover::before{opacity:1}
.card > *{position:relative;z-index:1}
.card .ico{
  width:50px;height:50px;border-radius:12px;display:grid;place-items:center;margin-bottom:18px;
  background:linear-gradient(150deg,rgba(255,90,30,.16),rgba(224,27,57,.1));
  border:1px solid rgba(255,90,30,.3);color:var(--amber);
}
.card .ico svg{width:30px;height:30px;stroke:currentColor;fill:none;stroke-width:1.3;stroke-linecap:round;stroke-linejoin:round}
.card h3{font-size:1.42rem;letter-spacing:.01em}
.card p{margin:10px 0 0;color:var(--bone-dim);font-size:.96rem}
.card .idx{position:absolute;top:22px;right:24px;font-family:"Space Mono",monospace;font-size:.72rem;color:var(--ash);letter-spacing:.1em}

/* ---------- FORMATS ---------- */
.formats{display:grid;grid-template-columns:repeat(4,1fr);gap:16px}
.fmt{
  padding:28px 24px 26px;border-radius:14px;border:1px solid var(--edge);
  background:linear-gradient(180deg,rgba(27,24,21,.6),rgba(10,8,6,.5));
  position:relative;transition:transform .3s var(--ease),border-color .3s var(--ease)}
.fmt:hover{transform:translateY(-4px);border-color:rgba(255,178,62,.4)}
.fmt .step{font-family:"Anton",sans-serif;font-size:1.4rem;color:var(--ember);line-height:1}
.fmt h3{font-size:1.16rem;margin-top:14px}
.fmt p{margin:8px 0 0;font-size:.9rem;color:var(--bone-dim)}
.fmt .pin{margin-top:16px;font-family:"Space Mono",monospace;font-size:.66rem;letter-spacing:.12em;text-transform:uppercase;color:var(--amber)}

/* ---------- PRICING ---------- */
.pricing{position:relative;isolation:isolate}
.price-wrap{display:grid;grid-template-columns:1.1fr 1.1fr .9fr;gap:18px;align-items:stretch}
.price{
  position:relative;border-radius:18px;padding:34px 30px 32px;overflow:hidden;
  border:1px solid var(--edge);
  background:linear-gradient(180deg,var(--char),var(--coal));
  display:flex;flex-direction:column;
}
.price.feature{
  border-color:rgba(255,90,30,.5);
  background:linear-gradient(180deg,rgba(42,18,6,.9),rgba(16,10,7,.95));
  box-shadow:0 30px 70px -35px rgba(255,90,30,.5);
}
.price.feature::before{
  content:"MOST POPULAR";position:absolute;top:22px;right:-40px;transform:rotate(45deg);
  background:var(--ember);color:var(--black);font-family:"Space Mono",monospace;font-weight:700;
  font-size:.56rem;letter-spacing:.18em;padding:5px 48px 5px 60px}
.price .plan{font-family:"Space Mono",monospace;font-size:.74rem;letter-spacing:.2em;text-transform:uppercase;color:var(--amber)}
.price .headline{font-family:"Anton",sans-serif;font-size:1.7rem;margin-top:10px;text-transform:uppercase;line-height:1}
.price .rows{margin:22px 0 0;display:grid;gap:14px;flex:1}
.prow{display:flex;align-items:baseline;justify-content:space-between;gap:14px;padding-bottom:14px;border-bottom:1px dashed var(--edge)}
.prow:last-child{border-bottom:0;padding-bottom:0}
.prow .p-lbl{color:var(--bone-dim);font-size:.95rem}
.prow .p-amt{font-family:"Anton",sans-serif;font-size:2rem;line-height:1;
  color:transparent;background:linear-gradient(120deg,var(--amber),var(--ember));-webkit-background-clip:text;background-clip:text}
.prow .p-amt sup{font-size:.5em;vertical-align:super;-webkit-text-fill-color:var(--bone-dim)}
.prow .p-unit{font-family:"Space Mono",monospace;font-size:.66rem;color:var(--muted);letter-spacing:.06em;display:block;text-align:right}
.price .btn{margin-top:24px;width:100%}
.voucher{
  grid-column:auto;
  border-radius:18px;padding:32px 30px;overflow:hidden;position:relative;
  border:1px dashed rgba(255,178,62,.5);
  background:
    repeating-linear-gradient(45deg,rgba(255,178,62,.05) 0 12px,transparent 12px 24px),
    linear-gradient(180deg,rgba(27,24,21,.7),rgba(10,8,6,.8));
  display:flex;flex-direction:column;justify-content:center;
}
.voucher .gift{font-size:2rem}
.voucher h3{font-size:1.5rem;margin-top:14px}
.voucher p{color:var(--bone-dim);font-size:.95rem;margin:10px 0 0}
.voucher .btn{margin-top:20px}

/* ---------- TESTIMONIALS ---------- */
.quotes{background:linear-gradient(180deg,transparent,rgba(27,24,21,.35),transparent)}
.quote-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:18px}
.quote{
  position:relative;padding:34px 32px 30px;border-radius:16px;
  border:1px solid var(--edge);background:linear-gradient(180deg,var(--char),var(--coal));
  transition:transform .3s var(--ease),border-color .3s}
.quote:hover{transform:translateY(-4px);border-color:rgba(255,90,30,.35)}
.quote::before{content:"\201C";font-family:"Anton",serif;position:absolute;top:6px;left:22px;
  font-size:5rem;line-height:1;color:rgba(255,90,30,.24)}
.quote p{margin:26px 0 0;font-size:1.14rem;line-height:1.5;color:var(--bone);font-weight:500}
.quote .who{margin-top:20px;display:flex;align-items:center;gap:12px}
.quote .stars{color:var(--amber);letter-spacing:.12em;font-size:.9rem}
.quote .who span{font-family:"Space Mono",monospace;font-size:.72rem;letter-spacing:.12em;text-transform:uppercase;color:var(--muted)}

/* ---------- ABOUT ---------- */
.about-grid{display:grid;grid-template-columns:.95fr 1.05fr;gap:clamp(34px,5vw,64px);align-items:center}
.about-media{position:relative;border-radius:18px;overflow:hidden;border:1px solid var(--edge);box-shadow:var(--shadow-lg);
  min-height:360px;
}
.about-media img{
  position:absolute;inset:0;width:100%;height:100%;
  object-fit:cover;object-position:center 22%;
}
/* Extra darkening the old inline style baked directly onto the photo
   layer (in front of the .about-media::after fade below, i.e. between
   the photo and that fade). Now a dedicated layer so it can sit above
   the <img> — see .hero-bg::before for why it can't be .about-media's
   own background instead. z-index:1 puts it above the img and below
   ::after/.badge; ::after (z-index:1, tree-last) wins its tie with this
   ::before (tree-first) so it still paints on top, and .badge (z-index:2)
   stays on top of everything, unchanged. */
.about-wash{
  position:absolute;inset:0;pointer-events:none;
  background-image:linear-gradient(180deg,rgba(10,8,6,.12) 28%,rgba(10,8,6,.58));
}
.about-media::after{content:"";position:absolute;inset:0;z-index:1;background:linear-gradient(180deg,transparent 40%,rgba(10,8,6,.75));pointer-events:none}
.about-media .badge{
  position:absolute;left:22px;bottom:22px;z-index:2;
  font-family:"Space Mono",monospace;font-size:.68rem;letter-spacing:.14em;text-transform:uppercase;color:var(--bone);
  background:rgba(10,8,6,.6);border:1px solid var(--edge);border-radius:999px;padding:8px 16px;backdrop-filter:blur(6px)}
.about-body h2{font-size:clamp(2.1rem,5vw,3.6rem)}
.about-body p{color:var(--bone-dim);margin:18px 0 0}
.about-body p strong{color:var(--bone);font-weight:700}
.creds{margin:26px 0 0;display:flex;flex-wrap:wrap;gap:10px;padding:0;list-style:none}
.creds li{
  font-family:"Space Mono",monospace;font-size:.72rem;letter-spacing:.06em;text-transform:uppercase;
  padding:9px 14px;border-radius:999px;border:1px solid var(--edge);color:var(--bone-dim);
  display:inline-flex;align-items:center;gap:.55em;background:rgba(27,24,21,.5)}
.creds li b{color:var(--amber);font-weight:700}
.langs{margin-top:22px;font-size:.95rem;color:var(--bone-dim)}
.langs b{color:var(--bone)}

/* ---------- REGISTER / CONTACT ---------- */
.register{position:relative;overflow:hidden;isolation:isolate}
.register::before{
  content:"";position:absolute;inset:0;z-index:-1;opacity:.5;
  background:
    radial-gradient(60vw 55vh at 14% 18%, rgba(255,90,30,.14), transparent 60%),
    radial-gradient(52vw 55vh at 90% 82%, rgba(224,27,57,.12), transparent 62%),
    linear-gradient(0deg,var(--black),transparent)}
.reg-grid{display:grid;grid-template-columns:1fr 1.05fr;gap:clamp(34px,5vw,60px);align-items:start}
.reg-info{min-width:0}
.reg-info h2{font-size:clamp(2.2rem,5.5vw,4rem)}
.reg-info p{color:var(--bone-dim);margin:18px 0 0;max-width:44ch}
.contact-list{margin:30px 0 0;display:grid;gap:14px}
.cline{display:flex;align-items:center;gap:16px;padding:16px 18px;border-radius:12px;min-width:0;
  border:1px solid var(--edge);background:linear-gradient(180deg,rgba(27,24,21,.6),rgba(10,8,6,.4));
  transition:border-color .25s,transform .25s var(--ease)}
.cline:hover{border-color:rgba(255,90,30,.4);transform:translateX(4px)}
.cline .ci{width:44px;height:44px;flex-shrink:0;border-radius:10px;display:grid;place-items:center;
  background:linear-gradient(150deg,rgba(255,90,30,.16),rgba(224,27,57,.1));border:1px solid rgba(255,90,30,.3);color:var(--amber)}
.cline .ci svg{width:22px;height:22px;stroke:currentColor;fill:none;stroke-width:1.6}
.cline .ct{display:flex;flex-direction:column;min-width:0}
.cline .ct .k{font-family:"Space Mono",monospace;font-size:.62rem;letter-spacing:.18em;text-transform:uppercase;color:var(--muted)}
.cline .ct .v{font-size:1.02rem;font-weight:600;color:var(--bone)}
/* The email is a single unbreakable token (206px intrinsic). Without a break
   opportunity it sets the min-content floor of .ct -> .cline -> .reg-info, and
   a grid/flex item cannot shrink below that, so the whole .reg-grid track was
   forced wider than .wrap on a 320px screen. Scoped to the mailto row ONLY:
   the tel: row must keep its clean, unbroken number (see the CTA note below),
   and it needs no help — it already wraps at its spaces. */
.cline[href^="mailto:"] .ct .v{overflow-wrap:anywhere}
.avail{margin-top:22px;font-family:"Space Mono",monospace;font-size:.78rem;letter-spacing:.06em;color:var(--amber);
  display:flex;align-items:flex-start;gap:.6em}
/* 2026-08-03: align-items was center — fine on one line, but this text wraps
   to 2 lines on narrow cards/viewports, and center centered the dot against
   the whole wrapped block (floating between the lines, not next to "Mon").
   flex-start + a small top nudge lines it up with the first line instead. */
.avail::before{content:"";width:8px;height:8px;margin-top:.5em;border-radius:50%;background:var(--amber);box-shadow:0 0 12px var(--amber);animation:pulse 2.2s infinite;flex-shrink:0}
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.35}}

.reg-form{
  padding:32px 30px 30px;border-radius:18px;
  border:1px solid var(--edge);background:linear-gradient(180deg,var(--char),var(--coal));
  box-shadow:var(--shadow-lg)}
form .btn{margin-top:22px;width:100%}
.form-note{margin-top:14px;font-family:"Space Mono",monospace;font-size:.66rem;color:var(--muted);text-align:center;letter-spacing:.04em}

/* ---------- FOOTER ---------- */
footer{border-top:1px solid var(--edge-soft);background:linear-gradient(180deg,transparent,rgba(0,0,0,.4));padding-block:clamp(48px,6vw,72px) 34px}
.foot-grid{display:grid;grid-template-columns:1.4fr 1fr 1fr 1fr;gap:38px}
.foot-brand .name{font-family:"Anton",sans-serif;font-size:1.5rem;text-transform:uppercase}
.foot-brand .name span{color:var(--ember)}
.foot-brand p{color:var(--muted);margin:14px 0 0;font-size:.92rem;max-width:34ch}
/* UX-2026-08-05 M-56: the footer tel:/mailto: pair were bare inline text 16px
   tall. Scoped to .foot-brand p so it reaches only those two anchors and not
   the .foot-col link lists (handled separately above). inline-flex keeps them
   in the flow of their <br>-separated lines. */
.foot-brand p a[href^="tel:"],
.foot-brand p a[href^="mailto:"]{
  display:inline-flex;align-items:center;
  min-height:44px;
}
/* UX-2026-08-05 L-40 + M-57: font-size .7rem (11.2px) -> 12px, and
   line-height was inheriting an ABSOLUTE 10.304px — smaller than the font
   itself, so every footer h4 was clipping its own text. It only looked fine
   because these labels are uppercase with no descenders. A relative 1.2
   fixes it for any future label. */
.foot-col h4{font-family:"Space Mono",monospace;font-size:12px;line-height:1.2;letter-spacing:.18em;text-transform:uppercase;color:var(--amber);margin:0 0 16px}
.foot-col a,.foot-col p{display:block;color:var(--bone-dim);font-size:.92rem;margin-bottom:10px;transition:color .2s}
/* UX-2026-08-05 M-55: was padding:6px 0;margin-bottom:4px — 22 links per page
   at 350x35.8px with only 4px between them, which is a mis-tap trap on a
   phone. Now a 44px flex row with an 8px gap, meeting the site's own 44x44
   standard (used by .burger and .social-icons) rather than the 24x24 WCAG
   2.2 AA floor the previous pass settled for. */
.foot-col a{
  display:flex;align-items:center;
  min-height:44px;padding-block:10px;margin-bottom:8px;
}
.foot-col a:hover{color:var(--ember)}
.foot-bottom{margin-top:44px;padding-top:24px;border-top:1px solid var(--edge-soft);
  display:flex;flex-wrap:wrap;justify-content:space-between;gap:14px;
  font-family:"Space Mono",monospace;font-size:.7rem;letter-spacing:.06em;color:var(--muted)}

/* ---------- scroll reveal (progressive enhancement: only hidden when JS present) ---------- */
html.js .reveal{opacity:0;transform:translateY(28px);transition:opacity .7s var(--ease),transform .7s var(--ease)}
html.js .reveal.in{opacity:1;transform:none}
.reveal.s1{transition-delay:.06s}.reveal.s2{transition-delay:.14s}.reveal.s3{transition-delay:.22s}.reveal.s4{transition-delay:.3s}

/* ---------- interior pages (page/single/archive/search/404) ---------- */
.page-shell{padding:clamp(56px,9vw,110px) clamp(20px,5vw,48px)}
.page-shell h1,.page-shell h2,.page-shell h3{color:var(--bone)}
.page-shell a{color:var(--ember)}
.page-shell a:hover{color:var(--amber)}
.page-shell .wp-block-post-title{font-size:clamp(2.2rem,6vw,4rem);margin-bottom:.3em}
.page-shell .wp-block-post-date,.page-shell .wp-block-post-terms{font-family:"Space Mono",monospace;font-size:.74rem;letter-spacing:.06em;color:var(--muted);text-transform:uppercase}
.page-shell .wp-block-query .wp-block-post-title{font-size:1.6rem}
.page-shell .card{margin-bottom:18px;display:block}
.page-404 h1{font-size:clamp(2.6rem,8vw,5rem)}

/* ============================================================
   RESPONSIVE
   ============================================================ */
@media (max-width:1080px){
  .hero-grid{grid-template-columns:1fr;gap:36px}
  .gigcard{max-width:440px}
  .price-wrap{grid-template-columns:1fr 1fr}
  .voucher{grid-column:1/-1}
  .cards{grid-template-columns:repeat(2,1fr)}
  .formats{grid-template-columns:repeat(2,1fr)}
  .about-grid{grid-template-columns:1fr}
  .about-media{order:-1;max-height:420px}
  .reg-grid{grid-template-columns:1fr}
  .foot-grid{grid-template-columns:1fr 1fr}
}
/* ------------------------------------------------------------
   UX-2026-08-05 C-7 — THE NAV BREAKPOINT. Was 760px, now 1200px.

   These nav rules used to share a single @media (max-width:760px) block with
   the trust/quote/footer grid rules below. They have been SPLIT OUT rather
   than the whole block being retargeted, because moving .trust-grid,
   .quote-grid and .foot-grid to 1200px would have collapsed them to 1-2
   columns on every laptop — a large unintended layout change. Only the six
   nav rules moved; everything else stays at 760px, byte-for-byte.

   THE BUG. The desktop bar needs ~1211px of viewport to fit, but the burger
   only appeared at <=760px, so from 761px to ~1210px the site had NO reachable
   navigation. Measured live before the fix (Chrome, azure skin):

     768px   nav.links right edge 950 -> "Reviews", "FAQ" and "About" past the
             768px edge; .nav-cta laid out at x=974-1201, i.e. the "Gift
             voucher" button AND the primary blue "Book" button ENTIRELY
             off-screen. .burger computed display:none.
     834px   FAQ + About clipped; .nav-cta 977-1204, both buttons off-screen.
     1024px  links fit, but .nav-cta 984-1211 — Book at 1127-1211, fully
             outside the viewport.
     1180px  Book at 1127-1211, clipped by 31px.
     1280px  first width where everything fits.

   None of it was scrollable: body{overflow-x:hidden} and
   .wp-site-blocks{overflow-x:clip} swallow it, so documentElement.scrollWidth
   stayed equal to the viewport at every width and nothing hinted the controls
   existed. Every iPad (768/834/1024/1180 portrait and landscape) and every
   half-tiled laptop window therefore had no Book CTA and no FAQ/About/Gift
   voucher links at all.

   WHY 1200 AND NOT SOMETHING SMALLER. The bar's own width had to come down to
   make 1200 safe. Reclaimed in three places, all commented at their rules
   above: .nav-inner gap 24->18, nav.links gap 6->2, nav.links a padding
   14->10. That is 92 + 12 = 104px, against the 58px the bar was over. The
   1201px worst case now needs ~1083px inside a 1105px content box.

   NO JS CHANGE IS NEEDED — verified. assets/js/coolgool.js toggles the
   .mobile class on click with no width test anywhere in the file, so the
   drawer follows this breakpoint automatically. There is no matching JS
   constant to keep in sync.

   PAIRED EDIT: skin-azure.css carries the drawer's white background in its own
   @media (max-width:760px) block and has been split identically. Without that,
   761-1200px would have opened a near-black drawer on the white live skin.
   ------------------------------------------------------------ */
@media (max-width:1200px){
  nav.links,.nav-cta .btn-ghost{display:none}
  .burger{display:block}
  nav.links.mobile{
    display:flex;flex-direction:column;align-items:stretch;gap:2px;
    position:absolute;top:74px;left:0;right:0;
    background:rgba(9,7,5,1);border-bottom:1px solid var(--edge);
    padding:14px clamp(20px,5vw,48px) 22px;backdrop-filter:blur(16px)}
  nav.links.mobile a{padding:14px 4px;font-size:1rem;border-bottom:1px solid var(--edge-soft)}
  nav.links.mobile a::after{display:none}
  nav.links.mobile .mobile-only-link{display:block}
}
@media (max-width:760px){
  .trust-grid{grid-template-columns:1fr 1fr}
  .stat + .stat::before{display:none}
  .stat:nth-child(odd){border-right:1px solid var(--edge)}
  .stat:nth-child(-n+2){border-bottom:1px solid var(--edge)}
  .quote-grid{grid-template-columns:1fr}
  .foot-grid{grid-template-columns:1fr}
  .hero-meta{gap:8px 16px}
}
@media (max-width:480px){
  .cards{grid-template-columns:1fr}
  .formats{grid-template-columns:1fr}
  .price-wrap{grid-template-columns:1fr}
}

/* ============================================================
   INTERIOR KIT  —  reusable patterns for interior pages
   Patterns: page-hero · prose · feature-cards · cta-band · faq · pricing-table
   Shares the homepage palette, fonts and .wrap / .btn primitives.
   Interior pages run on templates/page.html (full-width flow); every
   pattern is a full-bleed <section> with an inner .wrap, exactly like
   the homepage sections. The single <h1> is supplied by .page-hero.
   ============================================================ */

/* ---------- PAGE HERO (compact interior banner) ---------- */
.page-hero{
  position:relative;overflow:hidden;isolation:isolate;
  padding-top:clamp(48px,7vw,92px);padding-bottom:clamp(40px,6vw,74px);
}
.page-hero-bg{
  position:absolute;inset:0;z-index:-1;
  background-color:var(--stage-2);
  background-image:
    linear-gradient(90deg,rgba(8,6,5,.92) 0%,rgba(10,7,5,.62) 55%,rgba(10,7,5,.28) 100%),
    radial-gradient(60vw 70vh at 84% 4%, rgba(255,90,30,.26), transparent 60%),
    radial-gradient(50vw 55vh at 10% 100%, rgba(224,27,57,.16), transparent 62%),
    linear-gradient(0deg,var(--black) 2%,transparent 46%),
    linear-gradient(160deg,#211710,#0f0b08);
  /* Face-safe default for any hero that supplies a photo but no inline position.
     Inert on the 12 gradient-only heroes (a gradient at background-size:cover
     fills the box exactly, so background-position has nothing to shift), and all
     20 photo heroes set their own inline background-position, which overrides it. */
  background-size:cover;background-position:50% 35%;
}
.page-hero-bg::after{
  content:"";position:absolute;inset:0;
  background:radial-gradient(52vw 52vh at 84% 12%,rgba(255,90,30,.22),transparent 62%);
  mix-blend-mode:screen;
}
.page-hero-inner{position:relative;max-width:var(--maxw)}
.page-hero .kicker{margin-bottom:20px}
.page-hero-title{
  font-size:clamp(2.5rem,7.5vw,5.4rem);letter-spacing:-.01em;max-width:18ch;
  text-shadow:0 2px 40px rgba(0,0,0,.6);
}
.page-hero-title em{
  font-style:normal;color:transparent;
  background:linear-gradient(120deg,var(--amber),var(--ember) 55%,var(--crimson));
  -webkit-background-clip:text;background-clip:text;
}
/* 2026-08-03: under Windows High Contrast (forced-colors:active), the four
   clipped-gradient headings above can render invisible — force them back
   to solid system text there */
@media (forced-colors:active){
  .hero h1 em,.hero-strap em,.stat .num,.prow .p-amt,.page-hero-title em{
    background:none;color:CanvasText;-webkit-text-fill-color:CanvasText;
  }
}
.page-hero-standfirst{
  margin:22px 0 0;max-width:62ch;
  font-size:clamp(1.02rem,1.5vw,1.22rem);color:var(--bone-dim);
}
.page-hero-standfirst strong{color:var(--bone);font-weight:700}
.page-hero-cta{display:flex;flex-wrap:wrap;gap:14px;margin-top:30px}
.page-hero-meta{
  margin-top:26px;display:flex;flex-wrap:wrap;gap:10px 22px;
  font-family:"Space Mono",monospace;font-size:.72rem;letter-spacing:.08em;
  color:var(--muted);text-transform:uppercase;
}
.page-hero-meta span{display:inline-flex;align-items:center;gap:.55em}
.page-hero-meta span::before{content:"";width:6px;height:6px;border-radius:50%;background:var(--ember);box-shadow:0 0 10px var(--ember)}

/* ---------- PROSE (long-form article body) ---------- */
.prose-band{padding-block:clamp(48px,7vw,88px)}
.prose{max-width:74ch;margin-inline:auto;font-size:1.06rem;color:var(--bone-dim)}
.prose > *:first-child{margin-top:0}
.prose > *:last-child{margin-bottom:0}
.prose p{margin:0 0 1.15em}
.prose .lead{font-size:1.2rem;color:var(--bone)}
.prose strong{color:var(--bone);font-weight:700}
.prose em{color:var(--bone-dim)}
.prose a{
  color:var(--ember);text-decoration:underline;text-underline-offset:3px;
  text-decoration-thickness:1px;text-decoration-color:rgba(255,90,30,.5);
  transition:color .2s,text-decoration-color .2s;
}
.prose a:hover{color:var(--amber);text-decoration-color:var(--amber)}
.prose h2{font-size:clamp(1.8rem,4vw,2.7rem);color:var(--bone);margin:1.6em 0 .5em;line-height:1}
.prose h3{font-size:clamp(1.3rem,2.6vw,1.7rem);color:var(--bone);margin:1.5em 0 .4em}
.prose h2 + p,.prose h3 + p{margin-top:0}
.prose ul,.prose ol{margin:0 0 1.2em;padding-left:1.35em}
.prose li{margin-bottom:.5em}
.prose li::marker{color:var(--ember)}
.prose ol li::marker{color:var(--amber);font-family:"Space Mono",monospace}
.prose blockquote{
  margin:1.6em 0;padding:.3em 0 .3em 1.3em;border-left:3px solid var(--ember);
  font-size:1.16rem;line-height:1.5;color:var(--bone);font-style:italic;
}
.prose blockquote cite,.prose blockquote footer{
  display:block;margin-top:.6em;font-style:normal;
  font-family:"Space Mono",monospace;font-size:.74rem;letter-spacing:.1em;
  text-transform:uppercase;color:var(--muted);
}
.prose hr{border:0;border-top:1px solid var(--edge);margin:2em 0}
.prose img{border-radius:12px;border:1px solid var(--edge);margin:1.4em 0}
.prose figure{margin:1.6em 0}
.prose figure figcaption{margin-top:.6em;font-family:"Space Mono",monospace;font-size:.72rem;letter-spacing:.06em;color:var(--muted);text-transform:uppercase}
.prose code{
  font-family:"Space Mono",monospace;font-size:.9em;color:var(--amber);
  background:var(--char);border:1px solid var(--edge);border-radius:6px;padding:.12em .4em;
}

/* ---------- FEATURE CARDS (icon / label / desc) ---------- */
.feature-cards{display:grid;grid-template-columns:repeat(3,1fr);gap:18px}
.fcard{
  position:relative;padding:28px 26px;border-radius:16px;overflow:hidden;
  background:linear-gradient(180deg,var(--char),var(--coal));border:1px solid var(--edge);
  transition:transform .3s var(--ease),border-color .3s var(--ease),box-shadow .3s var(--ease);
}
.fcard:hover{transform:translateY(-5px);border-color:rgba(255,90,30,.4);box-shadow:0 26px 54px -30px rgba(0,0,0,.9)}
.fcard .ico{
  width:48px;height:48px;border-radius:12px;display:grid;place-items:center;margin-bottom:16px;
  background:linear-gradient(150deg,rgba(255,90,30,.16),rgba(224,27,57,.1));
  border:1px solid rgba(255,90,30,.3);color:var(--amber);
  font-family:"Anton",sans-serif;font-size:1.35rem;line-height:1;
}
.fcard .ico svg{width:24px;height:24px;stroke:currentColor;fill:none;stroke-width:1.6}
.fcard h3{font-size:1.22rem}
.fcard p{margin:9px 0 0;color:var(--bone-dim);font-size:.95rem}

/* ---------- CTA BAND (full-width ember/crimson) ---------- */
.cta-band{padding-block:clamp(52px,8vw,96px)}
.cta-inner{
  position:relative;overflow:hidden;border-radius:22px;
  padding:clamp(38px,6vw,66px) clamp(28px,5vw,58px);
  background:linear-gradient(135deg,var(--ember),var(--crimson));
  box-shadow:0 40px 90px -40px rgba(255,90,30,.6);
  display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:28px;
}
.cta-inner::before{
  content:"";position:absolute;inset:0;opacity:.5;pointer-events:none;
  background:
    radial-gradient(50% 120% at 12% 0%, rgba(255,178,62,.5), transparent 55%),
    repeating-linear-gradient(90deg,rgba(0,0,0,.06) 0 1px,transparent 1px 40px);
}
.cta-band .cta-text{position:relative;max-width:36ch}
.cta-band .cta-text h2{font-size:clamp(2rem,5vw,3.3rem);color:#fff;line-height:.96}
.cta-band .cta-text p{margin:12px 0 0;color:rgba(255,255,255,.92);font-size:1.05rem}
.cta-band .cta-actions{position:relative;display:flex;flex-wrap:wrap;gap:14px}
.cta-band .btn-solid{background:var(--black);color:var(--bone);border-color:transparent}
.cta-band .btn-solid:hover{background:#000;color:#fff;transform:translateY(-2px);box-shadow:0 20px 50px -18px rgba(0,0,0,.7)}
.cta-band .btn-outline{background:transparent;color:#fff;border-color:rgba(255,255,255,.55)}
.cta-band .btn-outline:hover{border-color:#fff;background:rgba(255,255,255,.12);color:#fff;transform:translateY(-2px)}

/* ---------- FAQ ACCORDION (core wp:details, themed) ---------- */
.faq-band{padding-block:clamp(48px,7vw,88px)}
.faq{max-width:840px;margin-inline:auto;display:grid;gap:12px}
.faq .wp-block-details{
  border:1px solid var(--edge);border-radius:12px;overflow:hidden;
  background:linear-gradient(180deg,var(--char),var(--coal));
  transition:border-color .25s var(--ease);
}
.faq .wp-block-details[open]{border-color:rgba(255,90,30,.4)}
.faq .wp-block-details summary{
  list-style:none;cursor:pointer;position:relative;
  padding:18px 56px 16px 22px;
  font-family:"Archivo",sans-serif;font-weight:700;font-size:1.04rem;color:var(--bone);
  transition:color .2s;
}
.faq .wp-block-details summary::-webkit-details-marker{display:none}
.faq .wp-block-details summary:hover{color:var(--amber)}
.faq .wp-block-details summary:focus-visible{outline:2px solid var(--amber);outline-offset:-2px;border-radius:10px}
.faq .wp-block-details summary::after{
  content:"+";position:absolute;right:20px;top:16px;
  font-family:"Space Mono",monospace;font-size:1.45rem;line-height:1;color:var(--ember);
  transition:transform .3s var(--ease);
}
.faq .wp-block-details[open] summary::after{content:"\2013";color:var(--amber)}
.faq .wp-block-details > :not(summary){margin:0;padding:0 22px;color:var(--bone-dim);font-size:1rem;line-height:1.62}
.faq .wp-block-details > :not(summary):last-child{padding-bottom:20px}
.faq .wp-block-details p{margin:0 0 .8em}
.faq .wp-block-details p:last-child{margin-bottom:0}
.faq .wp-block-details ul,.faq .wp-block-details ol{margin:0 0 .8em;padding-left:1.3em}
.faq .wp-block-details li{margin-bottom:.4em}
.faq .wp-block-details li::marker{color:var(--ember)}
.faq .wp-block-details a{color:var(--ember);text-decoration:underline;text-underline-offset:2px}
.faq .wp-block-details a:hover{color:var(--amber)}
.faq .wp-block-details .note-hot{color:var(--amber)}
.faq-group-head{
  grid-column:1/-1;margin:24px 0 2px;
  font-family:"Space Mono",monospace;font-size:.76rem;letter-spacing:.2em;
  text-transform:uppercase;color:var(--amber);display:flex;align-items:center;gap:.7em;
}
.faq-group-head::before{content:"";width:26px;height:1px;background:linear-gradient(90deg,var(--ember),transparent)}

/* ---------- PRICING TABLE (themed table + card rail) ---------- */
.pricing-band{padding-block:clamp(48px,7vw,88px)}
.pricing-wrap{max-width:960px;margin-inline:auto;overflow-x:auto;border-radius:14px;border:1px solid var(--edge)}
.pricing-table{width:100%;min-width:520px;border-collapse:collapse;font-size:1rem}
.pricing-table th,.pricing-table td{padding:15px 20px;text-align:left;border-bottom:1px solid var(--edge)}
.pricing-table thead th{
  background:rgba(42,18,6,.55);
  font-family:"Space Mono",monospace;font-size:.68rem;letter-spacing:.16em;
  text-transform:uppercase;color:var(--amber);font-weight:700;
}
.pricing-table tbody tr{transition:background .2s}
.pricing-table tbody tr:hover{background:rgba(255,90,30,.05)}
.pricing-table tbody tr:last-child td{border-bottom:0}
.pricing-table td.amt{font-family:"Anton",sans-serif;font-size:1.32rem;color:var(--ember);white-space:nowrap;letter-spacing:.01em}
.pricing-table td.amt small{font-family:"Space Mono",monospace;font-size:.6rem;color:var(--muted);letter-spacing:.04em;margin-left:.3em}
.pricing-table td .sub{display:block;font-family:"Space Mono",monospace;font-size:.66rem;color:var(--muted);letter-spacing:.03em;margin-top:3px}
.pricing-note{max-width:960px;margin:18px auto 0;color:var(--muted);font-size:.92rem}
.pricing-note strong{color:var(--bone-dim)}
.pricing-note a{color:var(--ember);text-decoration:underline;text-underline-offset:2px}

/* Card rail (reuses .price / .price-wrap / .voucher from the homepage kit) */
.pricing-band .price-wrap{margin-top:26px}

/* ---------- shared interior helpers ---------- */
.sec-head.tight{margin-bottom:clamp(22px,3vw,34px)}
.interior-lead{max-width:64ch;color:var(--bone-dim);font-size:1.08rem}

/* ---------- INTERIOR RESPONSIVE ---------- */
@media (max-width:1080px){
  .feature-cards{grid-template-columns:repeat(2,1fr)}
}
@media (max-width:640px){
  .feature-cards{grid-template-columns:1fr}
  .cta-inner{flex-direction:column;align-items:flex-start}
  .page-hero-title{font-size:clamp(2.2rem,10vw,3.2rem)}
}

/* ============================================================
   REAL PHOTOGRAPHY — rich footer nav + photo galleries
   (appended 2026-07-10; later source order intentionally wins)
   ============================================================ */
.foot-grid{grid-template-columns:1.7fr repeat(4,minmax(0,1fr));gap:30px;align-items:start}
@media (max-width:1080px){
  .foot-grid{grid-template-columns:repeat(3,1fr)}
  .foot-grid .foot-brand{grid-column:1/-1}
}
@media (max-width:760px){
  .foot-grid{grid-template-columns:1fr 1fr}
  .foot-grid .foot-brand{grid-column:1/-1}
}
@media (max-width:480px){
  .foot-grid{grid-template-columns:1fr}
}

/* Photo galleries for gear shots & band banners */
.media-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:18px;margin-top:8px}
.media-grid figure{margin:0;position:relative;border-radius:14px;overflow:hidden;border:1px solid var(--edge);box-shadow:var(--shadow-lg);background:var(--coal)}
.media-grid img{width:100%;height:210px;object-fit:cover;display:block;transition:transform .6s var(--ease)}
.media-grid figure:hover img{transform:scale(1.045)}
.media-grid figcaption{position:absolute;left:0;right:0;bottom:0;padding:16px 14px 12px;font-family:"Space Mono",monospace;font-size:.68rem;letter-spacing:.1em;text-transform:uppercase;color:var(--bone);background:linear-gradient(0deg,rgba(10,8,6,.9),transparent)}

/* Single framed photo (portraits / feature shots) */
.photo-frame{margin:0;border-radius:16px;overflow:hidden;border:1px solid var(--edge);box-shadow:var(--shadow-lg)}
.photo-frame img{width:100%;height:auto;display:block}

/* ============================================================
   --- 2026-07-21 Malcolm review edits ---
   Styling for markup introduced by the theme/content review pass.
   Everything below uses the :root custom properties so the planned
   white + azure reskin only needs the :root block changed.
   ============================================================ */

/* ---------- .hot — red emphasis inside a heading ----------
   Fees page (18): "Recommend a mate, <span class="hot">get rewarded.</span>"
   Generic on purpose: any heading fragment can be flagged .hot. */
.hot{color:var(--crimson)}

/* ---------- .nowrap — keep a hyphenated phrase from breaking mid-word ----------
   2026-08-03: a plain "-" is a valid line-break point per the Unicode
   line-breaking algorithm, so a big Anton heading can wrap a compound
   term like "one-to-one" right after a hyphen ("ONE-TO-" / "ONE?"),
   which reads as broken. Space-to-space wraps elsewhere in these CTA
   headings (e.g. "Let's come to" / "you.") ARE the intended short-line
   rhythm — leave those alone. Wrap only the hyphenated phrase itself in
   this so it stays whole; the heading can still wrap before it. */
.nowrap{white-space:nowrap}

/* ---------- Red italics — GROUP LESSONS page only (page 26) ----------
   Malcolm asked for "what I put in italics" to be red: the 19 module
   labels ("Mod 7 :") and the 5 audience qualifiers ("kids 4 to 12").
   Scoped to body.page-id-26 (verified body class) AND to .band so it
   cannot leak to italics site-wide. Deliberately NOT applied to the
   three <em>s outside .band — the hero <h1> em is the theme's amber→
   ember→crimson gradient headline treatment (.page-hero-title em),
   and the two section <h2> ems inherit that same display idiom;
   flooding them red would break the page's signature headings. */
body.page-id-26 .band em{color:var(--crimson);font-style:italic}

/* ---------- .mod-thumb — module thumbnails on group-lessons ----------
   One <img class="mod-thumb"> sits as a sibling immediately before each
   module <h3> inside .prose, so the float wraps both the heading and its
   bullet list. Fixed 4:3 box + object-fit:cover normalises 13 source
   photos of wildly different aspect ratios into one tidy column.
   clear:left is load-bearing: without it a short module lets the next
   thumbnail float up alongside and the set reads as a ransom note.
   Zeroing the adjacent h3's margin-top makes the heading's cap-line and
   the image's top edge land on the same y (both then sit at the previous
   block's collapsed margin), which is what makes the column look aligned. */
.prose img.mod-thumb{
  float:left;clear:left;
  width:124px;height:93px;
  object-fit:cover;object-position:center;
  margin:0 1.15em .55em 0;
  border-radius:12px;
  border:1px solid var(--edge);
  background:var(--coal);
}
.prose img.mod-thumb + h3{margin-top:0}
/* The module's bullet list gets its own block formatting context so it sits
   BESIDE the float as a clean column instead of wrapping around it — without
   this, the first two bullets indent past the photo and the rest snap back to
   the far left, giving every module a ragged two-step left edge. */
.prose img.mod-thumb + h3 + ul{overflow:hidden;padding-left:1.5em}

/* Forward-compat: not used by the current markup (each module carries a
   single thumb), but keeps a multi-thumb module tidy if one is ever added. */
.mod-thumbs{display:flex;flex-wrap:wrap;gap:10px;margin:0 0 1.2em}
.mod-thumbs img.mod-thumb{float:none;clear:none;margin:0}

@media (max-width:760px){
  .prose img.mod-thumb{width:104px;height:78px;margin-right:.95em}
}
/* Below ~560px a floated photo leaves the bullets only three or four words a
   line. Drop the float and sit the thumbnail above its heading instead — the
   page gets longer, but the module text becomes readable again. */
@media (max-width:560px){
  .prose img.mod-thumb{
    float:none;clear:none;
    width:132px;height:99px;
    margin:0 0 .65em;
  }
  .prose img.mod-thumb + h3 + ul{overflow:visible;padding-left:1.35em}
}

/* ---------- 3-step register flow (page 32) ----------
   Three sibling <section class="band step-block">s. A CSS counter numbers
   them, so the badge can never drift out of step with the source order.
   The panel treatment goes on the form rather than the full-bleed section,
   which is what makes it match .gigcard / .price / .reg-form. */
body{counter-reset:cgm-step}
.step-block{
  counter-increment:cgm-step;
  padding-block:clamp(46px,6vw,76px);
}
.step-block + .step-block{border-top:1px solid var(--edge)}
.step-block .sec-head{position:relative;padding-top:72px}
.step-block .sec-head::before{
  content:counter(cgm-step);
  position:absolute;top:0;left:50%;transform:translateX(-50%);
  width:54px;height:54px;border-radius:14px;
  display:grid;place-items:center;
  font-family:"Anton",sans-serif;font-size:1.85rem;line-height:1;
  color:var(--amber);
  background:linear-gradient(150deg,rgba(255,90,30,.16),rgba(224,27,57,.1));
  border:1px solid rgba(255,90,30,.3);
}
/* The mu-plugin ships .cgm-form bare (max-width:720px, no panel, no
   horizontal padding — so on a narrow viewport the fields ran to the
   screen edge). This gives it the theme's standard panel and gutters. */
.step-block .cgm-form{
  width:calc(100% - clamp(32px,8vw,56px));
  max-width:720px;
  margin-top:clamp(26px,3.5vw,38px);
  margin-inline:auto;
  padding:32px 30px 30px;
  border-radius:18px;
  border:1px solid var(--edge);
  background:linear-gradient(180deg,var(--char),var(--coal));
  box-shadow:var(--shadow-lg);
}
/* Step 3 is the payment step — same panel, warmed with the amber hatch
   the .voucher card already uses, so "money" reads consistently. */
.paypal-box .cgm-form{
  border-color:rgba(255,178,62,.42);
  background:
    repeating-linear-gradient(45deg,rgba(255,178,62,.045) 0 12px,transparent 12px 24px),
    linear-gradient(180deg,var(--char),var(--coal));
}

/* ---------- .sec-cta — trailing call-to-action under a section grid ----------
   Used by the testimonials "Read all 131 reviews" link. Declared here so the
   pattern no longer needs its inline text-align. */
.sec-cta{margin-top:36px;text-align:center}

/* ============================================================
   --- 2026-07-21 corrections ---
   ============================================================ */

/* ------------------------------------------------------------
   NAV — mobile header overflow. The burger existed and worked;
   it was simply pushed OUTSIDE the viewport.

   Measured at 390px before the fix: .nav-inner needed 491px of
   content in a 390px box. .brand was flex-shrink:0 at 287px, so
   every pixel of the overflow was dumped onto .nav-cta, whose
   children cannot shrink either (.btn is white-space:nowrap, the
   burger is a fixed 44px). Result: "Register" clipped at x=437
   and the burger laid out at x=447-491 — entirely offscreen.
   Because .page-hero/body clip the overflow (documentElement
   .scrollWidth stayed 390) it could not even be scrolled to, so
   the site had NO working navigation on a phone, on every page.

   The widest single item is the brand tagline: 216px intrinsic
   versus 118px for the wordmark itself. It is repeated in the
   footer, so it is the right thing to drop on a phone.
   ------------------------------------------------------------ */
@media (max-width:760px){
  .brand .sub{display:none}
  .nav-inner{gap:12px}

  /* Safety valve: whatever the brand ends up containing, it may now
     give way before the controls do, so the burger can never be
     pushed off-screen again. .nav-cta holds its ground instead. */
  .brand{flex-shrink:1;min-width:0}
  .brand > span:last-child{min-width:0}
  .brand .name{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .nav-cta{flex-shrink:0}

  /* Buys back ~16px so the wordmark survives intact down to ~360px. */
  .nav-cta .btn-primary{padding:11px 16px;font-size:.84rem}
}

/* Below ~400px there is no longer room for the wordmark beside the
   controls. Rather than ellipsise it to "COOL GOOL MU…", let it use
   the second line the hidden tagline freed up — the lockup stays
   38px tall, matching the mark, and the name stays fully readable. */
@media (max-width:400px){
  .brand .name{
    white-space:normal;overflow:visible;text-overflow:clip;
    font-size:1.02rem;
  }
  .nav-cta{gap:8px}
}

/* ============================================================
   B3 FIX — /profile/ (page 70) hero: make Malcolm's EYES visible
   on small screens. VERIFIED by render at 375 / 390 / 430 / 640 /
   700 / 760 px. Desktop (>=761px) is provably unchanged.

   APPEND to style.css. Scoped to body.page-id-70 ONLY — it must not
   touch the other 20+ photo heroes that share .page-hero.

   WHY !important: page 70 sets `background-image` in an INLINE style
   on .page-hero-bg, and an inline declaration beats any stylesheet
   selector regardless of specificity. !important on the three
   background-* lines is the only way to override it from style.css.
   Do NOT drop it and do NOT drop the url() — background-image is a
   single layer-list, so the photo must be re-declared with the
   replacement gradients.

   WHY the hero gets taller: .page-hero-bg is background-size:cover.
   At mobile widths the box is portrait, so the image is scaled to the
   box HEIGHT and background-position-Y becomes inert — his eyes land
   at a FIXED 27.7% of the hero height no matter what Y you set. The
   only way to move his face above the text is to add headroom above
   the kicker. 210px puts the eyes ~58px clear of the kicker.

   WHY the scrim is replaced: the inline scrim is a 90deg (horizontal)
   one tuned for desktop — .94/.88/.78 across the left 30%. At 390px
   that 30% is only 117px, so it sits straight over his face. On small
   screens the text is full-width, so legibility has to come from a
   VERTICAL scrim instead: clear at the top (face), dark from 34% down
   (kicker/title/standfirst/CTA/meta).
   ============================================================ */
@media (max-width:760px){
  body.page-id-70 .page-hero{ padding-top:210px; }

  body.page-id-70 .page-hero-bg{
    background-image:
      linear-gradient(180deg,
        rgba(8,6,5,.62) 0%,
        rgba(8,6,5,.26) 8%,
        rgba(8,6,5,.04) 14%,
        rgba(8,6,5,.04) 28%,
        rgba(8,6,5,.40) 34%,
        rgba(10,7,5,.78) 40%,
        rgba(10,7,5,.90) 50%,
        rgba(10,7,5,.95) 100%),
      radial-gradient(70vw 30vh at 82% 6%, rgba(255,90,30,.20), transparent 62%),
      url('/wp-content/uploads/2026/07/bright.jpg') !important;
    background-position:38% 28% !important;
    background-size:cover !important;
  }

  /* tone down the inherited ember screen-blend so the bright studio
     wall behind his head doesn't go orange-washed */
  body.page-id-70 .page-hero-bg::after{ opacity:.45; }
}

/* ============================================================
   --- 2026-07-21 final sweep ---
   ============================================================ */

/* ------------------------------------------------------------
   IN-PAGE CTA PHONE BUTTON — clipped on every phone.

   The client's phone line must read "Call +44 7983 868507
   (please don't Whatsapp)". The theme already carries that string
   in three places and each one splits it into TWO nowrap units so
   it can drop to a second line:
     parts/footer.html    — <a nowrap> + <span nowrap>
     patterns/register.php— <span nowrap> + <span nowrap>
     patterns/cta-band.php— <a> for the number, separate <p> below
   The in-page CTA is the variant that never got that treatment:
   it is ONE anchor carrying the whole string, authored in page
   CONTENT and repeated verbatim on 30 published pages (IDs 17,
   19-26, 28-33, 37-46, 70-74), so it cannot be split from CSS.

   Measured before the fix (Chrome, 390px viewport):
     .btn is white-space:nowrap  -> intrinsic width 375.5px
     .cta-inner content box       -> 294px, and it is overflow:hidden
   so the right-hand 53.5px — border, radius and the closing ")" —
   was clipped away. A width sweep shows this from 320px up to
   478px; at >=480px the button fits on one line unaided.

   THE FIX, and why it is built this way:

   1. white-space:normal is necessary but NOT sufficient. Greedy
      line-breaking fills the first line, which measures out as
        "Call +44 7983 868507 (please" / "don't Whatsapp)"
      (verified) — it breaks the parenthetical, not the number.

   2. max-width is therefore the load-bearing part. Text metrics
      for this button's font:
        "Call +44 7983 868507"          153.0px
        "(please don't Whatsapp)"       173.5px
        "Call +44 7983 868507 (please"  209.2px
      Any content width in [173.5, 209.2) forces exactly the wanted
      break: the number still fits on line 1, "(please" no longer
      does, and line 2 holds the parenthetical whole. 22.5ch lands
      mid-window with ~2ch of slack either side, and ch is used
      rather than px so the window tracks the font — if Archivo
      fails to load and the sans-serif fallback is used, the text
      and the cap scale together. +34px covers the 16px side
      padding and 1px border of the border-box.

   3. text-wrap:balance is belt-and-braces, not the mechanism. It
      independently picks the same split (it minimises the longest
      line: 153/173.5 beats 209.2/117.3), so browsers that support
      it agree with the cap. Browsers that don't (Safari < 17.5)
      still get the correct break from max-width alone — verified.

   The number can never break mid-digit: there is no break
   opportunity inside "868507", and nothing here sets
   overflow-wrap/word-break, which is why neither is used.

   Result 320-520px: button 224-227 x 62.6px — taller than the
   49.3px single-line version, so the tap target grows, and well
   clear of the 44px minimum. >=560px is byte-for-byte the old
   rendering (375.5 x 49.3, one line). Verified on pages 17, 20,
   32, 70, 73 at 320/360/390/430/480/520/560/768/1200 with
   documentElement.scrollWidth == viewport width at every step.

   Scoped to .cta-band .cta-actions so it cannot reach the footer,
   the register card or the nav. It does also match the cta-band.php
   pattern button, whose label is just "Call +44 7983 868507"
   (153px) — that fits line 1 unwrapped, so it only picks up the
   slightly tighter mobile padding. Intentional.
   ------------------------------------------------------------ */
@media (max-width:520px){
  .cta-band .cta-actions .btn[href^="tel:"]{
    white-space:normal;
    text-wrap:balance;
    max-width:calc(22.5ch + 34px);
    padding:11px 16px;
    line-height:1.34;
    text-align:center;
  }
}

/* ------------------------------------------------------------
   SMALLEST PHONES (<=420px) — fixed padding and display type
   that never reduced.

   Two cards were overrunning their container at 320px. Both had the
   same cause: an intrinsic minimum that does not shrink, inherited
   by a grid/flex item whose default min-width:auto refuses to go
   below it. Neither was a stray width or a missing overflow.

   1. .stat — .trust-grid is repeat(2,1fr) at <=760px, but "1fr" is
      minmax(auto,1fr), so a track cannot go below its item's
      min-content. "Berklee" set in Anton at the 2.6rem floor of the
      old clamp is 126px and cannot break, plus 2x26px of fixed
      padding = 178px. At 320px the wrap gives each track only 140px,
      so the tracks resolved to 130.95px + 178px = 308.95px inside a
      280px box: the right-hand column ran 9px past the viewport and
      its border and rounded corner were shaved by an ancestor's
      overflow:hidden. Measured, not guessed.

      Fix = make the content fit the track, then release the floor.
      Padding 26->12px and the display number down to a clamp whose
      vw term tracks the viewport gives "Berklee" 92px against a
      116px budget at 320px (~25% headroom, enough to absorb the
      sans-serif fallback if Anton is slow). min-width:0 is what
      finally lets the two tracks resolve equal — but it is only
      safe BECAUSE the type now fits, which is why it lives in here
      and not on the base rule: at 761-799px the same grid runs 4-up
      with ~171px tracks, and releasing the floor there without
      shrinking the type would clip "Berklee" instead. That band is
      deliberately left exactly as it was.

   2. .cline — the email guitar@malcolmcallus.com is one unbreakable
      206px token, so .ct could not shrink, so .cline could not, so
      the .reg-info grid item could not: a 304px floor inside a 280px
      wrap, 4px past the viewport. overflow-wrap on the mailto row
      (above) removes the floor; the tightened padding/gap/icon and a
      .92rem value here keep it on ONE line at 320px (186px of 198px
      available) so the fix costs nothing visually.

   Verified by render at 320 / 360 / 390 px and 1280px desktop, on
   the default skin and ?skin=azure, with
   documentElement.scrollWidth == viewport width throughout.
   ------------------------------------------------------------ */
@media (max-width:420px){
  .stat{padding:26px 12px;min-width:0}
  .stat .num{font-size:clamp(1.9rem,8.5vw,2.4rem)}
  .stat .lbl{font-size:.62rem;letter-spacing:.1em}

  .cline{padding:14px;gap:12px}
  .cline .ci{width:40px;height:40px}
  .cline .ct .v{font-size:.92rem}
}

/* ============================================================
   --- 2026-07-21 mobile sweep #2 ---
   ============================================================ */

/* ------------------------------------------------------------
   IN-PAGE CTA — the whole panel overflowed to the RIGHT on
   phones. Worst on /register/, whose email button carries the
   longest label on the site.

   Measured at 320px BEFORE the fix (Chrome):
     .cta-inner content box          224px  (280 - 2x28 padding)
     .cta-actions                    331.4px  -> 79.4px past the edge
     .cta-text                       329.9px  -> 77.9px past the edge
   .cta-inner is overflow:hidden, so all of that was CLIPPED, not
   scrollable: the h2 read "RATHER TALK IT THROU", the standfirst
   lost its last word, and the black "Email me (including your
   phone number)" button lost its right border and radius. Still
   visibly clipped at 390px (9.4px over). Desktop was never
   affected — the panel only overflows below 428px-ish, and the
   media query below stops well clear of that.

   ROOT CAUSE — and what it is NOT.
   The obvious suspect was the recurring one on this site: a flex
   item stuck at its default min-width:auto. It was tested and
   RULED OUT — adding `min-width:0` to .cta-actions changed the
   measurement by exactly 0px at 320/360/390. The floor is not the
   flex item's automatic minimum, it is the BUTTON ITSELF: .btn
   sets `white-space:nowrap`, so "Email me (including your phone
   number)" is one unbreakable 331.4px token. A nowrap inline-flex
   box has no smaller form to shrink to, so nothing above it in
   the tree can shrink either.

   Why the HEADING moved too, which is the part that looks odd:
   .cta-text and .cta-actions are the two items of the wrapping
   flex container .cta-inner, and they end up on separate flex
   lines. The 331.4px button sizes the flex formatting context,
   and .cta-text then takes as much of that as its own cap allows
   — it measured 329.877px, i.e. exactly its `max-width:36ch`.
   So the heading and paragraph were not independently broken;
   they were following the button. Verified: releasing the button
   alone collapses .cta-text back to 224px with no rule of its
   own. That is why this fix touches ONLY the button.

   THE FIX: let the label wrap. 224px content box, 2 lines,
   224 x 62.6px — a bigger tap target than the 49.3px it replaces
   and well over the 44px minimum. The padding/line-height/
   text-align match the tel button beside it so the pair reads as
   one control group.

   INTERACTION WITH THE PROTECTED TEL RULE (above, same 520px
   breakpoint): that rule is
     .cta-band .cta-actions .btn[href^="tel:"]        (0,4,0)
   and this one is
     .cta-band .cta-actions .btn                      (0,3,0)
   so the tel button keeps its own `max-width:calc(22.5ch + 34px)`
   — the load-bearing part of that fix — no matter which order the
   two blocks appear in. `max-width:100%` here is a safety valve
   for any FUTURE long label and provably does not reach the tel
   button: its computed max-width is unchanged at 226.78px.
   Re-verified after this change at 320/360/390/430/480/520.
   ------------------------------------------------------------ */
@media (max-width:520px){
  .cta-band .cta-actions .btn{
    white-space:normal;
    max-width:100%;
    padding:11px 16px;
    line-height:1.34;
    text-align:center;
  }
}

/* ------------------------------------------------------------
   PRICING TABLE — it scrolled, but nothing SAID so.

   .pricing-wrap is overflow-x:auto around a min-width:520px
   table, so the mechanism was already correct and the page never
   scrolled sideways. The problem was purely that the affordance
   was invisible: at 320px the wrap is 278px of a 520px table, so
   242px (47%) is off-screen — the header reads "ONE-", the
   figures are sliced mid-glyph and the whole "Group · per person"
   column simply does not exist until you happen to swipe it.

   Measured scrollable range (identical on /fees/,
   /group-lessons/ and every instrument page — the table is the
   same 520px everywhere):
     320px -> 242px hidden      390px -> 172px hidden
     520px ->  54px hidden      576px ->   4px hidden
     580px and up -> not scrollable at all
   Hence the 579px breakpoint: it is the exact measured width at
   which the last pixel of overflow disappears, so the cue is
   present when and only when something is actually hidden. It
   never shows on desktop.

   WHY THIS IS AN OVERLAY AND NOT THE USUAL BACKGROUND TRICK.
   The stock pure-CSS answer is the local/scroll background
   scroll-shadow, which self-hides at both ends for free. It
   cannot work here, for two independent reasons:
     1. Backgrounds paint BEHIND content. The cells are
        transparent over the body colour, so a background ramp
        would tint the gap between glyphs and leave the sliced
        text just as sharp — it would not read as a fade at all.
     2. The shadow would be dark-on-dark. The page is #0a0806 and
        the wrap is transparent, so a dark ramp over it is
        invisible by construction.
   The cue therefore has to sit ON TOP of the content, which means
   a positioned box, which — with no markup to add — means a
   pseudo-element. The only way to pin one to the VISIBLE edge of
   a scroll container (rather than to the far end of its scrolled
   content, where absolute positioning would put it) is
   position:sticky, so .pricing-wrap becomes a 2-row grid purely
   to give the two pseudos a cell to be placed in.

   ::before  row 1, sticky left  — the worded hint. Space Mono /
             --muted / uppercase micro-label, the idiom already
             used for .stat .lbl and td .sub. No new colours.
   ::after   row 2, sticky right — the fade, ramping to --black so
             it is correct on both skins, and pointer-events:none
             so it can never eat a tap or a drag.

   Both then fade to opacity 0 over the last 28% of the scroll via
   a scroll-driven animation, so once you have reached the Group
   column the cue gets out of the way instead of dimming the
   figures you just swiped to. Verified: opacity 1 at scrollLeft 0
   and 0 at the end, at 320/390/579.

   The @supports wrapper matters. Where scroll-driven animations
   are unsupported the timeline is simply inactive, the pseudos
   keep their base opacity:1, and the cue is still correct — it
   just stays put. Nothing depends on the animation for layout.
   At >=580px the pseudos have no `content` at all (verified
   computed content:none at 580/768/1280), so desktop keeps the
   original block layout and paints nothing extra.
   ------------------------------------------------------------ */
@media (max-width:579px){
  .pricing-wrap{ display:grid; grid-template-columns:auto; }

  .pricing-wrap > .pricing-table{ grid-row:2; grid-column:1; }

  .pricing-wrap::before{
    content:"swipe to see more \2192";
    grid-row:1; grid-column:1;
    position:sticky; left:0;
    justify-self:start;
    font-family:"Space Mono",monospace;
    font-size:.6rem;
    letter-spacing:.09em;
    text-transform:uppercase;
    color:var(--muted);
    padding:10px 14px 6px;
    white-space:nowrap;
  }

  .pricing-wrap::after{
    content:"";
    grid-row:2; grid-column:1;
    position:sticky; right:0;
    justify-self:end;
    width:clamp(34px,11vw,56px);
    pointer-events:none;
    background:linear-gradient(to left,var(--black) 12%,var(--fade-clear));
  }

  @supports (animation-timeline:scroll()){
    .pricing-wrap::before,
    .pricing-wrap::after{
      animation:cgm-swipe-fade linear both;
      animation-timeline:scroll(nearest inline);
    }
  }
}

@keyframes cgm-swipe-fade{
  0%,72%{ opacity:1 }
  100%{ opacity:0 }
}

/* ============================================================
   --- 2026-07-23 footer social icons ---
   A row of small monoline brand links in the footer brand column
   (Facebook / YouTube / Instagram / X). No third-party plugin or
   icon font — the SVGs are inline and paint with currentColor.
   Colour comes only from --muted (rest) and --ember (hover), both
   of which every skin (default + azure) redefines, so the icons
   track the active skin automatically. Mirrors the .foot-col link
   idiom: muted at rest, accent + lift on hover/focus.
   ============================================================ */
.social-icons{
  display:flex;
  align-items:center;
  gap:4px; /* 2026-08-03: shrunk from 16px — the 12px padding added below
              already provides that spacing, so the icons stay visually
              where they were while the tap zone grows */
  margin-top:18px;
}
/* 2026-08-03: 12px padding brings the 20px svg's hit box to 44x44
   (WCAG 2.2 AA min is 24x24; this site's own standard elsewhere is 44x44) */
.social-icons a{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  margin:0;
  padding:12px;
  color:var(--muted);
  transition:color .2s var(--ease),transform .2s var(--ease);
}
.social-icons a:hover,
.social-icons a:focus-visible{
  color:var(--ember);
  transform:translateY(-2px);
}
.social-icons svg{
  width:20px;
  height:20px;
  display:block;
  fill:currentColor;
}

/* ============================================================
   2026-07-23  Freebies resource-card links  (page 30 / D3)
   Each .fcard gained a foot "Open →" anchor. Its ::after also
   stretches across the whole card, so the entire card is one
   click target. .fcard already sets position:relative +
   overflow:hidden. Colours come only from theme vars /
   currentColor, so the default (ember) and ?skin=azure skins
   both track automatically — nothing is hard-coded.
   ============================================================ */
.fcard{cursor:pointer}
.fcard-open{
  display:inline-flex;align-items:center;gap:.45em;
  width:100%;margin-top:16px;padding-top:14px;border-top:1px solid var(--edge);
  font-family:"Space Mono",monospace;font-size:.72rem;letter-spacing:.14em;
  text-transform:uppercase;color:var(--ember);text-decoration:none;
  transition:color .25s var(--ease);
}
.fcard-open .arw{transition:transform .25s var(--ease)}
.fcard:hover .fcard-open{color:var(--amber)}
.fcard:hover .fcard-open .arw{transform:translateX(4px)}
/* stretch the foot link across the whole card (nearest positioned
   ancestor is .fcard) so a click anywhere on the card opens it */
.fcard-open::after{content:"";position:absolute;inset:0;z-index:1}
.fcard-open:focus-visible{outline:2px solid var(--ember);outline-offset:3px;border-radius:4px}

/* ============================================================
   GEAR CARDS — UNIFORM PHOTO FRAME (GUITARS & BASSES + STUDIO KIT)
   ------------------------------------------------------------
   Client request 2026-07-25 (Malcolm): "Can all guitar/bass
   instrument pics be same size?"
   Extended 2026-07-27 (Malcolm): "Do for studio kit" — same
   treatment applied to the Studio & teaching kit section
   (#gear-kit) alongside Guitars & basses (#gear-guitars).

   The source photos have wildly different aspect ratios — the
   guitars run 0.42 -> 0.75 w:h, and the studio-kit shots are
   landscape (Alesis ~1.5, Behringer ~1.33) — so with the page's
   default `.gear-thumb img{height:auto}` every card rendered its
   photo at a different height.

   Fix: give the .gear-thumb frame inside these sections a FIXED
   height and let the photo object-fit:contain inside it. Every
   photo now renders at the same frame height, centred and
   letterboxed on the frame's own dark backdrop.

   NOTHING IS CROPPED — Malcolm previously asked to "leave the
   images as is", so `contain` (not `cover`) is deliberate: the
   full image content is preserved for every item — guitar or
   gear — only the display frame is normalised.

   Scoped via :has(#gear-guitars, #gear-kit) so the ukulele
   section (mixed portrait/landscape, not requested) stays
   untouched, and so this lives in the theme rather than in the
   page content Malcolm edits by hand in the block editor.
   Specificity (1,3,x) sits above the page's inline
   #gear-media-styles block, which loads later in document order.
   ============================================================ */
section.band:has(#gear-guitars, #gear-kit) .fcard .gear-thumb{
  height:400px;
}
section.band:has(#gear-guitars, #gear-kit) .fcard .gear-thumb img{
  width:100%;
  height:100%;
  object-fit:contain;
  object-position:center;
}
@media(max-width:640px){
  section.band:has(#gear-guitars, #gear-kit) .fcard .gear-thumb{height:340px}
}

/* ============================================================
   2026-08-05  CSS-UX PASS  (audit refs C-7 H-22 H-23 H-59 M-51
   M-55 M-56 M-57 M-58 L-38 L-40 L-45 L-47)
   ------------------------------------------------------------
   NOTE FOR THE SECOND PASS / OTHER AGENT — rules this pass touched
   IN PLACE, above this block, each tagged "UX-2026-08-05":
     html                          scroll-padding-top      (L-38)
     .nav-inner                    gap 24 -> 18            (C-7)
     .brand .sub                   8.96px -> 12px, tracking(M-57)
     nav.links                     gap 6 -> 2              (C-7)
     nav.links a                   padding, white-space    (C-7/M-58)
     nav.links a::after            inset 14 -> 10          (C-7)
     .hero                         padding-top ceiling     (H-23)
     .hero-eyebrow/.hero-strap     margins                 (H-23)
     .hero h1                      clamp ceiling + lh      (H-23/H-59)
     .hero-sub                     margin + max-width      (H-23)
     .hero-cta                     margin-top              (H-23)
     .hero-tel a                   inline-flex chip        (M-56)
     .foot-col h4                  size + line-height      (L-40/M-57)
     .foot-col a                   44px flex row           (M-55)
     .foot-brand p a[tel|mailto]   inline-flex 44px        (M-56)
     @media 760 -> 1200 SPLIT      nav rules only          (C-7)
   Everything below is additive and appended, so it can be reviewed or
   reverted as one contiguous unit. skin-azure.css has one paired split
   (nav drawer, C-7) and one appended block (L-47).
   ============================================================ */

/* ------------------------------------------------------------
   H-22 — /fees/ PRICING TABLE ON PHONES: restack, don't scroll.

   The table is 3 columns (Lesson | One-to-one | Group · per person) and
   min-width:520px inside a .pricing-wrap that measured 348px at a 390px
   viewport — 172px, the whole "Group · per person" column, off-screen.
   That column is where the group prices live, so the four group-course rows
   showed a mobile visitor nothing but the literal em-dash placeholder that
   sits in their One-to-one cell:

     <tr><td>Group course · 6 × 50 min</td><td>—</td><td class="amt">£100</td></tr>

   i.e. the page whose job is quoting group prices quoted "—" to every phone.

   FIX = remove the scroll rather than decorate it. Restacking each <tr> as a
   card below 640px makes all three columns visible with no horizontal scroll
   at any width: below 640px the rows are stacked, and above it the wrap is
   already wider than the 520px table (>=577px at 641px), so it never
   scrolled there either. That is why the swipe hint, the edge fade, and the
   tabindex/role/aria-label the audit asks for are NOT added — a scroll
   container that cannot scroll should not advertise that it can, and a
   focusable region with nothing to scroll is a keyboard trap for no gain.
   The existing <=579px cue is switched off below for the same reason.

   The column labels are generated from nth-child rather than a data-label
   attribute, because the markup has none (verified: 0 td[data-label] on
   /fees/). This is safe but positional: it hard-codes "One-to-one" and
   "Group · per person" to columns 2 and 3.
   CONTENT/TEMPLATE AGENT: adding data-label="…" to the <td>s and swapping
   the two content:"" values for content:attr(data-label) would make this
   self-maintaining and survive a column being added or reordered. Until
   then, if the table's columns change, THIS BLOCK MUST CHANGE WITH IT.

   The label is positioned absolutely rather than made a flex/grid sibling on
   purpose: cells like <td class="amt">£40<small>4 for £150</small></td> hold
   two inline children, and any flex/grid treatment of the <td> would promote
   the bare "£40" text node and the <small> into separate items and blow them
   apart with space-between. Absolute positioning leaves each cell's inline
   flow completely untouched.
   ------------------------------------------------------------ */
@media (max-width:640px){
  /* the <=579px swipe hint + fade are now false — nothing scrolls */
  .pricing-wrap::before,
  .pricing-wrap::after{content:none}

  .pricing-wrap{display:block;overflow-x:visible;border:0;border-radius:0}
  .pricing-table{display:block;width:100%;min-width:0}
  .pricing-table thead{display:none}
  .pricing-table tbody{display:block}

  .pricing-table tr{
    display:block;
    margin-bottom:12px;
    border:1px solid var(--edge);border-radius:12px;
    background:linear-gradient(180deg,var(--char),var(--coal));
    overflow:hidden;
  }
  .pricing-table tbody tr:last-child{margin-bottom:0}

  .pricing-table td{
    display:block;position:relative;
    padding:10px 16px 10px 45%;
    text-align:right;
    border-bottom:0;
  }
  /* row 1 of each card = the lesson itself, full width, no label */
  .pricing-table td:first-child{
    padding:13px 16px 11px;
    text-align:left;
    font-weight:700;color:var(--bone);
    border-bottom:1px solid var(--edge);
  }
  .pricing-table tbody tr:last-child td{border-bottom:0}
  .pricing-table tbody tr:last-child td:first-child{border-bottom:1px solid var(--edge)}

  .pricing-table td:nth-child(2)::before{content:"One-to-one"}
  .pricing-table td:nth-child(3)::before{content:"Group · per person"}
  .pricing-table td:nth-child(2)::before,
  .pricing-table td:nth-child(3)::before{
    position:absolute;left:16px;top:11px;width:38%;
    text-align:left;
    font-family:"Space Mono",monospace;font-size:12px;line-height:1.3;
    letter-spacing:.08em;text-transform:uppercase;color:var(--muted);
  }
  /* the block sub-note under an amount keeps to the value side */
  .pricing-table td .sub{text-align:right}
}

/* ------------------------------------------------------------
   M-57 — MINIMUM TYPE SIZES.

   Two floors, as specified: 12px for decorative labels, 14px for text that
   carries meaning (prices, credentials, phone labels). Collected here rather
   than edited into ~14 scattered rules so the whole policy is reviewable in
   one place; each selector's original size is noted beside it. Source order
   puts this after every base rule it overrides, and after the <=420px block,
   which is deliberate — see .stat .lbl below.
   ------------------------------------------------------------ */
/* 12px — decorative */
.kicker{font-size:12px}                    /* was .72rem  11.52px */
.gigcard .gc-tag{font-size:12px}           /* was .66rem  10.56px */
.fmt .pin{font-size:12px}                  /* was .66rem  10.56px */
.card .idx{font-size:12px}                 /* was .72rem  11.52px */
.about-media .badge{font-size:12px}        /* was .68rem  10.88px */
.form-note{font-size:12px}                 /* was .66rem  10.56px */
.price .plan{font-size:12px}               /* was .74rem  11.84px */
.foot-bottom{font-size:12px}               /* was .70rem  11.20px */
.quote .who span{font-size:12px}           /* was .72rem  11.52px */
/* Found by re-sweeping the rendered DOM of the interior pages after the first
   pass — M-57 is a sitewide floor, and these three were the only elements
   still under it. .arw is the "→" glyph, which inherits from .fcard-open. */
.fcard-open{font-size:12px}                /* was .72rem  11.52px */
.prose figure figcaption{font-size:12px}   /* was .72rem  11.52px */
.media-grid figcaption{font-size:12px}     /* was .68rem  10.88px */
.prose blockquote cite,
.prose blockquote footer{font-size:12px}   /* was .74rem  11.84px */
/* Breadcrumb — <nav class="crumbs"> inside .page-hero-inner on every interior
   page, so this was the single most widespread sub-12px offender on the site
   (9.92px). Held to the 12px floor rather than the 14px one: it is secondary
   navigation and has to stay visually subordinate to the page H1 directly
   below it. The leaf elements are targeted as well as the wrapper because the
   <a> and <span> are what actually carry the size. */
nav.crumbs,
nav.crumbs a,
nav.crumbs span{font-size:12px}            /* was .62rem   9.92px */
/* mu-plugin form kit (cgm-forms.php declares these at .72/.74rem in its own
   inline <style>). Overridden from here for the same reason skin-azure.css
   already restyles .cgm-note: these two files are where the site's visual
   rules live. Form instructions, so the 12px floor. */
.cgm-hint{font-size:12px}                  /* was .72rem  11.52px */
.cgm-note{font-size:12px}                  /* was .74rem  11.84px */

/* 14px — carries meaning */
.cline .ct .k{font-size:14px}              /* phone/email labels, was .62rem 9.92px */
.prow .p-unit{font-size:14px}              /* price qualifier,    was .66rem 10.56px */
.pricing-table td .sub{font-size:14px}     /* price sub-note,     was .66rem 10.56px */
.pricing-table td.amt small{font-size:14px}/* price sub-note,     was .60rem  9.60px */
.hero-meta,.page-hero-meta{font-size:14px} /* trust signals,      was .74/.72rem */
/* The ★ rating is a rating, not decoration. It needs (0,3,0) to land: the
   theme's .quote .stars is (0,2,0) and loses to .quote .who span (0,2,1),
   which is why the stars have always rendered at that span's size/colour. */
.quote .who .stars{font-size:14px}         /* was .90rem, overridden down to 11.52px */
/* Credentials ("RGT-registered", "Berklee Honors accreditation"). The
   <=420px block above deliberately shrinks this to .62rem so the 2-up trust
   grid fits a 320px screen; that fix was measured, so it is respected —
   this raises the label to 14px everywhere it has room, and holds it at the
   12px floor on the smallest phones instead of overriding the fit. */
.stat .lbl{font-size:14px}                 /* was .72rem 11.52px */
/* The About-section credential pills. Not named in the audit list, but found
   by sweeping the rendered DOM for anything still under 12px afterwards: the
   <b> inside each pill inherits the li's size, so "RGT", "Berklee" and
   "DBS-checked" were still setting at 11.52px. Same class of content as
   .stat .lbl above, so same 14px floor. They are flex-wrap pills, so the
   extra width simply wraps. */
.creds li{font-size:14px}                  /* was .72rem 11.52px */
@media (max-width:420px){
  .stat .lbl{font-size:12px}               /* was .62rem 9.92px */
}
/* H-22 also asks for the fees <th> at >=12px. Held at exactly 12px rather
   than lifted to the 14px "meaningful" floor on purpose: <th> is Space Mono
   at .16em tracking, and "Group · per person" at 14px measures ~191px, which
   would widen the table past its 520px min-width and could reintroduce a
   horizontal scroll in the 641-760px band the restack above does not cover. */
.pricing-table thead th{font-size:12px}    /* was .68rem 10.88px */

/* ------------------------------------------------------------
   L-45 — /guitar-bass-uke-lessons/ instrument cards: whole card clickable.

   Six cards whose only job is routing to the six instrument pages, with a
   29px heading link and a 40.6px "More about …" link as the sole targets.
   Each card is <article class="fcard"> containing <h3><a href="/electric/">
   and a second anchor to the SAME href inside the <p>, so stretching the
   heading link costs nothing — both destinations are identical.

   Naturally scoped: the freebies cards (the other .fcard user) have no link
   in their <h3> at all — they use .fcard-open, which already has its own
   stretch — so this selector cannot match there and the two patterns can
   never double up. .fcard is already position:relative, so inset:0 resolves
   against the card. z-index:0 keeps it below .fcard-open::after (z-index:1)
   in the impossible case that a card ever carries both.
   ------------------------------------------------------------ */
.fcard h3 a::after{content:"";position:absolute;inset:0;z-index:0}
.fcard h3 a:focus-visible{outline:2px solid var(--amber);outline-offset:3px;border-radius:4px}

/* L-45 — CTA band solid button: padding-block 12px -> 14px.
   Scoped .btn.btn-solid (0,2,0) so the measured <=520px mobile rule
   .cta-band .cta-actions .btn (0,3,0) still wins on phones. */
.btn.btn-solid{padding-block:14px}
