/* N SKA — Home
   Mobile-first. Glitch / digital-decay / post-internet direction per WEB 007 proposal. */

:root{
  /* duotone: everything on the page — colors, borders, photography — lives between
     these two hues. --bg is the dark/shadow end, --purple the light/highlight end,
     --gray is the true mid-point used for structure (borders, secondary text). */
  /* Neon Violet duotone — the site's default palette (see the hidden design
     picker's DUOTONES list in js/main.js for the other options this was chosen
     from). --bg-alt is --bg lightened by 12 per channel, matching the design
     picker's own lighten() helper for a custom bg color. --gray/--purple/--fg
     carried over unchanged from the previous Mint Violet default — only bg/lime
     were specified when this default was set. */
  /* MONOCHROME TRY (2026-11-10): desaturated greys + ONE purple accent (--accent),
     used only on big statement text + the active nav. To REVERT, restore:
     --bg:#adbcc7; --bg-alt:#b9c8d3; --gray:#7d8fa8; --purple:#ff6b9d;
     --purple-dim:rgba(255,107,157,.16); --fg:#eaf1ff; --muted/--muted-2/--line on
     234,241,255; --lime:#755d8e; */
  --accent:#a688df;                 /* the single purple accent */
  --bg:#ccced3;
  --bg-alt:#d8dadf;
  --gray:#898b92;
  --purple:var(--accent);           /* any former pink maps to the one accent */
  --purple-dim:rgba(166,136,223,.16);
  --fg:#eef0f3;
  --muted:rgba(238,240,243,.62);
  --muted-2:rgba(238,240,243,.4);
  --line:rgba(238,240,243,.14);

  --lime:#4e5056;                   /* panels/page — neutral grey (was the purple) */
  --ink:var(--bg);
  --ink-muted:color-mix(in srgb, var(--bg) 70%, transparent);

  /* [2026-11-12] ONE global text color for the whole site. It defaults to --ink-muted —
     the exact gray the inactive (un-hovered) event names use in the homepage lists — so
     body copy, headings and the event names all read as that single tone. The hidden
     design panel (open it with Ctrl+Shift+L) retargets --type-color live to recolor every
     piece of site type at once; "Reset to event-name gray" clears the override back here.
     Text that sits ON photos (.work-card-* uses --fg) and inverted text on filled chips/
     buttons is deliberately left alone so it keeps its contrast. */
  --type-color:var(--ink-muted);

  /* --font-serif = "title" role, --font-sans = "text" role. Both default to the same
     family so the rendered look is unchanged — the hidden design picker (top-right of
     the navbar) is what actually lets these diverge into a real title/text pairing. */
  --font-serif:'Plus Jakarta Sans', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
  --font-sans:'Plus Jakarta Sans', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;

  --header-h:76px;
  --marquee-h:50px;
  --container:1180px;

  /* cut-corner: shared bottom-right 45° notch — --cut-lg for the lime "sticky-note"
     cards, --cut-sm for buttons and other compact chrome (header bar, badges). */
  --cut-lg:26px;
  --cut-sm:14px;

  /* dot-grid texture — tweakable live via the hidden design panel (#designPanel —
     top-right of the navbar). --dot-size is the radius of each dot. Baked directly
     into each surface's own background (see --dot-pattern and background-blend-
     mode:overlay below) rather than drawn as one overlay div on top of the page: a
     single fixed overlay has no way to tell "UI chrome" apart from "photograph"
     underneath it, so it either textures both or neither. Baking it into each
     surface's own paint means photos (separate elements, painted with their own
     image content, never given this background) are never touched, with no
     z-index/stacking involved at all.
     As of the "separate background texture from container cards" pass, --dot-pattern
     itself is kept for the page-level surfaces that still use it (body, header,
     marquee, footer, design-panel) — every content CARD (.hero-note/.bio-card/
     .work-card/.calendar-widget/.calendar-past/.mission-note/.contact-form/
     .contact-direct) had it stripped from its own fill so cards render as flat
     --lime panels, reading as distinct surfaces sitting on the page's own textured
     background instead of sharing one continuous pattern with it. */
  --dot-size:.5px;
  --dot-gap:19px;
  --dot-opacity:.9;
  --dot-pattern:radial-gradient(rgba(0,0,0,var(--dot-opacity)) var(--dot-size), transparent var(--dot-size));
}

*,*::before,*::after{box-sizing:border-box;}
/* the browser's own [hidden]{display:none} rule is a plain (non-!important)
   user-agent style, so it loses to ANY author rule that sets display on the same
   element — .btn{display:inline-flex} was silently winning over the `hidden`
   attribute main.js toggles on the conversational forms' Next/Submit buttons,
   so "hidden" buttons kept right on rendering. Making hidden win here, always,
   is what the two one-off .design-panel[hidden]/.design-custom[hidden] rules
   further down were already doing per-element for the same reason. */
[hidden]{display:none !important;}
/* scroll-behavior:smooth deliberately NOT set here — Chrome (and other
   Chromium-based browsers) applies CSS smooth-scroll to every individual wheel/
   trackpad delta on a scroller that has it set, not just anchor-link jumps. Rapid
   wheel ticks each queue their own smooth-scroll animation, which don't finish
   before the next tick arrives and pile up — the actual cause of "have to scroll a
   couple times to move on, sometimes gets stuck" on ordinary pages (dj.html's
   "nearly a decade" bio-card is just where it was noticed, this affected scrolling
   everywhere the property was set). Anchor links (the hero's "See the formats ↓"
   etc.) still animate smoothly — see the dedicated click handler in js/main.js,
   which calls scrollIntoView({behavior:'smooth'}) explicitly and only for actual
   link clicks, the same way the homepage's own wheel-driven section jump already
   did before this rule existed. */
html{-webkit-text-size-adjust:100%;}
/* homepage-only: each top-level section (hero, marquee, mission, work, calendar,
   footer — see their own scroll-snap-align rules) snaps fully into place after every
   scroll gesture. `mandatory`, not `proximity` — proximity only engages when a gesture
   happens to end near a snap point, so a single wheel tick or arrow-key press could
   leave the page resting half inside a section instead of landing on it, which is
   exactly the "scroll once, land on the next section" behaviour these are meant to
   give. Sections taller than one screen (the calendar's long past-events list) simply
   keep scrolling past their own snap point until the next one, rather than trapping —
   see the .mission/.work/.calendar/.site-footer min-height rule below, which floors
   each section at one screen but never caps it. `:has()` scopes this to body.home
   without needing the class on <html> itself, since scroll-snap-type has to live on
   the scroll container. */
/* [2026-11-11] homepage auto scroll-snap RE-ENABLED: each full-height section
   (.hero/.mission/.work/.calendar/.site-footer — all carry scroll-snap-align:start)
   snaps into place as you scroll, sliding over the fixed shader backdrop. Mandatory,
   scoped to the homepage via :has(body.home) since snap-type must sit on the scroll
   container (<html>). js/main.js also drives one-section-per-wheel-notch jumps and
   suspends this (html.snap-paused) during each, per the comment below. To revert:
   delete this rule (back to free scroll). */
html:has(body.home){ scroll-snap-type:y mandatory; }
/* while js/main.js is driving a wheel-triggered section jump (its own smooth
   scrollIntoView), native CSS snap gets suspended — two systems steering the same
   scroll position at once made the browser's own snap engine re-evaluate mid-flight
   against wherever the JS animation happened to be that frame and settle early,
   short of the intended section. Toggled on/off around each jump; see goToSnap(). */
html.snap-paused{scroll-snap-type:none;}

/* homepage-only full-height sections: floors mission/work/calendar to the same "one
   screen below the sticky header + sticky marquee ticker" height .hero already uses
   (see .hero's own comment), so short sections fill the screen instead of snapping to
   a sliver, and the mandatory snap above always has a full-screen target to land on.
   The footer is deliberately left out — its content (logo, a few links) is short by
   design, and stretching it to a full screen just left a wall of empty space above it
   with nothing to center against; it keeps its natural, content-sized height and still
   gets its own snap point below. Scoped to body.home — .work/.calendar/.site-footer
   are shared classes reused (often several times per page) on every subpage, and
   forcing those full-height too was never asked for. justify-content:center vertically
   centers each section's existing content within that floor; margin:0 auto on each
   section's own inner wrapper (.mission-inner) still centers it horizontally the same
   way auto-margins do on a block, since flex-item cross-axis auto-margins behave the
   same way. The marquee stays position:sticky for as long as it's inside <main>
   (mission/work/calendar are), so its height is only added to those three sections'
   scroll-margin-top — without it, snapping to their start would tuck the first
   ~var(--marquee-h) of content behind the ticker. */
/* The homepage no longer shows the festival ticker (removed 2026-10-30; the other
   pages keep theirs). Zeroing --marquee-h here — scoped to body.home so subpages are
   untouched — collapses the gap it used to reserve: the hero and the full-height
   sections below all size against header-only, exactly as they did with the ticker. */
body.home{ --marquee-h:0px; }
body.home .mission,
body.home .work,
body.home .calendar{
  min-height:calc(100svh - var(--header-h) - var(--marquee-h));
  display:flex;
  flex-direction:column;
  justify-content:center;
}
/* .calendar gets an actual height, not just the shared floor above — mission/work
   fit their content INTO that floor by shrinking the content itself (clamp()s on the
   figure/images/type elsewhere in this file), but the calendar's event lists are
   meant to scroll once they don't fit rather than shrink, and flex-grow/shrink +
   overflow:auto only actually kick in against a real constraint — a min-height alone
   never forces anything to shrink, it only ever grows. See .calendar-grid's own
   flex:1 + .upcoming-list/.past-list's overflow-y:auto below, which this is what
   actually makes effective. */
body.home .calendar{
  height:calc(100svh - var(--header-h) - var(--marquee-h));
}
/* the homepage SoundCloud player reuses .calendar for its section styling, but it's
   a single fixed-height embed — keep it content-sized instead of a full screen. */
body.home #mixes{
  height:auto;
  min-height:0;
}
/* the extra +24px buffer these two carried elsewhere (a bit of breathing room below
   the marquee) isn't free on the homepage: the min-height floor above sizes each
   section to exactly one screen below the sticky header+marquee, so any extra offset
   here pushes the whole section down that same amount past the bottom of the screen
   — .work's own bottom padding was getting clipped below the fold from just this.
   Matching .mission's plain header+marquee offset keeps the math consistent. */
body.home .mission,
body.home .work,
body.home .calendar{
  scroll-margin-top:calc(var(--header-h) + var(--marquee-h));
}
body{
  margin:0;
  background-color:var(--lime);
  /* page canvas gets its own two-layer texture (the shared dot-grid plus a fine
     diagonal hatch, both very low-opacity) — every content card above stripped
     the dot-pattern from its own fill, so this is now the one place the site's
     background texture actually lives, reading as a distinct textured backdrop
     behind the now-flat cards instead of one continuous pattern running through
     both. */
  background-image:
    repeating-linear-gradient(135deg, color-mix(in srgb, var(--ink) 7%, transparent) 0 1px, transparent 1px 9px),
    var(--dot-pattern);
  background-size:auto, var(--dot-gap) var(--dot-gap);
  background-blend-mode:normal, overlay;
  color:var(--type-color);        /* global site type color — defaults to the event-name gray (see :root --type-color) */
  font-family:var(--font-sans);
  font-size:16px;
  line-height:1.55;
  overflow-x:hidden;
  /* custom cursor: a plain lime (site accent) dot — hotspot centred on the
     dot so clicks land where it is. Fallback for touch/imprecise pointers;
     mouse/trackpad users see the JS-driven .cursor-wave dot instead (below). */
  cursor:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Ccircle cx='8' cy='8' r='7' fill='%235390d9'/%3E%3C/svg%3E") 8 8, auto;
}
/* the same drawings as a fixed, low-key layer behind the whole site — z-index:-1
   keeps it under all content but above the body's own lime/texture canvas; overlay
   lets the white lines lift the lime and the dark haze deepen it, instead of
   washing everything grey. */
body::before{
  content:'';
  position:fixed;inset:0;
  z-index:-1;
  /* tiled at a smaller size instead of one full-screen (cover) copy */
  background:url("../assets/images/drawings-kasia.png") 0 0 / 600px auto repeat;
  /* parallax: js/main.js sets --bg-parallax from scrollY so the fixed drawing
     layer drifts slower than the page content, reading as a deeper plane. */
  background-position:0 var(--bg-parallax, 0px);
  mix-blend-mode:overlay;
  opacity:.35;
  pointer-events:none;
}
img,video{max-width:100%;display:block;}
a{color:inherit;text-decoration:none;}
h1,h2,h3,p{margin:0;}
button{font:inherit;}

::selection{background:var(--purple);color:var(--bg);}

/* ---------- texture overlays ---------- */
.noise-overlay{
  position:fixed;inset:0;
  pointer-events:none;
  z-index:80;
  opacity:.05;
  mix-blend-mode:overlay;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
}
/* ---------- header / nav ---------- */
.site-header{
  position:sticky;
  top:0;
  z-index:60;
  height:var(--header-h);
  display:flex;
  align-items:center;
  /* the bottom ~20% of the header fades out (see ::before mask), so the nav is
     centered in the SOLID region (padding-bottom shifts it up) — this makes its
     gap to the top edge match its gap to where the gradient starts. */
  padding-bottom:15px;
}
/* blur lives on a pseudo-element, not .site-header itself — backdrop-filter on the
   header would make it the containing block for its position:fixed .nav descendant
   (mobile menu), collapsing the menu to the header's own 64px height. */
