/* =========================================================
   WIRED-INSPIRED EDITORIAL DESIGN SYSTEM
   for Die Gilde der Musiker KYUSHU / ギルド・ムジカ九州
   ========================================================= */

:root{
  /* INK */
  --ink-black:#000000;
  --ink-page:#1a1a1a;
  --paper:#ffffff;

  /* GRAYS */
  --caption:#757575;
  --disabled:#999999;
  --hairline:#e2e8f0;
  --soft-bg:#f6f6f3;

  /* THE ONE COLOR */
  --link-blue:#057dbc;

  /* TYPE STACKS — substitutes for proprietary WIRED faces */
  --display:'Playfair Display','Noto Serif JP',Georgia,serif;
  --body:'Source Serif 4','Noto Serif JP',Georgia,serif;
  --ui:'Inter','Noto Sans JP',-apple-system,BlinkMacSystemFont,sans-serif;
  --mono:'JetBrains Mono','Noto Sans JP',Menlo,Monaco,Courier,monospace;

  /* GRID */
  --max:1440px;
  --pad-x:64px;
  --gut:32px;
}

@media (max-width:1023px){:root{--pad-x:32px;--gut:24px}}
@media (max-width:767px){:root{--pad-x:20px;--gut:20px}}

*,*::before,*::after{box-sizing:border-box}
html,body{margin:0;padding:0}
html{scroll-behavior:smooth}
/* Prevent horizontal overflow caused by full-bleed elements that
   use width:100vw / margin-left:calc(50% - 50vw). On mobile, 100vw
   includes the scrollbar gutter while the actual content area does
   not, so those elements end up ~15px wider than the viewport and
   the whole page becomes horizontally scrollable. `overflow-x: clip`
   visually clips the overflow without creating a new scroll container,
   so position:fixed / sticky inside the page still work normally. */
html,body{overflow-x:clip}
body{
  font-family:var(--body);
  font-size:16px;
  line-height:1.5;
  color:var(--ink-page);
  background:var(--paper);
  -webkit-font-smoothing:antialiased;
  -moz-osx-font-smoothing:grayscale;
  text-rendering:optimizeLegibility;
}
img,video{display:block;max-width:100%;height:auto;border:0}
button{font:inherit;color:inherit;background:none;border:0;padding:0;cursor:pointer}
a{color:inherit;text-decoration:none}

/* —— NO ROUNDED CORNERS ANYWHERE —— */
*{border-radius:0}

/* —— TYPOGRAPHIC ROLES —— */
.kicker{
  font-family:var(--mono);
  font-size:12px;
  font-weight:400;
  line-height:1.23;
  letter-spacing:1.1px;
  text-transform:uppercase;
  color:var(--ink-page);
  display:inline-block;
}
.kicker--bold{font-weight:700}
.kicker--white{color:var(--paper)}
/* Filled black-tile variant — used for status labels next to a
   concert heading (e.g. "開催終了" / "次期開催予定"). Pairs with
   .concert-status-note (gray plain text shown beside the badge). */