.site-header::before{
  content:'';
  position:absolute;
  inset:0;
  z-index:-1;
  background-color:color-mix(in srgb, var(--lime) 90%, transparent);
  background-image:var(--dot-pattern);
  background-size:var(--dot-gap) var(--dot-gap);
  background-blend-mode:overlay;
  backdrop-filter:blur(10px);
  -webkit-backdrop-filter:blur(10px);
  /* fade the whole blurred background out toward the bottom edge — no hard border
     line or cut-corner notch, just a smooth dissolve into the page. */
  -webkit-mask-image:linear-gradient(to bottom, #000 80%, transparent);
  mask-image:linear-gradient(to bottom, #000 80%, transparent);
}
/* notch filler removed — the header now fades smoothly, so there's no cut corner to
   reveal and no hard edge to patch behind. */
.site-header::after{ display:none; }
.header-inner{
  width:100%;
  max-width:var(--container);
  margin:0 auto;
  padding:0 20px;
  display:flex;
  align-items:center;
  justify-content:space-between;
}
/* ---------- Book menu (top right of the header) ----------
   Button + dropdown of the three bookable services. Opens on :hover/:focus-within
   on desktop; .is-open (toggled by js/main.js) covers tap on touch devices. The
   dropdown's padding-top is a transparent hover bridge so moving the pointer from
   the button down into the list doesn't cross a gap and close it. */
.book-menu{
  position:relative;
  flex:0 0 auto;
  margin-left:16px;
}
.book-btn{
  display:inline-flex;
  align-items:center;
  gap:8px;
  padding:9px 18px;
  border:none;
  background:var(--ink);
  color:var(--lime);
  font-family:var(--font-sans);
  font-weight:800;
  font-size:12.5px;
  letter-spacing:.08em;
  text-transform:uppercase;
  cursor:pointer;
  clip-path:polygon(0 0,100% 0,100% calc(100% - 8px),calc(100% - 8px) 100%,0 100%);
}
.book-btn::after{
  content:'';
  width:6px;height:6px;
  border-right:2px solid currentColor;
  border-bottom:2px solid currentColor;
  transform:translateY(-2px) rotate(45deg);
  transition:transform .2s ease;
}
/* [2026-11-12] the "Contact" button opens a modal, not a dropdown — no chevron. */
.book-btn--contact::after{ display:none; }
/* [2026-11-13] Contact button more transparent / less bright than the solid --ink fill —
   a translucent ghost with light text + a faint border instead of a bright pill. */
.book-btn--contact{
  background:color-mix(in srgb, var(--ink) 14%, transparent);
  color:var(--ink);
  border:none;          /* [2026-11-13] no border */
  font-size:10.5px;     /* [2026-11-13] smaller type */
}
.book-btn--contact:hover,
.book-btn--contact:focus-visible{ background:color-mix(in srgb, var(--ink) 26%, transparent); }
.book-dropdown{
  position:absolute;
  top:100%;
  right:0;
  padding-top:8px;
  min-width:230px;
  opacity:0;
  visibility:hidden;
  transform:translateY(-6px);
  transition:opacity .18s ease, transform .18s ease, visibility 0s linear .18s;
  z-index:70;
}
.book-dropdown a{
  display:block;
  padding:13px 18px;
  background:var(--lime);
  border:2px solid var(--ink);
  border-top-width:0;
  color:var(--ink);
  font-family:var(--font-sans);
  font-weight:700;
  font-size:13px;
  letter-spacing:.06em;
  text-transform:uppercase;
  white-space:nowrap;
  transition:background .15s ease, color .15s ease;
}
.book-dropdown a:first-child{border-top-width:2px;}
.book-dropdown a:hover,.book-dropdown a:focus-visible{background:var(--ink);color:var(--lime);}
.book-menu:hover .book-dropdown,
.book-menu:focus-within .book-dropdown,
.book-menu.is-open .book-dropdown{
  opacity:1;
  visibility:visible;
  transform:translateY(0);
  transition:opacity .18s ease, transform .18s ease, visibility 0s linear;
}
.book-menu:hover .book-btn::after,
.book-menu.is-open .book-btn::after{transform:translateY(1px) rotate(-135deg);}
/* mobile: header holds logo + hamburger + Book — keep the button compact */
@media (max-width:859px){
  .book-menu{margin-left:10px;}
  .book-btn{padding:8px 12px;font-size:11.5px;}
}

/* ---------- hidden design picker (internal tool, not part of the public site) ---------- */
.design-toggle{
  width:22px;height:22px;
  margin-left:14px;
  flex:0 0 auto;
  border:1px solid var(--ink-muted);
  border-radius:50%;
  background:transparent;
  color:var(--ink-muted);
  font-size:12px;
  line-height:1;
  cursor:pointer;
  opacity:.45;
  transition:opacity .2s ease, color .2s ease, border-color .2s ease;
}
.design-toggle:hover{opacity:1;color:var(--ink);border-color:var(--ink);}

.design-panel{
  position:absolute;
  /* .bio-card/.contact-form/.contact-direct get a stacking context for free from
     their own opacity/transform scroll-reveal (see .mission-note's comment on this
     exact gotcha) — this panel and .hero-note have no such animation, so without
     isolate here their z-index:-1 ::before fill (added lower in this file) would
     paint too early and end up hidden behind this panel's own background instead of
     showing on top of it. */
  isolation:isolate;
  top:calc(var(--header-h) + 8px);
  right:16px;
  z-index:90;
  width:min(320px, calc(100vw - 32px));
  max-height:calc(100vh - var(--header-h) - 24px);
  overflow-y:auto;
  background:var(--lime);
  border:2px solid var(--ink);
  box-shadow:0 20px 45px rgba(10,9,14,.4);
  padding:16px;
  font-family:var(--font-sans);
}
.design-panel[hidden]{display:none;}
/* [2026-11-12] FIX unreadable lower half: the panel used the border-fix (element bg = light
   --ink "border", ::before = the dark --lime fill). That ::before is position:absolute;inset:2px,
   so inside this SCROLLING panel it only covered the first screenful — once the controls scrolled,
   the lower half showed the light --ink element background and went unreadable. Give the panel a
   solid --lime fill (covers the whole scroll height) and drop the border-fix ::before. */
#designPanel{ background:var(--lime); }
#designPanel::before{ display:none; }
.design-panel-head{
  display:flex;
  align-items:center;
  justify-content:space-between;
  margin-bottom:10px;
}
.design-panel-title{font-weight:800;font-size:14px;color:var(--ink);}
.design-panel-close{
  width:24px;height:24px;
  border:1px solid var(--ink);
  background:transparent;
  color:var(--ink);
  font-size:15px;
  cursor:pointer;
  line-height:1;
}
.design-group-label{
  font-weight:700;
  font-size:11px;
  text-transform:uppercase;
  letter-spacing:.06em;
  color:var(--ink-muted);
  margin:14px 0 8px;
}
.design-group-label:first-of-type{margin-top:0;}
.design-swatches{
  display:grid;
  grid-template-columns:repeat(4,1fr);
  gap:8px;
}
.design-swatch{
  aspect-ratio:1/1;
  border:2px solid var(--ink);
  cursor:pointer;
  padding:0;
  position:relative;
  overflow:hidden;
}
.design-swatch span{
  position:absolute;inset:0;
  display:block;
}
.design-swatch span:nth-child(1){clip-path:polygon(0 0,100% 0,0 100%);}
.design-swatch span:nth-child(2){clip-path:polygon(100% 0,100% 100%,0 100%);}
.design-swatch.is-active{outline:2px solid var(--ink);outline-offset:2px;}
.design-swatch.is-custom{
  display:flex;
  align-items:center;
  justify-content:center;
  font-size:18px;
  color:var(--ink);
  background:repeating-conic-gradient(from 0deg, var(--lime) 0deg 90deg, var(--bg) 90deg 180deg) 0 0/60% 60%;
}
.design-custom{
  display:flex;
  gap:10px;
  margin-top:8px;
}
.design-custom[hidden]{display:none;}
.design-custom-field{
  flex:1;
  display:flex;
  flex-direction:column;
  gap:4px;
  font-size:10.5px;
  font-weight:700;
  text-transform:uppercase;
  letter-spacing:.04em;
  color:var(--ink-muted);
}
.design-custom-field input[type=color]{
  width:100%;
  height:34px;
  border:1px solid var(--ink);
  padding:2px;
  background:transparent;
  cursor:pointer;
}
.design-texture-controls{display:flex;flex-direction:column;gap:10px;}
.design-texture-field{display:flex;flex-direction:column;gap:4px;}
.design-texture-field-head{
  display:flex;
  align-items:baseline;
  justify-content:space-between;
  font-size:11px;
  font-weight:700;
  text-transform:uppercase;
  letter-spacing:.04em;
  color:var(--ink-muted);
}
.design-texture-field-val{color:var(--ink);font-variant-numeric:tabular-nums;text-transform:none;letter-spacing:normal;}
.design-texture-field input[type=range]{width:100%;}
/* [2026-11-12] Dark-panel range sliders. The browser-default track is a LIGHT grey bar that
   read as an unreadable light band on the dark (--lime) panel, with the light thumb lost on
   it — so draw our own dark track + a clear high-contrast thumb (both texture + hero-paint). */
.design-panel input[type=range]{
  -webkit-appearance:none; appearance:none;
  width:100%; height:18px; background:transparent; cursor:pointer;
}
.design-panel input[type=range]::-webkit-slider-runnable-track{
  height:5px; border-radius:3px; background:color-mix(in srgb, var(--ink) 22%, transparent);
}
.design-panel input[type=range]::-moz-range-track{
  height:5px; border-radius:3px; background:color-mix(in srgb, var(--ink) 22%, transparent);
}
.design-panel input[type=range]::-webkit-slider-thumb{
  -webkit-appearance:none; appearance:none;
  width:15px; height:15px; margin-top:-5px; border-radius:50%;
  background:var(--ink); border:2px solid var(--lime);
}
.design-panel input[type=range]::-moz-range-thumb{
  width:15px; height:15px; border-radius:50%;
  background:var(--ink); border:2px solid var(--lime);
}
.design-type-list{display:flex;flex-direction:column;gap:4px;}
.design-type-option{
  display:block;
  width:100%;
  text-align:left;
  border:1px solid var(--ink-muted);
  background:transparent;
  color:var(--ink);
  padding:8px 10px;
  font-size:12.5px;
  font-family:var(--font-sans);
  cursor:pointer;
}
.design-type-option:hover{border-color:var(--ink);}
.design-type-option.is-active{background:var(--ink);color:var(--lime);border-color:var(--ink);}
/* [2026-11-12] fonts are a dropdown now (built by renderTypeList) instead of a button list */
.design-select{
  width:100%;
  background:var(--lime);
  color:var(--ink);
  border:1px solid var(--ink-muted);
  padding:8px 10px;
  font-family:var(--font-sans);
  font-size:12.5px;
  cursor:pointer;
}
.design-select:focus{ outline:none; border-color:var(--ink); }
.design-select option{ background:var(--lime); color:var(--ink); }
.design-panel-foot{
  margin-top:16px;
  padding-top:12px;
  border-top:1px dashed var(--ink-muted);
  display:flex;
  flex-direction:column;
  gap:8px;
}
.design-copy,.design-reset{
  border:1px solid var(--ink);
  background:transparent;
  color:var(--ink);
  font-family:var(--font-sans);
  font-weight:700;
  font-size:12.5px;
  padding:9px 10px;
  cursor:pointer;
}
.design-copy:hover,.design-reset:hover{background:var(--ink);color:var(--lime);}
.design-copy-status{font-size:11.5px;color:var(--ink-muted);min-height:14px;}

.logo{
  display:flex;
  align-items:center;
  gap:10px;
  font-family:var(--font-serif);
  font-weight:800;
  font-size:24px;
  letter-spacing:-.01em;
  color:var(--ink);
}
/* themeable mark: the source is a raster PNG (no vector available), so it's applied as
   a mask (using its own alpha channel) filled with currentColor instead of drawn as an
   <img> — that's what lets it recolor with the duotone picker the same as the wordmark
   next to it, rather than staying a fixed color regardless of theme. */
/* the four rotating logo marks, embedded (like the old mark) because a mask-image
   pointing at a separate file is blocked by the browser when the site is opened
   locally (file://). js/main.js sets --logo-mark-url to one of these per load. */
:root{
  --logo-1:url("data:image/png;base64,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");
  --logo-2:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAACgCAYAAACLz2ctAAA8+klEQVR42u29d5hcV303/vmec8vcKbuyjYxNx4Apa4rxWs0y7FjNFthWmwlgkkBeQJSQ5AWSN5D8mNmXhCRAEkKAYMqbUEyZVXMTtlVm3FRs2WCwTMeYYoxVrJ1y+znf3x93RlqrrqSZ1cre8zz7PHpGU+6953O+/fv5Esa5mJnKtZosDw0pIuLO69fddOcZqZR8IZF8kWb9PAE8G6BpDEoRaYMZLhGaYIRM5BLzLi3kY0Kougqwl5n39PX17a3/dmC0WCR1rGuo1WoSAHbt2sWFQkGPvZapdfotYzxvqlQqkogUgHgYwNrN2y4iogXMeB0zXwDmc0zTNKWUICIkiOjggkAdACUogtIKWhFYxhokWi2v0TDO2r579aZtvyPgdyD8nlnvAovfk+THdCwf9aLdu4moDiAee22lUklgaEiUh4Z08tNTgDydFh1T6pVBw8OkS5WKdeEzzytA65UgujSdzkBrhSgMEccxtNYMgI8lkZiZABARgYiIhIAQAlJKSGlACJFcFQNaKURRhCgMQibaTYRfEeMHDL4fUjyICD9dtmDmnicdFmYJADvLZR4eHtZTW3yaApCZBRFpAFizaesyaZh/b1v2hZoZvueCGTERqP2+Y4L5KL/D7Q8ziBgM5s6Xtb9fSElSShiGASkNMDMC34fW6nEw36+B24Sg6jS4D+bz+fiAdGQxUAYVgClVfToBsFKpyGKxqCrr75hup51/N0zzGjAQ+J5CAjY5kRfJzB3JysxgIiZmCMM0ybJsCCHQajYBwkMEvoMZd5Ah7lr6+hm/GXugRkZGaMpunOQArFRYFoukvrm+dmEmk/2O4zgvaTYaKsEAicl08W1gajAYBMOybZimBa0VPNdrEPh2FuI7poqrV86f87v9krFaNVCr6SkVPckA2FG7le/eNTuVdm6ShjzTd72YBBmnwb1wos9JE4GEEDKVcsAAAs/dBxK3MfE39nFrw9vzeb8j6QuFAndMjal1CgFYKpXE8PCwXnXnPecZmrYY0nhm4PuKiOTpeGP7pSMAIaVMpRwoFSMMg58Q0beI4+uuzs/5eccxGhkZEcViUU1B4tQAkEqlEmFoSLwqtjdlcn2vazUap4vkGx8YAc0AWbYtLMtGq9V0paC1YP3Zq/Ozth1s/05BYwIByMySiNSajVvfms7mvt5qNmMiGE/Re9bM0EIIw0mn4XsuANwGwueWDM24oWOKlMtlTNmIEwdA+uIX7zPOelF0n5NyLggCX0+0p3uqpCKIpJNOgzUjDMPblVb/d/m8WZuBJKZYJJqShhNhA67ZsHWumbLvDIOAqR3YexotxczkpDMijiNorb8RBuqjxUWzHh4TOJ+Shj1YB8Iqggq2nQLwtDzxkoiE77kqCkN2nPRb7ZRx79rN97yXiJiIdCfDMrV6IAH/u1pNTdPO/aZtvzwMfA1MrnjfKVDPyjAMaadSCH1/swrU3yxdNOu+ErMojyPdOLWOUwJmwvTLGHhRFEZ4uoMPib6VcRyz22wq07Yvk4551+pN2z40TKSJiEslFlPQ6SIALYtfbJqmpbWaOtkHQEggkm6rpVQcp7LZ3Cevr91Tue6mO88YHiZdqVSmVHK3ABjHPF1ImRQETK1DpKHWmpuNRuyks4Vsxtn0jZs2Pb9YLKopEHYJgCRhEmgKfUeRhkQwGqOjsZWyL8xm+zau2nDnecViUTFPqeOTB6AmzVPwOzYQBRluqxnbdurFhrRvXn3r3WcTkZ6yCU8SgEzcYmY87aJ/JyYNDbfZjJ1M+mVkGt9Z/9Of2ijvL7SdWse5jDYK/6DiGJiC4LglYbPeiPumTRuqP7Lnc8Pnn/+OgcQePOUx1KSKvUwDAwMEFLBzeo2GANQADAwNMUZGAAA7CwUuT4KQEgHAuk33vFSxul9KmW6X1k8BcVy7jTiTzRqNZv0dK+bP+cqpKmRgZhoBBEZGcCK/X6mwROHUtDEQAFx77Q5z+ovVDjtlvyrwPI3JWHgKelKMqFMVfSrThszMhmkyGA2l/IuWzZv7ixKzGJ6gtF2pxGJgYITGgq5afTj1hN7zbIjoXB3jmUKKLBRLBa1Iki+0rINVQ4n4CVs4f7gqP7j7cGCeqDYGAwBWrhyM1mzcusky7Vf5nq9pbIru1KNPSWlIJ+0YRJQ0jABg1giDAFEUMYEUCAITfN1ERHEU6Uw2299qhP8JYPHAyAhNiMQbGRGdNtbVt959tmGZCxXzVU/wHy5i5mebwrKNjAkhCJ0uL2aGVhpKKSAmFanoibWbtz9ChO9rUE0KfTcRPdwxJSZCou9/WN++Zdur045xn1KKJkNogZk1AMrm+qjZqNdBWAvQPjAsQBsgOodAF5uWdY5l2QgCH3EUKTDThEtwZpXOZqXXcq9ZOm/mNzttDb3Yrwqz6FTojGzaPmAK8V4Qltt26plEhCgKEUcxtFZjKr3HWFXMxAAJIUi0G70MwwRrDddruYLE3dD49u7GoyPvWLKk0S5UZvQoRtwpxxJEpFfddvc3+qZNu6YxWj9lxahJlxwp27YNBkOp+FsSqnTl0OyfHfzem+78wRmxCl+jdbxUEC2xU85zVawQhoHCRJaTMWvTtikMgl/Jpnr11Vdf0mxLyK5t2ljVvrq67TmSjI8Q8LaU4zi+50GpSCU4I2r379B4nnQCrKSNgYSQKTsFEgJB4P1Mx7q8dN7MbwKgJErSfZVMHVuiXAavqW1/toS4T0h5dhyFCpjocnxWQkiZzmTgu95DCvpvlw7NuLFjKO+cXqOBoSEGgJ0Aj7W11lar08DZ5ULgA5Ztv8JzXdU+WDRBB0dlc32y1Wr91bLLZvxHN2sJO99VKFTkNe87731g/ffpTGZ6q9mE1hwDLLtxn502BmaGZdvSNC34Xuvaq4dmvLcjAbsNQjr4hK267e5FtuPcrGMlYxVPSE9IcuPQTjorg8Cvk+bP1P3dn/zjxYvrR6tO7thCQAEdlXftDTekz86e86lMNvueVrOhtFaCSEwACFlblk1B4P9cpfHq4uzZPp/kho3tVals2PJK27T+M+U4r/c9D3EcKaB3ThgzawK4/4wz5ejePf+zbMGct7dtQt1NdbxfzQ4T6UqF5YqFdOvIbVveYqfsr6Usx/Y9L0ZSL9erG1VSSply0tL3vBtDHfx1cd7cn3SMYDqKFGlvrupsVq1Wk/l83gXw3tWbtu9yUqmPRlGIOI5171tKSQRBoO1U+iWB680F0YaRk4gNlkqlDjGAWrVh27ss0/iUaVm5ZqPRkXg9FQyd5zW674koN+2Mt63auOVHK+bP+US3HZMnbUqxSKpSYVlYOKcSeq15Oo535vr6DSklMSPebzV0Zylm1ulMVgoSDd9v/eWS/MVXFefN/UmpWjWYmY7nRomI8/l8zMzEzGL5vJkl13XfRIL2maYl2k5Nr/1ibZomE9E8ANg5fTqdKPiGh4d1qVKx1m6+54vZbOZazTrnui1FBGMiQ0/MbLitpjKlWV636Z6XFgsFXeqik3rIFyUgrMgVi1539x+e+O1sz23+AxHtzeZyhmGaxMyqDR4+zhvh5HMJuVDKSUvHSYvQD9YHSs1eMjTzM6VSSZRKJTGcz8cnqro6FczVKhsrFsz+ThD6VxFRQxoGdfkAHea3QVorYuaLAAC1mj5R8N1www3p10x/wZpsLvdOt9VUSik+FS2yRERxrDiVTjuKVQlE3M1Q07i4Ydbecs9zZUq8U2t+p5NJn6PiGEEYQCulgeQ9BKYnfRtTm+OFiQFhGAaZlgXDMNBqNplIVDXjM8suu/j6jpPR7dDFtTt2mCsHB6PVG+5+g5VyboijiNshpl5JEG1algiD8BdOuHdg8eLFQdsj5XEeUhoZGRHnnXee+HVdrcvl+hY3RvdFIDJPdVQMAKSUUaj0awvzZu4ci4+u2ICHQb7uPJCll8/4DYCPVu64/z9Vq/lmARTAuMhJpx0pDdF+eHgSJRsRiJLXwyBEGIV7tef/MJS0WUp501WvH7y/89DLZVAv4mYrBwejapWNfJ5uXr1h6xdz/f3vbtRHe+ZYMTMppQDw9NDoOwvAo8fz+XKtJoeLxXj1xm2f7+vvX1zfty8mccrBhyQMg9hx0lbcbPwZgA+OdOkQj+tLSqWSGCiXaWxYYdWGe86TpF+lCC8n4HnEOIPBqQR2iADUQXicCA+TpB8pP/7x8kWXPH44D28isgY447ysKfU9lmWd7/teT50SIQQQ8cVLFs7cMV5J0dEAlVu3rOzr7/uC22rGwCTqzWZoy7ZFEPg/UefkXlW84IIQ+4n0egzAsZt5OJbU4/l8rVaTQ0NDeiLbHDue20h161DKsG+Jo8jsYbZHpRxH+k13+bKFs9eMx7TogHTktrsG7ZRzJ2ttxnEsJlN7LDOzEIJY61BrXLBi4eyflUoshodPbh+P64S1QRcPd6TiQJmmT6/RrnaZT6FQYAAYGRkhoIDp02sEHEKnG0/0wysWi6rCLAtEtVUbttyczfUtdZvNGD1gf2AGS2lAC3oWgP3P4KiHGkBlyxZHeuIrhjRSfuiqydabTUmGBdIwLGZ1FoCfDQycvDNywhuQBIaHcbqs6bUaMTOt2bz9egDLGEzUI1+EkmqOs8bz3pGRETFcLKqRDVv/Ntvf96pGfTQmmpycPB0pSH5k9ywM81RdQ22zQQj7hlaz8ahlWRKA7uFmpY9pWzOLQqGQMJIZ8oOe25r0lCicUOOqKQCeQHywUqnIpfkL9xHRZy071XHde/N74tg28sDICBERUxB/KJ3JZOJY6clLi5JIvziOlUW0F0iqqqcAeBxr586dDABCxV9tNRsNIaXsRXCaGWBg97EiC8ViQd9U3X4OkXiz57oMTGb6D2IpDQB4POTG7wCg3IWc8NMKgMPDw7pUKoklC+c+CvAdqZQDQne9cSKQUjEI/EsA2NWu3jmMSSAA4oj1NZlsbppK8tWTuBWC2bQsBvBAccGC0XauegqAJ2ALCgDEGutJCHS1HTVJe0jf8yIt9EMAsLN86A8wMw0NDalbv//9DDPeG4aTn5GMGRCCCIybxzzHKRvweFdtqKaT5ylvcVtNT0opu2YLErFhWmDGr142vf+XidQ9VEqMjIwIIuLWHve9mWzfeWEQ6Em9F8wspRStZrNJpri+49RNAfBE1DAlanjFghm/ZOa77VQK6FZQnJlN0wQRPXDBBReEbeoOPlj6FQoFXblly5mA+EDge5Nf+gHaSWeIgXVLXz/jN+0yOZ4C4Inr4c59PySEBHdJDzOIhSCwVlsAYPphyrHKtZokIjYN8SeZbO6cKIomtfRjZjYMA77nhhDiXwBQoQveb2cZT0v8oR1C19zsouxhIhitZisWprWxrab0wdIPgFq0ZYvzmIv3RuFpwUYbp7M5c3Tv3o+tWDjnwWMVCU9JwOOLLPwmsf66QKvBzJZlgbV+eBo3ftT2iJ8kKWpt6feYx0ucTPolQRDwJJd+UV//NLO+74nrly+Y/bEkp17oatTgaQnAXbt2JfFAKXd4bqs7lTFELA0DDP51Pp+PS6WSOHhyZ22/RJR/AtCkZVplZgaz6uufZrYa9e/uds23AOBCoaC7PY30aQnAYiE5xZa354dKqV+alpV0up9cmIKllADo3sOFKUqlkhgm0t+65Z7ngjE38D2ahNRuzIzYMAxyMlnZbNS/+MgP9yxdedWgm5yx7h+Yp6cKJuJStWosXrw4IOBG204Rn2RAmgjCbbkMGCOHs/8GymUCAMvQM1PpdFapSZV20+1WCcrmcgaI9rR89+1LL5u58i//8viquqcAON5VawOE1OdarUbLMKQ40bSc1hxnc31C63jV8vmD9xcSQ/1JAJxeS8qyiHBpW1KesrEPY/tzmJlNyxLZvpwhpBF7buubbsufuSI/83+YWfQSfE9rAHZ4npfNm/sLFet/TmdzAuD4BDYzSqfTRqvVfNTk1P9mZnpFO+c8VkDm8/m4wiwZyEdRBMJEqV/WHbAhaShjwzTJSadlri9nmKZFcRj93Pe8fwf0jCX5Gde8efHcX7S93Z4TFD3FaNjanVAHrXK5TEAZKI99MfkbAOiJ++4Tz9gXr+ufNm1xffSJiDmZG3IM4GkCOJPrk0Hg/95t+le/afEl9x6OHavz2prbtr4ckh4gIpO1ZvRYBTMz23aKpJFMomdm+L4HrdQuMP0QElXEuhY/wfcVi3O8zrViAseUnXZxwKQSe4A6Qd5du3bxzp0727x2xEfYUgaGD62fHd4PED5j48a3NBry/2Vz/cvCwEcYBJpBOun2a7c+7Mc3y5STFlIIBIF/c1h3/+JNb7z0l5VK5bB0HEO1mhgGNCTNTmeypttsKPS8xZLYMA0Kg+AnHPiPEOFnzPx9aPEgEf1s2YKZe8a+u8IsCwlh5YSaBsZpAbhymXbWajScz8dHO5nt1JcEXgHgIbSmTxfTjbOcIHYzFFNaEBuwgCgikhoRW7Lx29bje/+SKAAwCmD5uk33vJ0M8X9S6cxLTdMUWiskwgr7Sbd8z0UUBNtiIf7t6qHBkba0EUcK0HbCPsz8ukTo9Tj8wqxtxxG+731g9zTjsysHB6PDSEeq1WpyTLvEKWF3nZQquEOSeDjGzsqGO59nSuslzPo8ZjqPiJ/LjHMA9IOQTg7VfoklQcgSkGbmFAFiPwsxswbBZcYuIvoFkfieELT56qGLNwDA2s33XQRSedY8g8FnEOAx8S4B8RBB3rXkssHtnWstl8t0xIPBIBC4Wn04tSd+7EE7Zb8oCsPepd+YVTqTlW6refOy+bPfiITZikYA2lmr0cCT+3NO+TImHfBG0JEkCgBu2LDjebFQswg8RwOzCXiFaZpZw7QgBCWki1pDa05CedzWuCAwGDz2/54cN5FCiH4pZb80zBdLKRaFYfi3azdt/y2Db9Ec3ohIf235oks+dTSJ277WI25mZaQiiiiqJ+jxC03TOC8KAu4pfyGRCMMwZpbDnYNMk3jipzFZgNdO0scA1HU33XlGJmMvAbBCsbrUcZycEBIqjhGGAcIw1GEQMIOSHBolp5wOken0JPb6A/YhAcyItYZSihGGzEmXkjBN8zmWnXoHEb2j1Wzo62s7tjH0V8LHf/WNYrEYrl+/3r7iiisiIuLx9DTvL0iI+Qonl6FGox5T7567SjmOdN3WthUL5tzLzDTZx80ap1ziHTih8a23fj/jWuF7CPQXKcd5LjMj8D0kXH9JG1vb1hI4qKftSA7lER3NA5+nseCMokhHYaSTTJmQpmXOkdKYg2e+8N3fXl973+LFQ/e2bc1xGev5/FAyUYnwhigOAbDoleXDDDYMAwLiBwCoXKtJnII22NMiDlipsCQiLhKpyvo7pq+t3fNezwzuTWcynxRSPLfVbCjPbSmlFAOQ7QnucgKyByLpFybJzOx7nmo2GrFlWhens7nqqtu2Lh7vmK5kgA2xddazXkzABWEQgHpqdzO1RfmPAfDQaRDVmHAAlkpJdL1YJLV2bXXauto9H7Wc1ANpJ/05wzRf3qzXVRSGHSYoeYrTVdQBv+e2FICMZZvfHtm0faBYLKpj0pQN1QQAKJYXptJpi5lVj2N/IvADMOIHxnrfUwBsq9tqtWoMDyfR9bWbdrxFnJHbkU5nh0mIc5uNhgrDQBORnIw1ckRCRmEYm5aVI9ZfLlWrRjm5sSNe69CBz14ou1j4eqSgs2maFIXBH2Q9/AEAFAqFST/lfUJswDHeYrzmtq0vl7b5L5ZlXxnHERr1+oQwfnYHhGS4LTfu6+ub9ap9/OdE9OlKpSKLR2BBrbX5AYn0a5TW6BkVQ+KHKctOyTiOa0uX5vd1u3D0tATgkziOK1sc65nmB4nxN7Zt59xWSyFJdBunU0aQCMLzPCYp/q5yx/3XFV/32l2HS9i3X9Pr7rorpzwMRFHY07grg4XWirTmZBYXCqfF8zR6CL79HMerN2y53LCsTziO80q31UKr2Uw4+k7P0XQijiKVzfU9o9UY/SMAn60dxttMyNOh4lC8yrTMZ7ft2l6ZPNo0TeG1Wn+QhrMpUb/QT1sAVpglEalrb7ghfXbu3E+YhvE+ENCoN04bdXsMVcysNTNoEYDPHlz7Nzb+J5gudVIOmlGsevW8maHtVErEcXzj0vyFp4367QkAq9WqkSeKv3VT7eWZXPZrKSc92GzUdXvQifGUKMBhFrGKCYTz2uEklfSVHFDDtQP80AuVUgD1NPwiwyCE0nzd6fYoje7tSWLv5fP5uLJhy+Upy/qaaVrTG6OjMQky6Kk0CZYIrBkAHDxnqwXAYz4QzN5PNL5hx/NixDOCwAeYRS9MDmbWqZRDQeD/YO8vzbvbtqc6XR5lV2ySpAEnIYJcvWHrX6Qs62aAprtuS52qkV89dq5AggBGc+fs2UFbLR8Iv7T7QZRQc51MJqOV6mX8jw3TJDC+tHLlYNS2R58+ErDjbAwMDMh11e2fSTmZ97qtFjNrfbrbekcJeWjDMCgA/XQ4IXN/Eg90xybUWr2DNfdyDrg2TUu0GvXfe358HcA0NAR1Oj1L0Q3wrV1bnWaf/YLr05nce91WUzFr0CSbOdzlkAclyWS+GQDKtdr+e23bhHr1xq1vSmey+V6STjIzp1IpgsbnrnnjpU9UKjhpxipmpkqlIqvVqlGpVGQnc8XMVCqVBDOLCvOY/y+JkzvMJwm+b66761np/tQ6J+1c3GzUJy29bDdtLsu2KQiC32k2LyguGKx3Jkl2agNnXnFN1m/tfcC0rOf3qvyqQ5kRq3ivKcyXXTl00Z6Oh368gANAtVpN1Go1fSKl+J1qJpzA542TAd/Xv3v7uZlU6hbbSb2yWT91I14nEHwshNCmaRpRGH1wxfzB0bEhj5ERiOHhYbV67qK/yfVPe0EvZ5IgIQyS9dF9X75q3uDu4x30kxRTFDCmnlEDwJoN289iwa8WhEGleUAAZwOwINBuSWBPgH6rgZ9C46cmjB8S0a/RjoNWKhV5oEWiBwDsDNFbt+6uHNvWGttJvbLVaExK8I1tsyQiRuKq8pPqR5MhpMlUpwPlXnSY71FCCiOTyRmNfXv/YfnCuZWxg/tKzKIA6DWbdrxISP4rt9XqWdUzM7NhmqLZbPyBNP9bW/LyeIE3tgT/hht2pON0eAGBLtXAAiK+0LSssy3LBsDQuj2AqD3zOhlAlNxWHEcIfb+5dvP2ewi0JlTBjcUFl/668zvjqZc8/jkhZdALhmrWGZy+3klnFjabjVOudtsAYQLpDpAASCIBITpTmwgkBET7b+ytd/CmlUIURYjjqDOxHUREhmFSyknB83xXqfAjyy6b/R9toHZ2h6699j5j5crBaPXGLasy2b7lrWajlxOZktnEzfqHl82b/c/jkX4Hz/RYW9t2KbR4M8CLiOg8J52B1hphGCCOIgZIdYp9D7GAuV0IDBZCSmHZKUgp4XmtfQS6rtGsf/Ktb5z3SKlUEuVy+agUJMcDQCpVq3I4n4/XbNz6jVz/tGvao6ROFfg0M3SCKyk7c+gAQKkYYRBAaR0A7BPIZ+aQQC0Aexi8GyDFxCSAmBk+ESlmvJAI5xPRuZZtgwCEYQQw/xZE60Ol/qM4f9ZDY1svS8ziWV/8oly5cmW06ratH8xkM5/yPLdnE9s7tp9Sak/KtF5xxaUX7j6W7TdWGq3dfM9yEvR+QfR6O+UgDAJEUQgwYhxBAxzrejpDrqVsDxv3vF1xpD66bP7MLxwO/CekgqvVqszn8/GqDVv+OtvXf029HWA+BeJOJ0ykprTtlFAqhud5De17P/YYDwpBD7JWD2tFj8qMuZsbLTcmM4AdhNMBP5/PH7VCuLJhQz+x8xJoOheIQYIet9L0o8WzZtX3qzBAD1QqEoUC2iXveu3mbe8yTOuTvu91wjK9CgKplJM23EZjzeLXvXbXMVQdVSqVpBhk4x2vSJnpT5uWtYCZ4bkuR1GsiCCwvwgXxx2ubINVEhGUUtyoN5RhyOmZXPa/rq/eO5fN4D1L5lLjcP3S4wZgpVKR+Xw+XrNh61wjZX3cbTVVwug+odkNDWa27JQ0TAOu6/5axc1boPRtMGj7svys3x6P1zdy8MjRQgEFQBPRKIAdhzyDBx+08NBDKBQK0dhB2auqO15mEv+9kPKaOIpYa009rGdkIUj4nqtiVl/A0aedtlsNSK3etO1PTNP8jGla/e3CWrTNg64KkPZ9G3Ecc6vRUNm+vmtcj87/1i23L38z0W8ONzfvmBdQKpVEoVDQ12/c+kwWxtcJZEwksU7bvtOmZUnbtuF73kNRFPxHrIzvFBcMjj75oLCcPr1Gu3YNMTCCnTt38ljjPOntpbFjPQ97v8961pXyjEtS9Ptf/5r2bt8eDQ8P6/ZwvsR+qlanQTmvhKQ/ItJvSzmZTLNR5wN70DPhrzO5ftkcHf2fwoJLvnekXuRSiZM8DRGv2bj1kykn/aEoDOC2mmoikgMdINZHR+NsLncxa33L9Ru3XkZEf+ikKccNwIGBASIivXrD1i9lM+kXNBujikjICQKfMgxDppy0DDzvYddt/btsyK8svWqW2wEcAOzcmfQPjzXE2xJAjIyAOqVxlXbLZocoqLOSWXdAodBhBjjwgEolFmtvf8NzdaReJoC8JprDms+XpnFuKuXAc1toNuoTsbHasmxym60/KEN+uO35HsHeI1VCyXj15m1fzeX639KsjyqdgHVCM1NCkNFqNqJcru8VzWbj68x8eRkAl8v76yeNY6neYrGoVm3c+rZMNndlq9GIiYQxQVKPM9mcDHx/j+e6n2YYn12aH9yXAIllW12qg9XOyAjEzp3lDsXEcaelrt2xw3zmvvglMXA+ES8i3j5Xx/xC205lLNtCHCvEUYQoCjkpsZqg8jKGtuyUEXj1vy0umv1YpVKRw8PD6nD79d9rq9POPDP3VcdxrqqPjsYEPmXFIERkNhr1OJvrW7B647bPDy+Y/e6BA12FfEwbYuTWrWcYpvihYZrnJu55b/tIkmAvwU6lKQz9b7GnPrL0itm/Ogh4fDRPDwBW3/r9s0l452uiZ4DZllJCKQUhmME4EyTO0JqzJMgmwGGGSdDPBMT5RHiJnXKkNAxEUYg4iqC13u91H6+n2K2wS70+uq6wYM7Sw4Vd9guLm+48z8ym1qSc9KsnWWYqzuZyRqM++u7l8+dc27neI17cyAhEsUhq9Yat78vkcs9q1nuvZlhrFtKAlAKe7/758stmfa7tgRvtYYPqcDbb8HCZi0VS69evt8PUWStA9BbmYIaU5jMMw0wqV56kGkTb26N2XOuAgx1HMaIohOe5OpmixIITs0a0PUZMpDRhZm3bKem5zV+ERvDOwwWdSyUWxSKp6zbceZ5ppjZYduq8SZiZEp7naSmNT6zadPctyy+b8+sjquBOTdmaDdvPguD3BV7vZ1mw1iwNCSElR0HwJ8sXzLmuwix3lst8pNDJAak3jLXVe/44EuJvUrZ9ATMQBj6iKOIoig4NhDKDD0MQREl8NXFVknC/6HEl6THR1x5np+JQ/ek1i/K7zYNUb1tT8cDsLWeahnGDZdvnuc3mZMxMiTiK4r7+/r5Gvf5+IvoQjqROOzVlJHlFJpt9ZtzjWRbMmoWUkNLcD75qlY0ikTpSTjFRQ0W15ratL7++du9Gx3G+JqW8wG01lee2VBzHTLQfSPJJf0SSCMbBfwBJgAQmSdk2g1Q6k5W+7/3bikVz7i5Vq8bBMb/O1CUh8P8ymcyA22xN2pw8EQnf85iZi2ur35t2NAAm9WyMgu5wk/XQ5pNSsmEYCHzvbQn4qkY+T/GRnaPEBlq14a7lhm3ebdupea1mUwW+rxMQQdLpXoLNrJy0YzQb9fufYT7ro5VKRZYPGo/VOYSrN2x5f25a/9WNemOyF4SIMAxhGMZzdexeclgV3GknrNy0/RyCHgyDgHoW2WeGEIJNKyV8r/XOFQsv+XoCvnx8dM+cVGXDlj9JpZz/UUpRa4LiWxOoeZNSqyj2FPPb8/kX+mNyz533CAD6+tu3vRBa/qPvevoUJAdORApq07JkrOIZAG4WhzofIwIAZEq/0rLs/p4GnYmUnXKE77l/u3z+nC+PD3xFtW7T9telUqmvxHGEOI70Uw18RKRS6bQMguADhfmzf9Apch375MrlmiAijiL9adtxcnEc8Wkl9RkvPKwE3E8nJvBy07IRBqEGoRcFlSqTzUm31fz28vmz/6UNPnWMsJBet+6unGL+iknCiJVST0Xw5fqnGaOjT3y6sHDOF0rVqlE8yBzpFIWsum3Ln2ezfVe5Pay86ZkkFMn1HhlYmp9PhJ6QmbRVDPm+2wxC/nB7fq7GUX6uTePGOmO8O9fX92Lf92I8pcCnmYiQzmSNxmj9X1fMm/2/K5WKHD7oULZfi0duu2vQStmf8j1X82k27YCSyELzsBIwyaMCEHIa945bSTvptGzURz/95ivm/Eoeu56NikSqUtniMHhlEPiTesbaicT6pDSElFK5zeZfLZs/67Pt2N6TDmXntS+vuytnmNZXpZR2FIY9z8vvr7dMbFB5kt+VUMiBfnIECTjSeaeVEBx3H3yWZYlmo/EbIYN/ZWbaufPo1byVSkUAgHgGXmta5ovCIHjKND0xa20YppBShlEUFhPwlYz2oOsx4CuJchlcqVTEmTnjOsdxXuF7nur5c2BWQghKOWlhp5yT1jhCCOH7XqRi3HFYCXhATPaMxpNNyxZxGP3b0nx+X4X5kJzmkexSoWimnUkh6iHNxQSDT1lWSgJwfdf7o8Lll9xUrfIhIag2/TCXARhnPe+r2Vzuyka9l5XozGBoEMlMLidbjUboe94PQVBgvFYIMk5kqBQzazuVosDzHtp7pvHA0W3AHuhfZmZhGLLVbDa0aXwHzLRzHL0MtQP/PO+pQO3BzMyMOJ3JSmb9Bz9ovSEBX/Ww4AOAUq0m11XvuS6bzV3TrDfiNmNsT8wBIkHpbE4KITjw/OsV61nL588aXD5v1kwC7rNse3895HF6vtqybGLgW53REYcAcGdb2jDhCTp44G0XYkCWZQGEB5a/fvD3DIxrIs/AfrtUpNrS+XQGnxJCUK6/zwiD8C7fa8wtLLi0ViodGoLq0J0AwKtU6muZXO7NjUYjRu/ApxwnLYgoCnz3S4ow86qhwSWFBZd8r1qtGu1N/KppWsSaj7f9U1u2LRv10UdVPPqlzsE6BIBD+8EiHu62EOyQaDPzNuBAyu9Ya+f0pH6PmUMA4NMTeJqZOZPNSSGk12o2//FXDzw+v3h5/udJadXhwAdRLBbVms3bPt/XP+3NzXo96p3kQ5zN9ckwCu5m1rOvHprxruVDM+4tlUqixCyGhoZUqVQSmdj+WqMx+pCTSRvtCZvj03xCatM0CdB/Vbz88r2dg3UYLzjhFVaKf6HiuD1Ur7syR0DsO573DyGZqiVAvzgdgUcEdpy0jFWMwPe+o6PoH5cumPPDMZ7tIaEWALpYJLV607Z/yGaz727UR2MAZi8uEYDK9fUZrWbj2/vIffvbL8v7pWrVKA8NaSLSGB7GMPZnyVrrqtv/VEXxZtu2cr4fxCKJ6dGRnRiiTDZr1Ov7SivmzxkZWzp3CAALhUJb3dHPfd+PSQij7YafNArpgGl5/liwH2vtPxRCbAt8D6dDyqkzzNC2U9IwTfiet5VZ/39LL5u5qQOyYqGgxzbqdMZWFIlUqVQy1tXu+Tfbdt7vNps9c7qISKczWaPRqH9h+bxZ79l/bfl8PHyY97ZTgjsqt969JOWkruvr7zun1WxCa46TJhSmpI2YGGDppNNSK41Gfd/frZg/5+MH122KI5wIPEO4v2DmRwzT7J5HQiCtFJj4+W2wj6t7vlAoaGYmvTu6Pwqjn9t26qQnnPcsXsas2pRpIp3NyTgKH/Q998/CXQ9fuvSymZuYWSRSr6jQzu0ysyhVq0ZnbMW6zVtnXpi/suak0u/33ZbiHrV4AlCplCObjfo/LZ836z1t7hc6WkM5UTLmtrjoks1h3Z/luu43SAg/m8samVzOSGdyMpPNyWwuZ5iWRVEYbQkCf+Hy+XM+zty+7zHLOMwPcLsLzl+7edsmy7JfFHUpHcfMpLUGAWeM4VWmY5l1RMQVZlkszvFWb97+n5Zl/UcQ+IomSTC63cTOUkqZctJSxTHiOPp+GMWf2/eI+423vz3vdyRLp6i2w6cynM/H7Tyvrty0/RwzQx8mEu8xTdNs9rK5XXPc1z/NqNdH/2v5/NkfqVRYFgoY1wy5zpyUFW+85BEAf7xmw/aPedpdoFm/hglnguFKIX/CpG5fOjTrzs4ho+Nty9SM74Rh8K5u5YITFcwAYH3xvvsMABF4fPRlRUCXSiWhUupLjUb9HU46/UrPdU9JDvRAMzaYCEbKSQvDMOC2WnXfc29iTdd9XzRvG257te3yMV0sFhUzi5GRkQ6JZAwAazbeO0NILgJ4i5POnNtqNqBU3FPwZfv7jEZj9Nbd04y/TOg6cFwDDIvFomozH4CIfgrgp0d679Eog+koWMGOHTuMXz0R3p9y0hcEvqe7EHXXpmWJMAh+4YRPDCxevDg4npHwnebmkdvuGrRTqRoYmSiKJgKEnPjwpEFMQhjSsm0YhkSr1QISr36VYmPVinkXPXLgwSdSpVwuE4aGxPCYMEtl45ZnW8JawdBvAmFWJmEUQHI/EL0iFewUgXiuu8N1g4XXvPHSJ45nDw67LyUWQ0M10WmH7SQPdu3axcVi8ag5/iPeZKlaNYbz+XjN5u0fyGSy/9qN1sOk+NQgrVWTIvGKpZfP+M3BfaLHWh0jtrLh7jekbWeEpHB814tJQLSrmXsi5SzLgmnZYNZwXbdOjO9p6Nsh5U3Lh2bce5AHi52FAqNWEwdTlq2ubpslWPwpEYpOOnNmHMcIfA9JSIN7WkjbzkSIOI4fCJvNy4tvzD92JNU4UevIKvjAkJU1rVbjY1LKtNKqMz78RD0u0ipW6Wwu22q2FgH48tDQ0HEBsGN/FBdccvPId+9aZKdT/5Xr7xsIggBhECSkOsTESRq7ww5AR3QaMKZZfX+vCEvTtMi0TCmlRKvZRBiFP4mjeCsTNpOk2tLXz/jN2O+qVqvGrqEhnl6r0dDQkC627ToAWLXhnvMMg64G+E0gzHDSGfiei2ajrnCg4amnBO7JJCULcRTvFbF/VfGN+ccmA5v+EQE4PDys26L5V6s3bt1iZ1LzPNc9ebZPSmb8EqkigC+PYZPH8YKwcMXcOz9bqcx6zvQXvIdI/C/Lsl9q27ahmaFUDBUraK2gleL9tGxt+iwAQkpJCYOWICklpJQgQfBcD3EcPapUvJM1bifBt8S7sz8sFg+wI5RKJXHllVdKAGg0Gtzu2tuvalZ/9/ZzhW1fBRLLWetLnHQ2nUg7vwO8CW0UTyYp2UarPvqhJQsv/fWxin8n7rqOsjoXuWrD1vfkcrnPd8Mra/eAkGZ244gvKC6a9fDxquEx37VffVSr1dQ+ZGcR60s084UAXgjmcwGaJg3pSMNIqtAIYM2IohBaa5eIXGY0Qfw4gX4phLifNe6OtNh5KPVHxcpmX0OO8xJ1uJ6VNZvuehGJVJ5ZXUmguU46fSazRuD70MnYTzoVVTysOc719xmNev2by+fPvmaygO+YAOwYp5WNW54tiR4yhNEXq/jkS78ZcSaXM9xm86NL5838WIVZnuhg5bHB20PsxQ07+qHjMw1B57Cps0ILAdaShAxB2BOraK8l7BYacK+6atA95PPMMvvdnxlnn13Xg+3k+di19pbbn0uG/WIWmA0Si8B8sZPOOAAj8H2oOFZtiS9OWbk8s7JTjgzD8OeuGcz46caNo8fi7Js0ABxr9K/euPUr2VzfnzUbXanESLxh338kq9MDixa9pnWynlgncT/G+zpuQJeqVWOm58lm83k8Vt0CwNduvTWTTZ05QEpfyswXM/NLCfRiy7aylmUjVgpB4IOVUu2B7OJU92gwszYMQ5CgVuD7Q4WFc3cciSZt8jkhBy2h1H/6nvfHXUqGizAIdDqbfX7L9d4A5pGTne49ljJtLCjL5TINDAzQYbIrXC6XUS6XuVwu09DQkGirpSR29+CDlvi9+xxAXSyEWApgptB4gZPJgpmh4oRBIQxDHQThWMoOCeCUj8HrVFmTkHHku28pLJy7o1KpnLCmOWUSsGNwDw8P69UbttySzuYWtTnmTs6AZsTpbEa2ms0bls+fveRUhQPG5iYrlYq0nvG8y4nkMsXqEmZ+geOkbSllm0k0AjNiAhMnz44mYycaa60N0xRCiDAIvLesWDB3dalUNQ6uuDltANi20fS6jduXWE5qjee5Jx+UZmYhJcBoMalXLs3PfqRUYjoSlWsvwVeqVo0LdfYtEPwXpmVdZBgGojBEFMXQWuk21x7hNOhDYdbKslOSWbdC3y+uWDh3/WRyOk5IBRfaVFrhXndDfKb6rW3Zz4lOlq6DiJTSca6vL9ts1P8cwIcGBkYmdII7EanVG7ZfbgjjH2zHvkjFMXzPS2jDCJSM/zh9ek+YOU5nskYURL/3I69YXHjpXZMZfBgvgDoFCsVivklC3mbZKTB3Yx4tS891mcFvq9xx//R2rrTXKq1jq/GaDVv/MeXY3zWkvKjVbCi/nW5M7DgSp0ujd7sYQvf19xtRGGzz/eB1xQWTH3w4EQkmib4VhWG7UPUkkUBEcRzpbLbvLBmHRQAo93jYXqVSEUSkRzZs+VTfmWd8JAx9FQS+IiJ5OnbaMSO2UylhWpZwW+6/79HNfPHyOT/v8HpP9uun45Qc+OJ99xnP2Bfdl0o5rwwCvxvjCJRtp6TnuQ/8cP7s1wLA8DF4nE8cfEn/8ZrN265Op7Pr3FYrZtanJZFRUmlNlMnmKPC9h6Iw/ODyBXNuSZzGI49FOJ0lII8AYuXgYASBLxumAe5Onar0fU+nM9lXv3rj1j8eTgoee0EFQjsL4Aqz1Fp/Io4jTnqtT0fwJVLPMAz2Pe+f/T80Zi5fMOeWSqUimSfWkZtQFdx2RqD86FvNZmOPYZiSu4BCIkIchUxSfurGjd97dqFQ0Cc7hfHgNTICMUykaeOWj2QyufND3+/ZFMseQk8xM+f6+gyl1I81x/OvHhr8cLGYb3Y8+smS4egJAImIS8yiuPh1u6CxxbZtJuqGMwIRRaHOZLPPCNgrEREfLnh8cuEWUms3bV3spNL/N/A9hdPL3kvK/J20NC2L3Fbj83v3/mb2kqFZ1VK1ahyrjP4p5YSgVhNgJhLiRnSxcZhAotVssmEYb63csuXFScUtd6UNoFAo6MotW85kxrUMhlKKMMm7mpLm9UTipRxHOk5aRFF4ZxRF85bkZ77v7UuX7usQFZ1uUu+kAFgeGlIgYg79m1rN5j5hGF1RwyAirVk56YwjTfE2AMBQ7aQBODKSsGoZhnxPtq//OaEfxJPV2+1M5QSzMgyTsrk+aVk2RUF4Z+QHy69+/cWvWz5v1uaOrXe6Sr0T9YIPUmlFtXrjlm9nsn1Ft9lUXerWb5fs+w+fKc99xdDQCwJq9/qdqPQjIr711u9nmsLbadn286IonFzMWsyaQe2hi0LadgpCCLhu63ESdKNS+pvL583afPCzx1NkndRGCCH/W8UxcRdigp2vDINApzPZF+6Jf78smUJ+4tc4MpJ8tiHdy1Jp5/lhGEwK8HW4YTiZfSeyuZyRctJSMzeCwN/Uarbeo6P4lUuGZryjA75Oqf9TCXwnLAGTWFNJDA0Nib3K3uY4mYt83+vWiFJtmhaUVo/CEDOvvuS1vy+Xy3QiBaudOsPVm7b9VzabW9lsNFSvqC3GH7sDS8OUqZQD3/Og4vjHkHS71HRboIMdnYHPT2XQjV0nvBkDAwOUz+fj1dXtf8+sv9tFo15EYaAyub7ntBqNLxHRG04wLkhFInXttTtMcHRpHIWEHtCMjBN6GgAcJy2EFPBd93Gv1bohZv76nmnG1pVjil07/cLlIwzmeaotOskTLYhIr9qwdU02l1vqNhuqa7S57arpRr3+3hULZv/X8do+ncLL6zdtH9DA90HoGsXIcT4jZdm2FCQQReHdzPq/daRuXL7okscPSLonD13E02idlDoqd77EkR/2fe8KEsLu2iYTROB72pDi4zfcuePmK+dedFwtnEO1mhgGdAw9I5PJGsmM44lrAkraOsHZXE4Gnv9wqOMPL71sxncOUa+Fgi4+DSRdT5yQdtpMLpk74ydxFN3kpDMERrcepojCkNPZ7LTIjz56EsHp1xIJME9crCyhIxOUSqWF57Y+/8TeJy5eetmM7zAzVZj3h1DG8sNMAfCEVwHMTEKKb2il0EWPGERJcFpIcc2aTTtedDzB6f3tnkznsdadOXATElWRhkFSGpHvu+9akp/5vj9dtmBPe9YHF4kUPc1B11UAdjhFiLzbPc99zDQtwdwtNq0kOJ3OZFOaw7cCwNA4g9OdiZIEZPUEmX7J+AlTC6IwDuNly+bN/lJ1f6rs6atmewpAIuJSicXSfH4fgO2WbYOALhrSLOIoAoGWVCosjzbM5gi2pJw4TlVSKSctozD662ULZt507Y4dZv40T5WdBip4rFQSW5P0cPceOBFREAYQJC6Q0+99OQAu8fjVPE0U+phVJps1Go3RG5YvmP2ZarVqrBy8KJ6C2IQAcEgnskrd5XsuE3W1zImgtUpnMgaUvqRt4B3zusvlMgGAZg4mIPWrDcsi3/ceS0m5kpkpsUGnJN+EABBtKZM24p/GUbxPGgZ1zQ5MMMhtVo2ZADAwDmrfjscsBI0mNae9wwIzs22nRBgFH39jfuZj5VpNPt3ieacagACApmEoCAq7be4zWKhYAcQvB4A259xRV2e4jVb8qBDUuzBMMn5ANOujv4IR/XepVBIHz/WdWhMEQNQB1rrrwV4igtIKAM5ev/6ndlvojA/nUvyMe6kIidgwTCLBHynm882BgQGacjomGIDJzAcmQ+CVtm2fGcdx1wfotQfc2Xuw1x7P+zvM+kLz9w4w63ff8XDSGdlqNW5aNu+Sbz3VSqVOMwlIzJLeZKdSojs9w4d4syBA2Y43ru8uthn45TTjvigKf2VZNnWKAroWH5KSwsD3IfmvgTEjLqbWxAGwk1a67s47zwB4qe/1SNoQAczx9PESGLWZ9a8aHHSJxHfsVArM3esWY2btpDMiiqKvrMhf8uM22+iU4zHRAOw0kjux9UeZTN8z44Q0vOvqV5AAiJpDQ0NBxy481trZdn2lgWvdVrNlSCm60Uua0N2a5LaaT2jCPyUjZ3dOSb9TAsChIVUqVQ1o/U6lYu4FLxkRsZASzPxYknkpifHEVTrFEle/ftbDSulrnUxGcBeKJQiIU+m0iJUuF+fP+d3IyIiYCrucAgC21Q6/6hJnUErjwkT9dr/XlhkshIAAPQIAA+0g83hWp8fYlMY/tZqN31u2bfBJTFli1lG2v9+sj47e8uD8WZ893PSfqTVBAOyMdiVJS510moDeJNw7aNOkfwQA02u1cQOwU8Z1VX5wd6zidwkhIKXk4x311W6TjHN900y31dwmWLy1nEjhKdV7igBIw/l8vH79eptZXxUGIYi4JzkvBsswDKAV/2BsiGW8az+r/oJLbnI99wN2ypEkBDGzGif2khm/ff1Gq9W6odUMFi9bMHNPuVyeivmdKgB2+jRcu3+maVkvCwKfuzkoZuzuS8OgMAhG2TR2AsCJGPwJCFkWFsz5d7fZfJ8wDJVMLE861JD042qAdaKiWbVfp0w2J4UUgdtq/s3S/MVXX/PGS584UWb/qfXkdcIl+Z1Ul2S5IJVKIQqjnowUTaas28KP4/uK+ZmPnczGF4ukKpWKXL5g9ucrG+76HjEPS8NYkE6nDRWrJNvCAAmClBJCCLSardj33ZtUHH9s+fw593cyMFMhl1MMwKF2vlODZyil2hXH3feAmRlSSmKB1e3fPSnJc2DS0tytABauuf3eGa1mcwlrzATx2cwwieAC/AhI7JBa33j1ZbN/MMbpmnI4emDfHy8oiIj4wQcftH7yWGOnZdsvjsLw5Ch7j6B+TdOkOIoe96Q5cE1+cPfJjnMY890CCT8bj33ti/fdJ1ceNBOkVGJRLk9JvUklAQHgob17+yWZZ2ilO6Ds9vlQdsoxwji64Zr84O5uSqAOmJhZ1Go1UavVNI2Z79Z5fag9tn54eAoskwaA7WJPlsqywbC4R5EIIhZRFIIYFfSoqWMs6ABQZ37xQa9Prcmogtffcf90Pwp/LKU8M47jbotAZdsp4XneD/acYV78rosumuqtmArDPHmdndb7GLxbSgPdYwrsgBwsDYOEEB9fOTgYdYiGptYUAPczpQ4ODkZg/MgwDUYX9TBrjnN9OaPVqK9fetmMkRKzmGprnALgk1e7MYhY39DNyWjMWjnptOG2Wg/bhvxfbaNzaqembMAj2IHbtvX5Ld5pmNaz4yg8qWxIAr6MjKPw0cD1FxauuHRnoVKRI1PJ/ikJeDg1XKlU5OJZs+rQVEqlHAJOvNSJNcfpTE5GUfSjOGjNL1xx6c7KFPimJOA4JGFC0bZx6zemTTvjmvq+JyIGjPF6xG0WKZ3r65fNVnN71GwtKb4x/9hUf8WUBBw3BkulknjBNPPtjX2j38r1TzOFENShoD0a8JgRSykpncnJVqPxjeZvdi+cAt/Ta5108UDC48wgogjAW9Zs2vZDaRh/l8mmM77nIo7jzlgpHmM7CsuyKOWkDc9z677X+j9LLpv5BSCh/p0C35QKPiGnpAPIdZvueilJ+/2aeQkRPds0TRAJUPI+BIEPgB4WUt4YBeFnVyyc/bNSqSTK5TJPBZunAHhS60kTyNffMV2k7NdKxvlMPJ00G8zYTVI8ECm5o7hgcDT5TDJEcGo7nn7r/wdzvGaMMkCS+gAAAABJRU5ErkJggg==");
  --logo-3:url("data:image/png;base64,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");
  --logo-4:url("data:image/png;base64,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Og46UodEukPXDXUsvkRAQOxI880kl9vMpmer+kO+7+22HAegRV8BIqAQAgBofYJDTp1R+YpPpxCilFKmZesaV68CAOg9IsTTzj7spGyKQETacRhjcm2M4WVSSDUeOiECpesGIsBPrdFRn4gmu0yqDA3xVUuX/DAKos9atkOAbDqVDURdXXxrZfiVn9uyxcgjyibZtynolM/nZWnbjnPmLV210clkPqqU6pKTShUfWzYzDJP7nveoBHldcrpCyxhwXMpUJiJGCQxDRKjiFn9nBGaloY1evaGhIZ7L5QQQfNswjAmImcR8zyWu65cNbN9zUX9//8QxRXICozltVQdlmibIRL20Oft3stWEatrvuyDueS4Zmn7Ftr1752azWdWXbOpmAxAR/oBrnJGi6Eg9XalI13VNkhJE9K58Pi/jpGzCMIeaoRAyuDkIgoOMM95BjRyTxikkkLdLkg+fY532yMDgrj++ZXD3GYiocrmcyOfz8ubKQ8sM3XpI07UbRg+PCNWu8cWsb0KGYSiiN61buvjJSqWiNUkoE+GAqlAoMBHxR91GY8iyHQQAiYgoIiEyma65CMHbAYCmmoSTy2UlEaGU9PXa6Mivdd04bgx8PCwNpOM4Gij1YUSk/qGhSQ2QK31aU4IYIoaBD0RyaWnfPiObnarTKxYRLxFxIFoYHT/jt/VRLyJlWNaLRmvyy4ioXr1/P1UqpB04cICICIWAL7huozHntNOsTFeXlunq0maf1qMjw197DXfl2mWLHiIi1oqhUygUWIGIbdo+/LJb7h2+f9Pgnj0AWCElT1NS4jTZQQwADF3Xz0+lu/5TAD62afvuzZsGd392YPueWxlT2xji3FhNArR2P4MIZCrTxX3P+3zfsoWPbBge1scSPya6kZTNZll++bxRIBowzbEBLrEoDEEqenupUkk3b+hkm6xcLrP81YsOEeKdlmURtGBsEBD33AbpppndWNn5yv5sVrZG6WMLFCqIElm3joBoAuCe54FhmEuMZ9yXNuduTPV3hx98kAGA3f5MGORuva4sy77+5u0PvLVYLKpcDkXToPIrF/w0DMV1URS+r1qtvrdWH32353nv9arVFfmVi+9utpmO0Qo8JrYuIipS4XldXbMu1U1jPte0jrvixgPERIrC0FduoyY1jc9yUplV6a7uv0w5qTdEQkAURtQJHS+WLNF4vV57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");
  --logo-mark-url:var(--logo-1);
}
.logo-mark{
  height:36px;
  width:36px;
  display:block;
  background-color:currentColor;
  -webkit-mask-image:var(--logo-mark-url);
  mask-image:var(--logo-mark-url);
  -webkit-mask-repeat:no-repeat;
  mask-repeat:no-repeat;
  -webkit-mask-position:center;
  mask-position:center;
  -webkit-mask-size:contain;
  mask-size:contain;
}
/* [2026-11-12] header wordmark GOŚCIŃSKA in the active-nav button colour (--accent, the
   purple). Only the text — the logo mark icon keeps the --ink it inherits from .logo. */
.logo-word{color:var(--accent);}
.logo .glitch-flicker{color:var(--accent);}
.footer-logo .logo-mark{height:30px;width:30px;}

.nav-toggle{
  display:flex;
  flex-direction:column;
  justify-content:center;
  gap:5px;
  width:36px;
  height:36px;
  background:none;
  border:none;
  cursor:pointer;
  z-index:70;
}
.nav-toggle span{
  display:block;
  height:2px;
  width:100%;
  background:var(--ink);
  transition:transform .25s ease, opacity .25s ease;
}
.nav-toggle[aria-expanded="true"] span:nth-child(1){transform:translateY(7px) rotate(45deg);}
.nav-toggle[aria-expanded="true"] span:nth-child(2){opacity:0;}
.nav-toggle[aria-expanded="true"] span:nth-child(3){transform:translateY(-7px) rotate(-45deg);}

.nav{
  /* was a full-screen panel sliding in from the right (bottom:0 + translateX) —
     now a dropdown sized to its own content that slides down from under the sticky
     header instead, so it reads as an extension of the top navbar rather than a
     separate full-page overlay.
     position:absolute + top:100% (not position:fixed + top:var(--header-h)) —
     .site-header (position:sticky) is this element's nearest positioned ancestor, so
     "100%" always means exactly the header's own real rendered bottom edge, however
     tall the header actually turns out to be. Pinning it to the --header-h constant
     instead was fragile: any mismatch between that number and the header's real
     height (a taller logo, text wrapping, a future header edit) would place the
     dropdown too high, overlapping the header's own content instead of sitting
     cleanly below it — which is exactly what was happening over the logo on mobile.
     +2px: the containing block "100%" resolves against is .site-header's PADDING
     box, which stops short of its own 2px border-bottom — without this the dropdown
     would start right under that border line instead of past it. */
  position:absolute;
  top:100%;
  left:0;right:0;
  background:var(--lime);
  display:flex;
  flex-direction:column;
  padding:20px 24px 28px;
  gap:4px;
  box-shadow:0 14px 28px rgba(10,9,14,.28);
  /* clip-path, not a transform:translateY slide — a translate would move this whole
     (fairly tall) panel in from off-screen above the header, which reads as
     something flying in from outside the page rather than the navbar itself opening
     up. Sitting exactly where it already sits (right under the header, see top:
     above) and animating its visible height from 0 up to full via clip-path instead
     is what makes it read as unfurling out from behind the navbar — the top edge
     never moves, only the reveal grows downward from it. Also fully hides the
     content (0 visible height) when closed on its own, but visibility is kept as a
     belt-and-braces second layer — the header's own background is a blurred,
     semi-transparent backdrop (see .site-header::before), not a solid fill, and it's
     cheap insurance against anything ever being readable through it. The 0s-linear-
     .3s-delay transition holds visibility at "visible" for the full close animation,
     then switches to hidden right as it finishes; opening reverses instantly (0s
     delay) since it needs to be visible from the first frame of the reveal. */
  clip-path:inset(0 0 100% 0);
  visibility:hidden;
  transition:clip-path .3s ease, visibility 0s linear .3s;
  z-index:60;
}
.nav.open{
  clip-path:inset(0 0 0% 0);
  visibility:visible;
  transition:clip-path .3s ease, visibility 0s linear;
}
.nav a{
  font-family:var(--font-sans);
  font-weight:700;
  font-size:22px;
  padding:16px 4px;
  color:var(--ink-muted);
  /* [experiment 2026-11-10] nav labels are the editable service titles in big caps.
     To revert: remove text-transform + white-space below. */
  text-transform:uppercase;
  white-space:nowrap;
}
.nav a.active,.nav a:hover{color:var(--ink);}
.nav a.active{text-decoration:underline;text-decoration-thickness:2px;}

@media (min-width:860px){
  .nav-toggle{display:none;}
  .nav{
    position:static;
    flex-direction:row;
    background:none;
    padding:0;
    /* [experiment 2026-11-10] was 28px — tightened so the longer service-title
       labels (e.g. WORKSHOPS & FACILITATION) sit comfortably on mid-size desktops. */
    gap:20px;
    transform:none;
    width:auto;
    /* the mobile dropdown's closed state hides via clip-path + visibility, not a
       transform (see .nav's own comment) — desktop nav is never "closed" (no toggle
       button, no .open class ever applied here), so both must be explicitly reset
       or it'd inherit a fully-clipped, invisible nav from the base rule. */
    clip-path:none;
    visibility:visible;
    /* the base rule's border-bottom exists for the mobile dropdown panel's own
       bottom edge — left un-reset here, it rendered as one continuous line under
       the whole nav row (from "Home" to wherever the flex container's content
       happened to end), on top of each link's own per-item ::after underline
       below. Each link is meant to get its own line on hover/active, not the row
       as a whole. */
    border-bottom:none;
    /* same story for the dropdown's drop shadow — left on, it framed the desktop
       link row in a flat hazy box. */
    box-shadow:none;
  }
  .nav a{
    /* [experiment 2026-11-10] was 14px / .08em — eased down a touch to fit the longer
       editable service-title labels in the header row. */
    font-size:13px;
    padding:0;
    border-bottom:none;
    text-transform:uppercase;
    letter-spacing:.06em;
    position:relative;
    color:var(--ink-muted);
  }
  .nav a.active,.nav a:hover{color:var(--ink);}
  .nav a::after{
    content:'';
    position:absolute;
    left:0;bottom:-6px;
    width:0;height:2px;
    background:var(--ink);
    transition:width .2s ease;
  }
  .nav a:hover::after,.nav a.active::after{width:100%;}
}

/* Book links are injected into the menu (js/main.js); shown only on phones. */
.nav-book{ display:none; }

/* ---------- mobile burger menu: full-height, brutalist, dancers footer ------- */
@media (max-width:859px){
  .nav{
    /* fixed + top:--header-h + bottom:0 → fills the whole screen below the 64px
       header, responsive to any viewport. Uses a simple opacity/visibility fade
       (overriding the base dropdown's clip-path reveal, which is tuned for a short
       content-sized box and misbehaves at full height). */
    position:fixed;
    top:var(--header-h);
    left:0; right:0; bottom:0;
    padding:0;
    gap:0;
    border-bottom:none;
    overflow:hidden;        /* everything fits the height — no scrolling */
    z-index:65;
    display:flex;
    flex-direction:column;
    clip-path:none;
    opacity:0;
    visibility:hidden;
    transition:opacity .22s ease, visibility 0s linear .22s;
  }
  .nav.open{
    clip-path:none;
    opacity:1;
    visibility:visible;
    transition:opacity .22s ease, visibility 0s linear;
  }
  .nav a{
    /* the five main links share the free vertical space equally, so the whole
       menu fits the screen height without scrolling */
    flex:1 1 0;
    min-height:0;
    display:flex;
    align-items:center;
    font-family:var(--font-sans);
    font-weight:800;
    font-size:clamp(20px,min(9vw,6vh),50px);
    text-transform:uppercase;
    letter-spacing:-.02em;
    line-height:1;
    padding:0 24px;
    color:var(--ink);
    border-top:2px solid var(--ink);
  }
  .nav a:first-child{ border-top:none; }
  .nav a:hover{ color:var(--ink); }
  .nav a.active{ background:var(--ink); color:var(--lime); text-decoration:none; }
  /* dancers illustration — compact footer so it never pushes the menu to scroll */
  .nav::after{
    content:'';
    flex:0 0 auto;
    width:100%;
    height:clamp(90px,20vh,240px);
    border-top:2px solid var(--ink);
    background:url(../assets/images/dancers.png) no-repeat center bottom;
    background-size:contain;
  }
  /* header Book dropdown folded into the menu on phones */
  .book-menu{ display:none; }
  .nav-book{ flex:0 0 auto; display:flex; flex-direction:column; border-top:2px solid var(--ink); }
  .nav-book-label{
    font-family:var(--font-sans); font-weight:800; font-size:12px;
    text-transform:uppercase; letter-spacing:.12em; color:var(--ink-muted);
    padding:clamp(8px,1.6vh,16px) 24px 2px;
  }
  .nav-book a{
    flex:0 0 auto; min-height:0;
    font-size:clamp(15px,min(5vw,3vh),22px);
    text-transform:uppercase; font-weight:700;
    padding:clamp(5px,1vh,10px) 24px; border-top:none; color:var(--ink);
  }
}

/* ---------- hero ---------- */
/* hero + marquee together fill exactly one viewport below the sticky header, so the
   ticker is visible on load without scrolling — sized via --marquee-h since CSS has
   no way to size against a sibling's actual rendered height. */
.hero{
  position:relative;
  height:calc(100svh - var(--header-h) - var(--marquee-h));
  display:flex;
  align-items:flex-end;
  overflow:hidden;
  scroll-snap-align:start;
  /* the sticky header still reserves its own var(--header-h) box in normal flow
     above .hero, so .hero's true document top sits header-h below the page's
     actual top edge — without this, mandatory snap has no valid snap point at
     scrollY 0 (only at header-h) and auto-corrects there right after load,
     making the page look like it starts pre-scrolled. Every section after this
     one already carries the equivalent offset in its own scroll-margin-top. */
  scroll-margin-top:var(--header-h);
}
.hero-video{
  position:absolute;
  inset:0;
  width:100%;
  height:100%;
  object-fit:cover;
  /* kasia-demo is portrait (phone footage) — the stage/decks sit around the
     vertical middle of the frame, so the landscape crop is centred just above it. */
  object-position:center 42%;
  filter:contrast(1.22) saturate(1.12);
}
/* Hero shader canvas — temporary stand-in for the hero video (2026-11-03). A flowing
   curved texture painted in the site palette by js/hero-shader.js. Occupies the same
   box as .hero-video and sits under .hero-drawings (z-index:1) and .hero-content. The
   --lime fill is the themed fallback shown if WebGL is unavailable. */
/* [2026-11-11] Now a FIXED page-wide backdrop (moved to body level in index.html):
   it stays put while the homepage sections scroll-snap over it. Was position:absolute
   inset:0 inside .hero. z-index:-2 sits it behind all content (sections are transparent,
   so it shows through; the opaque cards cover it). --lime is the no-WebGL fallback. */
.hero-shader{
  position:fixed;
  inset:0;
  width:100%;
  height:100%;
  display:block;
  z-index:-2;
  background:var(--lime);
}
/* dims the bright shader a touch so text on the transparent sections stays legible,
   while it still reads as a moving colour field behind the content. */
.home-shader-scrim{
  position:fixed;
  inset:0;
  z-index:-1;
  pointer-events:none;
  background:color-mix(in srgb, var(--lime) 42%, transparent);
}
.hero-scrim{
  /* no darkening overlay — the video plays at full contrast/color, unobstructed. */
  position:absolute;inset:0;
  background:none;
  /* purely decorative (currently inert) — without this it still sits in front of
     .hero-video for hit-testing purposes despite being invisible, which is exactly
     what was breaking the custom cursor's "am I over an image" check in main.js
     (document.elementFromPoint hit this div, not the video, over most of the hero). */
  pointer-events:none;
}
/* Kasia's line drawings (white glow on dark) laid over the hero video — `screen`
   drops the dark parts out entirely, so only the glowing lines/clouds read on top
   of the footage. Sits between the video and .hero-content (z-index 2). */
.hero-drawings{
  position:absolute;inset:0;
  z-index:1;
  background:url("../assets/images/drawings-kasia-head-clean.png") center / cover no-repeat;
  mix-blend-mode:overlay;
  opacity:.75;
  pointer-events:none;
}
.hero-content{
  position:relative;
  z-index:2;
  width:100%;
  /* same centred column as .header-inner, so the hero card lines up with the logo */
  max-width:var(--container);
  margin:0 auto;
  padding:0 20px 40px;
}

/* ---------- homepage hero: fullscreen intro + delayed nav/CTA reveal ----------
   Home only. The header switches from the site-wide sticky bar to a fixed
   overlay here, hidden (opacity/translate, plus `inert` via main.js) until the
   first scroll — fixed rather than sticky specifically so it reserves no space
   in document flow while hidden, letting .hero below claim a genuine 100svh
   instead of svh-minus-header-h. main.js adds .is-scrolled to <body> on the
   first scroll event (any amount) and never removes it. */
body.home .site-header{
  position:fixed;
  top:0;left:0;right:0;
  width:100%;
  opacity:0;
  transform:translateY(-16px);
  transition:opacity .5s ease, transform .5s ease;
  pointer-events:none;
}
body.home.is-scrolled .site-header{
  opacity:1;
  transform:translateY(0);
  pointer-events:auto;
}
/* true fullscreen on load — overrides the shared .hero (sized for header+
   marquee already sharing the first viewport, which every other use of .hero
   still wants). scroll-margin-top:0 because scrollY:0 IS the hero's natural
   resting point now that the fixed header no longer pushes it down in flow. */
body.home .hero{
  height:100svh;
  scroll-margin-top:0;
  /* [2026-11-11] the hero now carries the mission statement (running figure + text) —
     center it vertically (base .hero bottom-aligns for the other pages). */
  align-items:center;
}
/* [2026-11-11] HERO STATEMENT (moved up from the former .mission section, BARE — no card).
   Layout: a narrow vertical column of text on the left, the running figure floated right.
   Load/scroll choreography (gated by html.js-anim, set in <head> before paint, so no-JS
   shows everything): the shader + drawings load first, the text fades in a beat later
   (body.hero-intro-in, added by main.js), and the figure slides in from the right on the
   first downward scroll (body.hero-png-in — see onSnapWheel in js/main.js). */
.hero-content--mission{
  position:relative;
  min-height:100svh;
  display:flex;
  align-items:center;
  /* [2026-11-12] figure + text are a CENTERED group (were pushed to opposite edges) —
     on big screens they sit together in the middle rather than at the far left/right. */
  justify-content:center;
  gap:clamp(24px,4vw,56px);
  padding:0 clamp(20px,6vw,80px);
  box-sizing:border-box;
}
.hero-content--mission .mission-text{
  position:relative;
  z-index:2;
  margin:0;
  /* narrow vertical column — much less than the container width, so it reads as a tall
     stack of words rather than a wide paragraph. */
  max-width:clamp(250px,28vw,360px);
  text-shadow:0 2px 20px rgba(0,0,0,.5);
}
.hero-content--mission .hero-figure{
  position:relative;
  z-index:1;
  order:-1;                          /* runner sits to the LEFT of the text, in flow */
  flex:0 0 auto;
  pointer-events:none;
}
.hero-content--mission .mission-figure{
  display:block;
  filter:drop-shadow(0 18px 34px rgba(0,0,0,.55));
}
/* hidden-until-revealed states — only when JS is on (html.js-anim) */
/* [2026-11-12] hidden on load; js wraps the text in .tw-char spans, shows the container
   (body.hero-intro-in) and fades each char in one by one, like it's being written. */
html.js-anim .hero-content--mission .mission-text{
  opacity:0;
  transition:opacity .2s ease;
}
html.js-anim body.hero-intro-in .hero-content--mission .mission-text{
  opacity:1;
}
.hero-content--mission .mission-text .tw-char{
  opacity:0;
  transition:opacity .5s ease;
}
.hero-content--mission .mission-text .tw-char.tw-on{
  opacity:1;
}
html.js-anim .hero-content--mission .mission-figure{
  opacity:0;
  /* starts off-screen right and sweeps all the way to its left resting spot (a full
     right→left run across the screen, passing behind the text). */
  transform:translateX(100vw);
  transition:opacity 1.1s ease, transform 1.3s cubic-bezier(.16,.72,.29,1);
}
html.js-anim body.hero-png-in .hero-content--mission .mission-figure{
  opacity:1;
  transform:translateX(0);
}
@media (prefers-reduced-motion:reduce){
  html.js-anim .hero-content--mission .mission-text,
  html.js-anim .hero-content--mission .mission-figure{
    opacity:1 !important; transform:none !important; transition:none !important;
  }
}
/* phones: stack the runner above the text, both centered (still slides in from the right). */
@media (max-width:719px){
  .hero-content--mission{ flex-direction:column; gap:clamp(14px,4vw,26px); }
  .hero-content--mission .mission-text{ max-width:min(86vw,360px); }
  .hero-content--mission .hero-figure{ order:-1; }   /* runner above the text, both centered */
}
.hero-note{
  width:100%;
  /* see .design-panel's own comment on this same isolation gotcha — .hero-note has
     no scroll-reveal opacity/transform to give it a stacking context for free. */
  isolation:isolate;
  background:var(--lime);
  border:2px solid var(--ink);
  max-width:640px;
  padding:clamp(24px,4vw,40px);
  /* container queries so the wordmark/eyebrow can be sized relative to this box's
     own width (cqw) rather than the viewport — they fill it edge to edge regardless
     of where the card sits or how wide the viewport is. width:100% is required here:
     size containment (implied by container-type) stops a flex item's auto-width from
     being derived from its content, so without an explicit width it collapses to ~0
     when this class is reused as a flex child (e.g. dj.html's page intro). */
  container-type:inline-size;
}
.eyebrow{
  font-family:var(--font-sans);
  font-weight:700;
  font-size:clamp(12px, 7.2cqw, 18px);
  letter-spacing:.02em;
  text-transform:uppercase;
  color:var(--ink);
  margin-bottom:14px;
  width:100%;
}
.hero-title{
  font-family:var(--font-serif);
  font-weight:800;
  font-size:clamp(2.6rem, 27.5cqw, 7.5rem);
  line-height:.9;
  letter-spacing:-.03em;
  color:var(--ink);
  margin-bottom:40px;
  width:100%;
}
.hero-tagline{
  max-width:none;
  color:var(--ink-muted);
  font-weight:800;
  line-height:1.1;
  letter-spacing:-.02em;
  font-size:clamp(22px,4vw,24px);
  margin-bottom:32px;
}
.hero-actions{display:flex;flex-wrap:wrap;gap:14px;}
.hero-actions .btn{flex:1;justify-content:center;}
.hero-note .btn-primary{background:var(--ink);color:var(--lime);border-color:var(--ink);}
.hero-note .btn-primary:hover{background:var(--lime);color:var(--ink);}
.hero-note .btn-ghost{color:var(--ink);border-color:var(--ink);}
.hero-note .btn-ghost:hover{background:var(--ink);color:var(--lime);}
/* the cut-corner border-fix further down gives every .btn a ::before that
   holds its actual fill color (the element's own background became the
   border color instead) — these two rules invert text color for extra pop
   against the lime card, so their fill needs to invert too, or the text
   ends up the same color as what's now sitting directly behind it */
.hero-note .btn-primary::before{background:var(--ink);}
.hero-note .btn-primary:hover::before{background:var(--lime);}
.hero-note .btn-ghost:hover::before{background:var(--ink);}

/* homepage hero card at half size — scoped to #home specifically (not the
   base .hero-note/.eyebrow/.hero-title/.hero-tagline classes) since those
   are shared with the intro card on dj.html/workshops.html/event-production.html/
   contact.html, which this request wasn't about. Halving max-width alone
   already shrinks most of the type via the existing cqw container-query
   sizing (font-size scales with the container's own width), but .hero-tagline
   uses vw (viewport width, not cqw) so it doesn't auto-shrink with the
   container — every clamp() bound below is halved explicitly so container
   and content actually end up proportional, not just the box. --cut-lg is
   overridden locally too, so the notch and its border-fix pseudo-element
   (../both read var(--cut-lg)) shrink to match instead of looking oversized
   on a now-smaller card. */
#home .hero-note{
  --cut-lg:13px;
  max-width:320px;
  padding:clamp(12px,2vw,20px);
}
#home .eyebrow{
  /* now the hero's only line — sized to match the old GOŚCIŃSKA title
     (#home .hero-title below), since the title + buttons were removed. */
  font-size:clamp(1rem, 13cqw, 5rem);
  line-height:.95;
  letter-spacing:-.01em;
  margin-bottom:0;
}
#home .hero-title{
  /* max bound raised from 3.75rem so "N SKA" reaches the same rendered width as the
     .eyebrow line above it (measured, not guessed — see hero_text.py-style check:
     eyebrow ~225px, "N SKA" was only ~170px at the old 3.75rem cap) rather than
     sitting narrower than it once the glitch effect (which used to visually mask the
     mismatch) was removed. */
  /* rescaled for "GOSCINSKA" (9 letters vs. the old 5-letter "N SKA") so it still
     spans the card edge to edge instead of overflowing it. */
  font-size:clamp(1rem, 13cqw, 5rem);
  margin-bottom:20px;
}
#home .hero-tagline{
  font-size:clamp(11px,2vw,12px);
  margin-bottom:16px;
}
#home .hero-actions{gap:7px;}
#home .hero-actions .btn{
  padding:7px 12px;
  font-size:9px;
}