.kicker--badge{
  background:var(--ink-black);
  color:var(--paper);
  padding:6px 12px;
  letter-spacing:1.6px;
}
.concert-status{
  display:flex;
  align-items:center;
  gap:14px;
  flex-wrap:wrap;
}
.concert-status-note{
  font-family:var(--body, Georgia, serif);
  font-size:13px;
  color:var(--caption, #666);
  line-height:1.5;
}
.kicker--blue{color:var(--link-blue)}

.eyebrow-rule{
  display:flex;
  align-items:center;
  gap:12px;
  margin-bottom:14px;
}
.eyebrow-rule::after{
  content:"";
  flex:1;
  height:1px;
  background:var(--ink-black);
  display:block;
}

h1,h2,h3,h4{
  font-family:var(--display);
  font-weight:400;
  color:var(--ink-page);
  margin:0;
  letter-spacing:-0.5px;
}
.display-xxl{
  font-family:var(--display);
  font-size:clamp(40px,6.4vw,82px);
  line-height:1.05;     /* +0.12 from the 0.93 token to compensate Playfair metrics */
  letter-spacing:-1.2px;
}
.display-xl{
  font-family:var(--display);
  font-size:clamp(32px,4.8vw,64px);
  line-height:1.06;
  letter-spacing:-0.9px;
}
.display-l{
  font-family:var(--display);
  font-size:clamp(26px,3vw,40px);
  line-height:1.12;
  letter-spacing:-0.5px;
}
.display-m{
  font-family:var(--display);
  font-size:clamp(22px,2.2vw,28px);
  line-height:1.18;
  letter-spacing:-0.28px;
}

/* Japanese-leaning headline variant — slightly looser, less negative tracking */
.display-jp{
  font-family:var(--display);
  font-feature-settings:"palt" 1;
  letter-spacing:-0.02em;
}

.deck{
  font-family:var(--body);
  font-size:19px;
  line-height:1.55;
  letter-spacing:0.05px;
  color:var(--ink-page);
}
.body{
  font-family:var(--body);
  font-size:16px;
  line-height:1.7;
  color:var(--ink-page);
}
.body p{margin:0 0 1.1em}
.body p:last-child{margin-bottom:0}

.caption{
  font-family:var(--mono);
  font-size:11px;
  letter-spacing:0.9px;
  text-transform:uppercase;
  color:var(--caption);
}
.timestamp{
  font-family:var(--mono);
  font-size:12px;
  letter-spacing:1px;
  text-transform:uppercase;
  color:var(--caption);
}

a.inline-link{
  color:var(--ink-page);
  border-bottom:1px solid currentColor;
  transition:color 120ms linear;
}
a.inline-link:hover{color:var(--link-blue)}

/* —— BUTTONS (square, 2px hard black, color-flip on hover) —— */
.btn{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  gap:10px;
  padding:14px 24px;
  border:2px solid var(--ink-black);
  background:var(--paper);
  color:var(--ink-black);
  font-family:var(--ui);
  font-size:14px;
  font-weight:700;
  letter-spacing:0.6px;
  text-transform:uppercase;
  transition:background 150ms linear,color 150ms linear;
  min-height:46px;
}
.btn:hover{background:var(--ink-black);color:var(--paper)}
.btn--inverted{background:var(--ink-black);color:var(--paper);border-color:var(--paper)}
.btn--inverted:hover{background:var(--paper);color:var(--ink-black)}
.btn .arrow{font-family:var(--mono);font-weight:400}

/* —— TOP UTILITY BAR —— */
.utility-bar{
  background:var(--ink-black);
  color:var(--paper);
  height:60px;
  display:flex;
  align-items:center;
  padding:0 var(--pad-x) 0 0;     /* logo flush-left, content padding kept on right */
  position:sticky;
  top:0;
  z-index:100;
  font-family:var(--mono);
  font-size:11px;
  text-transform:uppercase;
  letter-spacing:1.2px;
  transition:height 220ms cubic-bezier(.2,.7,.2,1);
}
body.scrolled .utility-bar{height:38px}
.utility-bar nav{display:flex;align-items:center;gap:0;flex:1;overflow-x:auto;scrollbar-width:none;align-self:stretch}
.utility-bar nav::-webkit-scrollbar{display:none}

/* Burger button — hidden on desktop, shown on mobile (≤899px).
   Three short bars; animates to "X" when nav is open. */
.bar-burger{
  display:none;
  width:44px;
  height:44px;
  margin-left:auto;
  margin-right:8px;
  background:transparent;
  border:0;
  padding:0;
  cursor:pointer;
  align-self:center;
  flex:0 0 auto;
  position:relative;
}
.bar-burger span{
  position:absolute;
  left:10px;
  width:24px;
  height:2px;
  background:var(--paper);
  transition:transform 220ms cubic-bezier(.2,.7,.2,1),
             opacity 160ms linear,
             top 220ms cubic-bezier(.2,.7,.2,1);
}
.bar-burger span:nth-child(1){top:14px}
.bar-burger span:nth-child(2){top:21px}
.bar-burger span:nth-child(3){top:28px}
body.nav-open .bar-burger span:nth-child(1){top:21px;transform:rotate(45deg)}
body.nav-open .bar-burger span:nth-child(2){opacity:0}
body.nav-open .bar-burger span:nth-child(3){top:21px;transform:rotate(-45deg)}
.utility-bar a{
  color:var(--paper);
  padding:0 13px;
  display:inline-flex;
  align-items:center;
  border-right:1px solid #2a2a2a;
  transition:color 120ms linear,background 120ms linear;
  white-space:nowrap;
  flex:0 0 auto;
  align-self:stretch;
}
.utility-bar nav a:first-of-type{border-left:1px solid #2a2a2a}
.utility-bar a:hover{color:var(--link-blue)}

/* Brand logo — flush left of the bar, scales with bar height */
.bar-logo{
  display:inline-flex;
  align-items:center;
  padding:0 20px;
  border-right:1px solid #2a2a2a;
  align-self:stretch;
  flex:0 0 auto;
  transition:padding 220ms cubic-bezier(.2,.7,.2,1);
}
.bar-logo img{
  height:36px;
  width:auto;
  display:block;
  transition:height 220ms cubic-bezier(.2,.7,.2,1);
}
body.scrolled .bar-logo{padding:0 16px}
body.scrolled .bar-logo img{height:20px}

/* Inverted CTA inside the bar — pushes to the right edge on desktop */
.utility-bar .bar-cta{
  margin-left:auto;
  background:var(--paper);
  color:var(--ink-black) !important;
  font-weight:700;
  letter-spacing:1.4px;
  border-left:1px solid #2a2a2a;
}
.utility-bar .bar-cta:hover{
  background:var(--link-blue);
  color:var(--paper) !important;
}
/* Language selector — native <select> styled to fit the dark utility
   bar. Replaces the inline 7-token strip; saves horizontal real estate
   so the nav can fit comfortably on smaller widescreens. The chevron
   is drawn with two tiny rotated background gradients to avoid an SVG
   asset. The currently-active language is the selected option with
   value="" so picking it again is a no-op (the JS handler skips empty
   values). */
.utility-bar .lang-select{
  appearance:none;
  -webkit-appearance:none;
  -moz-appearance:none;
  background-color:transparent;
  border:0;
  border-left:1px solid #2a2a2a;
  color:#9a9a9a;
  font-family:var(--mono);
  font-size:11px;
  font-weight:500;
  letter-spacing:1.6px;
  text-transform:uppercase;
  padding:0 26px 0 14px;
  height:100%;
  align-self:stretch;
  flex:0 0 auto;
  cursor:pointer;
  outline:none;
  /* Chevron — two 5px squares meeting at a point, drawn from the right edge. */
  background-image:
    linear-gradient(45deg,  transparent 50%, #9a9a9a 50%),
    linear-gradient(135deg, #9a9a9a 50%, transparent 50%);
  background-position:
    calc(100% - 12px) 50%,
    calc(100% -  8px) 50%;
  background-size:5px 5px, 5px 5px;
  background-repeat:no-repeat, no-repeat;
  transition:color 160ms;
}
.utility-bar .lang-select:hover,
.utility-bar .lang-select:focus-visible{color:var(--paper)}
.utility-bar .lang-select:focus-visible{
  box-shadow:inset 0 0 0 1px #4a4a4a;
}
/* Native option styling. Browsers honor background/color on <option>
   inside the open dropdown menu — fall back gracefully where ignored. */
.utility-bar .lang-select option{
  background:var(--ink-black);
  color:var(--paper);
  font-family:var(--mono);
  letter-spacing:0.4px;
}
@media (max-width:1023px){
  .utility-bar .lang-select{display:none}
}

/* Mobile / tablet (≤899px) — collapse the inline nav into a burger
   that opens a fullscreen overlay menu. */
@media (max-width:899px){
  .bar-burger{display:block}
  .utility-bar nav.bar-nav{
    position:fixed;
    top:0; left:0; right:0; bottom:0;
    background:var(--ink-black);
    flex-direction:column;
    align-items:stretch;
    justify-content:flex-start;
    padding:80px 0 40px;
    overflow-y:auto;
    overflow-x:hidden;
    transform:translateX(100%);
    transition:transform 280ms cubic-bezier(.2,.7,.2,1);
    z-index:99;
    flex:none;
    align-self:auto;
  }
  body.nav-open .utility-bar nav.bar-nav{
    transform:translateX(0);
  }
  .utility-bar nav.bar-nav a{
    height:auto;
    padding:18px var(--pad-x);
    font-size:14px;
    letter-spacing:1.6px;
    border-right:0;
    border-bottom:1px solid #2a2a2a;
    width:100%;
    align-self:auto;
    flex:0 0 auto;
  }
  .utility-bar nav.bar-nav a:first-of-type{border-left:0}
  .utility-bar nav.bar-nav .bar-cta{
    margin-left:0;
    margin-top:16px;
    border-left:0;
    border-bottom:0;
    justify-content:center;
  }
  .utility-bar nav.bar-nav .lang-select{
    display:block !important;
    width:100%;
    height:auto;
    border-left:0;
    border-top:1px solid #2a2a2a;
    padding:18px var(--pad-x);
    margin-top:8px;
    background-position:
      calc(100% - var(--pad-x) - 4px) 50%,
      calc(100% - var(--pad-x) + 0px) 50%;
    font-size:14px;
    letter-spacing:1.6px;
  }
  /* Lock body scroll while menu open. */
  body.nav-open{overflow:hidden}
}

/* —— MASTHEAD —— */
.masthead{
  border-bottom:1px solid var(--ink-black);
  padding:28px var(--pad-x) 22px;
  background:var(--paper);
  position:relative;
}
.masthead-row{
  max-width:var(--max);
  margin:0 auto;
  display:flex;
  align-items:flex-start;
  justify-content:space-between;
  gap:24px;
}
.brand{
  display:flex;
  flex-direction:column;
  align-items:flex-start;
  gap:4px;
}
.brand-mark{
  font-family:var(--display);
  font-style:italic;
  font-weight:500;
  font-size:clamp(28px,3.2vw,42px);
  line-height:1;
  letter-spacing:-0.5px;
  color:var(--ink-page);
}
.brand-sub{
  font-family:var(--mono);
  font-size:10px;
  letter-spacing:1.6px;
  text-transform:uppercase;
  color:var(--caption);
  margin-top:4px;
}
.masthead-meta{
  display:flex;
  align-items:center;
  gap:18px;
  font-family:var(--mono);
  font-size:11px;
  letter-spacing:1.2px;
  text-transform:uppercase;
  color:var(--caption);
}
.masthead-meta .ext{color:var(--ink-page)}
.icon-btn{
  width:38px;height:38px;
  border:1px solid var(--caption);
  display:inline-flex;align-items:center;justify-content:center;
  border-radius:50% !important;       /* the only circle exception */
  transition:background 120ms linear,color 120ms linear;
}
.icon-btn:hover{background:var(--ink-black);color:var(--paper);border-color:var(--ink-black)}
@media (max-width:767px){
  .masthead{padding:20px var(--pad-x) 16px}
  .masthead-meta{display:none}
}

/* —— PRIMARY NAV STRIP —— */
.primary-nav{
  border-bottom:1px solid var(--ink-black);
  background:var(--paper);
}
.primary-nav-inner{
  max-width:var(--max);
  margin:0 auto;
  padding:0 var(--pad-x);
  display:flex;
  align-items:center;
  gap:0;
  height:54px;
  overflow-x:auto;
  scrollbar-width:none;
}
.primary-nav-inner::-webkit-scrollbar{display:none}
.primary-nav a{
  font-family:var(--ui);
  font-size:13px;
  font-weight:600;
  letter-spacing:0.4px;
  color:var(--ink-page);
  padding:0 18px;
  height:54px;
  display:inline-flex;
  align-items:center;
  white-space:nowrap;
  border-right:1px solid var(--hairline);
  transition:color 120ms linear,background 120ms linear;
}
.primary-nav a:first-child{border-left:1px solid var(--hairline);padding-left:18px}
.primary-nav a:first-child{padding-left:0;border-left:0}
.primary-nav a:hover{color:var(--link-blue)}
.primary-nav .nav-cta{
  margin-left:auto;
  font-family:var(--mono);
  font-weight:700;
  text-transform:uppercase;
  font-size:11px;
  letter-spacing:1.2px;
  color:var(--paper);
  background:var(--ink-black);
  padding:0 18px;
  height:54px;
  display:inline-flex;
  align-items:center;
  border:0 !important;
}
.primary-nav .nav-cta:hover{color:var(--ink-black);background:var(--link-blue);color:var(--paper)}

/* —— LAYOUT WRAPPERS —— */
.wrap{
  max-width:var(--max);
  margin:0 auto;
  padding:0 var(--pad-x);
}
.wrap--narrow{max-width:980px}
.section{padding:80px 0}
.section--tight{padding:64px 0}
.section--xtight{padding:48px 0}
@media (max-width:767px){
  .section{padding:56px 0}
  .section--tight{padding:48px 0}
}
.divider{height:1px;background:var(--ink-black);margin:0;border:0}
.divider--soft{background:var(--hairline)}

/* —— SECTION RIBBON (full-bleed black bar) —— */
.ribbon{
  background:var(--ink-black);
  color:var(--paper);
  padding:14px var(--pad-x);
  font-family:var(--mono);
  font-size:12px;
  font-weight:700;
  letter-spacing:1.4px;
  text-transform:uppercase;
  display:flex;
  align-items:center;
  gap:14px;
}
.ribbon .num{color:var(--link-blue);font-weight:400}
.ribbon .ribbon-jp{
  margin-left:auto;
  font-family:var(--ui);
  font-weight:500;
  font-size:12px;
  letter-spacing:0.8px;
  text-transform:none;
  color:#bcbcbc;
}
@media (max-width:767px){.ribbon .ribbon-jp{display:none}}

/* =========================================================
   HERO — full-bleed video, no overlay
   ========================================================= */
.hero{
  width:100%;
  background:var(--ink-black);
  position:relative;
  overflow:hidden;
}
.hero video{
  width:100%;
  height:auto;
  display:block;
  aspect-ratio:16/9;
  object-fit:cover;
}
.hero-strip{
  background:var(--ink-black);
  color:var(--paper);
  padding:14px var(--pad-x);
  display:flex;
  align-items:center;
  gap:24px;
  font-family:var(--mono);
  font-size:11px;
  letter-spacing:1.2px;
  text-transform:uppercase;
}
.hero-strip .live{
  background:#cc0000;
  color:var(--paper);
  padding:3px 8px;
  font-weight:700;
  letter-spacing:1.4px;
  border-radius:1920px !important;  /* pill exception */
}
.hero-strip .src{margin-left:auto;color:#9a9a9a}

/* =========================================================
   OPENING STATEMENT
   ========================================================= */
.opening{
  padding:96px 0 72px;
}
.opening .lede{
  font-family:var(--display);
  font-size:clamp(34px,5vw,68px);
  line-height:1.12;
  letter-spacing:-0.6px;
  color:var(--ink-page);
  margin-bottom:36px;
  max-width:1100px;
}
.opening .lede .accent{font-style:italic;color:var(--ink-page)}
.opening-cols{
  display:grid;
  grid-template-columns:1fr 2fr;
  gap:64px;
  align-items:start;
  margin-top:40px;
  padding-top:36px;
  border-top:1px solid var(--ink-black);
}
.opening-cols .meta{
  font-family:var(--mono);
  font-size:11px;
  letter-spacing:1.1px;
  text-transform:uppercase;
  color:var(--caption);
  line-height:2;
}
.opening-cols .meta b{color:var(--ink-page);font-weight:700;display:block;margin-bottom:8px}
.opening-cols .body{
  font-size:18px;
  line-height:1.72;
  letter-spacing:0.05px;
}
.opening-cols .body p+p{margin-top:1em}
@media (max-width:899px){
  .opening{padding:64px 0 48px}
  .opening-cols{grid-template-columns:1fr;gap:32px}
}

/* =========================================================
   ABOUT — two-column editorial
   ========================================================= */
.about{padding:80px 0}
.about-grid{
  display:grid;
  grid-template-columns:5fr 7fr;
  gap:64px;
  align-items:start;
}
.about-grid .left .display-jp{
  font-size:clamp(36px,4.6vw,64px);
  line-height:1.08;
  letter-spacing:-0.5px;
}
.about-grid .left .latin-title{
  font-family:var(--display);
  font-style:italic;
  font-size:clamp(22px,2.4vw,32px);
  line-height:1.2;
  color:var(--caption);
  margin-top:18px;
  letter-spacing:-0.2px;
}
.about-grid .right .body{font-size:17px;line-height:1.72}
.about-pull{
  font-family:var(--display);
  font-style:italic;
  font-size:clamp(22px,2.4vw,30px);
  line-height:1.35;
  color:var(--ink-page);
  border-left:2px solid var(--ink-black);
  padding-left:24px;
  margin:32px 0;
}
@media (max-width:899px){
  .about-grid{grid-template-columns:1fr;gap:32px}
}

/* =========================================================
   WHAT WE DO — 3 columns with vertical hairlines
   ========================================================= */
.threecol{
  display:grid;
  grid-template-columns:repeat(3,1fr);
  border-top:1px solid var(--ink-black);
}
.threecol > .col{
  padding:32px 24px 32px 0;
  border-right:1px solid var(--hairline);
}
.threecol > .col:last-child{border-right:0;padding-right:0}
.threecol > .col:not(:first-child){padding-left:24px}
.col .num{
  font-family:var(--display);
  font-size:48px;
  line-height:1;
  color:var(--ink-page);
  margin-bottom:14px;
  letter-spacing:-1px;
}
.col h3{
  font-family:var(--display);
  font-size:28px;
  line-height:1.15;
  letter-spacing:-0.4px;
  margin:8px 0 14px;
}
.col .body{font-size:15.5px;line-height:1.66;color:var(--ink-page)}
@media (max-width:899px){
  .threecol{grid-template-columns:1fr}
  .threecol > .col{border-right:0;border-bottom:1px solid var(--hairline);padding:28px 0}
  .threecol > .col:last-child{border-bottom:0}
  .threecol > .col:not(:first-child){padding-left:0}
}

/* =========================================================
   RECORDINGS — left column = song list, right column = thumbnail
   stage (loops a sample video). Hovering a song swaps the stage
   to that song's thumbnail. The play button on the stage opens
   the YouTube modal player for the currently selected song.
   ========================================================= */
.rec-grid{
  display:grid;
  grid-template-columns:1fr 1fr;
  gap:48px;
  align-items:start;
}
.rec-list{
  display:flex;
  flex-direction:column;
  border-top:1px solid var(--ink-black);
}
.rec-item{
  display:grid;
  grid-template-columns:80px 1fr;
  gap:24px;
  align-items:start;
  padding:24px 0;
  border:0;
  border-bottom:1px solid var(--hairline);
  background:transparent;
  text-align:left;
  font:inherit;
  color:inherit;
  cursor:pointer;
  width:100%;
  transition:background 120ms linear;
}
.rec-item:last-child{border-bottom:1px solid var(--ink-black)}
.rec-item.is-active{background:rgba(0,0,0,0.04)}
.rec-item .num{
  font-family:var(--display);
  font-size:48px;
  line-height:0.9;
  color:var(--ink-page);
  letter-spacing:-1.2px;
}
.rec-item .meta{
  font-family:var(--mono);
  font-size:11px;
  letter-spacing:1.1px;
  text-transform:uppercase;
  color:var(--caption);
  margin-bottom:8px;
}
.rec-item h3{
  font-family:var(--display);
  font-size:clamp(20px,2vw,26px);
  line-height:1.18;
  letter-spacing:-0.4px;
  margin:0 0 6px;
  transition:color 150ms linear;
}
.rec-item:hover h3,
.rec-item.is-active h3{color:var(--link-blue)}
.rec-item .sub{
  font-family:var(--body);
  font-size:14px;
  color:var(--caption);
  font-style:italic;
}

/* Right-column thumbnail stage. Sticky so it follows the user's eye
   as they scan the list. */
.rec-stage{
  position:sticky;
  top:80px;
  width:100%;
  aspect-ratio:16/9;
  background:#000;
  overflow:hidden;
}
.rec-stage-video{
  position:absolute;
  inset:0;
  width:100%;
  height:100%;
  object-fit:cover;
  display:block;
}
.rec-stage-play{
  position:absolute;
  top:50%;
  left:50%;
  transform:translate(-50%,-50%);
  width:80px;
  height:80px;
  border-radius:50% !important;
  background:rgba(0,0,0,0.65);
  border:2px solid var(--paper);
  cursor:pointer;
  display:flex;
  align-items:center;
  justify-content:center;
  padding:0;
  transition:background 150ms linear,transform 150ms linear;
}
.rec-stage-play:hover{
  background:var(--link-blue);
  transform:translate(-50%,-50%) scale(1.06);
}
.rec-stage-play .triangle{
  width:0;
  height:0;
  border-style:solid;
  border-width:14px 0 14px 22px;
  border-color:transparent transparent transparent var(--paper);
  margin-left:5px;
}

@media (max-width:899px){
  .rec-grid{grid-template-columns:1fr;gap:24px}
  .rec-stage{position:relative;top:auto}
}
@media (max-width:767px){
  .rec-item{grid-template-columns:48px 1fr;gap:14px;padding:18px 0}
  .rec-item .num{font-size:32px}
}

/* =========================================================
   Poster + program-notes panel below the sticky thumbnail.
   - JS sets position:fixed and computes top/left/width/height
     each frame so the panel fills the gap between the bottom of
     the sticky stage and min(viewport bottom, section bottom).
   - As the user scrolls and the section bottom approaches the
     stage bottom, the panel shrinks. JS toggles .is-hidden on
     the poster and adjusts text font-size and -webkit-line-clamp
     so the description gracefully degrades.
   - Disabled on mobile (single-column rec-grid).
   ========================================================= */
.rec-info{
  display:flex;
  gap:20px;
  background:var(--paper);
  z-index:1;
  overflow:hidden;
  pointer-events:none;
}
.rec-info[hidden]{display:none}
.rec-info-poster{
  flex:0 0 auto;
  height:100%;
  display:flex;
  align-items:flex-start;
  overflow:hidden;
}
.rec-info-poster.is-hidden{display:none}
.rec-info-poster-img{
  height:100%;
  width:auto;
  object-fit:contain;
  display:block;
  background:#f4f4f4;
  border:1px solid var(--hairline);
}
.rec-info-text{
  flex:1 1 0;
  min-width:0;
  display:flex;
  flex-direction:column;
  overflow:hidden;
  color:var(--ink-page);
}
.rec-info-text-title{
  font-family:var(--mono);
  font-size:10px;
  letter-spacing:1.4px;
  text-transform:uppercase;
  color:var(--caption);
  margin:0 0 8px;
  flex:0 0 auto;
  white-space:nowrap;
  overflow:hidden;
  text-overflow:ellipsis;
}
.rec-info-text-body{
  margin:0;
  flex:1 1 0;
  min-height:0;
  overflow:hidden;
  font-family:var(--body);
  font-size:14px;
  line-height:1.55;
  color:var(--ink-page);
  /* JS truncates text content with "…" using measured scrollHeight
     so a partial line never bleeds past the bottom edge. */
}
@media (max-width:899px){
  .rec-info{display:none !important}
}

/* =========================================================
   YouTube modal player
   ========================================================= */
.yt-modal[hidden]{display:none}
.yt-modal{
  position:fixed;
  inset:0;
  z-index:9999;
  background:rgba(0,0,0,0.92);
  display:flex;
  align-items:center;
  justify-content:center;
  padding:40px;
  animation:ytFadeIn 180ms ease-out;
}
@keyframes ytFadeIn{from{opacity:0}to{opacity:1}}
.yt-modal-close{
  position:absolute;
  top:16px;
  right:20px;
  width:48px;
  height:48px;
  background:transparent;
  color:var(--paper);
  border:0;
  font-size:34px;
  line-height:1;
  cursor:pointer;
  z-index:1;
  display:flex;
  align-items:center;
  justify-content:center;
  transition:color 120ms linear;
}
.yt-modal-close:hover{color:var(--link-blue)}
.yt-modal-content{
  width:100%;
  max-width:1280px;
  aspect-ratio:16/9;
  background:#000;
}
.yt-modal-frame{
  width:100%;
  height:100%;
  border:0;
  display:block;
}
@media (max-width:767px){
  .yt-modal{padding:60px 16px 16px}
}

/* =========================================================
   CONCERTS / FEATURE — left/right with thick black rule
   ========================================================= */
.feature{
  display:grid;
  grid-template-columns:5fr 7fr;
  gap:48px;
  border-top:2px solid var(--ink-black);
  /* No bottom border — the next sibling (performers grid or
     the next .feature edition) provides its own top border so
     this block flows seamlessly into what follows. */
  padding:56px 0;
  align-items:center;
}
.feature .meta-box{
  border:2px solid var(--ink-black);
  padding:28px 24px;
  background:var(--paper);
}
.feature .meta-box .row{
  display:flex;
  justify-content:space-between;
  align-items:baseline;
  gap:20px;
  padding:14px 0;
  border-bottom:1px solid var(--hairline);
}
.feature .meta-box .row:last-child{border-bottom:0;padding-bottom:0}
.feature .meta-box .row:first-child{padding-top:0}
.feature .meta-box .label{
  font-family:var(--mono);
  font-size:11px;
  letter-spacing:1.2px;
  text-transform:uppercase;
  color:var(--caption);
}
.feature .meta-box .value{
  font-family:var(--display);
  font-size:18px;
  font-weight:500;
  color:var(--ink-page);
  text-align:right;
}
.feature .meta-box .value-jp{font-size:15px;font-weight:400}
.feature .right .display-jp{
  font-size:clamp(36px,4.6vw,58px);
  line-height:1.1;
  letter-spacing:-0.5px;
  margin-bottom:18px;
}
.feature .right .deck{
  font-style:italic;
  margin-bottom:24px;
  max-width:38ch;
}
.feature .right .body{font-size:16px;line-height:1.72;margin-bottom:28px}
.feature .right .actions{display:flex;gap:12px;flex-wrap:wrap}
@media (max-width:899px){
  .feature{grid-template-columns:1fr;gap:32px;padding:36px 0}
}

/* Programme list inside the .right column of .feature */
.programme{
  border-top:1px solid var(--ink-black);
  border-bottom:1px solid var(--ink-black);
  margin:0 0 28px;
  padding:18px 0 12px;
}
.programme-title{
  font-family:var(--mono);
  font-size:11px;
  letter-spacing:1.6px;
  text-transform:uppercase;
  color:var(--caption);
  margin-bottom:10px;
}
.programme-row{
  display:grid;
  grid-template-columns:64px 1fr auto;
  gap:14px;
  align-items:baseline;
  padding:10px 0;
  border-bottom:1px solid var(--hairline);
}
.programme-row:last-child{border-bottom:0}
.programme-time{
  font-family:var(--mono);
  font-size:13px;
  letter-spacing:1px;
  color:var(--ink-black);
}
.programme-work{
  font-family:var(--body);
  font-size:17px;
  line-height:1.4;
  color:var(--ink-black);
}
.programme-composer{
  font-family:var(--body);
  font-size:13px;
  font-style:italic;
  color:var(--caption);
  white-space:nowrap;
}
.programme-row--break{
  border-bottom:1px solid var(--hairline);
}
.programme-break{
  text-align:center;
  font-family:var(--mono);
  font-size:11px;
  letter-spacing:2px;
  text-transform:uppercase;
  color:var(--caption);
}

/* =========================================================
   PERFORMERS — grid of player photos + bios for the Vol.01
   festival. Lives inside section J (現代音楽祭), separate from
   the .feature block above.
   ========================================================= */
.performers{
  margin-top:8px;
  padding-top:0;
  /* No top border — the Vol.01 feature block above visually
     extends straight into this performer list. */
}
.performers-head{
  display:grid;
  grid-template-columns:5fr 7fr;
  gap:48px;
  margin-bottom:36px;
  align-items:end;
}
.performers-head h3{
  font-family:var(--body);
  font-size:clamp(28px,3.4vw,42px);
  line-height:1.1;
  letter-spacing:-0.4px;
  margin:14px 0 0;
}
.performers-head p{
  font-size:15px;
  line-height:1.7;
  color:var(--caption);
  margin:0;
  max-width:62ch;
}

/* Player grid — 3 cols on desktop, 2 on tablet, 1 on phone.
   Each card is laid out HORIZONTALLY: small photo on the left,
   bio text on the right. The photo is reduced so the bio
   dominates the card. */
.players-grid{
  display:grid;
  grid-template-columns:repeat(3,1fr);
  gap:36px 32px;
}
@media (max-width:1023px){
  .players-grid{grid-template-columns:repeat(2,1fr);gap:32px}
}
@media (max-width:639px){
  .players-grid{grid-template-columns:1fr;gap:28px}
}

.player-card{
  display:grid;
  grid-template-columns:140px 1fr;
  gap:18px;
  align-items:start;
}
@media (max-width:480px){
  .player-card{grid-template-columns:96px 1fr;gap:14px}
}

.player-card .photo{
  aspect-ratio:3/4;
  width:100%;
  background:#1a1a1a;
  overflow:hidden;
  position:relative;
}
.player-card .photo img{
  width:100%; height:100%;
  object-fit:cover;
  display:block;
}
.player-card .photo--placeholder{
  display:flex;
  align-items:center;
  justify-content:center;
  background:#1a1a1a;
  color:rgba(255,255,255,0.28);
  font-family:var(--display,Georgia);
  font-size:32px;
  letter-spacing:-1px;
}
.player-card .text{
  display:flex;
  flex-direction:column;
  min-width:0;
}
.player-card .inst{
  font-family:var(--mono);
  font-size:10px;
  letter-spacing:1.6px;
  text-transform:uppercase;
  color:var(--caption);
  margin:0 0 4px;
}
.player-card .inst--lead{color:var(--ink-black);font-weight:700}
.player-card .name{
  font-family:var(--body);
  font-size:17px;
  font-weight:600;
  letter-spacing:-0.1px;
  margin:0 0 8px;
}
.player-card .bio{
  font-family:var(--body);
  font-size:12.5px;
  line-height:1.6;
  color:var(--caption);
  margin:0;
}

@media (max-width:899px){
  .performers-head{grid-template-columns:1fr;gap:18px}
}

/* =========================================================
   COMPOSERS — between F (statement) and G (about). 4-card grid
   with stacked-portrait layout: square photo on top, role/name/
   bio underneath. Differs from .player-card (which puts photo
   beside text) so the composer profiles read as primary
   editorial subjects rather than ensemble-list entries.
   ========================================================= */
.composers{padding:88px 0 104px}
.composers-head{
  display:grid;
  grid-template-columns:5fr 7fr;
  gap:48px;
  margin-bottom:48px;
  align-items:end;
}
.composers-head h2{
  font-family:var(--body);
  font-size:clamp(28px,3.4vw,42px);
  line-height:1.1;
  letter-spacing:-0.4px;
  margin:14px 0 0;
}
.composers-head p{
  font-size:16px;
  line-height:1.7;
  color:var(--caption);
  margin:0;
  max-width:62ch;
}
@media (max-width:899px){
  .composers-head{grid-template-columns:1fr;gap:18px}
}
.composers-grid{
  display:grid;
  grid-template-columns:repeat(4,1fr);
  gap:36px 28px;
}
@media (max-width:1099px){
  .composers-grid{grid-template-columns:repeat(2,1fr);gap:36px 32px}
}
@media (max-width:559px){
  .composers-grid{grid-template-columns:1fr;gap:32px}
}
.composer-card{
  display:flex;
  flex-direction:column;
  gap:14px;
}
.composer-card .photo{
  aspect-ratio:3/4;       /* portrait — matches the source images
                             which the user has already trimmed to
                             aligned 3:4 portraits. Square crop would
                             re-crop and break the head alignment. */
  width:100%;
  background:#1a1a1a;
  overflow:hidden;
  position:relative;
}
.composer-card .photo img{
  width:100%; height:100%;
  object-fit:cover;       /* CSS-side trim; no need to pre-crop the
                             source images. */
  display:block;
}
.composer-card .role{
  font-family:var(--mono);
  font-size:10px;
  letter-spacing:1.6px;
  text-transform:uppercase;
  color:var(--caption);
  margin:0;
}
.composer-card .name{
  font-family:var(--body);
  font-size:18px;
  font-weight:600;
  letter-spacing:-0.1px;
  margin:0;
}
.composer-card .name-en{
  font-family:var(--mono);
  font-size:11px;
  letter-spacing:1.2px;
  color:var(--caption);
  margin:0;
}
.composer-card .bio{
  font-family:var(--body);
  font-size:13px;
  line-height:1.65;
  color:var(--ink-page);
  margin:6px 0 0;
}

/* =========================================================
   HISTORY / TIMELINE
   ========================================================= */

/* K (History) — Variant A pinned scroll-video.
   Wraps the K ribbon + section--history in a pinwrap. The full-width
   black ribbon and the right-60% white panel sit ON TOP as foreground;
   the LEFT 40% transparent area shows the pinned bg video through.
   currentTime is scrubbed by scroll progress through the wrap. */
.k-pinwrap{
  position:relative;
  isolation:isolate;            /* contain the fixed bg's z-index */
}
.k-pinwrap-bg{
  position:fixed;
  top:0; left:0;
  width:100vw; height:100vh;
  z-index:0;
  overflow:hidden;
  pointer-events:none;
  visibility:hidden;            /* JS toggles via .is-active */
}
.k-pinwrap-bg.is-active{visibility:visible}
.k-pinwrap-video{
  position:absolute; inset:0;
  width:100%; height:100%;
  object-fit:cover;
  display:block;
  background:#000;
}
.k-pinwrap-content{
  position:relative;
  z-index:1;                    /* above the pinned bg */
}

/* Section K layout — the content panel sits in the RIGHT 60% of
   the viewport, leaving the LEFT 40% as transparent empty space.
   The full-width black ribbon above is unaffected.
   Selector uses `section.section--history` (specificity 0,0,1,1) so
   it beats the global `.section--tight { background: var(--paper) }`
   rule defined later in the stylesheet. */
section.section--history{
  background:transparent;
  padding:0;                    /* padding handled inside the panel */
}
.history-panel{
  /* Layout container only — no background. The two inner blocks
     (header block transparent, timeline block white) supply their
     own backgrounds. */
  width:60%;
  margin-left:40%;
  padding:0;
}
.history-header-block{
  background:transparent;
  padding:64px 0 32px;
}
/* Big editorial "History" wordmark sitting on the transparent
   header block. White over the muse_dance video bg.
   Roman (no italic), no text-shadow per spec. */
.history-mega{
  font-family:'Cormorant Garamond','Noto Serif JP',Georgia,serif;
  font-style:normal;
  font-weight:400;
  font-size:clamp(72px,10vw,160px);
  line-height:0.95;
  letter-spacing:-3px;
  color:#fff;
  margin:0 0 28px;
}
@media (max-width:899px){
  .history-mega{
    font-size:clamp(56px,12vw,96px);
    letter-spacing:-1.6px;
    margin:0 0 18px;
  }
}

/* The kicker + heading + intro paragraph in the K header block
   sit over the dark video bg, so they need to be white. */
.history-header-block .kicker{color:#fff}
.history-header-block .display-jp{color:#fff}
.history-header-block .body{color:#fff}
.history-timeline-block{
  background:var(--paper);
  /* No top padding: the white panel's top edge sits where the
     timeline's old black border-top used to be. */
  padding:0 0 64px;
}
.history-panel .wrap{
  /* The panel is already 60% wide and right-positioned; reset .wrap's
     max-width / margin so its content fills the panel. Horizontal
     padding from .wrap (var(--pad-x)) is preserved as the inner gutter. */
  max-width:none;
  margin:0;
}
@media (max-width:899px){
  /* On small screens, drop the 60% inset — full width keeps the
     timeline readable and the heading/intro from cramping. */
  .history-panel{
    width:100%;
    margin-left:0;
  }
  .history-header-block{padding:48px 0 24px}
  .history-timeline-block{padding:0 0 48px}
}

.timeline{
  /* Top border removed per spec — the white panel's top edge
     replaces the old line. Bottom hairline kept. */
  border-bottom:1px solid var(--ink-black);
}
.t-row{
  display:grid;
  /* year (left) | event title + meta + grant stack (right) */
  grid-template-columns:110px 1fr;
  gap:40px;
  align-items:baseline;
  padding:24px 0;
  border-bottom:1px solid var(--hairline);
}
.t-row:last-child{border-bottom:0}
/* Year column — back to plain text, no inner wrappers needed. */
.t-year{
  font-family:var(--display);
  font-size:clamp(36px,4vw,56px);
  line-height:1;
  letter-spacing:-1px;
  color:var(--ink-page);
}

.t-event{
  font-family:var(--display);
  font-size:clamp(20px,2vw,26px);
  line-height:1.25;
  letter-spacing:-0.3px;
  color:var(--ink-page);
}
/* "Date  Venue" line stacked under the event title.
   Multi-date rows simply repeat .t-meta-line. */
.t-event .t-meta-line{
  display:flex;
  gap:12px;
  align-items:baseline;
  margin-top:14px;
  font-family:var(--mono);
  font-size:12px;
  font-weight:400;
  letter-spacing:1.3px;
  text-transform:uppercase;
  color:var(--caption);
  line-height:1.45;
}
.t-event .t-meta-line + .t-meta-line{margin-top:4px}
.t-event .t-meta-date{
  color:var(--ink-page);
  min-width:46px;
  flex-shrink:0;
}
.t-event .t-meta-venue{flex:1 1 auto}

/* Grant / programme adoption note. Sits after meta lines. */
.t-grant{
  display:block;
  margin-top:14px;
  font-family:var(--mono);
  font-size:11px;
  letter-spacing:1.2px;
  text-transform:uppercase;
  color:var(--caption);
}
@media (max-width:767px){
  .t-row{grid-template-columns:90px 1fr;gap:18px}
  .t-year{font-size:30px}
  .t-event{font-size:17px}
}

/* =========================================================
   ARTISTS — 4 column kicker grid
   ========================================================= */
.fourcol{
  display:grid;
  grid-template-columns:repeat(4,1fr);
  border-top:1px solid var(--ink-black);
}
.fourcol > .cell{
  padding:32px 20px 32px 0;
  border-right:1px solid var(--hairline);
}
.fourcol > .cell:last-child{border-right:0}
.fourcol > .cell:not(:first-child){padding-left:20px}
.fourcol .cell .role{
  font-family:var(--mono);
  font-size:11px;
  letter-spacing:1.2px;
  text-transform:uppercase;
  color:var(--ink-page);
  font-weight:700;
  display:flex;
  align-items:center;
  gap:8px;
  margin-bottom:14px;
}
.fourcol .cell .role::before{
  content:"";
  width:8px;height:8px;
  background:var(--ink-black);
  display:inline-block;
}
.fourcol .cell h3{
  font-family:var(--display);
  font-size:clamp(20px,2vw,26px);
  line-height:1.15;
  letter-spacing:-0.3px;
  margin:0 0 12px;
}
.fourcol .cell .body{font-size:14.5px;line-height:1.6}
@media (max-width:1023px){
  .fourcol{grid-template-columns:repeat(2,1fr)}
  .fourcol > .cell:nth-child(2){border-right:0}
  .fourcol > .cell:nth-child(1),.fourcol > .cell:nth-child(2){border-bottom:1px solid var(--hairline)}
}
@media (max-width:599px){
  .fourcol{grid-template-columns:1fr}
  .fourcol > .cell{border-right:0;border-bottom:1px solid var(--hairline);padding:24px 0}
  .fourcol > .cell:last-child{border-bottom:0}
  .fourcol > .cell:not(:first-child){padding-left:0}
}

/* —— LEAD CALLED-OUT NAME LIST —— */
.lead-list{
  margin-top:40px;
  border-top:1px solid var(--hairline);
  padding-top:24px;
  display:grid;
  grid-template-columns:repeat(4,1fr);
  gap:24px;
}
.lead-list .role{
  font-family:var(--mono);
  font-size:11px;
  letter-spacing:1.2px;
  text-transform:uppercase;
  color:var(--caption);
  margin-bottom:6px;
}
.lead-list .name{
  font-family:var(--display);
  font-size:20px;
  letter-spacing:-0.3px;
  color:var(--ink-page);
}
@media (max-width:899px){.lead-list{grid-template-columns:repeat(2,1fr);gap:20px}}
@media (max-width:559px){.lead-list{grid-template-columns:1fr;gap:18px}}

/* =========================================================
   CRITICISM — 2x2
   ========================================================= */
.twobytwo{
  display:grid;
  grid-template-columns:1fr 1fr;
  border-top:1px solid var(--ink-black);
  border-left:1px solid var(--hairline);
}
.twobytwo > .cell{
  padding:32px;
  border-right:1px solid var(--hairline);
  border-bottom:1px solid var(--hairline);
  position:relative;
}
.twobytwo > .cell:nth-child(2n){border-right:0}
.twobytwo > .cell:nth-last-child(-n+2){border-bottom:0}
.twobytwo .cell .num{
  font-family:var(--display);
  font-size:48px;
  line-height:1;
  letter-spacing:-1px;
  color:var(--caption);
  position:absolute;
  top:24px;
  right:24px;
  font-style:italic;
}
.twobytwo .cell h3{
  font-family:var(--display);
  font-size:clamp(22px,2vw,28px);
  line-height:1.18;
  letter-spacing:-0.3px;
  margin:0 0 12px;
  max-width:80%;
}
.twobytwo .cell .role{
  font-family:var(--mono);
  font-size:11px;
  letter-spacing:1.2px;
  text-transform:uppercase;
  color:var(--ink-page);
  margin-bottom:14px;
}
.twobytwo .cell .body{font-size:15px;line-height:1.65}
@media (max-width:767px){
  .twobytwo{grid-template-columns:1fr;border-left:0}
  .twobytwo > .cell{border-right:0;padding:24px 0}
  .twobytwo > .cell:nth-last-child(-n+2){border-bottom:1px solid var(--hairline)}
  .twobytwo > .cell:last-child{border-bottom:0}
}

/* =========================================================
   INTERNATIONAL — inverted block
   ========================================================= */
.inverted{
  background:var(--ink-page);
  color:var(--paper);
}
.inverted .kicker{color:#bcbcbc}
.inverted h2,.inverted h3,.inverted .display-jp,
.inverted .display-l,.inverted .display-xl{color:var(--paper)}
.inverted .body{color:#dcdcdc}
.inverted .caption{color:#9a9a9a}
.inverted .divider--soft{background:#2a2a2a}
.inverted a.inline-link{color:var(--paper);border-bottom-color:#666}
.inverted a.inline-link:hover{color:var(--link-blue)}

.intl-grid{
  display:grid;
  grid-template-columns:6fr 5fr;
  gap:48px;
  align-items:start;
}
/* When the right-side English aside is removed, the left column
   spans the full row instead of leaving a 5fr empty gutter. */
.intl-grid--single{grid-template-columns:1fr}
.intl-grid .left .display-jp{
  font-size:clamp(34px,4.4vw,56px);
  line-height:1.1;
  letter-spacing:-0.4px;
  margin-bottom:14px;
}
.intl-grid .left .display-en{
  font-family:var(--display);
  font-style:italic;
  font-size:clamp(22px,2.2vw,30px);
  line-height:1.2;
  color:#bcbcbc;
  margin-bottom:32px;
  letter-spacing:-0.2px;
}
.intl-grid .right{padding-left:48px;border-left:1px solid #2a2a2a}
.intl-grid .right .english-label{
  font-family:var(--mono);
  font-size:11px;
  letter-spacing:1.4px;
  text-transform:uppercase;
  color:#9a9a9a;
  margin-bottom:14px;
}
.intl-grid .right .english-body{
  font-family:var(--body);
  font-style:italic;
  font-size:17px;
  line-height:1.6;
  color:var(--paper);
}
@media (max-width:899px){
  .intl-grid{grid-template-columns:1fr;gap:32px}
  .intl-grid .right{padding-left:0;border-left:0;border-top:1px solid #2a2a2a;padding-top:32px}
}

/* =========================================================
   ARTS × INDUSTRY — wide editorial
   ========================================================= */
.industry{padding:80px 0}
.industry .display-jp{
  font-size:clamp(36px,4.6vw,60px);
  line-height:1.1;
  letter-spacing:-0.5px;
  margin-bottom:32px;
  max-width:18ch;
}
.industry-cols{
  display:grid;
  grid-template-columns:1fr 1fr;
  gap:64px;
}
.industry-cols .body{font-size:17px;line-height:1.74}
@media (max-width:899px){.industry-cols{grid-template-columns:1fr;gap:24px}}

.industry-tag{
  margin-top:48px;
  border-top:1px solid var(--ink-black);
  padding-top:24px;
  font-family:var(--display);
  font-style:italic;
  font-size:clamp(20px,2.2vw,26px);
  line-height:1.4;
  color:var(--ink-page);
  max-width:60ch;
}

/* =========================================================
   SUPPORT — CTA grid
   ========================================================= */
.support{padding:96px 0}
.support .deck{margin-bottom:36px;max-width:60ch}
.support-cta{
  display:grid;
  grid-template-columns:repeat(4,1fr);
  border-top:2px solid var(--ink-black);
  border-bottom:2px solid var(--ink-black);
}
.support-cta .cell{
  padding:32px 20px;
  border-right:1px solid var(--hairline);
  display:flex;
  flex-direction:column;
  justify-content:space-between;
  min-height:200px;
  cursor:pointer;
  transition:background 150ms linear,color 150ms linear;
}
.support-cta .cell:last-child{border-right:0}
.support-cta .cell:hover{background:var(--ink-black);color:var(--paper)}
.support-cta .cell:hover h3,
.support-cta .cell:hover .sub,
.support-cta .cell:hover .arrow,
.support-cta .cell:hover .index{color:var(--paper)}
.support-cta .index{
  font-family:var(--mono);
  font-size:11px;
  letter-spacing:1.2px;
  text-transform:uppercase;
  color:var(--caption);
  margin-bottom:16px;
}
.support-cta h3{
  font-family:var(--display);
  font-size:clamp(20px,2vw,26px);
  line-height:1.18;
  letter-spacing:-0.3px;
  margin:0 0 8px;
}
.support-cta .sub{
  font-family:var(--body);
  font-style:italic;
  font-size:14px;
  color:var(--caption);
  margin-bottom:24px;
}
.support-cta .arrow{
  font-family:var(--mono);
  font-size:11px;
  letter-spacing:1.2px;
  text-transform:uppercase;
  color:var(--ink-page);
  display:inline-flex;
  align-items:center;
  gap:8px;
}
@media (max-width:899px){
  .support-cta{grid-template-columns:1fr 1fr}
  .support-cta .cell:nth-child(2){border-right:0}
  .support-cta .cell:nth-child(1),.support-cta .cell:nth-child(2){border-bottom:1px solid var(--hairline)}
}
@media (max-width:599px){
  .support-cta{grid-template-columns:1fr}
  .support-cta .cell{border-right:0;border-bottom:1px solid var(--hairline);min-height:0}
  .support-cta .cell:last-child{border-bottom:0}
}

/* =========================================================
   CONTACT
   ========================================================= */
.contact{padding:80px 0}
.contact-grid{
  display:grid;
  grid-template-columns:5fr 7fr;
  gap:48px;
  align-items:start;
}
.contact-list{border-top:1px solid var(--ink-black);margin-top:32px}
.contact-row{
  display:grid;
  grid-template-columns:140px 1fr auto;
  gap:24px;
  align-items:center;
  padding:20px 0;
  border-bottom:1px solid var(--hairline);
  cursor:pointer;
  transition:padding 150ms linear;
}
.contact-row:hover{padding-left:8px}
.contact-row:hover .channel-name{color:var(--link-blue)}
.contact-row .channel-label{
  font-family:var(--mono);
  font-size:11px;
  letter-spacing:1.2px;
  text-transform:uppercase;
  color:var(--caption);
}
.contact-row .channel-name{
  font-family:var(--display);
  font-size:20px;
  letter-spacing:-0.2px;
  color:var(--ink-page);
  transition:color 120ms linear;
}
.contact-row .channel-arrow{
  font-family:var(--mono);
  font-size:11px;
  letter-spacing:1.2px;
  color:var(--caption);
}
@media (max-width:767px){
  .contact-grid{grid-template-columns:1fr;gap:24px}
  .contact-row{grid-template-columns:100px 1fr 24px;gap:16px}
  .contact-row .channel-name{font-size:16px}
}

/* =========================================================
   CONTACT FORM (Formspree-backed)
   Visual style matches the editorial wired aesthetic — mono
   uppercase labels, single hairline underline inputs, no
   chrome. Status messages live in a polite live region.
   ========================================================= */
.contact-form{
  margin-top:48px;
  padding-top:32px;
  border-top:1px solid var(--ink-black);
  display:flex;
  flex-direction:column;
  gap:20px;
}
.contact-form__title{
  font-family:var(--display, Georgia, serif);
  font-size:22px;
  font-weight:600;
  margin:0 0 4px;
  color:var(--ink-page, #111);
  letter-spacing:0.02em;
}
.contact-form__honeypot{
  position:absolute;
  left:-9999px;
  width:1px; height:1px;
  overflow:hidden;
}
.contact-form__field{
  display:flex;
  flex-direction:column;
  gap:6px;
}
.contact-form__field label{
  font-family:var(--mono);
  font-size:11px;
  letter-spacing:1.4px;
  text-transform:uppercase;
  color:var(--caption);
}
.contact-form__field .req{color:var(--link-blue, #1a4eff)}
.contact-form__field input,
.contact-form__field textarea,
.contact-form__field select{
  width:100%;
  border:1px solid rgba(0,0,0,0.45);
  background:var(--paper, #fff);
  padding:10px 12px;
  font-family:var(--body, Georgia, serif);
  font-size:16px;
  line-height:1.55;
  color:var(--ink-page, #111);
  border-radius:2px;
  outline:none;
  transition:border-color 120ms ease, box-shadow 120ms ease;
}
.contact-form__field input:hover,
.contact-form__field textarea:hover,
.contact-form__field select:hover{
  border-color:var(--ink-black);
}
.contact-form__field input:focus,
.contact-form__field textarea:focus,
.contact-form__field select:focus{
  border-color:var(--link-blue, #1a4eff);
  box-shadow:0 0 0 1px var(--link-blue, #1a4eff);
}
/* :user-invalid only flags fields the user has actually interacted
   with (after blur or submit attempt). Avoids painting required-but-
   empty fields red on first paint. */
.contact-form__field input:user-invalid,
.contact-form__field textarea:user-invalid,
.contact-form__field select:user-invalid{
  border-color:#c0392b;
}
/* Custom dropdown caret since `appearance: none` is needed to make
   the select share the same border + radius as text inputs across
   browsers. SVG chevron, sized small, right-aligned. */
.contact-form__field select{
  -webkit-appearance:none;
  -moz-appearance:none;
  appearance:none;
  padding-right:36px;
  background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' fill='none' stroke='%23222' stroke-width='1.6'/%3E%3C/svg%3E");
  background-repeat:no-repeat;
  background-position:right 12px center;
  background-size:12px 8px;
  cursor:pointer;
}
.contact-form__field select:invalid,
.contact-form__field select option[value=""]{
  color:var(--caption, #666);
}
.contact-form__field select option{
  color:var(--ink-page, #111);
}
.contact-form__field textarea{
  resize:vertical;
  min-height:140px;
}
.contact-form__consent{
  display:flex;
  align-items:flex-start;
  gap:10px;
  font-family:var(--body, Georgia, serif);
  font-size:14px;
  line-height:1.5;
  color:var(--ink-page, #111);
}
.contact-form__consent input[type="checkbox"]{
  margin-top:4px;
  width:16px; height:16px;
  flex:0 0 auto;
  accent-color:var(--ink-black);
}
.contact-form__consent .req{color:var(--link-blue, #1a4eff)}
.contact-form__consent a{
  color:inherit;
  text-decoration:underline;
  text-underline-offset:2px;
}
.contact-form__actions{
  display:flex;
  align-items:center;
  gap:24px;
  flex-wrap:wrap;
}
.contact-form__actions button[type="submit"]{
  cursor:pointer;
  font-family:inherit;
}

/* Disabled state — gray bg with white text, no wait-cursor.
   Pairs with the tooltip wrap below to surface the reason
   when the user hovers a disabled submit button. */
.contact-form__submit-wrap{
  position:relative;
  display:inline-flex;
}
.contact-form__submit-wrap button[disabled]{
  background:#94a3b8;
  border-color:#94a3b8;
  color:var(--paper);
  cursor:not-allowed;
  opacity:1;
}
.contact-form__submit-wrap button[disabled]:hover{
  background:#94a3b8;
  color:var(--paper);
}

/* Hover tooltip — only shown when the button is disabled. The
   :has() selector keeps the tip CSS-only without a JS toggle.
   pointer-events:none on the tip lets the underlying button keep
   receiving the hover (disabled buttons still fire :hover on the
   parent in modern browsers). */
.contact-form__submit-wrap::before,
.contact-form__submit-wrap::after{
  pointer-events:none;
  opacity:0;
  transition:opacity 150ms ease;
}
.contact-form__submit-wrap::before{
  content:"個人情報保護方針をご確認ください";
  position:absolute;
  bottom:100%;
  left:50%;
  transform:translateX(-50%) translateY(-10px);
  background:var(--ink-black);
  color:var(--paper);
  padding:8px 14px;
  font-family:var(--mono);
  font-size:11px;
  letter-spacing:0.8px;
  white-space:nowrap;
  border-radius:3px;
  z-index:5;
}
.contact-form__submit-wrap::after{
  /* tooltip arrow */
  content:"";
  position:absolute;
  bottom:100%;
  left:50%;
  transform:translateX(-50%) translateY(-2px);
  border:6px solid transparent;
  border-top-color:var(--ink-black);
  z-index:5;
}
.contact-form__submit-wrap:has(button[disabled]):hover::before,
.contact-form__submit-wrap:has(button[disabled]):hover::after{
  opacity:1;
}
.contact-form__status{
  margin:0;
  font-family:var(--mono);
  font-size:12px;
  letter-spacing:0.6px;
  color:var(--caption);
}
.contact-form__status[data-state="success"]{color:var(--ink-page, #111)}
.contact-form__status[data-state="error"]{color:#c0392b}

/* =========================================================
   FOOTER
   ========================================================= */
.footer{
  background:var(--ink-black);
  color:var(--paper);
  padding:64px 0 32px;
  margin-top:0;
}
.footer-mark{
  font-family:var(--display);
  font-style:italic;
  font-size:clamp(36px,5vw,56px);
  line-height:1;
  letter-spacing:-0.5px;
  text-align:center;
  padding-bottom:32px;
  border-bottom:1px solid #2a2a2a;
  margin-bottom:32px;
}
.footer-cols{
  display:grid;
  grid-template-columns:repeat(4,1fr);
  gap:32px;
  padding-bottom:48px;
  border-bottom:1px solid #2a2a2a;
  margin-bottom:32px;
}
.footer-cols .col h4{
  font-family:var(--mono);
  font-size:11px;
  letter-spacing:1.4px;
  text-transform:uppercase;
  color:#9a9a9a;
  margin:0 0 14px;
  font-weight:700;
}
/* Sub-section heading inside a .col (used for Legal under Channels).
   Keeps the same h4 visual treatment but with a small top gap so it
   reads as a quiet sibling group rather than detached. */
.footer-cols .col h4.col-subhead{margin-top:24px}
.footer-cols .col a{
  display:block;
  font-family:var(--ui);
  font-size:13px;
  font-weight:500;
  color:var(--paper);
  padding:6px 0;
  letter-spacing:0.2px;
  transition:color 120ms linear;
}
.footer-cols .col a:hover{color:var(--link-blue)}
.footer-bottom{
  /* 3-column layout: credit (left) · copyright (center) · locale (right).
     CSS grid with explicit columns so the copyright stays centered
     even when the side cells differ in width. */
  display:grid;
  grid-template-columns:1fr auto 1fr;
  align-items:center;
  gap:16px;
  font-family:var(--mono);
  font-size:11px;
  letter-spacing:1.1px;
  text-transform:uppercase;
  color:#9a9a9a;
}
.footer-bottom .footer-credit{justify-self:start}
.footer-bottom .footer-copy{justify-self:center;text-align:center}
.footer-bottom .footer-locale{justify-self:end}
.footer-bottom a{color:#9a9a9a;text-decoration:none}
.footer-bottom a:hover{color:var(--paper)}
@media (max-width:767px){
  .footer-bottom{
    grid-template-columns:1fr;
    text-align:center;
    gap:12px;
  }
  .footer-bottom .footer-credit,
  .footer-bottom .footer-copy,
  .footer-bottom .footer-locale{justify-self:center}
  /* Mobile stacking order: copyright → locale → credit (bottom). */
  .footer-bottom .footer-copy{order:1}
  .footer-bottom .footer-locale{order:2}
  .footer-bottom .footer-credit{order:3}
}
@media (max-width:767px){
  .footer-cols{grid-template-columns:1fr 1fr;gap:24px}
}

/* =========================================================
   SECTION CHIPS  ·  DEVELOPMENT MARKERS (A–R)
   Small black squares in the top-right of each section, so
   modification instructions can be addressed by letter.
   ========================================================= */
/* NOTE: .utility-bar is intentionally excluded — it has its own position:sticky
   above, which already establishes a containing block for the absolute chip. */
.masthead,.primary-nav,.hero,.hero-strip,
.opening,.about,.section,.section--tight,.section--xtight,
.industry,.support,.contact,.footer,.ribbon,.inverted{position:relative}

/* Lift B (masthead) and F (statement) above the GHI fixed video layer.
   The .gh-video-wrap forms a stacking context (isolation:isolate) painted
   in layer 6 (positioned with z-index:auto) of the body's stacking context.
   B and F also land in layer 6 (position:relative + z-index:auto) and —
   being earlier in DOM order — paint BEFORE the wrap, so the wrap's
   contained position:fixed video covers them when active. Promoting B
   and F to z-index:1 puts them in layer 7 (positive z-index), above the
   wrap. The explicit background on #statement keeps the video from
   showing through (B already has background:var(--paper)). */
.masthead{ z-index:1 }
#statement{ z-index:1; background:var(--paper) }

/* Lift every major top-level section above the GHI play_10s.mp4 layer
   AND the I score_5s.mp4 layer. Both fixed video layers paint at z-index 0
   (or 0 inside their stacking context); these sections need positive
   z-index + an opaque background so they overlay the videos cleanly when
   either is active. Exceptions whose own bg should win (.scroll-video-section
   for L's cello video, .inverted for the black N block) keep their bg via
   later/equal-specificity rules; here we only force z-index. */
.section,
.section--tight,
.section--xtight,
.industry,
.support,
.contact,
.composers,
.footer,
.inverted{
  position:relative;
  z-index:1;
}
.section,
.section--tight,
.section--xtight,
.industry,
.support,
.contact,
.composers{
  background:var(--paper);
}

.section-chip{
  position:absolute;
  top:10px;
  right:10px;
  width:26px;
  height:26px;
  background:var(--ink-black);
  color:var(--paper);
  display:flex;
  align-items:center;
  justify-content:center;
  font-family:var(--mono);
  font-size:12px;
  font-weight:700;
  letter-spacing:0.4px;
  z-index:60;
  pointer-events:none;
  border:0 !important;
  border-radius:0 !important;
}
.section-chip--inv{
  background:var(--paper);
  color:var(--ink-black);
  outline:1px solid var(--ink-black);
  outline-offset:-1px;
}
.section-chip--bar{
  top:50%;
  transform:translateY(-50%);
  right:10px;
  width:22px;
  height:22px;
  font-size:11px;
}
@media print{.section-chip{display:none}}

/* =========================================================
   SCROLL-DRIVEN VIDEO  ·  scrubbable on scroll, with parallax
   - No sticky shrink-wrap; document scroll never stalls.
   - Progress is measured across viewport entry → viewport exit:
       progress = (innerHeight - rect.top) / (innerHeight + rect.height)
   - INSIDE parallax: the video element itself is rendered at 200%
     of its frame's height and translateY'd over a large range, so
     the visible crop of the video moves dramatically inside its
     frame as the user scrolls.
   ========================================================= */

/* =========================================================
   G + H  ·  COMBINED SCROLL-VIDEO BACKGROUND  (pinned)
   - Video layer is position:sticky 100vh — pinned to viewport
     while scrolling through G+H, then naturally released when
     H ends. I and later sections then scroll on top of it.
   - Video is full viewport width, full viewport height, no
     transform, no parallax — only its currentTime is tied
     to scroll progress over the GH wrap.
   - Progress: 0 when wrap.top reaches viewport.top
              1 when wrap.bottom reaches viewport.top
   ========================================================= */
.gh-video-wrap{
  position:relative;
  isolation:isolate;
  /* isolation creates a new stacking context. The fixed video layer
     inside is z-index:0 INSIDE the wrap's context — it never rises
     above sibling elements like B (masthead), F (statement), or any
     section after I. Those siblings stay above without per-element
     z-index hacks. */
}
/* Video layer is position:fixed at z-index:0. JS toggles .is-active
   to show/hide based on whether GHI is in scroll range. Surrounding
   sections (F, J onwards) are lifted above it via z-index:1 + relative. */
.gh-video-bg{
  position:fixed;
  top:0;
  left:0;
  width:100vw;
  height:100vh;
  z-index:0;
  overflow:hidden;
  pointer-events:none;
  visibility:hidden;
}
.gh-video-bg.is-active{visibility:visible}
.gh-video-bg video.gh-bg-video{
  position:absolute;
  inset:0;
  width:100%;
  height:100%;
  object-fit:cover;
  display:block;
  background:var(--ink-black);
}
.gh-video-bg .scroll-video-overlay{
  position:absolute;
  inset:0;
  background:rgba(0,0,0,0.30);
  pointer-events:none;
  z-index:1;
}

/* GHI content layer — sits on top of the fixed video */
.gh-content{
  position:relative;
  z-index:1;
}

/* Divider between G and H — visible on top of the video */
.gh-content > hr.divider{
  background:rgba(255,255,255,0.30);
  border:0;
  height:1px;
  margin:0;
  position:relative;
  z-index:3;
}

/* —— Text & rule whitening within G (#about) and H (#practice) —— */
.gh-content #about,
.gh-content #practice{
  background:transparent;
}
/* Inside the GH wrap, #about's top padding is removed so the
   sticky black ribbon sits flush against the very top of G. */
.gh-content #about{padding-top:0}
/* Full-bleed variant of the ribbon: spans the full viewport width
   regardless of any parent's max-width. */
.ribbon--full{
  width:100vw;
  margin-left:calc(50% - 50vw);
  margin-right:calc(50% - 50vw);
}

/* I (Recordings) lives inside .gh-content too. It keeps a solid
   white background so it visually slides up OVER the pinned video
   as the user scrolls. */
.gh-content #recordings,
.gh-content #recordings + .section--tight{
  background:var(--paper);
  position:relative;
}
.gh-content #recordings{position:relative;z-index:3}
.gh-content #about .display-jp,
.gh-content #about .display-l,
.gh-content #about .display-xl,
.gh-content #about .display-xxl,
.gh-content #about h1,
.gh-content #about h2,
.gh-content #about h3,
.gh-content #about .deck,
.gh-content #about .body,
.gh-content #about .latin-title,
.gh-content #about .about-pull,
.gh-content #practice .display-jp,
.gh-content #practice .display-l,
.gh-content #practice .display-xl,
.gh-content #practice h1,
.gh-content #practice h2,
.gh-content #practice h3,
.gh-content #practice .deck,
.gh-content #practice .body,
.gh-content #practice .col .num{
  color:var(--paper) !important;
}
.gh-content #about .latin-title{color:rgba(255,255,255,0.72) !important}
.gh-content #about .kicker,
.gh-content #about .kicker--bold,
.gh-content #practice .kicker,
.gh-content #practice .kicker--bold{
  color:var(--paper) !important;
}
.gh-content #about .ribbon{background:var(--ink-black)}
.gh-content #practice .eyebrow-rule::after{background:var(--paper)}
.gh-content #about .about-pull{border-left-color:var(--paper)}
.gh-content #practice .threecol{
  border-top:1px solid rgba(255,255,255,0.42);
}
.gh-content #practice .threecol > .col{
  border-right:1px solid rgba(255,255,255,0.16);
}
@media (max-width:899px){
  .gh-content #practice .threecol > .col{
    border-right:0;
    border-bottom:1px solid rgba(255,255,255,0.16);
  }
  .gh-content #practice .threecol > .col:last-child{border-bottom:0}
}
.gh-content #about .body p{color:var(--paper) !important}
.gh-content #about > .section-chip,
.gh-content #practice > .section-chip{
  background:var(--paper);
  color:var(--ink-black);
  outline:1px solid var(--ink-black);
  outline-offset:-1px;
}

/* —— Inline parallax video frame (used in I / Recordings) —— */
.scroll-video-block{
  position:relative;
  margin:0 0 48px;
}
/* Full-bleed variant: video stretches to viewport width,
   figcaption stays inside the editorial wrap. */
.scroll-video-block--bleed{
  margin-left:calc(50% - 50vw);
  margin-right:calc(50% - 50vw);
  width:100vw;
  max-width:100vw;
}
.scroll-video-block--bleed > figure{margin:0}
.scroll-video-block--bleed figcaption{
  max-width:var(--max);
  margin-left:auto;
  margin-right:auto;
  padding-left:var(--pad-x);
  padding-right:var(--pad-x);
  box-sizing:border-box;
}

.scroll-video-frame{
  position:relative;
  width:100%;
  aspect-ratio:16/9;
  overflow:hidden;
  background:var(--ink-black);
  border-top:2px solid var(--ink-black);
  border-bottom:2px solid var(--ink-black);
}
.scroll-video-frame > video.scroll-video{
  position:absolute;
  left:0;
  top:-15%;          /* video is 130% the frame height; sit centred */
  width:100%;
  height:130%;       /* gentle oversize — minimal crop, room for parallax */
  object-fit:cover;
  display:block;
  background:var(--ink-black);
  will-change:transform;
}

/* =========================================================
   I (Recordings) — pinned scroll-video, same pattern as GHI
   .gh-video-bg play_10s.mp4. The score video stays fixed to the
   viewport for the entire I scroll range; the recordings ribbon,
   the "記録された音楽" heading block, and the recordings list each
   sit on top with white backgrounds, while the .i-video-spacer
   between them is transparent so the pinned score video shows.
   ========================================================= */
.i-video-wrap{
  position:relative;
}
.i-video-bg{
  position:fixed;
  top:0;
  left:0;
  width:100vw;
  height:100vh;
  z-index:0;
  overflow:hidden;
  pointer-events:none;
  visibility:hidden;
}
.i-video-bg.is-active{visibility:visible}
.i-video-bg .i-bg-video{
  position:absolute;
  inset:0;
  width:100%;
  height:100%;
  object-fit:cover;
  display:block;
  background:var(--ink-black);
}

/* Inside .gh-content the I body section--tight is white-bg; we drop
   that bg so the spacer can reveal the pinned score video, and bring
   the white back only on the two .i-content-block wrappers around the
   heading and the recordings list. */
.gh-content #recordings + .section--tight{
  background:transparent;
  padding:0;
  z-index:2;
}
.gh-content #recordings + .section--tight .i-content-block{
  background:var(--paper);
  padding:64px 0;
  position:relative;
  z-index:2;
}
@media (max-width:767px){
  .gh-content #recordings + .section--tight .i-content-block{
    padding:48px 0;
  }
}

/* The transparent gap inside section--tight where the pinned score
   video shows through. Full-bleed so the score fills the viewport
   width. Height is one viewport so there's a comfortable window of
   pure-video before the recordings list rises in over it. */
.i-video-spacer{
  position:relative;
  height:100vh;
  width:100vw;
  margin:0 calc(50% - 50vw);
  background:transparent;
  z-index:1;
  pointer-events:none;
}
.i-video-caption{
  position:absolute;
  left:0;
  right:0;
  bottom:24px;
  max-width:var(--max);
  margin:0 auto;
  padding:0 var(--pad-x);
  display:flex;
  flex-direction:column;
  gap:6px;
  font-family:var(--mono);
  font-size:11px;
  letter-spacing:1.2px;
  text-transform:uppercase;
  color:#fff;
  pointer-events:none;
  isolation:isolate;          /* contain the ::before plate */
}
/* Semi-opaque black plate behind the caption text. Extends from
   the viewport's left edge (using the centered-parent trick:
   left = 50% - 50vw, width = 100vw) and fades to full transparency
   around the horizontal centre so it doesn't visually compete with
   the right-hand side of the score video. */
.i-video-caption::before{
  content:"";
  position:absolute;
  left:calc(50% - 50vw);
  width:100vw;
  top:-14px;
  bottom:-14px;
  background:linear-gradient(to right,
    rgba(0,0,0,0.72) 0%,
    rgba(0,0,0,0.58) 35%,
    rgba(0,0,0,0)    60%);
  z-index:-1;
  pointer-events:none;
}
.i-video-caption .src{font-weight:700;letter-spacing:1.4px;color:#fff}
.i-video-caption .desc{
  text-transform:none;
  letter-spacing:0.4px;
  color:rgba(255,255,255,0.95);
  font-family:var(--body);
  font-size:13px;
  line-height:1.5;
  max-width:62ch;
}

/* —— Full-bleed background video section (used in L / Artists) —— */
.scroll-video-section{
  position:relative;
  background:var(--ink-black);
  overflow:hidden;
  isolation:isolate;
}
.scroll-video-bg{
  position:absolute;
  inset:0;
  z-index:0;
  overflow:hidden;
  pointer-events:none;
}
.scroll-video-bg video.scroll-video{
  position:absolute;
  left:0;
  top:-15%;
  width:100%;
  height:130%;
  object-fit:cover;
  display:block;
  will-change:transform;
}
.scroll-video-overlay{
  position:absolute;
  inset:0;
  background:rgba(0,0,0,0.42);
  pointer-events:none;
}
.scroll-video-grad-top{
  position:absolute;
  top:0;left:0;width:100%;
  height:30vh;
  background:linear-gradient(to bottom,#000 0%,transparent 100%);
  pointer-events:none;
}
.scroll-video-grad-bottom{
  position:absolute;
  bottom:0;left:0;width:100%;
  height:35vh;
  background:linear-gradient(to top,#000 0%,transparent 100%);
  pointer-events:none;
}
.scroll-video-section > .wrap{
  position:relative;
  z-index:3;
}

/* —— Reduced motion: collapse to flat fit, no transforms —— */
@media (prefers-reduced-motion:reduce){
  .scroll-video-frame > video.scroll-video,
  .scroll-video-bg video.scroll-video{
    transform:none !important;
    top:0;
    height:100%;
  }
}

/* =========================================================
   L  ·  ARTISTS  (white panel, black ink — no background video)
   ========================================================= */
#artists{padding:120px 0 140px;background:var(--paper)}

/* 200px breathing gap between K (History) and L (Artists), centered on
   the hairline divider (100px above + 100px below). */
.k-pinwrap + hr.divider{margin:100px 0}

/* =========================================================
   N + O  ·  shared pinned scroll-video bg (fukuoka.mp4)
   Both sections share ONE fixed bg layer. Two separate fixed
   layers would create overlapping stacking contexts where
   O's bg would paint over N's content. A single wrap fixes
   this — the video stays pinned across both sections.
   ========================================================= */
.no-pinwrap{
  position:relative;
  isolation:isolate;
}
.no-pinwrap-bg{
  position:fixed;
  top:0; left:0;
  width:100vw; height:100vh;
  z-index:0;
  overflow:hidden;
  pointer-events:none;
  visibility:hidden;
}
.no-pinwrap-bg.is-active{visibility:visible}
.no-pinwrap-video{
  position:absolute; inset:0;
  width:100%; height:100%;
  object-fit:cover;
  display:block;
  background:var(--ink-black);
}

/* Both N and O sit transparently over the shared bg. The inner
   .section div inside #international also needs the override —
   the global .section{background:var(--paper)} rule would
   otherwise paint a solid white panel over the fixed video. */
section#international,
section.industry,
#international > .section{
  background:transparent;
  color:var(--paper);
  position:relative;
  z-index:1;
}

/* O (Industry) text overrides for white-on-dark. */
#industry .kicker,
#industry .kicker--bold,
#industry .display-jp,
#industry h2,
#industry .body,
#industry .body p,
#industry .industry-tag{
  color:var(--paper) !important;
}
#industry .body,
#industry .body p{color:rgba(255,255,255,0.88) !important}
#industry .industry-tag{
  color:rgba(255,255,255,0.78) !important;
  border-top-color:var(--paper);
}
#industry .eyebrow-rule::after{background:var(--paper)}
#industry > .section-chip{
  background:var(--paper);
  color:var(--ink-black);
  outline:1px solid var(--ink-black);
  outline-offset:-1px;
}

/* N (International) text overrides for white-on-dark. */
#international .kicker,
#international .display-jp,
#international h2,
#international .display-en,
#international .body,
#international .english-label,
#international .english-body{
  color:var(--paper) !important;
}
#international .body{color:rgba(255,255,255,0.88) !important}
#international .display-en{color:rgba(255,255,255,0.72) !important}
#international .english-label{color:rgba(255,255,255,0.65) !important}
#international .english-body{color:rgba(255,255,255,0.92) !important}
#international .intl-grid .right{
  border-left-color:rgba(255,255,255,0.24);
}
@media (max-width:899px){
  #international .intl-grid .right{
    border-top-color:rgba(255,255,255,0.24);
    border-left-color:transparent;
  }
}
#international .btn{
  background:var(--paper);
  color:var(--ink-black);
  border-color:var(--paper);
}
#international .btn:hover{
  background:transparent;
  color:var(--paper);
}
#international [style*="border-top:1px solid"]{
  border-top-color:rgba(255,255,255,0.24) !important;
}

/* =========================================================
   M  ·  CRITICISM  solid-black backdrop
   White-on-dark text overrides match the K-style chip on a
   black ground. No video, no scroll-linked behaviour.
   ========================================================= */
section.section--criticism{
  background:var(--ink-black);
}
/* White-on-dark text overrides scoped to #criticism. The cells'
   hairlines also lift to translucent white so they read on dark. */
#criticism .kicker,
#criticism .display-jp,
#criticism h2,
#criticism h3,
#criticism .body,
#criticism .role,
#criticism .num{
  color:var(--paper) !important;
}
#criticism .body{color:rgba(255,255,255,0.88) !important}
#criticism .role{color:rgba(255,255,255,0.7) !important}
#criticism .num{color:rgba(255,255,255,0.55) !important}
#criticism .twobytwo{
  border-top:1px solid rgba(255,255,255,0.42);
  border-left:1px solid rgba(255,255,255,0.18);
}
#criticism .twobytwo > .cell{
  border-right:1px solid rgba(255,255,255,0.18);
  border-bottom:1px solid rgba(255,255,255,0.18);
}
#criticism .twobytwo > .cell:nth-child(2n){border-right:0}
#criticism .twobytwo > .cell:nth-last-child(-n+2){border-bottom:0}
@media (max-width:767px){
  #criticism .twobytwo{border-left:0}
  #criticism .twobytwo > .cell{border-right:0}
  #criticism .twobytwo > .cell:nth-last-child(-n+2){
    border-bottom:1px solid rgba(255,255,255,0.18);
  }
  #criticism .twobytwo > .cell:last-child{border-bottom:0}
}

/* =========================================================
   EDITORIAL IMAGES  ·  figures, captions, posters
   ========================================================= */
.figure{
  margin:0;
}
.figure img{
  display:block;
  width:100%;
  height:auto;
  background:var(--ink-black);  /* matches dark photo edges, prevents flash */
}
.figure figcaption{
  margin-top:14px;
  display:flex;
  align-items:flex-start;
  gap:14px;
  border-top:1px solid var(--hairline);
  padding-top:10px;
  font-family:var(--mono);
  font-size:11px;
  letter-spacing:1px;
  text-transform:uppercase;
  color:var(--caption);
  line-height:1.5;
}
.figure figcaption .src{
  font-family:var(--display);
  font-style:italic;
  font-size:12px;
  letter-spacing:0;
  text-transform:none;
  color:var(--ink-page);
  white-space:nowrap;
  flex:0 0 auto;
}
.figure figcaption .src::before{
  content:"";
  display:inline-block;
  width:8px;height:8px;
  background:var(--ink-black);
  margin-right:8px;
  vertical-align:middle;
}
.figure figcaption .desc{flex:1}

/* full-bleed figure that breaks out of .wrap */
.figure--bleed{
  margin-left:calc(50% - 50vw);
  margin-right:calc(50% - 50vw);
  width:100vw;
  max-width:100vw;
}
.figure--bleed figcaption{
  max-width:var(--max);
  margin-left:auto;
  margin-right:auto;
  padding-left:var(--pad-x);
  padding-right:var(--pad-x);
}

/* —— Score, with a 2px black frame to read as artifact —— */
.figure--score img{
  border-top:2px solid var(--ink-black);
  border-bottom:2px solid var(--ink-black);
}

/* —— Rehearsal inset (in concerts feature) —— */
.feature-inset{
  margin-top:24px;
}
.feature-inset .figure img{aspect-ratio:16/9;object-fit:cover}

/* Poster variant — show the full A4 portrait without cropping.
   Constrain max-height so it doesn't dominate the column. */
.feature-inset--poster .figure{
  background:transparent;
}
.feature-inset--poster .figure img{
  aspect-ratio:auto;
  object-fit:contain;
  width:auto;
  max-width:100%;
  max-height:520px;
  margin:0 auto;
  display:block;
  background:#0e0e0e;
}

/* —— Poster thumbs in timeline (K).
   Lives inside .t-event, below the meta line(s). */
.t-thumb{
  display:block;
  width:64px;
  height:auto;
  margin:14px 0 0;
  outline:1px solid var(--hairline);
  outline-offset:0;
}
@media (max-width:767px){
  .t-thumb{width:54px}
}

/* —— UTILITIES —— */
.flex{display:flex}
.gap-12{gap:12px}
.gap-16{gap:16px}
.mt-8{margin-top:8px}.mt-12{margin-top:12px}.mt-16{margin-top:16px}
.mt-24{margin-top:24px}.mt-32{margin-top:32px}.mt-48{margin-top:48px}
.mb-12{margin-bottom:12px}.mb-16{margin-bottom:16px}.mb-24{margin-bottom:24px}
.mb-32{margin-bottom:32px}.mb-48{margin-bottom:48px}

/* =========================================================
   COOKIE CONSENT BANNER
   Bottom-fixed, dismissible. State stored in localStorage so
   the choice carries across pages and reload. GDPR/JP-APPI
   compliant: Reject is equally prominent as Accept.
   Hidden by default (the controller sets hidden attribute on
   load if a choice is already recorded).
   ========================================================= */
.cookie-banner{
  position:fixed;
  left:0; right:0; bottom:0;
  z-index:9000;
  /* Liquid Glass effect (Apple visionOS / iPadOS 26 style) — heavy
     backdrop blur with saturation+brightness boost, layered semi-
     transparent fills for vibrancy, plus a top-edge inner highlight
     for the characteristic glass-rim sheen. Falls back to plain
     translucent white on browsers without backdrop-filter. */
  background:
    linear-gradient(180deg,
      rgba(255,255,255,0.42) 0%,
      rgba(255,255,255,0.62) 100%),
    rgba(255,255,255,0.18);
  -webkit-backdrop-filter:blur(30px) saturate(200%) brightness(108%);
  backdrop-filter:blur(30px) saturate(200%) brightness(108%);
  color:var(--ink-page);
  border-top:1px solid rgba(255,255,255,0.55);
  padding:18px 22px;
  font-family:var(--ui);
  font-size:13px;
  line-height:1.65;
  /* Layered shadow:
     1. Inner top highlight — bright sheen edge.
     2. Inner bottom — subtle inner shadow on the top rim.
     3. Outer — soft lift above the content below. */
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,0.85),
    inset 0 -1px 0 rgba(0,0,0,0.04),
    0 -8px 32px rgba(0,0,0,0.06),
    0 -1px 0 rgba(0,0,0,0.04);
  animation:cookieFadeUp 280ms cubic-bezier(.2,.7,.2,1);
}
/* Optional second layer adds a faint vertical gradient overlay
   above the content for extra glass depth perception. */
.cookie-banner::before{
  content:"";
  position:absolute;
  inset:0;
  pointer-events:none;
  background:linear-gradient(180deg,
    rgba(255,255,255,0.25) 0%,
    rgba(255,255,255,0) 40%);
  mix-blend-mode:screen;
}
/* Make sure the inner content sits above the ::before overlay. */
.cookie-banner__inner{position:relative;z-index:1}
.cookie-banner[hidden]{display:none}
@keyframes cookieFadeUp{
  from{opacity:0;transform:translateY(20px)}
  to{opacity:1;transform:translateY(0)}
}
.cookie-banner__inner{
  display:flex;
  flex-direction:column;
  gap:14px;
  /* Keep the content centered and within editorial max-width on wide
     viewports while the bar itself spans full screen width. */
  max-width:var(--max,1440px);
  margin:0 auto;
}
@media (min-width:680px){
  .cookie-banner__inner{
    flex-direction:row;
    align-items:center;
    gap:24px;
  }
}
.cookie-banner__text{
  margin:0;
  flex:1 1 auto;
  color:var(--ink-page);
}
.cookie-banner__text a{
  color:var(--ink-black);
  text-decoration:underline;
  text-underline-offset:2px;
}
.cookie-banner__text a:hover{color:var(--link-blue)}
.cookie-banner__actions{
  display:flex;
  gap:8px;
  flex:0 0 auto;
  flex-wrap:wrap;
}
.cookie-banner__btn{
  font-family:var(--ui);
  font-size:12px;
  font-weight:600;
  letter-spacing:0.6px;
  padding:10px 18px;
  /* Glass-pill outline for Reject — fully transparent fill, soft
     dark border that matches the banner's translucent palette. */
  border:1px solid rgba(0,0,0,0.32);
  background:rgba(255,255,255,0.18);
  -webkit-backdrop-filter:blur(12px);
  backdrop-filter:blur(12px);
  color:var(--ink-black);
  cursor:pointer;
  border-radius:999px;
  transition:background 160ms ease, color 160ms ease,
             border-color 160ms ease, transform 160ms ease,
             box-shadow 160ms ease;
  white-space:nowrap;
  position:relative;
  z-index:1;
  box-shadow:inset 0 1px 0 rgba(255,255,255,0.5);
}
.cookie-banner__btn--accept{
  /* Solid pill — primary action stands out as a tactile dark capsule. */
  background:linear-gradient(180deg, #1a1a1a 0%, #000 100%);
  border-color:rgba(0,0,0,0.7);
  color:var(--paper);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,0.18),
    0 1px 4px rgba(0,0,0,0.12);
}
.cookie-banner__btn:hover{
  background:rgba(0,0,0,0.06);
  border-color:rgba(0,0,0,0.45);
  transform:translateY(-1px);
}
.cookie-banner__btn--accept:hover{
  background:linear-gradient(180deg, var(--link-blue,#1a4eff) 0%, #0028b6 100%);
  border-color:var(--link-blue,#1a4eff);
  color:var(--paper);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,0.22),
    0 4px 14px rgba(26,78,255,0.32);
  transform:translateY(-1px);
}
.cookie-banner__btn:active{transform:translateY(0)}

/* =========================================================
   RTL support — applied via <html dir="rtl"> on Arabic pages.
   Most flex/grid layout mirrors automatically; we override the
   inline text direction for body content, restore the LTR
   direction on UI elements that should stay left-to-right
   (logo, language select, English/numeric metadata, embedded
   YouTube IDs etc.), and flip a few padding/margin/border
   asymmetries that are explicit left/right.
   ========================================================= */
html[dir="rtl"] body{ text-align:right }
html[dir="rtl"] .wrap,
html[dir="rtl"] .legal-page,
html[dir="rtl"] .notes-page,
html[dir="rtl"] .work-body,
html[dir="rtl"] .movement-body,
html[dir="rtl"] .legal-intro,
html[dir="rtl"] .body{ text-align:right }

/* Lists in RTL — mirror padding so bullets/numbers sit on
   the right side of the text block. */
html[dir="rtl"] ul,
html[dir="rtl"] ol{ padding-right:24px; padding-left:0 }

/* The language switcher itself stays LTR — option labels
   like JA/EN/ES/AR are Latin abbreviations and the chevron
   should remain at the trailing (right) edge in the open
   direction users expect. */
html[dir="rtl"] .utility-bar .lang-select{ direction:ltr }

/* Logo and brand mark are bilingual / Latin — keep LTR. */
html[dir="rtl"] .bar-logo,
html[dir="rtl"] .footer-mark{ direction:ltr }

/* Mono-style technical metadata (timestamps, kickers,
   numeric refs) reads more naturally LTR even on RTL pages. */
html[dir="rtl"] .kicker,
html[dir="rtl"] .ribbon .num,
html[dir="rtl"] .legal-meta,
html[dir="rtl"] .notes-meta,
html[dir="rtl"] .footer-bottom,
html[dir="rtl"] .footer-credit,
html[dir="rtl"] .footer-copy,
html[dir="rtl"] .footer-locale{ direction:ltr; text-align:left }

/* The utility-bar uses a left border on the language select
   — in RTL that visually becomes the right edge. Swap so the
   border still separates the select from the preceding nav
   item visually on the trailing side. */
html[dir="rtl"] .utility-bar .lang-select{
  border-left:0;
  border-right:1px solid #2a2a2a;
}

/* Form labels / input flow — the contact form uses left-aligned
   labels above each field. Mirror to right-aligned in RTL. */
html[dir="rtl"] .form-row label,
html[dir="rtl"] .form-row .form-meta,
html[dir="rtl"] .form-consent label{ text-align:right }

/* Some headings in the editorial layout use specific letter-spacing
   that becomes awkward at RTL extremes; loosen slightly. */
html[dir="rtl"] h1,
html[dir="rtl"] h2,
html[dir="rtl"] h3,
html[dir="rtl"] h4{ letter-spacing:0 }