/* homepage-only entrance: the intro card sits off-screen left for the first 5s
   (arriving with the video/marquee already settled), then slides in; once it lands,
   "See the work" blinks once so it reads as the next thing to notice. */
#home .hero-note{
  animation:hero-slide-in .9s cubic-bezier(.16,1,.3,1) 5s both;
}
@keyframes hero-slide-in{
  from{transform:translateX(-120%);opacity:0;}
  to{transform:translateX(0);opacity:1;}
}
#home .btn-ghost{
  animation:hero-btn-blink .5s ease-in-out 5.9s 1;
}
@keyframes hero-btn-blink{
  0%,100%{opacity:1;}
  50%{opacity:.15;}
}
@media (prefers-reduced-motion:reduce){
  #home .hero-note{animation:none;}
  #home .btn-ghost{animation:none;}
}

.btn{
  display:inline-flex;
  align-items:center;
  gap:8px;
  padding:14px 24px;
  font-family:var(--font-sans);
  font-weight:700;
  font-size:13px;
  text-transform:uppercase;
  letter-spacing:.08em;
  border-radius:2px;
  border:1px solid var(--ink);
  transition:background .2s ease, color .2s ease, border-color .2s ease;
}
.btn-primary{background:var(--lime);color:var(--ink);border-color:var(--ink);}
.btn-primary:hover{background:var(--ink);border-color:var(--ink);color:var(--lime);}
.btn-ghost{background:transparent;color:var(--ink);border-color:var(--ink-muted);}
.btn-ghost:hover{border-color:var(--ink);}
.arrow-down{display:inline-block;animation:bob 1.6s ease-in-out infinite;}

/* ---------- cut-corner accent ----------
   Bottom-right 45° notch shared across every boxed UI element — buttons, the lime
   "sticky-note" cards, and the header bar — so it reads as one signature shape
   instead of a one-off. Left off the calendar cards and the SoundCloud embed (and,
   as of this rule, .mission-note/.work-card too): all of them hold content
   (hover-preview cards, the player iframe) that overflows or sits flush with that
   corner, and clip-path on the real element would slice into it — but the bigger
   reason .mission-note/.work-card moved out is look, not just overflow: clipping the
   real element clips its own ink "border" background (see the border-fix comment
   below) along the SAME diagonal as the ::before fill sitting on top of it, leaving
   only a thin 2px ink line tracing the cut. Leaving the real element uncut — same as
   .calendar-widget/.calendar-past already did — lets that ink background show as a
   solid triangle behind the notch instead, which is what "look like past events"
   meant. Each of these three still gets its OWN clip-path on its ::before fill layer
   (inset 2px, see their own rules), so the fill itself is still notched — only the
   ink layer underneath it stopped being cut too. */
.btn,
.section-title,
.design-swatch{
  clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-sm)),calc(100% - var(--cut-sm)) 100%,0 100%);
  -webkit-clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-sm)),calc(100% - var(--cut-sm)) 100%,0 100%);
}
/* .hero-note/.bio-card/.contact-form/.contact-direct/.design-panel used to be here
   too, clipped directly like .btn/.section-title/etc. above — same issue the
   cut-corner comment on .work-card/.mission-note (further down) covers in full:
   clipping the real element cuts its own ink "border" background along the same
   diagonal as the ::before fill sitting on top of it, leaving only a thin 2px ink
   line tracing the notch instead of the solid ink wedge every other card on the
   site (including these five, once removed here) now shows. Their own ::before
   already carries an identical clip-path (see the border-fix block below), so
   removing it from the real element only stops double-cutting the ink layer. */

/* cut-corner border fix, cross-browser: clip-path removes the border stroke
   along its own cut edge in every engine — the border only ever existed on
   the box's original straight edges, and clipping doesn't redraw one along
   the new diagonal, so every notched element above that also had a real
   `border` was missing its line on that one edge.

   First attempt at this (kept here so the reasoning isn't lost) was a
   same-shaped pseudo-element BEHIND the element, sized a border-width
   BIGGER, expecting the extra rim to peek out as a border. That's backwards:
   CSS always paints an element's own background before ANY of its children
   — including a negative-z-index ::before — so a same-colored, same-shaped,
   bigger pseudo just paints over the parent's entire background instead of
   peeking out from behind it, and with fill/border both == var(--ink) the
   text (also ink) turned invisible against it. Confirmed by deleting
   .noise-overlay/.dot-grid entirely and finding the card still solid dark —
   it was never those, it was this.

   Correct version: swap which layer holds which color. The element's own
   background becomes the border color (paints first, full size — this is
   the only layer collision-free to be "biggest"). A ::before inset by
   exactly the old border-width, still negative z-index (paints after the
   background but before normal in-flow content, so it still stays under the
   text), holds the actual fill color. What's left uncovered around its edge
   — a border-width-wide ring of the parent's own background — reads as the
   border, correctly, on every edge including the diagonal cut, because nothing
   here relies on an actual `border` property for clip-path to strip away.
   Thickness matches what each element originally declared (1px on .btn, 2px
   on the rest). Hover-state background swaps (.btn-primary/.btn-ghost) now
   target the ::before's fill instead of the element's own background, so the
   visual result on hover is identical to before — the border layer itself
   doesn't need to change on hover, so it's swap-free and simpler. */
.btn,
.hero-note,
.bio-card,
.contact-form,
.contact-direct{
  position:relative;
  border:none;
}
.design-swatch,
.design-panel{
  border:none;
}
.btn{ background:var(--ink); } /* border color, always — the fill lives on ::before now */
.btn::before{
  content:"";position:absolute;inset:1px;z-index:-1;
  clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-sm)),calc(100% - var(--cut-sm)) 100%,0 100%);
  -webkit-clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-sm)),calc(100% - var(--cut-sm)) 100%,0 100%);
}
.btn-primary::before{background:var(--lime);}
.btn-primary:hover::before{background:var(--ink);} /* whole button reads solid ink, matching the old hover look */
.btn-ghost{background:var(--ink-muted);} /* dimmer border at rest, same as the old border-color:var(--ink-muted) */
/* fill is lime, not transparent: a transparent ::before doesn't reveal
   whatever's behind the WHOLE button, only whatever's behind that pseudo
   layer specifically — which is this element's own opaque border-color
   background, so "transparent" here would just show solid ink-muted/ink
   across the entire button instead of a hollow cutout. Every .btn-ghost in
   this codebase sits on a lime card (hero-note/mission-note's own
   background), so lime is what "see-through to what's behind it" actually
   looks like in practice, not a hardcoded compromise. */
.btn-ghost::before{background:var(--lime);}
.btn-ghost:hover{background:var(--ink);} /* border brightens to full ink, same as the old hover border-color change */

.design-swatch{ background:var(--ink); }
.design-swatch::before{
  content:"";position:absolute;inset:2px;z-index:-1;
  background:transparent; /* its two triangle spans provide the visible swatch colors, unchanged */
  clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-sm)),calc(100% - var(--cut-sm)) 100%,0 100%);
  -webkit-clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-sm)),calc(100% - var(--cut-sm)) 100%,0 100%);
}

.hero-note,
.bio-card,
.contact-form,
.contact-direct,
.design-panel{ background:var(--ink); }
/* content-card fills are flat --lime now, no dot-pattern — the texture is the
   PAGE's own signature (see body{} below), kept off every card surface on
   purpose so a card reads as a distinct clean panel sitting on a textured
   background instead of blending into it. .design-panel is the one exception
   (internal dev tool, not public page content) and keeps the textured fill. */
.hero-note::before,
.bio-card::before,
.contact-form::before,
.contact-direct::before{
  content:"";position:absolute;inset:2px;z-index:-1;
  background-color:var(--lime);
  clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-lg)),calc(100% - var(--cut-lg)) 100%,0 100%);
  -webkit-clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-lg)),calc(100% - var(--cut-lg)) 100%,0 100%);
}
.design-panel::before{
  content:"";position:absolute;inset:2px;z-index:-1;
  background-color:var(--lime);
  background-image:var(--dot-pattern);
  background-size:var(--dot-gap) var(--dot-gap);
  background-blend-mode:overlay;
  clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-lg)),calc(100% - var(--cut-lg)) 100%,0 100%);
  -webkit-clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-lg)),calc(100% - var(--cut-lg)) 100%,0 100%);
}

.scroll-cue{
  position:absolute;
  bottom:18px;left:50%;
  transform:translateX(-50%);
  z-index:2;
  width:1px;height:40px;
  background:var(--line);
  overflow:hidden;
}
.scroll-cue span{
  display:block;
  width:100%;height:14px;
  background:var(--purple);
  animation:scrollcue 1.8s ease-in-out infinite;
}
@keyframes scrollcue{
  0%{transform:translateY(-100%);}
  100%{transform:translateY(140px);}
}
@keyframes bob{
  0%,100%{transform:translateY(0);}
  50%{transform:translateY(4px);}
}

/* [2026-11-12] glitch/flicker on the logo "Ń" removed per request — renders static now. */
.glitch-flicker{
  color:var(--ink);
}

/* ---------- marquee ---------- */
/* zero-height marker sitting right above the marquee in document flow — main.js
   watches it with an IntersectionObserver (rootMargin offset by --header-h) to detect
   the exact moment the marquee's position:sticky actually engages (there's no CSS way
   to select a "stuck" sticky element), toggling .is-stuck at that point so the ticker
   visibly compacts once it's collided with and pinned under the header. */
.marquee-sentinel{height:1px;}
.marquee{
  --mq-pad:14px;
  --mq-font:13px;
  position:sticky;
  top:var(--header-h);
  z-index:55;
  /* border-fix technique (see the big comment near the cut-corner rules above) —
     was a real border-top/border-bottom on a lime background with clip-path on this
     element directly, which cut the top/bottom rules AND the fill along the same
     diagonal, leaving only a thin ink line tracing the notch. Own background is now
     the "border" color; ::before below (inset exactly 2px top/bottom, matching the
     old border-width, full-bleed left/right same as before) holds the actual lime
     fill and is what actually gets clipped, so the ink shows as a solid wedge behind
     the notch — same look .calendar-widget/.calendar-past already had. */
  background:var(--ink);
  overflow:hidden;
  padding:var(--mq-pad) 0;
  transition:padding .3s ease;
  scroll-snap-align:start;
  scroll-margin-top:var(--header-h);
}
.marquee.is-stuck{--mq-pad:8px;--mq-font:11px;}
.marquee::before{
  content:'';
  position:absolute;
  top:2px;right:0;bottom:2px;left:0;
  background-color:var(--lime);
  background-image:var(--dot-pattern);
  background-size:var(--dot-gap) var(--dot-gap);
  background-blend-mode:overlay;
  z-index:-1;
  clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-sm)),calc(100% - var(--cut-sm)) 100%,0 100%);
  -webkit-clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-sm)),calc(100% - var(--cut-sm)) 100%,0 100%);
}
.marquee-track{
  display:flex;
  width:max-content;
  animation:marquee 42s linear infinite;
}
.marquee-track span{
  font-family:var(--font-sans);
  font-weight:700;
  font-size:var(--mq-font);
  transition:font-size .3s ease;
  letter-spacing:.1em;
  color:var(--ink);
  white-space:nowrap;
  padding:0 22px;
  border-right:1px solid var(--ink-muted);
}
@keyframes marquee{
  from{transform:translateX(0);}
  to{transform:translateX(-50%);}
}
@media (prefers-reduced-motion:reduce){
  .marquee-track{animation:none;}
  .glitch-flicker,.scroll-cue span,.arrow-down{animation:none;}
}

/* ---------- mission ---------- */
/* one deliberate break from the duotone: a bright sticky-note card for the
   mission statement, bold left-set sans, tight leading — a paper-note beat
   against the rest of the page's controlled dark/purple palette. */
.mission{
  max-width:var(--container);
  margin:0 auto;
  /* was a fixed 250px top/bottom (500px total) — with box-sizing:border-box that
     padding ate into the homepage's one-screen min-height floor (see body.home
     .mission below) rather than sitting on top of it, so the section's real
     rendered height came out taller than one screen even though it was meant to
     fit exactly, and one wheel-scroll from the hero landed short of fully centered.
     Scaling with the viewport keeps it fitting at typical sizes; min-height still
     covers anything shorter, and content simply grows the box on anything smaller. */
  padding:clamp(28px,6vw,64px) 24px;
  scroll-snap-align:start;
  scroll-margin-top:var(--header-h);
}
.mission-inner{
  display:flex;
  flex-direction:column;
  align-items:center;
  gap:8px;
  max-width:840px;
  margin:0 auto;
}
.mission-figure{
  /* sized off vw alone, this scaled with viewport WIDTH only — on any wide-but-not-
     very-tall window (a normal laptop, a maximized-but-modest browser pane) it could
     ask for more height than the section's one-screen floor actually has, even
     though the floor is a viewport-HEIGHT calc. The min(...) term mirrors that same
     floor calc (100svh minus the sticky header+marquee, see body.home rule up top)
     minus a stacked-layout allowance for the note sitting below it plus padding, so
     the figure only gets capped on genuinely short windows — tall ones are governed
     by vw exactly as before. */
  height:clamp(200px,min(55vw,calc(100svh - var(--header-h) - var(--marquee-h) - 260px)),380px);
  width:auto;
  object-fit:contain;
  filter:drop-shadow(0 18px 30px rgba(10,9,14,.5));
}
@media (min-width:720px){
  .mission-inner{
    flex-direction:row;
    /* was flex-end (sharing a bottom edge) — fine when the figure and note happened
       to be close in height, but the figure and note are now sized independently
       (each capped to the section's own floor, see their own comments below), so at
       most viewports one is noticeably taller than the other. Bottom-aligning left
       the shorter one — usually the text card — floating with dead space above it
       instead of sitting centered next to the photo. */
    align-items:center;
    justify-content:center;
    gap:28px;
    max-width:none;
  }
  .mission-figure{
    /* same idea, smaller allowance — figure and note sit side by side here instead
       of stacked, so this only needs to leave room for .mission's own padding. */
    height:clamp(280px,min(32vw,calc(100svh - var(--header-h) - var(--marquee-h) - 140px)),560px);
  }
}
.mission-note{
  position:relative;
  /* .work-card/.calendar-widget get a stacking context for free from their own
     opacity/transform scroll-reveal properties, which is what keeps their z-index:-1
     ::before fill correctly layered (painting after their own ink background, before
     normal content) instead of escaping to the page's broader stacking order and
     getting painted over. This card has no reveal animation of its own, and used to
     get that same stacking context as a side effect of clip-path being on the real
     element directly — removing that (see the cut-corner comment above) took the
     stacking context with it and left the whole card solid ink, fill never showing.
     isolation:isolate is the same fix with none of clip-path's cropping side effect. */
  isolation:isolate;
  background:var(--ink);
  padding:clamp(28px,5vw,44px);
  /* 640px is now the floor, not a fixed cap — grows further on wide screens instead
     of leaving the extra width empty either side of a fixed-size card. */
  max-width:clamp(640px,44vw,820px);
}
.mission-note::before{
  content:'';position:absolute;inset:2px;z-index:-1;
  background-color:var(--lime);
  clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-lg)),calc(100% - var(--cut-lg)) 100%,0 100%);
  -webkit-clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-lg)),calc(100% - var(--cut-lg)) 100%,0 100%);
}
.mission-text{
  font-family:var(--font-sans);
  font-weight:800;
  /* same min(vw,svh) reasoning as .mission-figure above — a wide-but-short window
     shouldn't be able to grow this (and the whole note card) past what the section's
     one-screen floor actually fits. */
  font-size:clamp(20px,min(4vw,4.6svh),38px);
  line-height:1.1;
  letter-spacing:-.02em;
  text-align:left;
  color:var(--type-color);        /* was --ink — now the shared global type color */
}
/* dancers illustration — centered under the figure + mission note row. */
.mission-dancers{
  display:block;
  width:min(100%,1200px);
  height:auto;
  /* extra space below the dancers before the next homepage section */
  margin:clamp(24px,4vw,48px) auto clamp(48px,9vw,110px);
}
.mission-text strong{
  font-weight:800;
  text-decoration:underline;
  text-decoration-thickness:2px;
  text-underline-offset:4px;
}

/* ---------- work ---------- */
.work{
  max-width:var(--container);
  margin:0 auto;
  /* bottom padding was a fixed 96px — on the homepage's one-screen-tall .work (see
     body.home rule up top) that pushed the section past 100svh, so snapping to its
     top scrolled the padding itself half off the bottom edge, leaving the cards
     looking flush against the browser window with no breathing room below them. */
  padding:0 20px clamp(16px,min(5vw,6svh),56px);
  scroll-snap-align:start;
  scroll-margin-top:calc(var(--header-h) + 24px);
}
.section-title{
  font-family:var(--font-serif);
  font-weight:800;
  font-size:clamp(22px,4vw,50px);
  /* [2026-11-12] was 1.15 — too tight for the Gloock display serif's deep descenders
     (the "g" in "Upcoming" got clipped where padding is 0), so give the line box room. */
  line-height:1.28;
  letter-spacing:-.01em;
  color:var(--type-color);        /* was --ink — shared global type color (section headings) */
  background-color:var(--lime);
  background-image:var(--dot-pattern);
  background-size:var(--dot-gap) var(--dot-gap);
  background-blend-mode:overlay;
  padding:14px 20px;
  margin-bottom:24px;
}
/* dj.html-only: a line icon before the title text, same stroke language as
   .bio-icon elsewhere. A dedicated modifier rather than changing .section-title
   itself, since that base rule is shared by every section heading on every page —
   most have no icon and don't need the flex layout this adds. em-sized so the icon
   scales with the heading's own clamp() font-size instead of needing its own
   breakpoints. */
.section-title--icon{
  display:flex;
  align-items:center;
  gap:.32em;
}
/* NOT .section-title-icon — that name was already taken by the homepage's own
   pre-existing badge-title icon further down this file (a completely different
   thing: applied to the <h2> itself, not a child span, with its own
   .section-title-icon-mark for the SVG). Reusing that name here collided badly:
   this rule's width/height:.72em was shrinking the *entire homepage heading* down
   to icon size, since both rules target the exact same class on elements that
   also both happen to be <h2 class="section-title">. */
.section-title-icon-inline{
  flex:none;
  width:.72em;
  height:.72em;
  color:var(--ink);
  /* align-items:center on the flex row centers the icon against the text's full
     line-height box, but the bold serif heading's own visual weight sits lower
     than that box's geometric middle — measured ~0.2em too high without this. */
  margin-top:.2em;
}
.section-title-icon-inline svg{width:100%;height:100%;display:block;}
/* homepage-only, and only the calendar's own two headings — "Upcoming Events" sits
   in .calendar-head-main, "Past Events" carries .calendar-head-past directly; the
   same two classes exist on dj.html/workshops.html's own calendar sections ("Latest
   mixes", "Approach") with completely different content, so body.home scopes this
   to the homepage instead of shrinking those too. 20% down from the shared
   clamp(22px,4vw,50px). */
body.home .calendar-head-main .section-title,
body.home .calendar-head-past{
  font-size:clamp(18px,3.2vw,40px);
  white-space:nowrap;
}
/* homepage-only marks on section-title headings — abstract line-art glyphs in the
   same stroke language as the card waveforms below (2px, currentColor), reused
   across every homepage section heading that carries one (.work, Upcoming/Past
   Events) so they read as one consistent signature rather than one-off flourishes. */
.section-title-icon{
  display:inline-flex;
  align-items:center;
  gap:14px;
  /* all three of these headings ended up as a flex item (.work/.calendar's own
     column-flex layout, part of the homepage's full-height redesign) or a grid item
     (.calendar-head-past, inside .calendar-head's grid) of an ancestor — and per
     spec, flex/grid items get their own display "blockified", so the inline-flex
     above was silently computing to plain flex the moment it landed in either
     context. That dropped the shrink-to-fit sizing inline-flex is here for, so the
     badge stretched to the full column/grid-track width with the icon+text
     left-aligned inside it and a stretch of empty lime trailing after the text
     instead of the badge hugging just the icon+title the way it's supposed to.
     align-self (the flex case) and justify-self (the grid case) both override their
     container's default stretch back to content-sized — each is simply ignored in
     whichever context doesn't apply, so one rule covers both. */
  align-self:flex-start;
  justify-self:start;
}
.section-title-icon-mark{
  flex:none;
  width:clamp(28px,4vw,40px);
  height:clamp(28px,4vw,40px);
  color:var(--ink);
}
.work-grid{
  display:grid;
  grid-template-columns:1fr;
  gap:20px;
}
@media (min-width:860px){
  .work-grid{grid-template-columns:repeat(3,1fr);gap:24px;}
}

/* dj.html "The sound" — plain text, no card/icon chrome (see dj.html's own
   comment). Width-capped and sized up from body copy for readability as a
   standalone statement rather than body text inside a card. */
.sound-statement{
  max-width:760px;
  font-family:var(--font-sans);
  font-weight:600;
  font-size:clamp(17px,2.2vw,20px);
  line-height:1.65;
  color:var(--ink-muted);
}
.sound-statement strong{color:var(--ink);font-weight:800;}
/* dj.html: the statement now sits in a full-width card, so let the text run the
   card's width instead of the 760px reading column. */
.sound-statement-box .sound-statement{max-width:none;}

/* event-production.html opening statement: sized like the homepage mission
   statement (.mission-text) rather than the smaller .sound-statement default. */
#statement .sound-statement,
#ws-intro .sound-statement{
  font-size:clamp(20px,min(4vw,4.6svh),38px);
  line-height:1.15;
  letter-spacing:-.02em;
  font-weight:700;
  color:var(--ink);
}
/* "What I can take on" list, sized to match the statement above it */
#services [data-edit="services-list"]{
  font-size:clamp(20px,min(4vw,4.6svh),38px);
  line-height:1.15;
  letter-spacing:-.02em;
  font-weight:700;
  color:var(--type-color);   /* [2026-11-13] muted gray like the other dropdown text */
}
/* workshops page: the "Custom workshops" intro, sized like the EP statement */
#formats [data-edit="formats-custom"]{
  font-size:clamp(20px,min(4vw,4.6svh),38px);
  line-height:1.15;
  letter-spacing:-.02em;
  font-weight:700;
  color:var(--ink);
}
/* dj page: the sound statement (now the lead, no title), sized to match */
#about .sound-statement{
  font-size:clamp(20px,min(4vw,4.6svh),38px);
  line-height:1.15;
  letter-spacing:-.02em;
  font-weight:700;
  color:var(--ink);
}
/* dj page Artist Profile photo: the source is a wide shot with lots of sky, so
   object-position can't crop it (a landscape image fills the box by height).
   Zoom in slightly, centred on the subject, so she sits in the middle with the
   extra sky cropped away. On big screens the photo also fills the column to match
   the facts card's height (image absolute, so it never makes the row taller). */
#profile .identity-photo-card{ overflow:hidden; }
#profile .identity-photo-card img{ object-position:50% 50%; transform:scale(1.45); transform-origin:50% 52%; }
@media (min-width:860px){
  #profile .identity-photo-card{ position:relative; }
  #profile .identity-photo-card img{ position:absolute; inset:0; width:100%; height:100%; aspect-ratio:auto; object-fit:cover; }
}

/* full-width single-column variant of .bio-grid (e.g. the Event Production
   "Let's collaborate" form, which shouldn't sit in a half-width column). */
.bio-grid.bio-grid--single{ grid-template-columns:1fr; }
/* in a single-column wrapper the form should fill the width (it otherwise keeps
   its own max-width:640px and sits half-width on wide screens). */
.bio-grid--single .contact-form{ max-width:none; }

/* ---------- workshops page: upcoming (prominent) + past (muted) ---------- */
.ws-grid{ display:grid; gap:20px; }
/* upcoming: large cards, flyer image beside the details on wider screens */
.ws-grid--upcoming{ grid-template-columns:1fr; }
.ws-card--upcoming{
  display:grid; grid-template-columns:1fr; overflow:hidden;
  background:var(--lime); border:2px solid var(--ink);
}
@media (min-width:720px){ .ws-card--upcoming{ grid-template-columns:minmax(0,300px) 1fr; } }
.ws-card--upcoming .ws-card-media{ display:block; cursor:zoom-in; min-height:220px; }
.ws-card--upcoming .ws-card-media img{ display:block; width:100%; height:100%; object-fit:cover; }
.ws-card--upcoming .ws-card-body{ padding:clamp(20px,3vw,34px); display:flex; flex-direction:column; gap:10px; }
.ws-card-title{ font-family:var(--font-serif); font-weight:800; line-height:1.05; color:var(--ink); margin:0; }
.ws-card--upcoming .ws-card-title{ font-size:clamp(22px,3.4vw,34px); }
.ws-card-meta{ font-family:var(--font-sans); font-weight:700; text-transform:uppercase; letter-spacing:.06em; font-size:13px; color:var(--ink-muted); margin:0; }
.ws-card-desc{ color:var(--ink-muted); font-size:16px; line-height:1.5; margin:2px 0 0; }
.ws-card--upcoming .work-link{ margin-top:auto; padding-top:6px; }
/* past: smaller, muted thumbnails (less visible than upcoming) */
.ws-grid--past{ grid-template-columns:repeat(2,1fr); gap:16px; }
@media (min-width:640px){ .ws-grid--past{ grid-template-columns:repeat(3,1fr); } }
@media (min-width:860px){ .ws-grid--past{ grid-template-columns:repeat(4,1fr); gap:20px; } }
.ws-card--past{ opacity:.58; transition:opacity .2s ease; }
.ws-card--past:hover{ opacity:1; }
.ws-card--past .ws-card-media{ display:block; aspect-ratio:3/4; overflow:hidden; border:2px solid var(--ink); background:var(--lime); cursor:zoom-in; }
.ws-card--past .ws-card-media img{ width:100%; height:100%; object-fit:cover; }
.ws-card--past .ws-card-body{ padding:8px 2px 0; }
.ws-card--past .ws-card-title{ font-family:var(--font-sans); font-weight:700; font-size:15px; }
.ws-card--past .ws-card-meta{ font-size:11px; margin-top:2px; }

/* event-production.html: "Two ways to work with me" cards (sub-title + bullet list). */
.ways-card-title{
  font-family:var(--font-serif);
  font-weight:800;
  font-size:clamp(18px,3vw,24px);
  line-height:1.1;
  letter-spacing:-.01em;
  color:var(--ink);
  margin:0 0 12px;
}
.service-list{
  list-style:none;
  margin:16px 0 0;
  padding:0;
  display:flex;
  flex-direction:column;
  gap:10px;
}
.service-list li{
  position:relative;
  padding-left:20px;
  color:var(--ink);
  font-family:var(--font-sans);
  font-size:15px;
  line-height:1.4;
}
.service-list li::before{
  content:'';
  position:absolute;
  left:2px;
  top:.52em;
  width:7px;height:7px;
  background:var(--ink);
  border-radius:50%;
}

/* dj.html "Event Flyers" — typography-only placeholder tiles (no flyer
   artwork exists yet, see dj.html's own comment) in the site's cut-corner
   sticky-note language, reusing the border-fix technique (own background is
   the border color, ::before holds the actual clipped lime fill). */
.flyer-grid{
  display:grid;
  grid-template-columns:repeat(2,1fr);
  gap:16px;
}
@media (min-width:640px){
  .flyer-grid{grid-template-columns:repeat(3,1fr);}
}
@media (min-width:860px){
  .flyer-grid{grid-template-columns:repeat(4,1fr);gap:20px;}
}
.flyer-card{
  position:relative;
  /* see .hero-note's own comment on this same gotcha — without a stacking
     context of its own, the ::before fill's z-index:-1 falls through to
     BEHIND this element's own background instead of just behind its text,
     leaving the card reading as solid --ink with barely-visible text. */
  isolation:isolate;
  display:flex;
  flex-direction:column;
  aspect-ratio:3/4;
  background:var(--ink);
  transition:transform .2s ease;
}
.flyer-card:hover{transform:translateY(-4px);}
.flyer-card::before{
  content:'';position:absolute;inset:2px;z-index:-1;
  background-color:var(--lime);
  clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-sm)),calc(100% - var(--cut-sm)) 100%,0 100%);
  -webkit-clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-sm)),calc(100% - var(--cut-sm)) 100%,0 100%);
}
.flyer-card-date{
  font-family:var(--font-sans);
  font-weight:700;
  font-size:11px;
  letter-spacing:.08em;
  text-transform:uppercase;
  color:var(--ink-muted);
  padding:16px 16px 0;
}
.flyer-card-title{
  font-family:var(--font-serif);
  font-weight:800;
  font-size:clamp(19px,3.6vw,26px);
  line-height:1.05;
  color:var(--ink);
  padding:6px 16px 2px;
}
.flyer-card-venue{
  font-family:var(--font-sans);
  font-weight:700;
  font-size:11px;
  letter-spacing:.06em;
  text-transform:uppercase;
  color:var(--ink-muted);
  padding:0 16px 16px;
}

.work-card{
  position:relative;
  background:var(--ink);
  display:flex;
  flex-direction:column;
  opacity:0;
  transform:translateY(24px);
  transition:opacity .6s ease, transform .6s ease;
}
.work-card.in-view{opacity:1;transform:translateY(0);}
/* border-fix, same technique as .hero-note/.bio-card/etc — see the shared comment
   near the cut-corner rules further down. Card's own background above became the
   border color; this inset, separately-clipped layer is the actual lime fill. */
.work-card::before{
  content:'';position:absolute;inset:2px;z-index:-1;
  background-color:var(--lime);
  clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-lg)),calc(100% - var(--cut-lg)) 100%,0 100%);
  -webkit-clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-lg)),calc(100% - var(--cut-lg)) 100%,0 100%);
}

.work-card-media{
  position:relative;
  /* was a flat aspect-ratio:4/3 — sized off the card's WIDTH alone, so on a wide-
     but-not-tall window it could still ask for more height than the section's
     one-screen floor has room for (same issue .mission-figure had), pushing the
     card's own text/CTA past the fold. The calc() term mirrors that floor (see
     body.home rule up top) minus a budget for the title, the card's text/CTA, and
     the section's own padding, so the photo only shrinks below the 14vw preferred
     size on genuinely short windows. */
  height:clamp(96px,14vw,calc(100svh - var(--header-h) - var(--marquee-h) - 480px));
  overflow:hidden;
}
/* homepage work-card photos, roughly doubled in height per request (taller photo
   area; the card below it grows accordingly rather than being pinned to one screen). */
.work-card--photo .work-card-media{
  height:clamp(240px,30vw,640px);
}
/* event-production.html's and workshops.html's standalone full-bleed banner photo
   (sits between the marquee and the next section, not inside a .work-card) — was
   relying on an inline aspect-ratio:21/9, but .work-card-media above already sets an
   explicit height, and aspect-ratio only has any effect when at least one dimension
   is auto. That explicit height is also a clamp() tuned for the homepage's card-grid
   (it references --header-h/--marquee-h, which mean nothing on a plain scrolling page
   like this one), so the inline aspect-ratio was silently doing nothing and this
   banner was getting sized by a formula built for a different section entirely.
   max-width was also capping it to --container, same as every other section on the
   page — but this one is meant to run full-bleed edge to edge like the marquee above
   it, so there's no max-width/margin centering here at all. */
.work-card-media--banner{
  height:auto;
  aspect-ratio:21/9;
  width:100%;
}
@media (max-width:640px){
  /* 21/9 gets very short once the banner is full viewport width on a phone —
     narrower ratio keeps the crop readable instead of a thin letterboxed strip. */
  .work-card-media--banner{aspect-ratio:4/3;}
}
.work-card-media img,
.work-card-media video{
  width:100%;height:100%;
  object-fit:cover;
  filter:url(#duotone) contrast(1.05);
  transition:transform .5s ease, filter .3s ease;
}
.work-card:hover .work-card-media img,
.work-card:hover .work-card-media video{
  transform:scale(1.04);
  filter:url(#duotone) contrast(1.15) brightness(1.05);
}
.work-card-media--pattern{
  background:
    repeating-linear-gradient(135deg, var(--bg-alt) 0 10px, color-mix(in srgb, var(--bg) 85%, black) 10px 20px),
    linear-gradient(160deg, color-mix(in srgb, var(--purple) 18%, transparent), color-mix(in srgb, var(--gray) 14%, transparent));
}

.work-card-body{
  padding:22px 22px 26px;
  display:flex;
  flex-direction:column;
  gap:10px;
  flex:1;
}
.work-card-head{
  display:flex;
  align-items:center;
  gap:6px 16px;
}
.work-card-body h3{
  font-family:var(--font-serif);
  font-weight:800;
  font-size:35px;
  /* was inheriting body's 1.55 — fine for a single line, but "Event Production"
     wraps to two and grid rows stretch every card to the tallest one, so that loose
     leading was inflating all three cards (and eating the section's own bottom
     margin on the homepage's now one-screen-tall .work — see body.home rule up top). */
  line-height:1.1;
  letter-spacing:-.02em;
  text-transform:none;
  color:var(--ink);
}
/* homepage's three service cards (DJing & Lessons / Workshops & Facilitation /
   Event Production) — 20% smaller than the shared 35px. */
body.home .work-card-body h3{font-size:28px;}
/* each practice area gets its own waveform signature beside the title —
   sine for DJing, square for Workshops, triangle for Event Production. */
.work-wave{
  height:16px;
  flex:1;
  min-width:40px;
  margin:0;
  background-repeat:repeat-x;
  background-size:24px 16px;
  animation:work-wave-scroll 1.6s linear infinite;
  opacity:.8;
}
.work-wave--sine{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 16'%3E%3Cpath d='M0,8 Q6,2 12,8 Q18,14 24,8' fill='none' stroke='%230d1321' stroke-width='2'/%3E%3C/svg%3E");}
.work-wave--square{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 16'%3E%3Cpath d='M0,4 L12,4 L12,12 L24,12 L24,4' fill='none' stroke='%230d1321' stroke-width='2'/%3E%3C/svg%3E");}
.work-wave--triangle{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 16'%3E%3Cpath d='M0,4 L12,12 L24,4' fill='none' stroke='%230d1321' stroke-width='2'/%3E%3C/svg%3E");}
@keyframes work-wave-scroll{
  from{background-position-x:0;}
  to{background-position-x:24px;}
}
@media (prefers-reduced-motion:reduce){
  .work-wave{animation:none;}
}
.work-card-body p{
  color:var(--ink-muted);
  font-weight:500;
  font-size:16.5px;
  line-height:1.5;
  flex:1;
}
.work-link{
  font-family:var(--font-sans);
  font-weight:700;
  font-size:20px;
  text-transform:uppercase;
  letter-spacing:.06em;
  color:var(--ink);
  text-decoration:underline;
  text-decoration-thickness:2px;
  text-underline-offset:3px;
  display:inline-flex;
  align-items:center;
  gap:6px;
}
.work-link span{transition:transform .2s ease;}
.work-link:hover span{transform:translateX(4px);}

/* ---- homepage service cards: whole card clickable + button-styled CTA ------ */
/* (2026-11-03) The CTA is restyled into an obvious raised pill button, and its
   stretched ::after overlay makes the WHOLE card a link to that section — one real
   anchor, so no nested-interactive accessibility issues. Both are switched off in
   admin edit mode (body.ka-editing) so inline text editing and the drag-to-reorder
   handles receive clicks instead of navigating. Scoped to body.home so the shared
   .work-card / .work-link elsewhere (subpages, ws-cards) are untouched. */
body.home .work-card{ cursor:pointer; }
/* CTA matches the site's .btn-primary (the form's "NEXT →" button): a light cut-corner
   OUTLINE whose fill matches the card, so it reads light instead of a heavy filled pill.
   Same border-fix technique as .btn — the element background is the (light) border
   colour, and the inset ::before (same notch) is the fill that matches the card. */
body.home .work-card .work-link{
  position:relative;
  z-index:4;
  align-self:stretch;              /* full card width, responsive on desktop + mobile */
  display:flex;
  justify-content:center;          /* centre the label + arrow across the full-width button */
  align-items:center;
  gap:6px;
  margin-top:auto;                 /* CTA pinned to the card bottom so all three align */
  padding:13px 20px;
  background:var(--ink);           /* = the light border colour (fill lives on ::before) */
  color:var(--ink);                /* light text, like the NEXT button */
  text-decoration:none;
  font-size:14px;
  border-radius:2px;
  clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-sm)),calc(100% - var(--cut-sm)) 100%,0 100%);
  -webkit-clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-sm)),calc(100% - var(--cut-sm)) 100%,0 100%);
  transition:color .2s ease;
}
body.home .work-card .work-link::before{
  content:"";
  position:absolute;
  inset:1px;                       /* the 1px ring of the element's bg reads as the border */
  z-index:-1;
  background:var(--lime);          /* fill matches the card → reads as a light outline */
  clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-sm)),calc(100% - var(--cut-sm)) 100%,0 100%);
  -webkit-clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-sm)),calc(100% - var(--cut-sm)) 100%,0 100%);
  transition:background .2s ease;
}
/* Whole-card click is a cover <a> that's a DIRECT child of .work-card, so it is never
   clipped by the collapsible .work-card-more below (which is overflow:hidden while
   collapsed). The real CTA is raised above it and stays independently clickable. */
body.home .work-card .work-card-cover{
  position:absolute;
  inset:0;
  z-index:3;
}
body.home .work-card .work-link{ position:relative; z-index:4; }
/* hovering the card fills the CTA solid (like .btn-primary:hover) — a light-touch
   feedback that signals the whole card is clickable. No pink, no heavy shadow. */
body.home .work-card:hover .work-link{ color:var(--lime); }
body.home .work-card:hover .work-link::before{ background:var(--ink); }
/* edit mode: drop the overlay + pointer cursor so editing/reorder handles get clicks */
body.home.ka-editing .work-card .work-card-cover{ display:none; }
body.home.ka-editing .work-card{ cursor:default; }

/* ---- hover reveal: image + title + CTA always shown; description on rollover ----
   (2026-11-03) The description (.work-card-more) is hidden until the card is hovered
   or focused, then slides open smoothly (grid-rows 0fr→1fr). Only on devices that
   actually support hover — on touch (hover:none) it's simply shown, so nothing is ever
   hidden with no way to reveal it. align-items:start keeps expanding one card on hover
   from stretching its neighbours. Edit mode forces it open so the text stays editable. */
body.home .work-grid{ align-items:start; }
body.home .work-card-more-inner{
  display:flex;
  flex-direction:column;
  gap:10px;
}
@media (hover:hover){
  body.home .work-card .work-card-more{
    display:grid;
    grid-template-rows:0fr;
    opacity:0;
    transition:grid-template-rows .45s cubic-bezier(.16,1,.3,1), opacity .35s ease;
  }
  body.home .work-card .work-card-more-inner{
    overflow:hidden;
    min-height:0;
  }
  body.home .work-card:hover .work-card-more,
  body.home .work-card:focus-within .work-card-more{
    grid-template-rows:1fr;
    opacity:1;
  }
}
/* edit mode: always show the description regardless of hover, so it stays editable */
body.home.ka-editing .work-card .work-card-more{ grid-template-rows:1fr; opacity:1; }
body.home.ka-editing .work-card .work-card-more-inner{ overflow:visible; }

/* ---------- subpage hero photo (dj/workshops/event-production page-intro) ----------
   Real event/workshop photography behind the lime intro card, duotone-filtered the same
   way as the homepage's video/work-grid photos — these sections had no imagery at all
   before, just the flat page background behind the card. max-width/margin are reset
   here so the photo runs edge to edge instead of staying capped at the shared
   --container width. .mission-inner's own max-width:840px + margin:0 auto (unchanged)
   still centers the actual intro card.
   display:grid, not flex, for the bottom-alignment — a grid item stretches to its
   track's full inline size by default, where a flex item sizes to its own content
   along the main axis. That default is exactly what re-triggers the collapse bug
   already hit (and documented) below on the contact page's own min-width:860px rule:
   .hero-note's container-type:inline-size stops a flex item's auto-width from
   deriving from content, so without an explicit width it collapses to ~0 and wraps
   every word onto its own line. Grid's stretch-by-default sidesteps that outright.
   min-height here (fill the screen, viewport height minus the header, same as the
   homepage hero) is the ORIGINAL full-height treatment — no page currently uses it
   bare; all three current subpages opt into the shorter .page-intro--banner variant
   below instead. Left in rather than deleted in case a future full-bleed portrait
   hero (the way contact.html briefly had one) comes back. */
.mission.page-intro{
  position:relative;
  overflow:hidden;
  max-width:none;
  margin:0;
  padding:0 24px 60px;
  min-height:calc(100svh - var(--header-h));
  display:grid;
  align-items:end;
}
.page-intro-photo{
  position:absolute;inset:0;
  width:100%;height:100%;
  object-fit:cover;
  filter:url(#duotone) contrast(1.08);
  z-index:0;
  /* Ken-Burns drift — .mission.page-intro's own overflow:hidden (above) clips
     the scaled-up edges, so this never shows a seam. ease-in-out + alternate
     (not a hard loop back to 1) keeps the direction change smooth instead of
     snapping back at the end of each cycle; this class is only ever used on
     dj.html/workshops.html/event-production.html's hero banner, so no extra
     scoping needed here. */
  transform-origin:center;
  animation:page-intro-photo-zoom 16s ease-in-out infinite alternate;
}
@keyframes page-intro-photo-zoom{
  from{transform:scale(1);}
  to{transform:scale(1.18);}
}
@media (prefers-reduced-motion:reduce){
  .page-intro-photo{animation:none;}
}
/* dj.html hero slideshow: several stacked .page-intro-photo layers (images and
   video both use the same class, so both get the same crop/duotone/Ken-Burns
   treatment) cross-fading via .is-active — see initHeroSlideshow in js/main.js.
   Only used where the markup actually stacks more than one .page-intro-photo;
   a single-photo hero (workshops.html/event-production.html) is untouched. */
.page-intro-slideshow .page-intro-photo{
  opacity:0;
  transition:opacity 1.1s ease;
}
.page-intro-slideshow .page-intro-photo.is-active{opacity:1;}
@media (prefers-reduced-motion:reduce){
  .page-intro-slideshow .page-intro-photo{transition:none;}
}
/* dj/workshops/event-production heroes: a shorter horizontal-photo banner instead of
   the full-viewport-height crop above — a landscape photo doesn't need (or suit) a
   full screen of height to read well, and the hero-note title card (now also holding
   the shader panel stacked below the title, see .hero-shader-panel further down)
   doesn't need a full screen to stay legible either. No .page-intro-scrim on
   these: that gradient existed to fade a tall portrait photo into the page background
   above the fold; a short banner crop doesn't have that same problem, and the
   hero-note is still a fully opaque card regardless, so there's no text-contrast
   reason to keep it either. */
.mission.page-intro.page-intro--banner{
  /* specificity note: plain .page-intro--banner (one class) loses the cascade to
     .mission.page-intro (two classes) above regardless of source order, silently
     leaving min-height:calc(100svh - header-h) in charge and making the min-height:
     clamp() below a no-op — matching .mission.page-intro's own two-class selector
     here is what actually lets these win. */
  /* min-height, not a hard height: the stacked title+shader card can run taller
     than this floor at some widths (e.g. a very narrow mobile viewport where
     .hero-shader-panel's cqw height climbs relative to its own now-narrower
     .hero-note), and .mission.page-intro's overflow:hidden would silently clip
     the card's bottom off if this were a fixed height instead. */
  /* [2026-11-11] run the hero photo UP under the sticky header so the header's
     blurred-lime gradient dissolves into the photo — the same look the homepage header
     has over the fixed shader — instead of a hard photo edge below a separate header
     band. The negative margin pulls the banner up by the header's height; the matching
     top padding + the extra header-h in min-height keep the title card and everything
     below exactly where they were (only the photo now extends up behind the header). */
  margin-top:calc(-1 * var(--header-h));
  min-height:calc(clamp(260px,42vw,520px) + var(--header-h));
  padding:var(--header-h) 24px 28px;
}
/* margin:0, overriding .mission-inner's own margin:0 auto (used elsewhere to center it
   as a normal block) — a grid item with an auto margin on its inline axis opts out of
   the grid's default stretch-to-fill sizing (same "auto margin means shrink-to-content"
   rule that centers a normal block), which is what was collapsing this down to its
   content width. Its own internal flexbox (align-items:center, see .mission-inner's
   base rule) already centers .hero-note horizontally, so this margin was never doing
   distinct work here anyway. */
/* width:100% for the same reason .contact-intro needed it: as a flex child of
   .mission.page-intro (align-items:center on .mission-inner's own base rule, no
   explicit width otherwise), it would shrink to content width instead of using
   the room available. max-width stays at the 840px base value (not widened) —
   .hero-note's own max-width:640px is always the tighter cap regardless of how
   wide this parent is, so there's nothing here for a wider max-width to do.
   flex-direction/align-items/justify-content all override .mission-inner's own
   rules (base align-items:center, and — the actual culprit — the >=720px media
   query further up that turns .mission-inner into a flex ROW with
   justify-content:center for the homepage's photo+text .mission blocks; without
   overriding that here too, .hero-note kept landing horizontally centered above
   720px even with align-items alone changed, since centering was coming from
   justify-content on the row's main axis, not align-items on its cross axis).
   Forcing flex-direction:column + justify-content:flex-start (main axis) and
   align-items:flex-start (cross axis) makes the title card sit at the left edge
   at every width, the way the homepage's #home .hero-note does (a plain block,
   left-aligned by default inside .hero-content, no centering flex/grid involved
   there), not floating centered over the photo the way the two-column .bio-grid
   layout this replaced used to justify. */
.mission.page-intro .mission-inner{
  position:relative;
  z-index:1;
  margin:0;
  width:100%;
  flex-direction:column;
  align-items:flex-start;
  justify-content:flex-start;
}
/* align the title card's left edge with the header logo: same centred column as
   .header-inner (max-width:var(--container), 20px side padding). The explicit
   width:100% above keeps the auto margins from shrinking it to content width. */
.mission.page-intro.page-intro--banner{padding-left:0;padding-right:0;}
.mission.page-intro .mission-inner{
  max-width:var(--container);
  margin:0 auto;
  padding:0 20px;
}
/* the hero's shader panel now sits nested inside .hero-note itself, stacked below
   the title (both inside the one card/border) rather than beside it as a separate
   .bio-grid column — so it no longer inherits a height from a grid sibling and
   needs a real one of its own, at every width. cqw scales it off .hero-note's own
   inline size (container-type:inline-size, set on .hero-note) rather than the
   viewport, so it stays proportional to the title card itself instead of the
   screen — including the smaller 320px card size set below. margin-top provides
   the gap under the title (.hero-title keeps margin-bottom:0 inline on these three
   pages, same as before this panel moved inside the card) — halved to match the
   card's own halved padding just below, same relationship #home's own halved
   hero-title margin-bottom has to its halved padding. */
.hero-shader-panel{
  height:clamp(120px,40cqw,220px);
  margin-top:12px;
}

/* dj/workshops/event-production's title card reuses the homepage's own half-size
   .hero-note treatment (#home .hero-note above) rather than the shared 640px/full
   padding base size, so the "hero card" reads as the same object across every page
   — just with a photo banner behind it here instead of the homepage's video.
   Scoped to .mission.page-intro (only the photo-banner hero on these three pages
   uses that class) rather than #home, so it doesn't reach the #dj-booking/
   #class-booking hero-note cards further down dj.html or contact.html's own
   .contact-intro hero. Font-size is NOT copied from #home .hero-title, unlike the
   sizing here — each page's own inline clamp() on its <h1> (tuned per-title, since
   "Facilitation & Learning"/"Building Club Culture" run longer than "N SKA") already
   scales itself down for free once its container shrinks, because cqw is relative
   to .hero-note's own width, not the viewport. */
.mission.page-intro .hero-note{
  --cut-lg:13px;
  max-width:320px;
  padding:clamp(12px,2vw,20px);
}
/* same delayed entrance as the homepage hero (#home's own hero-slide-in above) —
   arrives 5s in, once the page and marquee have already settled, sliding in from
   the left with a fade rather than just being there on first paint. */
.mission.page-intro .hero-note{
  animation:hero-slide-in .9s cubic-bezier(.16,1,.3,1) 5s both;
}
@media (prefers-reduced-motion:reduce){
  .mission.page-intro .hero-note{animation:none;}
}

/* ---------- subpage bits: bio grid + SoundCloud embed (dj.html) ---------- */
.bio-grid{
  display:grid;
  grid-template-columns:1fr;
  gap:20px;
}
@media (min-width:860px){
  .bio-grid{grid-template-columns:repeat(2,1fr);gap:24px;}
}
.bio-card{
  /* border/background intentionally NOT set here — the border-fix rules earlier in
     this file (position:relative;border:none / background:var(--ink) / ::before with
     the clipped lime fill) already establish those; redeclaring a real `border` here
     would silently win the cascade (same specificity, later wins) and undo that
     technique, which is exactly what was cutting the border off along the diagonal
     notch and leaving the corner unreadable against a same-colored backdrop. */
  padding:24px 22px;
  opacity:0;
  transform:translateY(24px);
  transition:opacity .6s ease, transform .6s ease;
}
.bio-card.in-view{opacity:1;transform:translateY(0);}
.bio-card p{
  color:var(--ink);
  font-weight:600;
  font-size:16px;
  line-height:1.5;
}
.bio-card p strong{font-weight:800;}
/* per-card line icon, same stroke-drawing language as the work-card waveforms
   (.work-wave--sine/square/triangle) — extends that vocabulary onto the
   subpages, which had no iconography of their own. */
.bio-icon{display:inline-block;width:32px;height:32px;margin-bottom:14px;color:var(--ink);}
.bio-icon svg{width:100%;height:100%;display:block;}

/* homepage's work-card waveforms aside, this is the only icon+paragraph bio-card
   pattern on the subpages — applied to every such group (event-production's "What
   she builds"/"Where she comes in", dj's "The sound", workshops' "Workshop
   formats"/"Approach") but NOT dj's fact-list/press-link "Profile" card or any of
   the contact-form .bio-grid instances, neither of which has a .bio-icon to move in
   the first place and would just turn into an unwanted side-by-side layout of their
   real children instead. Icon sits beside the credit instead of stacked above it,
   and bigger, so it reads more like a mark next to a name than a small decorative
   flourish above a paragraph. */
.bio-grid--icon-left .bio-card{
  display:flex;
  align-items:flex-start;
  gap:18px;
}
.bio-grid--icon-left .bio-icon{
  flex:none;
  width:52px;
  height:52px;
  margin-bottom:0;
}

/* ---------- identity card (dj.html profile block) ----------
   framed press portrait + a fact-list card, sitting in the same .bio-grid
   two-up layout as "The sound" below it — reuses that grid rather than
   inventing a new one, keeps the rhythm consistent down the page. */
.identity-photo-card{
  border:2px solid var(--ink);
  overflow:hidden;
  opacity:0;
  transform:translateY(24px);
  transition:opacity .6s ease, transform .6s ease;
}
.identity-photo-card.in-view{opacity:1;transform:translateY(0);}
.identity-photo-card img{
  display:block;
  width:100%;
  aspect-ratio:3/4;
  object-fit:cover;
  filter:url(#duotone) contrast(1.05);
}
/* [2026-11-13] DJ "Press & Booking" portrait — cap the height (was a full 3:4 portrait, too
   tall, esp. stacked on phones) so the opened panel fits on screen responsively; object-fit
   crops instead of growing. */
#dj-press .identity-photo-card img{
  aspect-ratio:auto;
  height:clamp(190px,40vh,400px);
}
.identity-photo-caption{
  background:var(--lime);
  padding:12px 16px;
  font-family:var(--font-sans);
  font-weight:700;
  font-size:12.5px;
  text-transform:uppercase;
  letter-spacing:.05em;
  color:var(--ink);
}
.fact-list{
  list-style:none;
  margin:0;
  padding:0;
  display:flex;
  flex-direction:column;
  gap:14px;
}
.fact-list li{border-top:1px solid var(--ink-muted);padding-top:14px;}
.fact-list li:first-child{border-top:none;padding-top:0;}
.fact-list b{
  display:block;
  font-family:var(--font-sans);
  font-weight:800;
  font-size:11.5px;
  text-transform:uppercase;
  letter-spacing:.06em;
  margin-bottom:4px;
  color:var(--ink);
}
.fact-list span{color:var(--ink);font-weight:600;font-size:15px;line-height:1.4;}

.press-links{display:flex;flex-wrap:wrap;gap:12px;margin-top:20px;}
.press-link{
  display:inline-flex;
  align-items:center;
  gap:8px;
  border:2px solid var(--ink);
  background:var(--lime);
  padding:10px 16px;
  font-family:var(--font-sans);
  font-weight:700;
  font-size:12.5px;
  text-transform:uppercase;
  letter-spacing:.05em;
  color:var(--ink);
}
.press-link:hover{background:var(--ink);color:var(--lime);}
.press-link svg{width:15px;height:15px;flex:none;}

/* ---------- contact form (contact.html) ---------- */
.contact-form{
  /* border/background NOT redeclared here — see .bio-card's comment further up for
     why: the border-fix rules earlier in this file already set those. */
  padding:clamp(24px,4vw,40px);
  display:flex;
  flex-direction:column;
  gap:20px;
  max-width:640px;
  opacity:0;
  transform:translateY(24px);
  transition:opacity .6s ease, transform .6s ease;
}
.contact-form.in-view{opacity:1;transform:translateY(0);}
.contact-field{
  display:flex;
  flex-direction:column;
  gap:8px;
}
.contact-field label{
  font-family:var(--font-sans);
  font-weight:700;
  font-size:12px;
  text-transform:uppercase;
  letter-spacing:.06em;
  color:var(--ink);
}
.contact-field input,
.contact-field select,
.contact-field textarea{
  font-family:var(--font-sans);
  font-size:15px;
  font-weight:500;
  color:var(--ink);
  background:transparent;
  border:1px solid var(--ink-muted);
  border-radius:0;
  padding:12px 14px;
  transition:border-color .15s ease;
}
.contact-field input:focus,
.contact-field select:focus,
.contact-field textarea:focus{
  outline:none;
  border-color:var(--ink);
}
.contact-field textarea{resize:vertical;min-height:130px;}
.contact-form .btn{align-self:flex-start;}

/* ---------- conversational form (workshops.html "Book a workshop" only) ----------
   One big, blunt question at a time instead of every field stacked at once. All
   .form-step panels stay in the DOM together (so this doesn't need its own field
   markup — same label/input/select/textarea as every other .contact-form) but only
   .is-active is actually displayed; main.js's wireConversationalForm decides which
   one that is and drives Enter-to-advance/Back/submit. Brutal on purpose: oversized
   serif question, no boxed input chrome — just a bare answer sitting on a thick ink
   rule — and a blunt numeric counter instead of a softened progress phrase. */
.contact-form--conversational{min-height:400px;justify-content:space-between;}
.form-progress{
  display:flex;
  align-items:center;
  gap:14px;
}
.form-progress-count{
  font-family:var(--font-sans);
  font-weight:800;
  font-size:12px;
  letter-spacing:.1em;
  color:var(--ink-muted);
  flex:none;
}
.form-progress-bar{
  flex:1;
  height:3px;
  background:color-mix(in srgb, var(--ink) 18%, transparent);
}
.form-progress-fill{
  height:100%;
  width:0%;
  background:var(--ink);
  transition:width .3s ease;
}
.form-step{
  display:none;
  flex-direction:column;
  gap:20px;
  flex:1;
  justify-content:center;
}
.form-step.is-active{display:flex;}
.form-question{
  font-family:var(--font-serif);
  font-weight:800;
  font-size:clamp(24px,4vw,38px);
  line-height:1.08;
  letter-spacing:-.01em;
  color:var(--ink);
  text-transform:none;
}
.form-answer{
  font-family:var(--font-sans);
  font-size:clamp(18px,2.4vw,22px);
  font-weight:600;
  color:var(--ink);
  background:transparent;
  border:none;
  border-bottom:3px solid color-mix(in srgb, var(--ink) 35%, transparent);
  border-radius:0;
  padding:8px 2px;
  transition:border-color .15s ease;
}
.form-answer:focus{outline:none;border-bottom-color:var(--ink);}
.form-answer.is-invalid{border-bottom-color:#c0392b;}
select.form-answer{cursor:pointer;}

/* bright text caret so it's obvious where to type, in every form + booking field */
.form-answer,.contact-field input,textarea{caret-color:var(--purple);}
/* custom blinking caret shown on the active, still-empty field (js positions it) */
.contact-form{position:relative;}
.form-caret{
  position:absolute; width:3px; display:none; z-index:2;
  background:var(--purple); pointer-events:none;
  animation:form-caret-blink 1.05s steps(1,end) infinite;
}
@keyframes form-caret-blink{0%,49.9%{opacity:1;}50%,100%{opacity:0;}}
@media (prefers-reduced-motion:reduce){.form-caret{animation:none;}}
/* the always-visible Next/Submit button reads as disabled until the field's answered */
.btn:disabled,.btn[disabled]{opacity:.45;cursor:not-allowed;}
textarea.form-answer{
  resize:vertical;
  min-height:110px;
  border:2px solid color-mix(in srgb, var(--ink) 35%, transparent);
  padding:12px 14px;
}
textarea.form-answer:focus{border-color:var(--ink);}
.form-nav{
  display:flex;
  align-items:center;
  gap:18px;
  margin-top:8px;
}
.form-nav-back{
  font-family:var(--font-sans);
  font-weight:700;
  font-size:13px;
  text-transform:uppercase;
  letter-spacing:.06em;
  color:var(--ink-muted);
  background:none;
  border:none;
  cursor:pointer;
  padding:0;
}
.form-nav-back:hover{color:var(--ink);}

/* ---------- brutalist date picker (workshops.html + event-production.html date
   fields) ----------
   Native <input type="date">/<input type="datetime-local"> open an OS/browser-drawn
   popup that no CSS can reach into — there is no way to theme it. The field is a
   plain readonly text trigger instead (still a real, labelled, submitted form
   field — see the data-datepicker attribute main.js keys off of); this is the fully
   custom popup calendar that opens in its place, built from the exact same ink/lime/
   cut-corner/dot-pattern parts every other card on the site uses (see the cut-corner
   accent + border-fix comments further up) and the same bordered-pill selection
   language as the .cal-day/.cal-slot pickers on dj.html's class-booking modal, so it
   reads as the site's own chrome, not a generic widget bolted on. position:fixed +
   JS-computed coordinates (same reasoning as .hover-card above) so it isn't clipped
   by the conversational form's own box. */
.date-picker-popup{
  position:fixed;
  top:0;left:0;
  z-index:250;
  width:296px;
  background:var(--ink);
  padding:2px;
  opacity:0;
  visibility:hidden;
  pointer-events:none;
  transform:translateY(6px);
  transition:opacity .15s ease, transform .15s ease;
  box-shadow:0 16px 34px rgba(10,9,14,.45);
  clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-sm)),calc(100% - var(--cut-sm)) 100%,0 100%);
  -webkit-clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-sm)),calc(100% - var(--cut-sm)) 100%,0 100%);
}
.date-picker-popup.is-open{
  opacity:1;
  visibility:visible;
  pointer-events:auto;
  transform:translateY(0);
}
.date-picker-popup-inner{
  background-color:var(--lime);
  background-image:var(--dot-pattern);
  background-size:var(--dot-gap) var(--dot-gap);
  background-blend-mode:overlay;
  padding:18px;
  clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-sm)),calc(100% - var(--cut-sm)) 100%,0 100%);
  -webkit-clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-sm)),calc(100% - var(--cut-sm)) 100%,0 100%);
}
.date-picker-head{
  display:flex;
  align-items:center;
  justify-content:space-between;
  margin-bottom:14px;
}
.date-picker-month{
  font-family:var(--font-sans);
  font-weight:800;
  font-size:13px;
  text-transform:uppercase;
  letter-spacing:.07em;
  color:var(--ink);
}
.date-picker-nav{display:flex;gap:6px;}
.date-picker-nav button{
  width:24px;height:24px;
  border:1px solid var(--ink);
  background:transparent;
  color:var(--ink);
  font-family:var(--font-sans);
  font-weight:800;
  font-size:13px;
  line-height:1;
  cursor:pointer;
}
.date-picker-nav button:hover{background:var(--ink);color:var(--lime);}
.date-picker-dow,
.date-picker-grid{display:grid;grid-template-columns:repeat(7,1fr);}
.date-picker-dow{margin-bottom:4px;}
.date-picker-dow span{
  text-align:center;
  font-family:var(--font-sans);
  font-weight:800;
  font-size:10px;
  letter-spacing:.03em;
  color:var(--ink-muted);
}
.date-picker-grid{gap:3px;}
.date-picker-day{
  aspect-ratio:1;
  border:1px solid var(--ink);
  background:transparent;
  color:var(--ink);
  font-family:var(--font-sans);
  font-weight:700;
  font-size:12px;
  cursor:pointer;
  display:flex;
  align-items:center;
  justify-content:center;
}
.date-picker-day:hover{background:color-mix(in srgb, var(--ink) 14%, transparent);}
.date-picker-day[aria-selected="true"]{background:var(--ink);color:var(--lime);}
.date-picker-day.is-outside{opacity:.3;border-color:transparent;cursor:default;pointer-events:none;}
.date-picker-day.is-today{border-width:2px;}
.date-picker-times{
  display:flex;
  flex-wrap:wrap;
  gap:6px;
  margin-top:16px;
  padding-top:14px;
  border-top:1px dashed var(--ink-muted);
}
.date-picker-time{
  padding:7px 10px;
  border:1px solid var(--ink);
  background:transparent;
  color:var(--ink);
  font-family:var(--font-sans);
  font-weight:700;
  font-size:12px;
  cursor:pointer;
}
.date-picker-time:hover{background:color-mix(in srgb, var(--ink) 14%, transparent);}
.date-picker-time[aria-pressed="true"]{background:var(--ink);color:var(--lime);}
.date-picker-time:disabled{opacity:.3;cursor:not-allowed;}
.contact-note{
  font-family:var(--font-sans);
  font-weight:600;
  font-size:13px;
  color:var(--ink-muted);
}
.contact-direct{
  /* border/background NOT redeclared here — see .bio-card's comment further up for
     why: the border-fix rules earlier in this file already set those. */
  padding:clamp(24px,4vw,40px);
  display:flex;
  flex-direction:column;
  gap:16px;
  opacity:0;
  transform:translateY(24px);
  transition:opacity .6s ease, transform .6s ease;
}
.contact-direct.in-view{opacity:1;transform:translateY(0);}
.contact-direct-item{display:flex;flex-direction:column;gap:4px;}
.contact-direct-item span{
  font-family:var(--font-sans);
  font-weight:700;
  font-size:12px;
  text-transform:uppercase;
  letter-spacing:.06em;
  color:var(--ink-muted);
}
.contact-direct-item a{
  font-family:var(--font-sans);
  font-weight:700;
  font-size:18px;
  color:var(--ink);
  text-decoration:underline;
  text-decoration-thickness:2px;
  text-underline-offset:3px;
}

/* ---------- 1:1 class booking modal (dj.html) ----------
   Client-side only, same as the rest of this site's forms: picking a slot and
   submitting shows a local success message, nothing is actually sent anywhere
   or written to a real calendar yet. A live Google Calendar sync needs a small
   backend (Calendar API credentials + an endpoint to check real availability
   and create the event) that doesn't exist for this project — see todo.md. */
.booking-modal{
  position:fixed;inset:0;z-index:200;
  display:flex;align-items:center;justify-content:center;
  padding:20px;
  background:color-mix(in srgb, var(--bg) 78%, transparent);
  opacity:0;visibility:hidden;
  transition:opacity .2s ease, visibility .2s ease;
}
.booking-modal.open{opacity:1;visibility:visible;}
.booking-modal-panel{
  position:relative;
  background:var(--lime);
  border:2px solid var(--ink);
  width:100%;max-width:560px;
  max-height:88vh;overflow-y:auto;
  padding:clamp(24px,4vw,40px);
  clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-lg)),calc(100% - var(--cut-lg)) 100%,0 100%);
}
/* Artist Profile modal (dj.html) — the shared .bio-grid goes two-up at a 860px
   *viewport*, which squeezed two columns into the 560px booking panel and left the
   photo card stretched taller than its image (empty block under the portrait).
   Wider panel, own breakpoint, and the photo fills its column instead. */
#profileModal .booking-modal-panel{max-width:880px;}
#profileModal .bio-grid{grid-template-columns:1fr;gap:20px;}
#profileModal .identity-photo-card img{aspect-ratio:4/3;object-position:center 30%;}
@media (min-width:760px){
  #profileModal .bio-grid{grid-template-columns:2fr 3fr;gap:24px;}
  #profileModal .identity-photo-card img{height:100%;aspect-ratio:auto;min-height:320px;}
}
.booking-modal-close{
  position:absolute;top:16px;right:16px;
  width:32px;height:32px;
  display:flex;align-items:center;justify-content:center;
  background:transparent;border:1px solid var(--ink);
  color:var(--ink);cursor:pointer;
}
.booking-modal-panel h3{
  font-family:var(--font-serif);font-weight:800;
  font-size:clamp(22px,3vw,30px);
  color:var(--ink);
  margin:0 0 10px;
  padding-right:40px;
}
.booking-modal-intro{
  color:var(--ink-muted);font-weight:600;font-size:14px;line-height:1.5;
  margin-bottom:22px;
}
.booking-details{
  display:grid;grid-template-columns:repeat(3,1fr);gap:14px;
  margin-bottom:24px;padding-bottom:20px;
  border-bottom:1px solid var(--ink-muted);
}
.booking-details span{
  display:block;font-weight:700;font-size:11px;
  text-transform:uppercase;letter-spacing:.06em;margin-bottom:4px;
  color:var(--ink);
}
.booking-details p{font-size:12.5px;color:var(--ink-muted);font-weight:500;line-height:1.4;}
.booking-label{
  font-family:var(--font-sans);font-weight:700;font-size:12px;
  text-transform:uppercase;letter-spacing:.06em;color:var(--ink);
  margin:0 0 10px;
}
.cal-days{display:flex;gap:8px;overflow-x:auto;padding-bottom:6px;margin-bottom:22px;}
.cal-day{
  flex:none;display:flex;flex-direction:column;align-items:center;gap:2px;
  min-width:52px;padding:8px 6px;
  border:1px solid var(--ink);background:transparent;
  font-family:var(--font-sans);color:var(--ink);cursor:pointer;
}
.cal-day[aria-selected="true"]{background:var(--ink);color:var(--lime);}
.cal-day:disabled{opacity:.35;cursor:not-allowed;text-decoration:line-through;}
.cal-day-dow{font-size:9px;font-weight:700;letter-spacing:.06em;}
.cal-day-num{font-size:15px;font-weight:800;}
.cal-slots{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:24px;}
.cal-slot{
  padding:9px 16px;border:1px solid var(--ink);background:transparent;
  font-family:var(--font-sans);font-weight:700;font-size:13px;color:var(--ink);cursor:pointer;
}
.cal-slot[aria-pressed="true"]{background:var(--ink);color:var(--lime);}
.cal-slot:disabled{opacity:.3;cursor:not-allowed;text-decoration:line-through;}
.booking-confirm{border-top:1px solid var(--ink-muted);padding-top:20px;}
.booking-confirm.hidden{display:none;}
.booking-confirm-fields{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-bottom:16px;}
.booking-status{margin-top:14px;font-weight:700;font-size:13px;color:var(--ink);}
.booking-status.hidden{display:none;}
.booking-status.error{color:#a02020;}
@media (max-width:600px){
  .booking-details{grid-template-columns:1fr 1fr;}
  .booking-confirm-fields{grid-template-columns:1fr;}
}

/* ---------- gallery lightbox (dj.html "Performances") ---------- */
/* thumbnails: cursor + a play icon on video ones (no native `controls` in the
   grid — see the HTML's own comment on why) so it's clear the whole card is
   clickable, not just decoratively hoverable like a plain photo elsewhere. */
.gallery-item{cursor:pointer;}
.gallery-play-icon{
  position:absolute;inset:0;
  display:flex;align-items:center;justify-content:center;
  color:#fff;
  pointer-events:none;
}
.gallery-play-icon svg{width:56px;height:56px;filter:drop-shadow(0 2px 6px rgba(0,0,0,.5));}
/* same fixed-overlay structure as .booking-modal, sized for media instead of a
   form panel — content is capped to the viewport with room for the close
   button/caption rather than a fixed max-width. */
.gallery-modal{
  position:fixed;inset:0;z-index:200;
  display:flex;align-items:center;justify-content:center;
  padding:60px 70px;
  background:color-mix(in srgb, var(--bg) 90%, transparent);
  opacity:0;visibility:hidden;
  transition:opacity .2s ease, visibility .2s ease;
}
.gallery-modal.open{opacity:1;visibility:visible;}
.gallery-modal-content{
  position:relative;
  max-width:100%;max-height:100%;
  display:flex;
}
.gallery-modal-content img,
.gallery-modal-content video{
  max-width:100%;
  max-height:calc(100vh - 130px);
  width:auto;height:auto;
  display:block;
  border:2px solid var(--ink);
  background:var(--bg);
}
.gallery-modal-close{
  position:fixed;top:20px;right:20px;
  width:40px;height:40px;
  display:flex;align-items:center;justify-content:center;
  background:var(--ink);color:var(--lime);
  border:none;cursor:pointer;
  z-index:1;
}
.gallery-modal-nav{
  position:fixed;top:50%;transform:translateY(-50%);
  width:48px;height:48px;
  display:flex;align-items:center;justify-content:center;
  background:var(--ink);color:var(--lime);
  border:none;cursor:pointer;
  z-index:1;
}
.gallery-modal-prev{left:16px;}
.gallery-modal-next{right:16px;}
.gallery-modal-caption{
  position:fixed;left:0;right:0;bottom:16px;
  text-align:center;
  font-family:var(--font-sans);font-weight:600;font-size:13px;
  color:var(--lime);
  padding:0 60px;
  pointer-events:none;
}
@media (max-width:640px){
  .gallery-modal{padding:60px 20px;}
  .gallery-modal-nav{width:40px;height:40px;}
  .gallery-modal-prev{left:6px;}
  .gallery-modal-next{right:6px;}
}

/* contact.html's title card, replacing the old full-bleed photo hero the other
   subpages use — just an eyebrow + h1 + line of copy in a .hero-note, no photo.
   Full width (matches .work's own max-width below it, not the narrower 640/840px
   hero-note cards the photo-hero pages use) so it reads as a section of the page,
   not a floating box with dead space on either side. */
.contact-intro{
  /* width:100% is required here: body.contact-page main is a flex container (see
     below), and a flex item with auto margins in its cross axis doesn't get the
     default stretch-to-fill sizing — it shrinks to its content's width instead and
     uses the leftover space as margin, same collapse bug .hero-note's own comment
     elsewhere in this file already documents for the flex-item case. Without this,
     the title card shrank down to its widest word instead of spanning the page. */
  width:100%;
  max-width:var(--container);
  margin:0 auto;
  padding:clamp(20px,5vh,44px) 20px clamp(10px,2vh,20px);
}
.contact-intro-note{width:100%;max-width:none;}
.contact-intro-title{font-size:clamp(2rem,7vw,3.4rem);margin-bottom:14px;}
.contact-intro-tagline{font-size:clamp(15px,2vw,19px);margin-bottom:0;}

/* the reaction-diffusion/halftone shader panel (see js/main.js's
   initReactionDiffusion) — the right-hand box of a title row on contact.html
   ("Get In Touch") and the hero title on dj.html/workshops.html/
   event-production.html. Reuses .bio-card for the same ink-border/cut-corner
   card chrome every other box on the site has, just with padding:0 and
   overflow:hidden so the canvas can fill it edge to edge instead of sitting
   inside the card's normal text padding. Generic/shared — page-specific sizing
   (contact.html's mobile min-height, the hero version's shorter banner height)
   lives in each page's own rules further down, alongside an extra class name
   on the element itself for that page-specific hook. */
.shader-panel{
  padding:0;
  overflow:hidden;
}
.shader-canvas{
  /* <canvas> is a replaced element (like <img>/<video>) — position:absolute +
     inset alone only positions replaced elements, it doesn't stretch them the way
     it does an ordinary div, so without explicit width/height here the canvas just
     sat at its default intrinsic 300×150 regardless of the card's real size.
     left/top position it 2px in (matching .bio-card::before's own inset, same
     border thickness); width/height do the actual sizing. */
  position:absolute;
  left:2px;
  top:2px;
  width:calc(100% - 4px);
  height:calc(100% - 4px);
  display:block;
  clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-lg)),calc(100% - var(--cut-lg)) 100%,0 100%);
  -webkit-clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-lg)),calc(100% - var(--cut-lg)) 100%,0 100%);
}
/* js/main.js adds this if WebGL isn't available (or errors out) anywhere along the
   way — hiding the canvas just reveals .bio-card::before's own lime dot-pattern
   fill underneath, which is already exactly what every other card on the site looks
   like without a photo/canvas on top of it, so no extra fallback styling needed. */
.shader-panel.is-fallback canvas{display:none;}
/* contact.html-specific: a real height of its own on mobile (stacked single
   column, no sibling row to stretch to match) — see body.contact-page's own
   >=860px override further down, which zeroes this back out once the grid row
   next to the title card can supply the height instead. */
.contact-intro-visual{min-height:180px;}

/* contact.html has no scroll-snap sections like the homepage — instead the whole
   page (header + title + form + footer) is stretched to fill exactly one screen on
   taller/wider viewports via flex, so the footer sits at the bottom of the viewport
   instead of wherever the form's natural height happens to end. flex-shrink stays at
   its default (0 on main, via flex-basis:auto) so nothing gets compressed below its
   own content size — on a short/narrow viewport (mobile) the content simply grows
   past 100svh and the page scrolls normally, same as before. */
body.contact-page{
  display:flex;
  flex-direction:column;
  min-height:100svh;
}
body.contact-page main{
  flex:1 0 auto;
  display:flex;
  flex-direction:column;
  justify-content:center;
}
/* .work#form is main's other direct child (besides .contact-intro, see its own
   longer comment above on why width:100% is needed) — same flex-item auto-margin
   collapse applies at every width, not just the >=860px compact rules below. */
body.contact-page .work#form{width:100%;}

/* fit the whole page (title + form + footer) within one screen on laptops/desktops,
   instead of phone-sized padding leaving a lot of empty space above the footer once
   there's width (and so, usually, height) to spare. Mobile keeps normal top-to-bottom
   scrolling.
   .contact-form--conversational's shared min-height:400px (see its own comment —
   it's there so workshops.html/event-production.html's 5-7 step forms don't visibly
   resize the card as you step through) was the single biggest thing fighting this:
   it floored the card at 400px regardless of how much the padding/gap tuning below
   shrank everything else, on EVERY viewport, wide-short ones included (it's a fixed
   px value, not proportional to height at all). Contact's form is short (4 steps,
   one line each) so the step-to-step wobble from letting it size to content instead
   is minor. Overriding it back to a real min-height instead of a plain reset is what
   actually makes the "fits on one screen" claim hold on ordinary laptop screens —
   1366×768 and 1280×720 both overflowed past the fold under the old numbers here. */
@media (min-width:860px){
  .contact-intro{
    padding:clamp(18px,4vh,40px) 20px clamp(14px,2.5vh,24px);
  }
  .contact-intro-note{
    padding:clamp(20px,3.2vh,34px);
  }
  .contact-intro-tagline{display:none;}
  /* the 180px mobile floor (stacked single column, needs a real height of its own)
     would otherwise also floor the two-column row here, forcing the title card
     taller than its compact content needs and eating back into the one-screen
     budget above — at 860px+ the grid row already stretches this to match
     whatever height the title column naturally ends up with. */
  .contact-intro-visual{min-height:0;}
  body.contact-page .work#form{
    padding:0 20px clamp(16px,2.5vh,28px);
  }
  body.contact-page .bio-grid{gap:20px;}
  body.contact-page .contact-form,
  body.contact-page .contact-direct{
    padding:clamp(18px,2.8vh,30px) clamp(18px,2.6vw,26px);
    gap:14px;
  }
  body.contact-page .contact-form--conversational{
    /* a real floor again (not 0) — "a bit higher" feedback on how short both boxes
       in this row had gotten once the min-height:400px shared with the longer
       workshops/event-production forms was stripped down to fit one screen. Content
       (the tallest step, the textarea) still governs above this. */
    min-height:220px;
    justify-content:flex-start;
  }
  body.contact-page .form-step{gap:14px;}
  body.contact-page .form-question{
    font-size:clamp(18px,3.4vh,30px);
    line-height:1.15;
  }
  body.contact-page .form-answer{
    font-size:clamp(16px,2.4vh,20px);
    padding:8px 2px;
  }
  body.contact-page textarea.form-answer{min-height:72px;padding:10px 12px;}
  body.contact-page .form-nav{margin-top:8px;}
  body.contact-page .btn{padding:11px 20px;font-size:12px;}
  body.contact-page .contact-direct{gap:12px;}
  body.contact-page .contact-direct-item{gap:4px;}
  body.contact-page .contact-direct-item a{font-size:17px;}
  body.contact-page .contact-note{margin:0;font-size:12px;}
}

.soundcloud-card{
  border:2px solid var(--ink);
  background:var(--lime);
  padding:16px;
  opacity:0;
  transform:translateY(24px);
  transition:opacity .6s ease, transform .6s ease;
}
.soundcloud-card.in-view{opacity:1;transform:translateY(0);}
.soundcloud-card iframe{display:block;width:100%;border:none;}
.soundcloud-attribution{
  font-family:var(--font-sans);
  font-size:11px;
  color:var(--ink-muted);
  line-break:anywhere;
  word-break:normal;
  overflow:hidden;
  white-space:nowrap;
  text-overflow:ellipsis;
  padding-top:8px;
}
.soundcloud-attribution a{color:var(--ink);text-decoration:none;}
.soundcloud-attribution a:hover{color:var(--fg);text-decoration:underline;}

/* ---------- calendar ---------- */
.calendar{
  max-width:var(--container);
  margin:0 auto;
  /* was a fixed 100px — same reasoning as .work/.mission's own padding fix: a fixed
     number eats into the homepage's one-screen min-height floor instead of sitting
     on top of it. */
  padding:0 20px clamp(28px,5vw,64px);
  scroll-snap-align:start;
  scroll-margin-top:calc(var(--header-h) + 24px);
}
.calendar-head{
  display:grid;
  grid-template-columns:1fr;
  align-items:baseline;
  gap:10px 24px;
  margin-bottom:24px;
  padding-bottom:16px;
  /* [2026-11-12] white bottom line removed from the title container per request. */
}
.calendar-head-main{
  display:flex;
  flex-direction:column;
  gap:10px;
}
.calendar-head-main .section-title,
.calendar-head-past{
  margin-bottom:0;
  width:100%;
}
@media (min-width:860px){
  .calendar-head{grid-template-columns:repeat(3,1fr);}
  .calendar-head-main{grid-column:span 2;}
  .calendar-head-past{grid-column:span 1;}
}
.calendar-sub{
  font-family:var(--font-sans);
  font-weight:700;
  font-size:12px;
  color:var(--ink-muted);
  text-transform:uppercase;
  letter-spacing:.06em;
}
/* generic "title(+tagline) inside a cut-corner box" treatment, used across every
   section heading on dj.html/workshops.html/event-production.html (started as a
   one-off for dj.html's "Book inquiries", generalized once the same look was
   wanted on every other heading across these three pages). .hero-note supplies
   the card chrome; .section-title's own lime-chip background/padding is stripped
   since it would double up nested inside another card here. Where a
   .calendar-sub tagline sits alongside the title in .calendar-head-main, the two
   share one line once there's width to spare; narrower than that (or with no
   tagline at all — most of these are just a bare title in the box) it's just the
   title on its own, same as .calendar-head-main normally stacks. */
.calendar-head--boxed{border-bottom:none;padding-bottom:0;}
.section-head-box{
  max-width:none;
  margin-bottom:24px;
  /* self-sufficient rather than leaning on .calendar-head-main for this — some
     .section-head-box instances (Artist Profile, The sound, Performances) are a
     bare title with no .calendar-head-main wrapper at all, and still need to lay
     out a title+tagline pair the same way once a tagline's added. Redundant
     (harmless) for the instances that do have .calendar-head-main, which already
     sets the same three properties itself. */
  display:flex;
  flex-direction:column;
  gap:10px;
}
/* .calendar-head-main instances already get their spacing-before-what-follows
   from .calendar-head's own margin-bottom, one level up — an extra 24px here too
   would double it up. */
.calendar-head-main.section-head-box{margin-bottom:0;}
.section-head-box .section-title{background:none;padding:0 0 .08em;margin-bottom:0;}
@media (min-width:860px){
  .section-head-box{
    /* only relevant where this sits inside .calendar-head-main: that class
       normally spans 2 of .calendar-head's 3 columns, reserving the 3rd for a
       sibling .calendar-head-past none of these sections have — left at that
       width, a long title+tagline pair can run past the card's own right edge.
       No-op for the plain-title (no tagline) instances, which aren't grid items
       of anything. */
    grid-column:1/-1;
    flex-direction:row;
    align-items:baseline;
    /* wrap, not nowrap: most title+tagline pairs fit one line at this width, but
       a couple of the longer ones (dj.html's "Latest mixes & live recordings",
       event-production.html's "Where she comes in") don't — wrap lets the
       tagline drop to its own line there instead of running past the card's
       right edge. .section-title keeps its own nowrap below regardless, so the
       title itself is never what wraps first. */
    flex-wrap:wrap;
    gap:6px 18px;
  }
  .section-head-box .section-title{white-space:nowrap;}
  /* .calendar-head-main .section-title{width:100%} (higher specificity than a
     plain .section-head-box .section-title) stretches the title across the whole
     flex row on its own regardless of its actual text length, shoving the
     tagline out to the far right instead of sitting right next to it — matching
     that selector's own specificity here to win. Only matters for the
     .calendar-head-main instances; harmless (if unnecessary) elsewhere. */
  .calendar-head-main.section-head-box .section-title{width:auto;flex:none;}
}
.calendar-grid{
  display:grid;
  grid-template-columns:1fr;
  gap:20px;
}
@media (min-width:860px){
  .calendar-grid{grid-template-columns:repeat(3,1fr);gap:24px;align-items:start;}
  .calendar-widget{grid-column:span 2;}
  .calendar-past{grid-column:span 1;}
}
/* homepage-only: lets the upcoming/past boxes actually fill the section's one-screen
   floor (see body.home rule up top) instead of sitting at their own small content
   height with dead space around them. flex:1 on the grid soaks up whatever's left
   after the heading, which also quietly cancels out .calendar's justify-content:center
   from that same shared rule — there's nothing left over for it to center once this
   grows to fill the column. align-items:stretch (overriding the plain .calendar-grid
   rule's align-items:start above, which subpages reusing this class still want) makes
   both boxes match each other's height; turning each into its own flex column, with
   its list as the flexible/scrollable member, is what makes that height difference
   land on the list (which can scroll) rather than on the box (which can't shrink
   below its content). Scrollbar hidden on the list itself, not the box, since the
   box's cut corner and hover-preview popups still need to render outside its bounds
   the same way the border-fix comment above already relies on. */
body.home .calendar-grid{
  /* [2026-11-12] content-sized (was flex:1 which stretched it to fill the screen and
     cancelled .calendar's justify-content:center) — so the upcoming-events block now
     sits CENTERED vertically in the section, like the work cards above it. */
  flex:0 0 auto;
  min-height:0;
  align-items:start;
}
body.home .calendar-widget,
body.home .calendar-past{
  display:flex;
  flex-direction:column;
  min-height:0;
}
body.home .upcoming-list,
body.home .past-list{
  /* natural height (so the block stays centred), but capped to one screen so a long
     list scrolls inside its box instead of pushing the centred block off-screen. */
  min-height:0;
  max-height:calc(100svh - var(--header-h) - 200px);
  overflow-y:auto;
  scrollbar-width:none;
  -ms-overflow-style:none;
}
body.home .upcoming-list::-webkit-scrollbar,
body.home .past-list::-webkit-scrollbar{
  display:none;
}

/* Responsive height (2026-11-03): scroll-snap was dropped and the homepage scrolls
   freely, so the events calendar no longer needs to fill a fixed one-screen box. Undo
   that fill — let the section and each card size to their own content, so an empty
   Upcoming column shrinks to its note instead of leaving a tall void beside Past
   (align-items:start stops the two boxes stretching to match). Each list keeps a
   max-height cap + its existing overflow-y:auto, so a long Past list scrolls inside a
   sensible height rather than running the whole page long. Scoped to #calendar so the
   #mixes section (which reuses .calendar) is untouched. */
body.home #calendar{
  /* [2026-11-12] full-height + vertically CENTERED like the .work cards section (was
     height:auto; display:block, which left it content-sized and top-aligned). The lists
     keep their max-height caps below, so a long list still scrolls inside the centred
     block instead of running the page long. */
  height:calc(100svh - var(--header-h) - var(--marquee-h));
  min-height:calc(100svh - var(--header-h) - var(--marquee-h));
  display:flex;
  flex-direction:column;
  justify-content:center;
  /* [2026-11-12] room at the top for the pinned dancers3 band (now 30% bigger + dropped
     10vh) so the centred content clears it. */
  position:relative;
  padding-top:calc(10vh + clamp(230px,28vh,262px));
}
/* decorative image pinned near the TOP of the Upcoming Events section — shown in FULL
   (width:auto on a capped height, so the ~3:1 row of dancers isn't cropped), centred,
   30% bigger and nudged 10vh down. */
.calendar-topimg{
  position:absolute;
  top:calc(10vh + clamp(8px,2vh,22px)); left:50%; transform:translateX(-50%);
  height:clamp(220px,17vh,216px); width:auto; max-width:94%;
  display:block; z-index:2; pointer-events:none;
}
body.home #calendar .calendar-grid{
  flex:0 0 auto;
  align-items:start;
}
body.home #calendar .upcoming-list,
body.home #calendar .past-list{
  flex:none;
  max-height:min(60vh,520px);
}

/* Focus the homepage calendar on Upcoming only (2026-11-03): hide the Past Events
   column + its heading, and let Upcoming span the full width. Scoped to #calendar so
   the shared .calendar classes on other pages are untouched; the Past markup stays in
   the DOM (just hidden), so it's easy to bring back later. */
body.home #calendar .calendar-head-past,
body.home #calendar .calendar-past{ display:none; }
body.home #calendar .calendar-head-main,
body.home #calendar .calendar-widget{ grid-column:1 / -1; }
body.home #calendar .upcoming-list{ max-height:min(56vh,480px); }  /* leaves room for the top image while staying centred */

/* border-fix technique again (see .hero-note/.bio-card etc.), but with a deliberate
   difference: clip-path stays OFF the real .calendar-widget/.calendar-past box itself,
   living only on their ::before fill layer. Both boxes host the hover-preview popups
   (.hover-card), which sit outside the box's own rect (popping up above the hovered
   row) — clip-path on an ancestor clips ANY descendant rendering that falls outside its
   own border-box, popups included, which is exactly why these two were left uncut in
   the original cut-corner pass. Keeping the real box clip-path-free (only its ::before
   fill is clipped) gets the same corner-cut look without breaking the popups. */
.calendar-widget{
  position:relative;
  background:var(--ink);
  padding:28px 24px 32px;
  opacity:0;
  transform:translateY(24px);
  transition:opacity .6s ease, transform .6s ease;
}
.calendar-widget::before{
  content:'';position:absolute;inset:2px;z-index:-1;
  background-color:var(--lime);
  clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-lg)),calc(100% - var(--cut-lg)) 100%,0 100%);
  -webkit-clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-lg)),calc(100% - var(--cut-lg)) 100%,0 100%);
}
.calendar-widget.in-view{opacity:1;transform:translateY(0);}

.calendar-past{
  position:relative;
  background:var(--ink);
  padding:28px 24px 32px;
  opacity:0;
  transform:translateY(24px);
  transition:opacity .6s ease, transform .6s ease;
}
.calendar-past::before{
  content:'';position:absolute;inset:2px;z-index:-1;
  background-color:var(--lime);
  clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-lg)),calc(100% - var(--cut-lg)) 100%,0 100%);
  -webkit-clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-lg)),calc(100% - var(--cut-lg)) 100%,0 100%);
}
.calendar-past.in-view{opacity:1;transform:translateY(0);}
.past-list{
  list-style:none;
  margin:0;
  padding:0;
  display:flex;
  flex-direction:column;
  gap:2px;
}
.past-list li{
  position:relative;
  display:flex;
  align-items:baseline;
  gap:10px;
  text-align:left;
  font-family:var(--font-sans);
  font-weight:700;
  font-size:14.5px;
  color:var(--type-color);   /* inactive event name — the gray the whole site's type matches */
  padding:11px 0;
  border-bottom:1px dashed var(--ink-muted);
  cursor:default;
  transition:color .15s ease;
}
.past-list li:last-child{border-bottom:none;}
.past-list li:hover{color:var(--ink);}
.past-list li:hover .past-title{text-decoration:underline;}
/* date first, matching .upcoming-date's own placement/treatment (flex:0 0 auto,
   dimmed via opacity — a secondary label, not competing with the venue name for
   attention) — .past-title bumped up from the list's own 14.5px so the actual
   names read as the primary content of each row, same as .upcoming-title below. */
.past-date{flex:0 0 auto;opacity:.75;font-size:12px;}
.past-title{flex:1;font-size:17px;}

/* rollover preview: image + title, used on both the upcoming and past event lists.
   position:fixed (not absolute) + JS-computed top/left (see showHoverCard in
   main.js) — an ancestor .upcoming-list/.past-list has overflow-y:auto now (the
   invisible-scroll rule; see body.home .upcoming-list/.past-list up top), and an
   absolutely-positioned popup escaping its own row would just get clipped by that
   scroll container's box the moment the row wasn't near its top edge. Fixed
   positioning + JS math is what actually gets it "over everything." Visibility is
   toggled via .is-visible (also JS, in the same place position gets set) rather than
   a plain :hover rule, since the position needs computing at the same moment. */
.hover-card{
  position:fixed;
  top:0;left:0;
  z-index:200;
  /* min bound left at 320px (unchanged) — this card now also opens via tap on
     touch devices (see wireHoverCardRow in main.js), where screen width is the
     real ceiling; the mid/max bounds are what actually scale up "bigger" on
     anything roomier than a phone. */
  width:clamp(320px, 42vw, 820px);
  aspect-ratio:4/3;
  overflow:hidden;
  background:var(--lime);
  box-shadow:0 16px 34px rgba(10,9,14,.55);
  opacity:0;
  visibility:hidden;
  pointer-events:none;
  /* grows in from slightly-small rather than just fading/rising — transform-origin
     stays centered since the card is positioned off the cursor/tap point (see
     positionHoverCard in main.js), so it reads as blooming outward from roughly
     where the pointer is, not sliding in from a fixed direction. */
  transform:scale(.82);
  transform-origin:center;
  transition:opacity .3s cubic-bezier(.16,1,.3,1), transform .3s cubic-bezier(.16,1,.3,1);
}
.hover-card.is-visible{
  opacity:1;
  visibility:visible;
  transform:scale(1);
}
.hover-card img{
  width:100%;height:100%;
  object-fit:cover;
  filter:url(#duotone);
  display:block;
}

/* Full-colour photography: the duotone colour filter was removed from all
   site images per request — photos now show in their natural colour. (Hover
   zoom etc. still work; only the colour filter is dropped.) */
.work-card-media img,
.work-card-media video,
.work-card:hover .work-card-media img,
.work-card:hover .work-card-media video,
.page-intro-photo,
.identity-photo-card img,
.hover-card img{
  filter:none !important;
}
/* was a translucent dark gradient with hardcoded white text — floating over an
   arbitrary photo, that reads fine against some images and badly against others.
   A solid, fully-opaque plate in the site's own lime/dot-pattern/cut-corner card
   language (same idea as .mission-note's fill, sized down to --cut-sm to fit this
   much smaller box) is legible regardless of what's under it and matches the rest
   of the page's chrome instead of looking like a one-off tooltip. */
.hover-card-caption{
  position:absolute;
  left:0;right:0;bottom:0;
  padding:clamp(12px,1.8vw,20px) clamp(14px,2.2vw,24px);
  background-color:var(--lime);
  background-image:var(--dot-pattern);
  background-size:var(--dot-gap) var(--dot-gap);
  background-blend-mode:overlay;
  clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-sm)),calc(100% - var(--cut-sm)) 100%,0 100%);
  -webkit-clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-sm)),calc(100% - var(--cut-sm)) 100%,0 100%);
}
.hover-card-title{
  display:block;
  color:var(--ink);
  font-family:var(--font-sans);
  font-weight:800;
  /* was clamp(36px,6.8vw,60px) — smaller so the caption plate covers less of the
     photo (long workshop titles wrapped to 2–3 lines and hid most of it). */
  font-size:clamp(18px,2.4vw,28px);
  line-height:1.05;
  letter-spacing:-.01em;
  text-align:left;
}
.hover-card-tagline{
  display:block;
  margin-top:6px;
  color:var(--ink-muted);
  font-family:var(--font-sans);
  font-weight:600;
  font-size:clamp(12px,1.6vw,15px);
  text-align:left;
}
.cal-note{
  margin-top:22px;
  padding-top:18px;
  border-top:1px dashed var(--ink-muted);
  color:var(--ink-muted);
  font-weight:700;
  font-size:14px;
  text-align:center;
}
.cal-note a{color:var(--ink);text-decoration:underline;text-underline-offset:3px;}

/* upcoming-events list — mirrors .past-list's structure/interaction (same
   hover-preview), plus a leading date since "upcoming" needs one and "past" doesn't. */
.upcoming-list{
  list-style:none;
  margin:0;
  padding:0;
  display:flex;
  flex-direction:column;
  gap:2px;
}
.upcoming-list li{
  position:relative;
  display:flex;
  align-items:baseline;
  gap:10px;
  text-align:left;
  font-family:var(--font-sans);
  font-weight:700;
  font-size:14.5px;
  color:var(--type-color);   /* inactive event name — the gray the whole site's type matches */
  padding:11px 0;
  border-bottom:1px dashed var(--ink-muted);
  cursor:default;
  transition:color .15s ease;
}
.upcoming-list li:last-child{border-bottom:none;}
.upcoming-list li:hover{color:var(--ink);}
.upcoming-date{flex:0 0 auto;opacity:.85;font-size:24px;}  /* [2026-11-12] 2x bigger per request */
.upcoming-title{flex:1;font-size:17px;text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:2px;}

/* event listing link-out — shared by .past-list/.upcoming-list rows. Currently
   points to a generated Resident Advisor search (ra.co/search?q=<event name>),
   a functional placeholder until real per-event RA/ticket links are supplied —
   see the raSearchUrl() comment in js/main.js. */
.event-ra-link{
  flex:0 0 auto;
  display:inline-flex;
  align-items:center;
  justify-content:center;
  width:22px;height:22px;
  border-radius:50%;
  border:1px solid var(--ink-muted);
  color:var(--ink-muted);
  opacity:.75;
  transition:opacity .15s ease, color .15s ease, border-color .15s ease, background-color .15s ease;
}
.event-ra-link svg{width:11px;height:11px;}
.past-list li:hover .event-ra-link,
.upcoming-list li:hover .event-ra-link{opacity:1;}
.event-ra-link:hover{background-color:var(--ink);color:var(--lime);border-color:var(--ink);}

@media (min-width:640px){
  .calendar-widget{padding:32px 32px 36px;}
}

/* ---------- footer ---------- */
.site-footer{
  /* border-fix technique (see the cut-corner comment further up) — was a plain lime
     background with a real border-top and clip-path on this element directly, plus
     a small fixed-#000 patch tucked behind just the notch corner. Clipping the real
     element cut the border-top along that same diagonal, and since the patch only
     backed the half of the corner still inside that clipped shape, the visible
     sliver read as a thin, oddly-angled ("flipped") corner instead of a clean wedge
     — not a themed color either, since it was hardcoded black rather than
     var(--ink). Own background is now the "border" color (matching every other
     notched card on the site — .work-card, .calendar-widget/.calendar-past,
     .mission-note, .marquee); ::before below (inset exactly 2px at the top, flush on
     the other three sides — same as the old border-top-only look) holds the actual
     lime fill and is what actually gets clipped, so the ink shows as a full solid
     wedge behind the notch, correctly following the active duotone.
     isolation:isolate is required for that ::before to actually show: .work-card/
     .calendar-widget get a stacking context for free from their own scroll-reveal
     opacity/transform (see .mission-note's own comment on this same gotcha), but
     .site-footer has no reveal animation, so without this its z-index:-1 fill
     escapes to a broader ancestor context, paints too early, and the footer's own
     background — painted after — covers it completely (solid ink, fill never
     showing) instead of the fill sitting on top the way it needs to. */
  position:relative;
  isolation:isolate;
  background:transparent;   /* [2026-11-13] was --ink = the 2px white top "border"; dropped it */
  padding:24px 20px 20px;
  scroll-snap-align:start;
  scroll-margin-top:calc(var(--header-h) + 24px);
}
.site-footer::before{
  content:'';
  position:absolute;
  top:0;right:0;bottom:0;left:0;   /* was top:2px (the border strip) — now flush to the top edge */
  background-color:var(--lime);
  background-image:var(--dot-pattern);
  background-size:var(--dot-gap) var(--dot-gap);
  background-blend-mode:overlay;
  z-index:-1;
  clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-lg)),calc(100% - var(--cut-lg)) 100%,0 100%);
  -webkit-clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-lg)),calc(100% - var(--cut-lg)) 100%,0 100%);
  /* [2026-11-13] top of the footer dissolves to transparent (like the header's gradient fade),
     so there's no hard edge — the shader/content above shows through the top band. */
  -webkit-mask-image:linear-gradient(to bottom, transparent 0, #000 clamp(60px,14vh,150px));
  mask-image:linear-gradient(to bottom, transparent 0, #000 clamp(60px,14vh,150px));
}
.footer-inner{
  max-width:var(--container);
  margin:0 auto;
  display:flex;
  flex-direction:column;
  gap:28px;
}
.footer-logo{
  display:flex;
  align-items:center;
  gap:10px;
  font-family:var(--font-serif);
  font-weight:800;
  letter-spacing:-.01em;
  font-size:21px;
  color:var(--ink);
}
/* ---- pre-footer "Upcoming" strip (site-wide, rendered by js/admin.js) --------
   (2026-11-03) Sits just above the footer on every page; hidden via [hidden] when
   there are no upcoming events. Purple panel matching the cards, with light date +
   title chips that wrap responsively. No pink — stays in the site palette. */
.upcoming-strip{
  background:color-mix(in srgb, var(--lime) 50%, transparent);   /* [2026-11-12] 50% transparent panel */
  border-top:2px solid rgba(0,0,0,.14);
  padding:clamp(5px,1vw,9px) 20px;   /* [2026-11-13] ~1/3 the old height */
}
.upcoming-strip[hidden]{ display:none; }
.upcoming-strip-inner{
  max-width:var(--container);
  margin:0 auto;
  display:flex;
  flex-wrap:wrap;
  align-items:center;
  gap:12px 22px;
}
.upcoming-strip-label{
  margin:0;
  font-family:var(--font-sans);
  font-weight:800;
  text-transform:uppercase;
  letter-spacing:.09em;
  font-size:14px;
  color:var(--ink);
}
.upcoming-strip-list{
  list-style:none; margin:0; padding:0;
  display:flex; flex-wrap:wrap; gap:6px 10px;
  flex:1;
}
/* Light cut-corner OUTLINE, matching the form's "NEXT →" button (.btn-primary): the
   element bg is the light border colour, the inset ::before (same notch) is the fill
   that matches the strip panel, so it reads light instead of a heavy filled pill. */
.upcoming-strip-item{
  position:relative;
  isolation:isolate;               /* contain the ::before fill (same border-fix as .btn) */
  display:inline-flex; align-items:baseline; gap:8px;
  padding:3px 14px;   /* [2026-11-13] shorter chips for the ~1/3-height strip */
  background:var(--ink);           /* = the light border colour */
  color:var(--ink);                /* light text, like the NEXT button */
  text-decoration:none;
  font-size:14px;
  border-radius:2px;
  clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-sm)),calc(100% - var(--cut-sm)) 100%,0 100%);
  -webkit-clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-sm)),calc(100% - var(--cut-sm)) 100%,0 100%);
  transition:color .2s ease;
}
.upcoming-strip-item::before{
  content:""; position:absolute; inset:1px; z-index:-1;
  background:var(--lime);          /* fill matches the strip panel → light outline look */
  clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-sm)),calc(100% - var(--cut-sm)) 100%,0 100%);
  -webkit-clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-sm)),calc(100% - var(--cut-sm)) 100%,0 100%);
  transition:background .2s ease;
}
.upcoming-strip-item:hover{ color:var(--lime); }
.upcoming-strip-item:hover::before{ background:var(--ink); }
.upcoming-strip-date{ font-weight:800; letter-spacing:.02em; white-space:nowrap; }
.upcoming-strip-title{ font-weight:600; }
/* [2026-11-13] events bare — no border-fix border/notch (just the text on the 50%-transparent
   strip). Hover brightens to the accent instead of inverting the (now-gone) lime fill. */
.upcoming-strip-item{ background:transparent; clip-path:none; -webkit-clip-path:none; }
.upcoming-strip-item::before{ display:none; }
.upcoming-strip-item:hover{ color:var(--accent); }

.footer-note a{
  color:inherit;
  text-decoration:underline;
  text-underline-offset:2px;
  transition:color .2s ease;
}
.footer-note a:hover{ color:var(--ink); }
.footer-note{
  font-size:13px;
  font-weight:600;
  color:var(--ink-muted);
  margin-top:4px;
}
.footer-links,.footer-social{
  display:flex;
  flex-wrap:wrap;
  gap:18px;
}
.footer-links a,.footer-social a{
  font-family:var(--font-sans);
  font-weight:700;
  font-size:13px;
  text-transform:uppercase;
  letter-spacing:.05em;
  color:var(--ink);
}
.footer-links a:hover,.footer-social a:hover{text-decoration:underline;}
.footer-social a{display:inline-flex;align-items:center;gap:7px;}
.footer-social svg{width:40px;height:40px;flex:none;}
/* icon-only links: underline has nothing to show, so fade on hover instead */
.footer-social a:hover{opacity:.6;}

@media (min-width:860px){
  .footer-inner{
    flex-direction:row;
    align-items:center;
    justify-content:space-between;
  }
}

/* ---------- custom cursor: sound knob ---------- */
/* mouse/trackpad only — (hover:hover)+(pointer:fine) excludes touch entirely, so
   phones/tablets-by-touch keep their native cursor behavior untouched.
   Outer element (.cursor-wave) carries JS-driven position (translate to the pointer);
   .cursor-wave-inner is the knob's cap (fill + border, both themeable via var(--lime)/
   var(--ink) so it stays correct with the duotone picker); .cursor-wave-indicator is
   the pointer line, rotated by main.js on every click like turning a rotary pot.
   .is-inverted (toggled in JS while the pointer sits over an image or text element)
   swaps which of the two theme colors is the fill vs the line, the same "read against
   anything" job mix-blend-mode:difference used to do on the old plain dot — but
   selective, since a flat difference-blend would have fought with the knob's own
   fixed fill/line color contrast instead of complementing it. */
@media (hover:hover) and (pointer:fine){
  html,body,a,button,.btn,input,textarea,.design-toggle,.nav-toggle,.past-list li,.upcoming-list li{
    cursor:none;
  }
  .cursor-wave{
    position:fixed;
    top:0;left:0;
    width:22px;height:22px;
    pointer-events:none;
    z-index:9999;
    opacity:0;
    transition:opacity .25s ease;
  }
  .cursor-wave.is-active{opacity:1;}
  .cursor-wave-inner{
    position:relative;
    width:100%;height:100%;
    border-radius:50%;
    background:var(--lime);
    border:2px solid var(--ink);
    box-sizing:border-box;
    transition:background .15s ease, border-color .15s ease, transform .15s ease;
  }
  .cursor-wave.is-clicking .cursor-wave-inner{transform:scale(.88);}
  .cursor-wave-indicator{
    position:absolute;
    top:50%;left:50%;
    width:2px;height:38%;
    margin-left:-1px;
    background:var(--ink);
    border-radius:1px;
    transform-origin:50% 0;
    /* order matters: translateY has to run first (rightmost) so the spoke is
       shifted to point "up" from the center BEFORE it's rotated — rotate() first
       would instead spin the shape in place and then re-shift it by a fixed screen-
       space amount afterwards, which is what was making the tick look off-center at
       most angles instead of pivoting cleanly around the knob's middle.
       Set by main.js on click; transitioning it here (not inline) is what makes each
       click read as the knob turning to its new position instead of snapping. */
    transform:rotate(var(--knob-angle, -110deg)) translateY(-100%);
    transition:transform .3s cubic-bezier(.34,1.2,.4,1);
  }
  /* over an image or a line of text: rather than just swapping the knob's own two
     fill colors, this makes the cap a genuine color-inverting lens — mix-blend-mode:
     difference against the real content behind it, filled with the theme's own ink
     tone as the difference base, so what shows through the circle is that image or
     text in the opposite of the current duotone. Border dropped to transparent so
     the ring doesn't break the lens at the very edge. */
  .cursor-wave.is-inverted .cursor-wave-inner{
    background:var(--ink);
    border-color:transparent;
    mix-blend-mode:difference;
  }
  .cursor-wave.is-inverted .cursor-wave-indicator{
    background:var(--ink);
    mix-blend-mode:difference;
  }
  /* over a real click target (buttons, links, toggles, the past/upcoming rows —
     the exact set the (hover:hover) rule above already hides the native cursor
     for): a thin ring floating just outside the knob's own cap, as a distinct
     "this is pressable" cue separate from the invert-lens content states above.
     outline instead of a second border/box-shadow layer so it doesn't consume any
     of the cap's own box or fight with its transform:scale() press-in on click. */
  .cursor-wave.is-clickable .cursor-wave-inner{
    outline:1.5px solid var(--ink);
    outline-offset:4px;
  }
  .cursor-wave.is-inverted.is-clickable .cursor-wave-inner{outline-color:var(--lime);}
}
@media (hover:hover) and (pointer:fine) and (prefers-reduced-motion:reduce){
  .cursor-wave-indicator{transition:none;}
  .cursor-wave.is-clicking .cursor-wave-inner{transition:none;}
}

/* ======================================================================
   SELECTED EXPERIENCE  (event-production.html, 2026-11-03)
   A banner you tap to unfold a list of experiences. Each row shows date +
   title + tiny tagline; the photo reveals on hover (desktop floating card,
   reusing .hover-card) and on tap (fullscreen .ka-lightbox). The reveal is
   wired in js/admin.js (wireExperienceList); the unfold toggle in js/main.js.
   ====================================================================== */
#selected-experience{ margin-top:0; }  /* was clamp(24..48) — now centered inside .ep-folds, so no offset (keeps the 3 buttons symmetric) */
/* drop the statement section's default bottom padding so the gap BELOW it (to the
   Selected-experience button) equals the gap ABOVE it (both = the margin-top clamp). */
#statement{ padding-bottom:0; }
/* group the three foldables tightly: ~5px between each, normal space after the last */
.foldable{ padding-bottom:0; }
.foldable + .foldable{ margin-top:5px; }
#production-contact.foldable{ padding-bottom:clamp(20px,5vw,56px); }

/* [2026-11-12] Event Production two-screen layout: the hero statement is one full screen,
   the three foldable buttons live in the next full-screen band, centered vertically as a
   group. main.js (body.ep) snaps between the two on a single wheel notch; opening a button
   grows the band and the page then scrolls freely (justify-content only distributes space
   while the collapsed trio FITS, so nothing is clipped). Scoped to .ep-folds / body.ep,
   which exist only on event-production.html. */
body.ep .inner-hero{ min-height:calc(100svh + var(--header-h)); }   /* full-screen hero (visible part = 100svh) */
.ep-folds{
  display:flex;
  flex-direction:column;
  justify-content:center;
  min-height:calc(100svh - var(--header-h));   /* full screen below the sticky header (marquee removed) */
  scroll-margin-top:var(--header-h);           /* snap target clears the sticky header */
}
/* The buttons are bare now (no panel bg / border / notch / chevron disc). Those rules live
   GLOBALLY on .exp-trigger (see "foldable triggers are bare" further down, placed AFTER the
   base .exp-trigger rules so they win on source order) so Workshops + DJ match Event Production.
   The ONLY EP-specific trigger tweaks (width + the first button's margin) stay below. */

/* [2026-11-12] All three buttons the SAME width: inside .ep-folds (a flex column) .work's
   own `margin:0 auto` overrode the default stretch, so each section shrank to its label
   width and the buttons differed. An explicit width:100% (still capped by .work's max-width,
   auto-margins still centering) makes all three the full container width again. */
.ep-folds > .work{ width:100%; }

/* [2026-11-13] Workshops two-band snap layout (body.ws): hero = one full screen, then the first
   5 buttons (.ws-folds-1) and the last 3 (.ws-folds-2) each fill a centered full-screen band.
   main.js snaps hero → band1 → band2 one screen per wheel gesture, and frees scrolling while a
   foldable is open. Mirrors the EP .ep-folds pattern (incl. the flex-column width fix). */
body.ws .inner-hero, body.dj-page .inner-hero{ min-height:calc(100svh + var(--header-h)); }
.ws-folds, .dj-folds{
  display:flex;
  flex-direction:column;
  justify-content:center;
  min-height:calc(100svh - var(--header-h));
  scroll-margin-top:var(--header-h);
}
.ws-folds > .work, .dj-folds > .work{ width:100%; }

/* [2026-11-12] Selected-experience rows restyled to match the homepage Upcoming-events list:
   no panel background, dashed separators, theme-gray date + title, and a "Read more" pill in
   place of the little arrow cue (the whole row stays the button that opens the photo). CSS
   only, so it covers both the static fallback rows and the admin.js/DB-rendered ones. */
.ep-folds .exp-list{ gap:0; }
.ep-folds .exp-item{
  background:transparent;
  clip-path:none; -webkit-clip-path:none;
  border-radius:0;
  border-bottom:1px dashed var(--ink-muted);
  padding:16px 2px;
  color:var(--type-color);
  transition:color .15s ease;
}
.ep-folds .exp-item::before{ display:none; }                       /* drop the lime fill */
.ep-folds .exp-list > li:last-child .exp-item{ border-bottom:0; }
.ep-folds .exp-item-date{ color:inherit; opacity:.75; }
.ep-folds .exp-item-title{ color:inherit; }
.ep-folds .exp-item-tagline{ color:inherit; opacity:.65; }
@media (hover:hover){
  .ep-folds .exp-item:hover{ transform:none; color:var(--ink); }   /* brighten like the upcoming rows, no lift */
}
/* the arrow cue becomes a "Read more" pill, matching the Upcoming list's READ MORE outline */
.ep-folds .exp-item-cue{
  width:auto; height:auto; opacity:1;
  padding:7px 14px; border-radius:999px;
  border:1.5px solid var(--ink-muted);
  font-family:var(--font-sans); font-weight:700; font-size:11px;
  text-transform:uppercase; letter-spacing:.14em;
  color:var(--type-color); white-space:nowrap;
  transition:background-color .15s ease, color .15s ease, border-color .15s ease;
}
.ep-folds .exp-item-cue svg{ display:none; }
.ep-folds .exp-item-cue::after{ content:"Read more"; }
@media (hover:hover){
  .ep-folds .exp-item:hover .exp-item-cue{ background:var(--ink); color:var(--lime); border-color:var(--ink); }
}

/* --- the tap-to-unfold banner (shared by all .foldable sections). Border-fix:
   the element bg is the border colour, an inset ::before carries the real fill —
   a photo on .exp-trigger--photo, a lime panel otherwise — so the 2px border
   follows the cut corner (same trick as .upcoming-strip-item / .btn). --- */
.exp-trigger{
  position:relative; isolation:isolate;
  display:flex; align-items:center; justify-content:space-between; gap:18px;
  width:100%;
  padding:clamp(16px,2.2vw,24px) clamp(18px,2.6vw,28px);
  min-height:clamp(92px,13vw,120px);     /* all three triggers share one height */
  text-align:left;
  color:var(--ink);
  background:var(--ink);                 /* = the visible border colour */
  border:0; border-radius:3px;
  cursor:pointer; overflow:hidden;
  clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-lg)),calc(100% - var(--cut-lg)) 100%,0 100%);
  -webkit-clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-lg)),calc(100% - var(--cut-lg)) 100%,0 100%);
  transition:transform .2s ease;
}
.exp-trigger::before{
  content:''; position:absolute; inset:2px; z-index:-1;    /* 2px gap = the border */
  background:var(--lime);                 /* default fill (non-photo triggers) */
  clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-lg)),calc(100% - var(--cut-lg)) 100%,0 100%);
  -webkit-clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-lg)),calc(100% - var(--cut-lg)) 100%,0 100%);
}
/* darker lime fill + tiny lift on hover (all three triggers) */
@media (hover:hover){
  .exp-trigger:hover{ transform:translateY(-1px); }
  .exp-trigger:hover::before{ background:color-mix(in srgb, var(--lime) 85%, #000); }
}
.exp-trigger-text{ display:flex; flex-direction:column; gap:6px; }
.exp-trigger-sub{
  font-family:var(--font-sans); font-weight:600; font-size:14px; color:var(--ink-muted);
}
.exp-trigger-label{
  font-family:var(--font-serif); font-weight:800; line-height:1;
  font-size:clamp(1.7rem,5.2vw,2.8rem);
  letter-spacing:-.01em;
  color:var(--ink);                      /* titles in the site theme colour */
}
.exp-trigger-hint{
  font-family:var(--font-sans); font-weight:700;
  text-transform:uppercase; letter-spacing:.12em; font-size:12px;
  color:var(--ink-muted);
}
.exp-trigger-chevron{
  flex:0 0 auto;
  width:56px; height:56px; border-radius:50%;
  display:flex; align-items:center; justify-content:center;
  background:var(--lime); color:var(--fg);
  transition:transform .45s cubic-bezier(.16,1,.3,1);
}
.exp-trigger-chevron svg{ width:40px; height:40px; }
.exp-trigger[aria-expanded="true"] .exp-trigger-chevron{ transform:rotate(180deg); }

/* [2026-11-12] foldable triggers are bare — every "dropdown" button on Event Production,
   Workshops/Facilitation and DJ drops its border-fix lime panel + ink border/notch and the
   chevron's filled disc, leaving just the big label + a plain chevron over the shader. Placed
   right after the base .exp-trigger rules so these same-specificity overrides win on order
   (the mobile-fullscreen `.foldable--js.is-open …` rules are higher specificity and still win).
   A label shadow keeps it legible without a panel. */
.exp-trigger{ background:transparent; clip-path:none; -webkit-clip-path:none; }
.exp-trigger::before{ display:none; }
.exp-trigger-chevron{ background:transparent; color:var(--ink); }
.exp-trigger-label{ color:var(--type-color); text-shadow:0 2px 20px rgba(0,0,0,.45); }  /* [2026-11-13] same muted gray as the statements + dropdown text */

/* --- the collapsible panel (open by default; .foldable--js lets it collapse).
   Shared by Selected experience, What I can take on, and Let's collaborate. --- */
.exp-panel{ margin-top:14px; }
/* max-height collapse (overflow:hidden guarantees nothing shows when folded —
   the grid-rows:0fr trick leaked the .bio-card's absolutely-positioned fill). */
.foldable--js .exp-panel{
  margin-top:0;
  max-height:0; overflow:hidden;
  transition:max-height .5s cubic-bezier(.16,1,.3,1), margin-top .5s ease;
}
.foldable--js .exp-trigger[aria-expanded="true"] + .exp-panel{
  margin-top:14px; max-height:1600px;
}
body.ka-editing .foldable--js .exp-panel{ max-height:4000px; margin-top:14px; }

.exp-list{ list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:10px; }
.exp-list > li{ display:block; }

/* --- each experience row: bordered lime panel (border-fix), themed text --- */
.exp-item{
  position:relative; isolation:isolate;
  width:100%;
  display:grid; grid-template-columns:auto 1fr auto; align-items:center; gap:16px;
  padding:16px clamp(16px,2vw,22px);
  text-align:left;
  background:var(--ink); color:var(--ink);   /* ink = border colour + themed text */
  border:0; border-radius:3px;
  cursor:pointer;
  clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-sm)),calc(100% - var(--cut-sm)) 100%,0 100%);
  -webkit-clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-sm)),calc(100% - var(--cut-sm)) 100%,0 100%);
  transition:transform .2s ease;
}
.exp-item::before{
  content:''; position:absolute; inset:2px; z-index:-1;   /* 2px gap = the border */
  background:var(--lime);
  clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-sm)),calc(100% - var(--cut-sm)) 100%,0 100%);
  -webkit-clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-sm)),calc(100% - var(--cut-sm)) 100%,0 100%);
  transition:background .2s ease;
}
.exp-item-date{
  font-family:var(--font-sans); font-weight:800; letter-spacing:.02em;
  font-size:14px; color:var(--ink); white-space:nowrap;
}
.exp-item-text{ display:flex; flex-direction:column; gap:2px; min-width:0; }
.exp-item-title{
  font-family:var(--font-serif); font-weight:800; letter-spacing:-.01em;
  font-size:clamp(1.05rem,2.4vw,1.35rem); line-height:1.1;
}
.exp-item-tagline{ font-size:14px; color:var(--ink-muted); }
.exp-item-cue{
  flex:0 0 auto; width:28px; height:28px;
  display:flex; align-items:center; justify-content:center;
  color:var(--ink);
  opacity:.5; transition:opacity .2s ease, transform .2s ease;
}
.exp-item-cue svg{ width:20px; height:20px; }
@media (hover:hover){
  .exp-item:hover{ transform:translateY(-2px); }
  .exp-item:hover::before{ background:color-mix(in srgb, var(--lime) 85%, #000); }
  .exp-item:hover .exp-item-cue{ opacity:1; transform:translate(2px,-2px); }
}
.exp-item:focus-visible{ outline:2px solid var(--fg); outline-offset:3px; }

@media (prefers-reduced-motion:reduce){
  .foldable--js .exp-panel{ transition:none; }
  .exp-trigger-chevron, .exp-item{ transition:none; }
}

/* ======================================================================
   LET'S COLLABORATE — form (75%) + CV-request banner (25%)
   ====================================================================== */
.collab-layout{
  display:grid; grid-template-columns:3fr 1fr;
  gap:clamp(20px,3vw,34px); align-items:start;
}
.collab-layout .contact-form{ max-width:none; }
@media (max-width:820px){ .collab-layout{ grid-template-columns:1fr; } }

/* [2026-11-12] Event Production: strip the lime panel + ink border (the border-fix) off the
   "What I can take on" card and BOTH "Let's collaborate" containers (the conversational form +
   the CV banner) — they sit bare over the shader now, text kept (soft shadow for legibility).
   Scoped to body.ep so the shared .bio-card / .contact-form / .cv-banner-inner chrome is
   unchanged on the other pages. background:transparent drops the ink "border", the ::before
   is the lime fill. */
/* [2026-11-12] Opened-foldable content containers go bare on EVERY page (EP + Workshops + DJ):
   no gray (lime) fill, no white (ink) border. Covers the border-fix cards (.bio-card /
   .contact-form / the .exp-item gig rows — element bg = ink border + ::before lime fill) and
   the real-border cards (.soundcloud-card / .identity-photo-card, a 2px solid ink border). The
   EP-only CV banner is kept below (its base rule sits later, so it stays body.ep-scoped to win
   on specificity). A soft text-shadow keeps the prose legible without a panel behind it. */
.exp-panel .bio-card,
.exp-panel .contact-form,
.exp-panel .exp-item{
  background:transparent;
  clip-path:none; -webkit-clip-path:none;
}
.exp-panel .bio-card::before,
.exp-panel .contact-form::before,
.exp-panel .exp-item::before{ display:none; }
.exp-panel .exp-item{ border-radius:0; border-bottom:1px dashed var(--ink-muted); }
.exp-panel .soundcloud-card,
.exp-panel .identity-photo-card{ background:transparent; border:none; }
body.ep .cv-banner-inner{ background:transparent; clip-path:none; -webkit-clip-path:none; }
body.ep .cv-banner-inner::before{ display:none; }
.exp-panel .bio-card,
.exp-panel .exp-item,
body.ep .cv-banner-eyebrow,
body.ep .cv-banner-title,
.exp-panel .contact-form .form-question{ text-shadow:0 1px 12px rgba(0,0,0,.45); }

.cv-banner-inner{
  position:relative; isolation:isolate;
  background:var(--ink);                 /* border colour (border-fix) */
  padding:clamp(20px,2.4vw,28px);
  border-radius:3px;
  display:flex; flex-direction:column; gap:12px;
  clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-lg)),calc(100% - var(--cut-lg)) 100%,0 100%);
  -webkit-clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-lg)),calc(100% - var(--cut-lg)) 100%,0 100%);
}
.cv-banner-inner::before{
  content:''; position:absolute; inset:2px; z-index:-1;   /* 2px gap = the border */
  background:var(--lime);
  clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-lg)),calc(100% - var(--cut-lg)) 100%,0 100%);
  -webkit-clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-lg)),calc(100% - var(--cut-lg)) 100%,0 100%);
}
.cv-banner-eyebrow{
  margin:0; font-family:var(--font-sans); font-weight:800;
  text-transform:uppercase; letter-spacing:.14em; font-size:11px; color:var(--ink-muted);
}
.cv-banner-title{
  margin:0; font-family:var(--font-serif); font-weight:800; line-height:1.04;
  font-size:clamp(1.3rem,2.6vw,1.8rem); color:var(--ink); letter-spacing:-.01em;
}
.cv-banner .btn{ width:100%; margin-top:4px; }
.cv-request-form{ display:flex; flex-direction:column; gap:10px; }
.cv-request-form[hidden]{ display:none; }
.cv-email{
  width:100%; padding:12px 14px;
  background:var(--ink); color:#1c1726;
  border:2px solid transparent; border-radius:3px;
  font-family:var(--font-sans); font-size:15px; font-weight:600;
}
.cv-email::placeholder{ color:rgba(28,23,38,.55); }
.cv-email:focus{ outline:none; border-color:var(--fg); }
.cv-email.is-invalid{ border-color:var(--purple); }
.cv-status{ margin:0; font-size:13px; font-weight:700; color:var(--ink); }

/* visible caption under the fullscreen image (experience rows pass showCaption) */
.ka-lightbox{ flex-direction:column; gap:16px; }
.ka-lightbox-caption{
  max-width:min(96vw,760px); text-align:center;
  font-family:var(--font-sans); font-weight:700; letter-spacing:.01em;
  font-size:clamp(15px,2.4vw,19px); color:#f2f6ff;
}

/* ======================================================================
   WORKSHOPS foldable accordion content (2026-11-03) — reuses the shared
   .foldable / .exp-trigger / .exp-panel pattern from event-production.
   ====================================================================== */
/* content inside a foldable panel is always visible — the fold IS the reveal,
   so override the scroll-reveal (opacity:0/translateY) in this context. CRUCIAL:
   keep isolation:isolate — the card's border-fix ::before is z-index:-1, so the
   card needs its own stacking context or its own --ink background paints over the
   lime fill (card turns --ink, and --ink text on it goes invisible). The reveal's
   transform normally provides that context; forcing transform:none removes it. */
.exp-panel .bio-card,
.exp-panel .contact-form,
.exp-panel .identity-photo-card,
.exp-panel .soundcloud-card{
  opacity:1; transform:none; isolation:isolate;
}
.exp-panel .bio-card{
  display:flex; flex-direction:column; gap:14px;
}
.exp-panel .bio-card > p{ margin:0; }
.exp-panel .service-list{ margin:0; }

.ws-sub-label{
  margin:0; font-family:var(--font-sans); font-weight:800;
  text-transform:uppercase; letter-spacing:.08em; font-size:12.5px; color:var(--ink);
}
/* "Selected example / experience" + "Include" notes — a small inset with a label */
.ws-example, .ws-include{
  margin:0; display:flex; flex-direction:column; gap:4px;
  padding:12px 14px; border-left:3px solid var(--ink);
  background:color-mix(in srgb, var(--ink) 12%, transparent);
  font-size:15px; line-height:1.45; color:var(--ink);
}
.ws-example-label{
  font-family:var(--font-sans); font-size:11px; font-weight:800;
  text-transform:uppercase; letter-spacing:.1em; color:var(--ink-muted);
}
.exp-cta{ margin-top:2px; }
.exp-cta .btn{ display:inline-flex; width:auto; }

/* 3.7 Background & Training: visually differentiated by INVERTING the hover —
   its resting fill is the tone the other triggers show on rollover, and on rollover
   it switches to the others' resting tone (--lime). */
.exp-trigger--alt::before{ background:color-mix(in srgb, var(--lime) 85%, #000); }
@media (hover:hover){
  .exp-trigger--alt:hover::before{ background:var(--lime); }
}

#workshop-booking.foldable{ padding-bottom:clamp(20px,5vw,56px); }

/* per-section image galleries in the workshops "Selected example/experience"
   (admin.js renders these from the settings store; upload UI shows in edit mode) */
.ws-gallery:empty{ display:none; }
.ws-gallery{ margin-top:8px; }
.ws-gallery-grid{
  display:grid; grid-template-columns:repeat(auto-fill, minmax(min(100%, 300px), 1fr)); gap:12px;
}
.ws-gallery-cell{
  position:relative; aspect-ratio:3/2; border-radius:6px; overflow:hidden;
  background:var(--ink); cursor:zoom-in;
}
.ws-gallery-cell img{ width:100%; height:100%; object-fit:cover; display:block; }
.ws-gallery-del{
  position:absolute; top:4px; right:4px; width:22px; height:22px; border:0; border-radius:4px;
  background:rgba(8,9,12,.72); color:#fff; font-size:14px; line-height:1; cursor:pointer;
}
.ws-gallery-drop{
  margin-top:8px; padding:12px; text-align:center;
  border:1.5px dashed var(--ink-muted); border-radius:6px;
  color:var(--ink-muted); font-size:13px; font-weight:600; cursor:pointer;
}
.ws-gallery-drop.ka-drop-over{ border-color:var(--ink); color:var(--ink); }

#dj-education.foldable{ padding-bottom:clamp(20px,5vw,56px); }

/* a foldable's prose+label+list edited as ONE rich block (workshops 3.2) — keep the
   same internal rhythm the separate .bio-card children had */
.ws-body{ display:flex; flex-direction:column; gap:14px; }
.ws-body > p{ margin:0; }
/* [2026-11-13] Each workshops foldable's INTRO paragraph is big (statement-sized) per request —
   much larger than the 16px body default, reading like the site's lead statements. The
   "Possible topics" / "Relevant training" labels + lists keep their normal size. */
#ws-design .ws-body > p:not(.ws-sub-label),
#ws-panel .bio-card > p,
#ws-networking .bio-card > p,
#class-booking .bio-card > p,
#ws-english .bio-card > p,
#ws-background .bio-card > p:not(.ws-sub-label),
#dj-education .bio-card > p{   /* dj.html DJ-education blurb, same big size */
  font-size:clamp(19px,2.6vw,30px);
  line-height:1.3;
  font-weight:700;
}
/* [2026-11-13] Align ALL dropdown-panel text across the 3 sectors (EP / Workshops / DJ) to the
   site's muted/darker gray (--type-color) — the intro statements included — instead of the
   brighter --ink some pieces used, so every sector's dropdown reads in one tone. (Hover states
   on the gig/experience rows still brighten.) */
.exp-panel .bio-card,
.exp-panel .bio-card p,
.exp-panel .bio-card li,
.exp-panel .ws-body,
.exp-panel .ws-sub-label,
.exp-panel .exp-item,
.exp-panel .exp-item-title,
.exp-panel .ws-card-title,
.exp-panel .ws-sub-label,
.exp-panel .cv-banner-eyebrow,
.exp-panel .cv-banner-title{
  color:var(--type-color);
}
/* [2026-11-13] these carried explicit --ink (more specific than the panel rule above), so
   they stayed light: the conversational-form question labels (EP + Workshops) and the DJ
   "Press & Booking" fact-list labels/values. */
.exp-panel .form-question,
.exp-panel .fact-list b,
.exp-panel .fact-list span{ color:var(--type-color); }
/* [2026-11-13] "Upcoming activities" cards go bare — drop the lime fill + ink border/frame
   (the .bio-card wrapper is already bare from the global .exp-panel rule). */
#ws-activities .ws-card--upcoming{ background:transparent; border:none; }
#ws-activities .ws-card--past .ws-card-media{ background:transparent; border:none; }

/* ======================================================================
   FOLDABLES ON PHONES: tapping a trigger opens that section as a FULLSCREEN
   overlay (title header + an X to close, content scrolls with a hidden
   scrollbar). Desktop keeps the inline accordion. js/main.js adds .is-open to
   the open section + .fold-fullscreen-open to <body>, and injects the X.
   ====================================================================== */
.fold-close{ display:none; border:0; cursor:pointer; }

@media (max-width:760px){
  body.fold-fullscreen-open{ overflow:hidden; }

  .foldable--js.is-open{
    position:fixed; inset:0; z-index:9000;
    margin:0 !important; padding:0 !important; max-width:none;
    display:flex; flex-direction:column;
    background-color:var(--lime);
    background-image:var(--dot-pattern);
    background-size:var(--dot-gap) var(--dot-gap);
    background-blend-mode:overlay;
    overscroll-behavior:contain;
  }

  /* trigger = fixed top header bar (title left, room for the X on the right) */
  .foldable--js.is-open .exp-trigger{
    flex:0 0 auto;
    min-height:auto;
    border-radius:0;
    padding:16px 64px 16px 20px;
    clip-path:none; -webkit-clip-path:none;
  }
  .foldable--js.is-open .exp-trigger::before{
    inset:0; clip-path:none; -webkit-clip-path:none;
    border-bottom:2px solid var(--ink);
  }
  .foldable--js.is-open .exp-trigger-chevron{ display:none; }

  /* panel fills the rest and scrolls; hidden scrollbar */
  .foldable--js.is-open .exp-panel{
    flex:1 1 auto;
    max-height:none !important;
    margin-top:0 !important;
    overflow-x:hidden; overflow-y:auto;
    -webkit-overflow-scrolling:touch;
    padding:18px 16px 36px;
    scrollbar-width:none;
  }
  .foldable--js.is-open .exp-panel::-webkit-scrollbar{ width:0; height:0; display:none; }

  .foldable--js.is-open .fold-close{
    display:flex; align-items:center; justify-content:center;
    position:absolute; top:12px; right:12px; z-index:3;
    width:44px; height:44px; border-radius:50%;
    background:var(--ink); color:var(--lime); border:2px solid var(--lime);
  }
}

/* ===== MONOCHROME TRY (2026-11-10): the one purple accent (--accent) =====
   Big statement text + the active nav link carry the purple; everything else is
   greyscale. Remove this block (and restore :root) to revert. */
#statement .sound-statement,
#ws-intro .sound-statement,
#about .sound-statement{ color:var(--accent); }
#statement .sound-statement strong,
#about .sound-statement strong{ color:inherit; }

.nav a.active{ color:var(--accent); }
.nav a.active::after{ background:var(--accent); }
@media (max-width:859px){
  .nav a.active{ background:var(--accent); color:var(--fg); text-decoration:none; }
}

/* [experiment 2026-11-10] visible "Read more" link on the Upcoming events list
   (replaces the small arrow icon; opens in a new tab). Remove to revert. */
/* [2026-11-12] transparent OUTLINE button — border only at rest (NO grey fill), fills on
   rollover. Dropped the border-fix ::before whose lime fill read as the grey background. */
.event-ra-link--text{
  position:relative; opacity:1;
  width:auto; height:auto; gap:6px; padding:8px 15px; align-self:center;
  font-family:var(--font-sans); font-size:11.5px; font-weight:800;
  text-transform:uppercase; letter-spacing:.06em;
  color:var(--type-color); background:transparent;   /* [2026-11-13] gray text, no white border */
  border:none; border-radius:2px;
  white-space:nowrap; transition:background .15s ease, color .15s ease;
}
.event-ra-link--text::before{ display:none; }
.event-ra-link--text svg{ width:13px; height:13px; }
@media (hover:hover){
  .event-ra-link--text:hover{ background:var(--ink); color:var(--lime); }
}

/* ===========================================================================
   [2026-11-10] Contact modal + DJ gig category labels
   Reusable 3-step contact modal (opened from the header "Book" options and the
   footer mail icon) and the Upcoming/Selected group headings in the DJ gig list.
   To revert: delete this whole block (+ the wireContactModal IIFE in main.js, the
   renderGigList grouping in admin.js, and the data-contact-modal attrs in the HTML).
   =========================================================================== */
/* DJ "Selected gigs" group headings (shown only when both groups have rows) */
.gig-group-label{
  list-style:none;
  font-family:var(--font-sans);
  font-weight:800;
  font-size:11px;
  letter-spacing:.14em;
  text-transform:uppercase;
  color:var(--ink);
  opacity:.5;
  margin:16px 0 4px;
  padding:0 2px;
}
.gig-group-label:first-child{ margin-top:0; }

/* Contact modal */
.contact-modal{
  position:fixed; inset:0; z-index:9500;
  display:flex; align-items:center; justify-content:center;
  padding:24px 16px;
}
.contact-modal[hidden]{ display:none; }
.contact-modal-backdrop{
  position:absolute; inset:0;
  background:rgba(10,11,13,.62);
  -webkit-backdrop-filter:blur(3px); backdrop-filter:blur(3px);
}
/* [2026-11-12] the FORM card IS the modal container now (no separate panel, no header).
   The base .contact-form already carries the lime cut-corner card (border-fix); force it
   visible (it's opacity:0 until the scroll-reveal observer, which never fires in a hidden
   modal) and isolate it so the ::before fill renders. Centred on the backdrop; close X in
   its own top-right corner, with extra top padding so the progress row clears it. */
.contact-modal .contact-form{
  position:relative; isolation:isolate;
  opacity:1; transform:none;
  width:100%; max-width:520px;
  max-height:calc(100dvh - 48px);
  overflow:auto;
  margin:0;
  box-sizing:border-box;
  padding-top:52px;
}
.contact-modal .contact-form--conversational{ min-height:300px; }
.contact-modal-close{
  position:absolute; top:12px; right:12px; z-index:5;
  width:38px; height:38px; display:flex; align-items:center; justify-content:center;
  background:none; border:none; cursor:pointer; color:var(--ink); opacity:.7;
}
.contact-modal-close:hover{ opacity:1; }
body.contact-modal-open{ overflow:hidden; }

/* ===========================================================================
   [2026-11-11] INNER-PAGE HERO (dj / workshops / event-production)
   The monochrome shader as the hero (js/hero-shader.js -> #heroShader, contained to
   the hero), with the page's first statement centered on top, bare (no card) — the
   homepage hero look. Runs up under the sticky header so the header's blurred-lime
   gradient dissolves into the shader. Replaced the photo banner + the decorative
   reaction-diffusion title box. To revert: restore the .page-intro--banner heroes +
   the separate statement sections and remove the hero-shader.js includes.
   =========================================================================== */
.inner-hero{
  position:relative;
  margin-top:calc(-1 * var(--header-h));     /* run up under the sticky header */
  min-height:calc(clamp(460px,84svh,900px) + var(--header-h));
  display:flex;
  flex-direction:column;
  align-items:center;
  justify-content:center;
  text-align:center;
  overflow:hidden;
  padding:var(--header-h) clamp(20px,6vw,64px) 0;
  box-sizing:border-box;
}
/* [2026-11-11] FIXED (static) like the homepage shader — a page-wide backdrop the whole
   page's content slides over for a 3D/parallax feel (nothing on these pages establishes a
   containing block, so a fixed child of the hero fills the viewport and isn't clipped by
   the hero's overflow). The sections are transparent, so the shader shows through as the
   content + the hero's png drawing overlay slide over it. */
.inner-hero-shader{
  position:fixed; inset:0;
  width:100%; height:100%;
  z-index:-2; display:block;
  background:var(--lime);                     /* no-WebGL fallback */
}
.inner-hero-scrim{
  position:fixed; inset:0; z-index:-1;
  pointer-events:none;
  background:color-mix(in srgb, var(--lime) 42%, transparent);
}
.inner-hero-content{
  position:relative; z-index:2;
  width:100%; max-width:860px;
}
/* [2026-11-12] top taglines (page titles) removed from view per user — the hero now shows
   just the statement. Kept as a visually-hidden <h1> so each page still has a heading for
   SEO/accessibility. To show them again, restore the visible styles below:
     font-family:var(--font-sans); font-weight:800; font-size:clamp(11px,1.4vw,13px);
     letter-spacing:.22em; text-transform:uppercase; color:var(--ink); opacity:.72;
     margin:0 0 20px; text-shadow:0 1px 10px rgba(0,0,0,.55); */
.inner-hero-kicker{
  position:absolute;
  width:1px; height:1px;
  margin:-1px; padding:0; border:0;
  overflow:hidden;
  clip:rect(0 0 0 0);
  clip-path:inset(50%);
  white-space:nowrap;
}
.inner-hero .sound-statement{
  margin:0 auto;
  text-shadow:0 2px 20px rgba(0,0,0,.5);
}

/* ===========================================================================
   [2026-11-11] INNER-HERO STATEMENT — grey like all the other text, with the pointer
   "discovering"/painting a SOFT purple into the words. The text fill is a radial
   gradient clipped to the glyphs (background-clip:text): grey (--ink) everywhere, a
   soft purple (--accent) blob at the pointer. js/main.js feeds --mx/--my and grows
   --hero-r on hover (soft fade in/out via @property), a hover glow adds the blur feel.
   Overrides the MONOCHROME accent block above (which painted these solid --accent).
   =========================================================================== */
@property --hero-r{ syntax:'<length>'; inherits:false; initial-value:0px; }
/* [2026-11-12] hero-paint tunables — live-editable in the design panel (Ctrl+Shift+L):
   --hero-paint-core = radius of the solid-purple centre, --hero-paint-soft = where it
   fades back to the base text colour (a bigger gap = blurrier), --hero-paint-glow = the
   ambient hover glow blur. Blob SIZE (--hero-r set on enter) + MOTION smoothing are JS
   (window.__heroPaint, js/main.js wireHeroPaint). Shared by the inner heroes + the home one. */
:root{ --hero-paint-core:18%; --hero-paint-soft:72%; --hero-paint-glow:26px; }
/* grey base + fallback where background-clip:text is unsupported */
#about.inner-hero .sound-statement,
#ws-intro.inner-hero .sound-statement,
#statement.inner-hero .sound-statement{
  color:var(--ink);
}
#about.inner-hero .sound-statement strong,
#ws-intro.inner-hero .sound-statement strong,
#statement.inner-hero .sound-statement strong{
  color:var(--ink);
  -webkit-text-fill-color:var(--ink);
}
@supports ((-webkit-background-clip:text) or (background-clip:text)){
  #about.inner-hero .sound-statement,
  #ws-intro.inner-hero .sound-statement,
  #statement.inner-hero .sound-statement{
    --mx:50%; --my:50%; --hero-r:0px;
    color:transparent;
    -webkit-text-fill-color:transparent;
    background-image:radial-gradient(circle var(--hero-r, 0px) at var(--mx) var(--my),
        var(--accent) 0%, var(--accent) var(--hero-paint-core,18%), var(--ink) var(--hero-paint-soft,72%));
    -webkit-background-clip:text;
    background-clip:text;
    text-shadow:0 2px 20px rgba(0,0,0,.5);
    transition:--hero-r .5s ease, text-shadow .5s ease;
    /* no cursor override here — inherit the site's cursor:none so the custom knob
       cursor stays visible over the statement (an override showed the native arrow). */
  }
  /* soft ambient purple glow on hover — the "blur it a bit" touch */
  #about.inner-hero .sound-statement:hover,
  #ws-intro.inner-hero .sound-statement:hover,
  #statement.inner-hero .sound-statement:hover{
    text-shadow:0 2px 20px rgba(0,0,0,.5), 0 0 var(--hero-paint-glow,26px) color-mix(in srgb, var(--accent) 24%, transparent);
  }
}
@media (prefers-reduced-motion:reduce){
  #about.inner-hero .sound-statement,
  #ws-intro.inner-hero .sound-statement,
  #statement.inner-hero .sound-statement{ transition:none; }
}

/* [2026-11-12] Homepage statement gets the SAME pointer-paint as the inner-page heroes
   (per request). Base stays the theme gray (--type-color); the purple blob follows the
   cursor, sharing the --hero-paint-* tunables + window.__heroPaint (js/main.js wireHeroPaint
   now also targets .hero-content--mission .mission-text). The typewriter .tw-char spans
   still fade in — with --hero-r:0 the radial gradient collapses to the base gray. */
.hero-content--mission .mission-text strong{ color:var(--type-color); -webkit-text-fill-color:var(--type-color); }
/* Gated behind .paint-on (js/main.js adds it when the typewriter finishes). Until then the
   statement keeps its normal --type-color fill so the per-character .tw-char opacity fade is
   visible — background-clip:text paints the fill on the PARENT and clips it to every glyph, so
   a child span's opacity can't hide its character, which was wiping the typing animation. */
@supports ((-webkit-background-clip:text) or (background-clip:text)){
  .hero-content--mission .mission-text.paint-on{
    --mx:50%; --my:50%; --hero-r:0px;
    color:transparent;
    -webkit-text-fill-color:transparent;
    background-image:radial-gradient(circle var(--hero-r,0px) at var(--mx) var(--my),
        var(--accent) 0%, var(--accent) var(--hero-paint-core,18%), var(--type-color) var(--hero-paint-soft,72%));
    -webkit-background-clip:text;
    background-clip:text;
    text-shadow:0 2px 20px rgba(0,0,0,.5);
    transition:--hero-r .5s ease, text-shadow .5s ease;
  }
  .hero-content--mission .mission-text.paint-on:hover{
    text-shadow:0 2px 20px rgba(0,0,0,.5), 0 0 var(--hero-paint-glow,26px) color-mix(in srgb, var(--accent) 24%, transparent);
  }
}
@media (prefers-reduced-motion:reduce){
  .hero-content--mission .mission-text{ transition:none; }
}

/* ===========================================================================
   [2026-11-12] Homepage service cards → image cards with overlaid text.
   The whole card is the photo (cut-corner, no lime body below): BIG title over the top,
   CTA button over the bottom, and the description fades IN over the photo on hover. Fixed
   height + no image zoom, so the image never shifts on hover. Overrides the earlier
   image-top + lime-body-below layout. Homepage-only (.work-card is used only here).
   =========================================================================== */
body.home .work-card{
  background:none;
  overflow:hidden;
  isolation:isolate;
  height:clamp(380px,52vh,560px);     /* fixed → hovering can't resize it */
  clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-lg)),calc(100% - var(--cut-lg)) 100%,0 100%);
  -webkit-clip-path:polygon(0 0,100% 0,100% calc(100% - var(--cut-lg)),calc(100% - var(--cut-lg)) 100%,0 100%);
}
body.home .work-card::before{ display:none; }        /* drop the lime border-fill */
body.home .work-card--photo .work-card-media,
body.home .work-card-media{
  position:absolute; inset:0;
  height:100%; width:100%;
  overflow:hidden;
  z-index:0;
}
body.home .work-card-media img{ width:100%; height:100%; object-fit:cover; }
/* image stays put on hover (no zoom / no position change) */
body.home .work-card:hover .work-card-media img{
  transform:none;
  filter:url(#duotone) contrast(1.08) brightness(1.04);
}
/* legibility scrim: darker at the top (title) and bottom (desc + button) */
body.home .work-card-media::after{
  content:''; position:absolute; inset:0; z-index:1; pointer-events:none;
  background:linear-gradient(to bottom,
      rgba(8,9,11,.60) 0%, rgba(8,9,11,.12) 24%,
      rgba(8,9,11,.14) 48%, rgba(8,9,11,.85) 100%);
}
body.home .work-card-overlay{
  position:relative; z-index:2;
  height:100%;
  display:flex;
  flex-direction:column;
  padding:22px;
  gap:12px;
}
body.home .work-card-title{
  font-family:var(--font-serif);
  font-weight:800;
  font-size:clamp(26px,2.7vw,40px);   /* BIG, over the top of the photo */
  line-height:1.03;
  letter-spacing:-.02em;
  color:var(--type-color);            /* theme gray (was --fg/white); text-shadow below keeps it legible over the photo */
  margin:0;
  text-shadow:0 2px 16px rgba(0,0,0,.6);
}
body.home .work-card-more{
  margin-top:auto;                    /* sit low, just above the button */
  color:var(--fg);
  font-weight:500;
  font-size:15.5px;
  line-height:1.5;
  text-shadow:0 1px 12px rgba(0,0,0,.75);
  opacity:0;
  transform:translateY(8px);
  transition:opacity .4s ease, transform .4s ease;
}
body.home .work-card-more p{ margin:0; color:var(--fg); font-size:inherit; }
@media (hover:hover){
  body.home .work-card:hover .work-card-more,
  body.home .work-card:focus-within .work-card-more{ opacity:1; transform:none; }
}
@media (hover:none){                  /* touch: no hover, so just show it */
  body.home .work-card-more{ opacity:1; transform:none; }
}
/* CTA button pinned to the bottom, over the photo (only the description gets the auto gap) */
body.home .work-card .work-link{ margin-top:0; }
/* neutralise the older grid-rows reveal (1990 block) which would collapse the overlaid
   description to 0 height — the new design fades it in over the photo instead. Same
   selector specificity, later in source, so these win. */
@media (hover:hover){
  body.home .work-card .work-card-more{
    display:block;
    grid-template-rows:none;
    opacity:0;
    transform:translateY(8px);
    transition:opacity .4s ease, transform .4s ease;
  }
  body.home .work-card:hover .work-card-more,
  body.home .work-card:focus-within .work-card-more{
    opacity:1;
    transform:none;
  }
}

/* ===========================================================================
   [2026-11-12] batch: inner-hero text left, cursor fixes, calendar cleanup
   =========================================================================== */
/* 1 — inner-page intro statements left-aligned (were centred) */
.inner-hero .sound-statement{ text-align:left; }

/* 2 — keep the custom knob cursor over the Contact button + disabled form buttons.
   The native cursor leaked through because .book-btn{cursor:pointer} beats
   button{cursor:none} on specificity, and .btn:disabled forces cursor:not-allowed. */
@media (hover:hover) and (pointer:fine){
  .book-btn, .btn:disabled, .btn[disabled]{ cursor:none; }
}

/* 3 — homepage "Upcoming Events" title: drop the grey chip background */
body.home #calendar .calendar-head-main .section-title{
  background:none;
  background-image:none;
  padding:0 0 .08em;           /* small bottom room so the "g" descender isn't clipped */
}
/* 4 — a touch less space between the title and the list */
body.home .calendar-head{ margin-bottom:12px; padding-bottom:0; }
/* 5 — event list sits on the page now (no card background) */
body.home .calendar-widget{ background:none; padding:0; }
body.home .calendar-widget::before{ display:none; }
