/* ============================================================================
   FM Astronomy — site styles (v1). Tokens live in tokens.css.
   Structure: base → frame & grid lines → patterns → atoms → nav → sections
   → event page → motion. Every value that matters is a token.
   ============================================================================ */

/* ---- Base ---------------------------------------------------------------- */
*, *::before, *::after { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; scroll-padding-top: calc(var(--nav-h) + var(--space-4)); background: var(--ground); }
/* Scrollbars: an H-alpha thumb on a clear track. Behind the page scrollbar sits the root
   background, which site.js paints in bands that match each section (see paintScrollbarGround). */
html { scrollbar-color: var(--accent) transparent; }
@supports not (scrollbar-color: auto) {
  ::-webkit-scrollbar { width: 12px; height: 12px; background: transparent; }
  ::-webkit-scrollbar-track { background: transparent; }
  ::-webkit-scrollbar-thumb { background: var(--accent); }
}
body {
  margin: 0;
  background: var(--ground);
  color: var(--text);
  font: 400 var(--fs-body)/var(--lh-body) var(--font-serif);
  font-kerning: normal;
  font-variant-numeric: lining-nums;
  text-rendering: optimizeLegibility;
  -webkit-font-smoothing: antialiased;
  overflow-x: clip;
}
img, canvas, svg { display: block; max-width: 100%; }
a { color: inherit; text-decoration-thickness: 1px; text-underline-offset: 0.18em; }
button, input, select, textarea { font: inherit; color: inherit; }
button { cursor: pointer; }
p { margin: 0; }
h1, h2, h3, h4 { margin: 0; font-weight: 400; }
:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
::selection { background: var(--accent); color: var(--on-accent); }
[hidden] { display: none !important; }
.nowrap { white-space: nowrap; }
.visually-hidden { position: absolute !important; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
.skip { position: absolute; left: var(--space-4); top: -60px; z-index: 100; padding: var(--space-3) var(--space-4); background: var(--accent); color: var(--on-accent); font: 500 var(--fs-label)/1 var(--font-mono); text-transform: uppercase; letter-spacing: var(--track-label); }
.skip:focus { top: var(--space-4); }

/* ---- Type roles ---------------------------------------------------------- */
.display { font-size: var(--fs-display); line-height: var(--lh-display); letter-spacing: var(--track-display); text-wrap: balance; }
.display em, .h2 em { font-style: italic; }
.h2 { font-size: var(--fs-h2); line-height: var(--lh-heading); letter-spacing: -0.02em; text-wrap: balance; }
.h3 { font-size: var(--fs-h3); line-height: 1.12; letter-spacing: -0.01em; text-wrap: balance; }
.h4 { font-size: var(--fs-h4); line-height: 1.2; }
.lede { font-size: clamp(1.125rem, 1rem + 0.4vw, 1.3125rem); line-height: 1.5; max-width: 34em; color: var(--text); }
.body { max-width: 38em; }
.muted { color: var(--text-muted); }
.label, .mono {
  font-family: var(--font-mono); font-size: var(--fs-label); line-height: 1.4;
  letter-spacing: var(--track-label); text-transform: uppercase; font-weight: 400;
}
.figure { font-size: var(--fs-figure); line-height: 1; letter-spacing: -0.03em; font-variant-numeric: lining-nums tabular-nums; }
.smallcaps { font-variant-caps: all-small-caps; letter-spacing: 0.04em; }

/* Eyebrow — [ LABEL ] with chamfered bracket glyphs */
.eyebrow {
  display: inline-flex; align-items: center; gap: 0.6em;
  font: 500 var(--fs-micro)/1 var(--font-mono); letter-spacing: var(--track-label); text-transform: uppercase;
  color: var(--text);
}
.eyebrow::before, .eyebrow::after {
  content: ""; width: 0.42em; height: 1.35em; background: currentColor; flex: none;
  -webkit-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 32'><path d='M10 0H4L0 4v24l4 4h6v-3H5.5L3 26.5v-21L5.5 3H10z'/></svg>") center / contain no-repeat;
          mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 32'><path d='M10 0H4L0 4v24l4 4h6v-3H5.5L3 26.5v-21L5.5 3H10z'/></svg>") center / contain no-repeat;
}
.eyebrow::after { transform: scaleX(-1); }

/* ---- Frame & grid lines --------------------------------------------------- */
/* The frame is the measured column: hairlines on both sides, sections stack
   inside it with a hairline between them. Lines never cross the margin. */
.frame {
  width: min(100% - 2 * var(--frame-margin), var(--frame-max));
  margin-inline: auto;
  border-inline: var(--hairline) solid var(--line);
  position: relative;
}
.section { background: var(--ground); color: var(--text); position: relative; }
.section > .frame { border-top: var(--hairline) solid var(--line); }
.section-head { padding: var(--section-pad) var(--gutter) var(--space-7); display: grid; gap: var(--space-5); }
.section-head--split { grid-template-columns: minmax(0, 1fr) auto; align-items: end; }
.cells { display: grid; gap: var(--hairline); background: var(--line); border-top: var(--hairline) solid var(--line); }
.cells > * { background: var(--ground); min-width: 0; }
.cell { padding: var(--cell-pad); position: relative; }
.rule-top { border-top: var(--hairline) solid var(--line); }

/* ---- Patterns -------------------------------------------------------------- */
[data-pattern] { position: relative; isolation: isolate; }
[data-pattern]::before { content: ""; position: absolute; inset: 0; z-index: -1; pointer-events: none; background-color: var(--pattern); }
[data-pattern="plus"]::before {
  -webkit-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><path d='M7.5 4h1v8h-1zM4 7.5h8v1H4z'/></svg>") 0 0 / var(--pattern-size) var(--pattern-size) repeat;
          mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><path d='M7.5 4h1v8h-1zM4 7.5h8v1H4z'/></svg>") 0 0 / var(--pattern-size) var(--pattern-size) repeat;
}
[data-pattern="dots"]::before {
  -webkit-mask: radial-gradient(circle at 50% 50%, #000 0.75px, transparent 1.1px) 0 0 / 12px 12px repeat;
          mask: radial-gradient(circle at 50% 50%, #000 0.75px, transparent 1.1px) 0 0 / 12px 12px repeat;
}
[data-pattern-hover]::before { opacity: 0; transition: opacity 300ms var(--ease-std); }
[data-pattern-hover]:is(:hover, :focus-within)::before { opacity: 1; }

/* ---- Atoms ------------------------------------------------------------------ */
.chamfer { clip-path: polygon(var(--chamfer) 0, 100% 0, 100% calc(100% - var(--chamfer)), calc(100% - var(--chamfer)) 100%, 0 100%, 0 var(--chamfer)); }

/* Button — chamfered, mono, with a center-out sweep on hover. */
.btn {
  --btn-bg: var(--accent); --btn-fg: var(--on-accent); --btn-sweep: var(--text);
  --btn-sweep-fg: var(--ground);
  position: relative; isolation: isolate; overflow: hidden;
  display: inline-flex; align-items: center; justify-content: center; gap: var(--space-2);
  min-height: var(--button-h); padding: 0 var(--space-5);
  border: 0; background: var(--btn-bg); color: var(--btn-fg); text-decoration: none;
  font: 500 var(--fs-label)/1 var(--font-mono); letter-spacing: var(--track-label); text-transform: uppercase;
  clip-path: polygon(var(--chamfer-sm) 0, 100% 0, 100% calc(100% - var(--chamfer-sm)), calc(100% - var(--chamfer-sm)) 100%, 0 100%, 0 var(--chamfer-sm));
  transition: scale 150ms var(--ease-std), color var(--dur-sweep) var(--ease-sweep);
}
.btn::after {
  content: ""; position: absolute; inset: 0; z-index: -1; background: var(--btn-sweep);
  clip-path: polygon(0 50%, 100% 50%, 100% 50%, 0 50%);
  transition: clip-path 375ms var(--ease-sweep);
}
.btn:active { scale: 0.97; }
.btn svg { width: 12px; height: 12px; flex: none; }
.btn--ghost { --btn-bg: transparent; --btn-fg: var(--text); clip-path: none; box-shadow: inset 0 0 0 var(--hairline) color-mix(in srgb, var(--text) 45%, transparent); }
@media (hover: hover) and (pointer: fine) and (prefers-reduced-motion: no-preference) {
  .btn:hover { color: var(--btn-sweep-fg); }
  .btn:hover::after { clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%); transition-duration: var(--dur-sweep); }
}

/* Text link with arrow */
.arrow-link { display: inline-flex; align-items: center; gap: var(--space-2); text-decoration: none; font: 500 var(--fs-label)/1 var(--font-mono); letter-spacing: var(--track-label); text-transform: uppercase; }
.arrow-link .arr { transition: translate var(--dur-sweep) var(--ease-sweep); }
.arrow-link:hover .arr { translate: 4px 0; }

/* Status chip */
.chip {
  display: inline-flex; align-items: center; gap: 6px; height: 24px; padding: 0 var(--space-2);
  font: 500 var(--fs-micro)/1 var(--font-mono); letter-spacing: var(--track-label); text-transform: uppercase;
  background: var(--accent); color: var(--on-accent); white-space: nowrap;
}
.chip--outline { background: transparent; color: var(--text); box-shadow: inset 0 0 0 var(--hairline) var(--line); }
.chip--hold { background: transparent; color: var(--accent); box-shadow: inset 0 0 0 var(--hairline) var(--accent); }
.chip--off { background: transparent; color: var(--text-muted); text-decoration: line-through; box-shadow: inset 0 0 0 var(--hairline) var(--line); }
.chip--sample { background: transparent; color: var(--text-muted); box-shadow: inset 0 0 0 var(--hairline) var(--line); }
.chip .dot { width: 6px; height: 6px; background: currentColor; }

.bullet { display: inline-block; width: 7px; height: 7px; background: var(--accent); flex: none; }
.index { font: 400 var(--fs-micro)/1 var(--font-mono); color: var(--text-muted); letter-spacing: 0.06em; }

/* ---- Nav ----------------------------------------------------------------------- */
.nav {
  position: sticky; top: 0; z-index: 50; background: var(--ground); color: var(--text);
  border-bottom: var(--hairline) solid var(--line);
  transition: background-color 300ms var(--ease-std), color 300ms var(--ease-std), border-color 300ms var(--ease-std);
}
.nav .frame { display: flex; align-items: stretch; height: var(--nav-h); }
.nav__logo { display: flex; align-items: center; gap: var(--space-3); flex: 0 1 auto; padding: 0 var(--gutter); text-decoration: none; border-right: var(--hairline) solid var(--line); }
.nav__mark { width: 40px; height: 40px; flex: none; border-radius: 50%; }
/* The club name sits on one line and breaks between "Fargo–Moorhead" and "Astronomy Club" when the bar runs short. */
.nav__word { font-size: 1.0625rem; line-height: 1.05; letter-spacing: -0.005em; }
.nav__word > span { white-space: nowrap; }
.nav__links { display: flex; align-items: stretch; flex: none; }
.nav__links a, .nav__end > * { position: relative; overflow: hidden; display: flex; align-items: center; padding: 0 var(--space-5); text-decoration: none; font: 400 var(--fs-label)/1 var(--font-mono); letter-spacing: var(--track-label); text-transform: uppercase; }
.nav__links a + a { border-left: 0; }
.nav__links a::after, .nav__end > *::after {
  content: ""; position: absolute; inset: 0; z-index: -1; background: var(--hover-fill);
  clip-path: polygon(0 50%, 100% 50%, 100% 50%, 0 50%); transition: clip-path 375ms var(--ease-sweep);
}
.nav__links a:hover::after, .nav__end > *:hover::after { clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%); }
.nav__links a, .nav__end > * { isolation: isolate; }
.nav__end { display: flex; flex: none; margin-left: auto; }
.nav__end > * { border-left: var(--hairline) solid var(--line); background: none; border-top: 0; border-bottom: 0; border-right: 0; gap: var(--space-2); }
.nav__night .lamp { width: 8px; height: 8px; border-radius: 50%; box-shadow: inset 0 0 0 1px currentColor; }
.nav__night[aria-pressed="true"] .lamp { background: var(--night-bright); box-shadow: 0 0 8px var(--night-bright); }
.nav__cta { background: var(--accent) !important; color: var(--on-accent); }
.nav__cta::after { background: var(--text) !important; }
.nav__cta:hover { color: var(--ground); }
.nav__menu { display: none !important; }
.nav__cta .txt-short { display: none; }
.nav__sheet { display: none; }

/* ---- Hero ---------------------------------------------------------------------- */
.hero > .frame { border-top: 0; }
/* The copy column never gets narrower than its button pair, so the two buttons stay side by side. */
.hero__grid { display: grid; grid-template-columns: minmax(min-content, 5fr) minmax(0, 7fr); gap: var(--hairline); background: var(--line); }
.hero__grid > * { background: var(--ground); min-width: 0; }
.hero__copy { display: flex; flex-direction: column; padding: var(--space-8) var(--gutter) var(--space-6); gap: var(--space-5); }
.hero__copy .display { margin-top: var(--space-2); }
.hero__actions { display: flex; flex-wrap: nowrap; gap: var(--space-3); margin-top: var(--space-2); }
.hero__actions .btn { white-space: nowrap; }

.observatory { display: grid; }
.observatory__plate { padding: var(--space-6); display: grid; place-items: center; }
.plate {
  --plate-size: min(100%, 760px, calc(100svh - var(--nav-h) - 2 * var(--space-6)));
  position: relative; width: var(--plate-size); aspect-ratio: 1; background: var(--dither-lo);
  color: var(--paper-100);
  clip-path: polygon(var(--chamfer) 0, 100% 0, 100% calc(100% - var(--chamfer)), calc(100% - var(--chamfer)) 100%, 0 100%, 0 var(--chamfer));
}
.plate canvas { position: absolute; inset: 0; width: 100%; height: 100%; image-rendering: pixelated; }
[data-hero] .plate { touch-action: pan-y; } /* sideways swipes drag the sky (js/home.js); vertical ones scroll */
.plate__mark { position: absolute; font: 400 var(--fs-micro)/1.3 var(--font-mono); letter-spacing: var(--track-label); text-transform: uppercase; color: var(--ink-500); pointer-events: none; }
.plate__mark--tl { top: var(--space-4); left: calc(var(--chamfer) + var(--space-3)); }
.plate__mark--br { bottom: var(--space-4); right: calc(var(--chamfer) + var(--space-3)); text-align: right; }

.readout__sub { font: 400 var(--fs-micro)/1.3 var(--font-mono); color: var(--text-muted); letter-spacing: 0.04em; }

/* Scrub the next 30 nights: a bare track that rises inside the plate on hover, keyboard focus or a tap.
   Only keyboard focus (:focus-visible) holds it open, so it leaves with the pointer after a mouse drag. */
.plate__scrub {
  position: absolute; left: var(--space-5); right: var(--space-5); bottom: calc(var(--space-4) + var(--space-6)); height: 28px;
  opacity: 0; pointer-events: none;
}
.plate:hover .plate__scrub, .plate:has(:focus-visible) .plate__scrub, .plate.is-scrub .plate__scrub { opacity: 1; pointer-events: auto; }
.plate__scrub::before {
  content: ""; position: absolute; inset: 0; pointer-events: none;
  background:
    repeating-linear-gradient(to right, var(--ink-500) 0 1px, transparent 1px calc((100% - 1px) / 30)) 0 100% / 100% 7px no-repeat,
    linear-gradient(var(--ink-500), var(--ink-500)) 0 100% / 100% 1px no-repeat;
}
.plate__scrub input[type="range"] { position: absolute; inset: 0; width: 100%; height: 100%; margin: 0; background: transparent; -webkit-appearance: none; appearance: none; cursor: ew-resize; }
.plate__scrub input[type="range"]::-webkit-slider-runnable-track { height: 28px; background: transparent; }
.plate__scrub input[type="range"]::-moz-range-track { height: 28px; background: transparent; }
.plate__scrub input[type="range"]::-webkit-slider-thumb { -webkit-appearance: none; width: 3px; height: 28px; background: var(--accent); border: 0; margin-top: 0; box-shadow: 0 0 0 4px color-mix(in srgb, var(--accent) 22%, transparent); }
.plate__scrub input[type="range"]::-moz-range-thumb { width: 3px; height: 28px; background: var(--accent); border: 0; border-radius: 0; }
.plate__scrub input[type="range"]:focus-visible { outline: 0; }
.plate__scrub input[type="range"]:focus-visible::-webkit-slider-thumb { box-shadow: 0 0 0 2px var(--dither-lo), 0 0 0 4px var(--focus); }
.plate__scrub input[type="range"]:focus-visible::-moz-range-thumb { box-shadow: 0 0 0 2px var(--dither-lo), 0 0 0 4px var(--focus); }
@media (prefers-reduced-motion: no-preference) {
  .plate__scrub { translate: 0 6px; transition: opacity 90ms var(--ease-std), translate 90ms var(--ease-std); }
  .plate:hover .plate__scrub, .plate:has(:focus-visible) .plate__scrub, .plate.is-scrub .plate__scrub { translate: 0 0; transition: opacity 180ms var(--ease-std), translate 420ms var(--ease-rise); }
}

.strip { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.strip .cell { display: grid; gap: var(--space-2); align-content: start; padding: var(--space-5) var(--gutter); text-decoration: none; }
.strip .label { color: var(--text-muted); display: flex; align-items: center; gap: var(--space-2); }
.strip__value { font-size: 1.625rem; line-height: 1.1; letter-spacing: -0.015em; }
.strip__sub { font: 400 var(--fs-micro)/1.35 var(--font-mono); letter-spacing: 0.04em; color: var(--text-muted); }
a.cell[data-pattern-hover] .arr { transition: translate var(--dur-sweep) var(--ease-sweep); }
a.cell[data-pattern-hover]:hover .arr { translate: 4px 0; }

/* ---- Schedule -------------------------------------------------------------------- */
.schedule-tools { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-4); }

.feature { display: grid; grid-template-columns: minmax(0, var(--golden-fr)) minmax(0, 1fr); gap: var(--hairline); background: var(--line); border-top: var(--hairline) solid var(--line); }
.feature > * { background: var(--ground); min-width: 0; }
.feature__media { position: relative; min-height: 420px; overflow: hidden; background: var(--dither-lo); }
.feature__media canvas { position: absolute; inset: 0; width: 100%; height: 100%; image-rendering: pixelated; }
.feature__media .badge { position: absolute; left: var(--space-5); top: var(--space-5); z-index: 1; }
.feature__credit { position: absolute; left: var(--space-5); bottom: var(--space-4); z-index: 1; font: 400 10px/1.2 var(--font-mono); color: var(--ink-500); letter-spacing: 0.06em; text-transform: uppercase; }
.feature__body { padding: var(--space-7) var(--gutter); display: flex; flex-direction: column; gap: var(--space-5); }
.feature__date { display: grid; gap: var(--space-2); font-family: var(--font-mono); text-transform: uppercase; letter-spacing: 0.06em; }
.feature__date b { font-weight: 500; font-size: var(--fs-h4); line-height: 1.15; }
.feature__date span { font-size: var(--fs-small); line-height: 1.4; color: var(--text-muted); }
.feature__speaker { display: grid; gap: 2px; padding-top: var(--space-4); border-top: var(--hairline) solid var(--line); }
.feature__speaker b { font-weight: 400; font-size: 1.25rem; }
.feature__actions { margin-top: auto; display: flex; flex-wrap: wrap; gap: var(--space-3); padding-top: var(--space-4); }

/* Upcoming and past lists share one grid cell: the stage holds the taller list's height,
   and the hidden list waits off to one side (clipped) until the toggle slides it in. */
.events-stage { display: grid; overflow-x: clip; }
.events-stage.is-folding { overflow: clip; } /* folded to three rows by js/schedule.js › mountExpand */
.events-stage > .events { grid-area: 1 / 1; }
.events-stage > .events[data-side="left"] { translate: -100% 0; visibility: hidden; }
.events-stage > .events[data-side="right"] { translate: 100% 0; visibility: hidden; }
@media (prefers-reduced-motion: no-preference) {
  .events-stage > .events { transition: translate 700ms var(--ease-sweep), visibility 0s linear 700ms; }
  .events-stage > .events[data-side="center"] { transition-delay: 0s, 0s; }
  .events-stage.is-sizing { transition: height 650ms var(--ease-sweep); }
}
.events { list-style: none; margin: 0; padding: 0; border-top: var(--hairline) solid var(--line); }
.event-row { border-bottom: var(--hairline) solid var(--line); }
.event-row:last-child { border-bottom: 0; }
.event-row > a {
  display: grid; align-items: center; text-decoration: none; gap: var(--space-5);
  grid-template-columns: 92px 150px minmax(0, 1fr) 200px 76px 132px 20px;
  padding: var(--space-5) var(--gutter);
}
.event-row__date { display: grid; gap: 2px; }
.event-row__date .day { font-size: 2.75rem; line-height: 0.9; letter-spacing: -0.03em; font-variant-numeric: lining-nums tabular-nums; }
.event-row__date .mon { font: 500 var(--fs-micro)/1 var(--font-mono); letter-spacing: var(--track-label); text-transform: uppercase; }
.event-row__kind { display: flex; align-items: center; gap: var(--space-2); font: 400 var(--fs-micro)/1.3 var(--font-mono); letter-spacing: var(--track-label); text-transform: uppercase; }
.event-row__kind .bullet.ink { background: var(--text); }
.event-row__title { font-size: 1.5rem; line-height: 1.15; letter-spacing: -0.01em; }
.event-row__speaker { font-style: italic; color: var(--text-muted); margin-top: 4px; font-size: var(--fs-small); }
.event-row__meta { font: 400 var(--fs-micro)/1.5 var(--font-mono); letter-spacing: 0.04em; color: var(--text-muted); }
.event-row__meta b { font-weight: 500; color: var(--text); display: block; }
.event-row__moon { display: flex; align-items: center; gap: var(--space-2); font: 400 var(--fs-micro)/1 var(--font-mono); color: var(--text-muted); }
.event-row__arrow { transition: translate var(--dur-sweep) var(--ease-sweep); }
.event-row > a:hover .event-row__arrow { translate: 4px 0; }
.event-row > a:focus-visible { outline-offset: -2px; } /* inset, so the stage's horizontal clip never cuts it */
.event-row > a:hover .event-row__title { text-decoration: underline; text-decoration-thickness: 1px; text-underline-offset: 0.2em; }
.event-row--cancelled .event-row__title { text-decoration: line-through; color: var(--text-muted); }
.events-empty, .events-error, .events-loading { padding: var(--space-7) var(--gutter); font: 400 var(--fs-label)/1.5 var(--font-mono); letter-spacing: 0.04em; color: var(--text-muted); }
.events-more { display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; gap: var(--space-4); padding: var(--space-5) var(--gutter); border-top: var(--hairline) solid var(--line); }
.events-more button { background: none; border: 0; padding: 0; }
.events-more .events-expand { grid-column: 2; padding: var(--space-2) 0; color: var(--text); cursor: pointer; transition: color var(--dur-fast) var(--ease-std); }
.events-more .events-expand:hover { color: var(--accent); }
.events-more .events-past { grid-column: 3; justify-self: end; }

.phase-glyph { width: 28px; height: 28px; flex: none; }
.phase-glyph .disc { fill: none; stroke: var(--text-muted); stroke-width: 1; }
.phase-glyph .lit { fill: var(--text); }

/* ---- Visit / map ------------------------------------------------------------------ */
.visit__body { display: grid; grid-template-columns: minmax(0, var(--golden-fr)) minmax(0, 1fr); gap: var(--hairline); background: var(--line); border-top: var(--hairline) solid var(--line); }
.visit__body > * { background: var(--ground); min-width: 0; }
.map { position: relative; isolation: isolate; min-height: 600px; background: var(--ink-750); overflow: hidden; } /* keeps MapLibre's z-index 99999 gesture hint under the sticky nav */
.map .map__canvas { position: absolute; inset: 0; width: 100%; height: 100%; }
.map__fallback { position: absolute; inset: 0; display: grid; place-items: center; padding: var(--space-6); text-align: center; color: var(--text-muted); font: 400 var(--fs-label)/1.5 var(--font-mono); }
.map__pager { position: absolute; right: var(--space-5); bottom: var(--space-5); z-index: 2; display: flex; align-items: stretch; background: var(--accent); color: var(--on-accent); height: 40px; clip-path: polygon(var(--chamfer-sm) 0, 100% 0, 100% calc(100% - var(--chamfer-sm)), calc(100% - var(--chamfer-sm)) 100%, 0 100%, 0 var(--chamfer-sm)); }
.map__pager button { background: none; border: 0; width: 40px; display: grid; place-items: center; color: inherit; }
.map__pager button:hover { background: color-mix(in srgb, #000 12%, transparent); }
.map__pager output { display: grid; place-items: center; padding: 0 var(--space-2); font: 500 var(--fs-label)/1 var(--font-mono); letter-spacing: 0.06em; font-variant-numeric: tabular-nums; min-width: 54px; }
.map__hint { position: absolute; right: var(--space-5); top: var(--space-5); z-index: 2; font: 400 var(--fs-micro)/1.2 var(--font-mono); color: var(--muted-on-ink); letter-spacing: 0.06em; text-transform: uppercase; }
.map .maplibregl-ctrl-attrib { background: color-mix(in srgb, var(--ink-900) 70%, transparent) !important; font: 400 10px/1.4 var(--font-mono) !important; }
.map .maplibregl-ctrl-attrib a { color: var(--muted-on-ink) !important; }
.map .maplibregl-ctrl-attrib-button { filter: invert(1); }
.map .maplibregl-cooperative-gesture-screen { font: 400 1rem/1.4 var(--font-serif); background: color-mix(in srgb, var(--ink-900) 72%, transparent); color: var(--paper-100); }
.map .maplibregl-ctrl-group { background: var(--ink-800); border-radius: 0; box-shadow: none; border: 1px solid var(--ink-700); }
.map .maplibregl-ctrl-group button { width: 32px; height: 32px; }
.map .maplibregl-ctrl-group button + button { border-top: 1px solid var(--ink-700); }
.map .maplibregl-ctrl-icon { filter: invert(1) brightness(.85); }
.map .maplibregl-ctrl-top-left { top: var(--space-4); left: var(--space-4); }

.pin { position: relative; width: 30px; height: 30px; display: grid; place-items: center; cursor: pointer; border: 0; padding: 0; background: none; }
.pin__core { width: 22px; height: 22px; border-radius: 50%; background: var(--accent); display: grid; place-items: center; box-shadow: 0 0 0 2px var(--ink-850); transition: scale 300ms var(--ease-rise); }
.pin__core::after { content: ""; width: 6px; height: 6px; border-radius: 50%; background: var(--ink-900); }
.pin__ring { position: absolute; inset: -6px; border-radius: 50%; border: 1px solid var(--accent); opacity: 0; scale: .6; transition: opacity 300ms, scale 400ms var(--ease-rise); }
.pin.is-active .pin__ring { opacity: 1; scale: 1; }
.pin.is-active .pin__core { scale: 1.1; }
.pin__label { position: absolute; left: calc(100% + 8px); top: 50%; translate: 0 -50%; white-space: nowrap; font: 500 10px/1 var(--font-mono); letter-spacing: var(--track-label); text-transform: uppercase; color: var(--paper-100); background: var(--ink-900); padding: 5px 7px; }
@media (prefers-reduced-motion: no-preference) {
  .pin.is-active .pin__ring { animation: pin-pulse 2.4s var(--ease-std) infinite; }
}
@keyframes pin-pulse { 0% { scale: 1; opacity: .9; } 70% { scale: 1.9; opacity: 0; } 100% { scale: 1.9; opacity: 0; } }

.site-panel { display: flex; flex-direction: column; }
.site-panel__top { height: 132px; border-bottom: var(--hairline) solid var(--line); display: flex; align-items: flex-end; justify-content: space-between; padding: var(--space-5) var(--gutter); }
.site-panel__body { padding: var(--space-6) var(--gutter); display: grid; gap: var(--space-5); align-content: start; flex: 1; }
.site-panel__facts { display: grid; border-top: var(--hairline) solid var(--line); }
.site-panel__facts div { display: grid; grid-template-columns: 112px minmax(0, 1fr); gap: var(--space-4); padding: var(--space-3) 0; border-bottom: var(--hairline) solid var(--line); font-size: var(--fs-small); }
.site-panel__facts dt { font: 400 var(--fs-micro)/1.7 var(--font-mono); letter-spacing: var(--track-label); text-transform: uppercase; color: var(--text-muted); }
.site-panel__facts dd { margin: 0; }
.site-panel__actions { display: flex; flex-wrap: wrap; gap: var(--space-3); padding: var(--space-5) var(--gutter) var(--space-6); }
.distance { display: flex; align-items: center; gap: var(--space-3); padding: var(--space-4) var(--gutter); border-top: var(--hairline) solid var(--line); font: 400 var(--fs-micro)/1.3 var(--font-mono); color: var(--text-muted); letter-spacing: 0.04em; text-transform: uppercase; }
.distance i { flex: 1; height: 1px; background: repeating-linear-gradient(to right, var(--accent) 0 4px, transparent 4px 8px); }

/* ---- Club --------------------------------------------------------------------------- */
.club__cells { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.club__cell { display: flex; flex-direction: column; gap: var(--space-4); padding: var(--space-6) var(--gutter) var(--space-7); }
/* Club photo: a black chamfered frame; the 4:3 crop sits inside it, chamfered to keep the band even. */
.club__art { --frame: 6px; position: relative; aspect-ratio: 4 / 3; margin-bottom: var(--space-3); background: var(--dither-lo); }
.club__art canvas {
  --c: calc(var(--chamfer) - 0.586 * var(--frame));
  position: absolute; inset: var(--frame); width: calc(100% - 2 * var(--frame)); height: calc(100% - 2 * var(--frame)); image-rendering: pixelated;
  clip-path: polygon(var(--c) 0, 100% 0, 100% calc(100% - var(--c)), calc(100% - var(--c)) 100%, 0 100%, 0 var(--c));
}
/* Once the dither settles to the photo, scale it smoothly. */
canvas.is-photo { image-rendering: auto; }
.club__cell .index { display: flex; align-items: center; gap: var(--space-2); }

/* ---- Join (mailing list) --------------------------------------------------------- */
.join__grid { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: var(--hairline); background: var(--line); }
.join__grid > * { background: var(--ground); min-width: 0; }
.join__art { position: relative; min-height: 560px; }
.join__art canvas { position: absolute; inset: 0; width: 100%; height: 100%; image-rendering: pixelated; }
.join__art figcaption { position: absolute; left: var(--gutter); bottom: var(--space-5); font: 400 10px/1.2 var(--font-mono); color: var(--muted-on-ink); letter-spacing: 0.06em; text-transform: uppercase; }
.join__body { padding: var(--space-9) var(--gutter) var(--space-8); display: flex; flex-direction: column; gap: var(--space-5); }
.form { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--space-5); margin-top: var(--space-3); min-width: 0; }
.form__row { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-5); }
.field { display: grid; gap: var(--space-2); align-content: start; min-width: 0; min-inline-size: 0; }
.field label, .field legend { font: 400 var(--fs-micro)/1 var(--font-mono); letter-spacing: var(--track-label); text-transform: uppercase; color: var(--text-muted); padding: 0; }
.field input[type="email"], .field input[type="text"] {
  width: 100%; min-width: 0; min-height: var(--field-h); padding: 12px 0; border: 0; border-bottom: var(--hairline) solid var(--line);
  background: transparent; font-size: var(--fs-body); outline: none; border-radius: 0;
  transition: border-color var(--dur-fast) var(--ease-std);
}
.field input:focus { border-bottom-color: var(--accent); }
.field input:focus-visible { outline: none; box-shadow: 0 1px 0 0 var(--accent); }
.field input[aria-invalid="true"] { border-bottom-color: var(--accent); }
.field__error { font: 400 var(--fs-micro)/1.3 var(--font-mono); color: var(--accent); letter-spacing: 0.04em; min-height: 1em; }
fieldset.field { border: 0; margin: 0; padding: 0; }
.checks { display: flex; flex-wrap: wrap; gap: var(--space-2); margin-top: var(--space-2); }
.check { position: relative; }
.check input { position: absolute; opacity: 0; inset: 0; margin: 0; cursor: pointer; }
.check span { display: inline-flex; align-items: center; gap: var(--space-2); height: 36px; padding: 0 var(--space-3); box-shadow: inset 0 0 0 var(--hairline) var(--line); font: 400 var(--fs-micro)/1 var(--font-mono); letter-spacing: var(--track-label); text-transform: uppercase; }
.check span::before { content: ""; width: 9px; height: 9px; box-shadow: inset 0 0 0 1px currentColor; }
.check input:checked + span { box-shadow: inset 0 0 0 var(--hairline) var(--text); }
.check input:checked + span::before { background: var(--accent); box-shadow: none; }
.check input:focus-visible + span { outline: 2px solid var(--focus); outline-offset: 2px; }
.form__foot { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-4); }
.form__fine { font: 400 var(--fs-micro)/1.5 var(--font-mono); color: var(--text-muted); letter-spacing: 0.02em; max-width: 36em; }
.form__status { font: 400 var(--fs-label)/1.5 var(--font-mono); letter-spacing: 0.02em; }
.form__trap { position: absolute; left: -10000px; width: 1px; height: 1px; overflow: hidden; } /* spam trap: people never see or fill it */
.form__done { display: grid; gap: var(--space-3); padding: var(--space-5); box-shadow: inset 0 0 0 var(--hairline) var(--line); }

/* ---- Facebook row & footer ----------------------------------------------------------- */
.bigrow { display: flex; align-items: center; justify-content: space-between; gap: var(--space-5); padding: var(--space-7) var(--gutter); text-decoration: none; }
.bigrow .h3 { transition: translate var(--dur-sweep) var(--ease-sweep); }
.bigrow:hover .h3 { translate: 8px 0; }
.bigrow svg { width: 40px; height: 40px; flex: none; transition: translate var(--dur-sweep) var(--ease-sweep), rotate var(--dur-sweep) var(--ease-sweep); }
.bigrow:hover svg { translate: 4px -4px; }

.footer__grid { display: grid; grid-template-columns: minmax(0, 2fr) repeat(3, minmax(0, 1fr)); gap: var(--hairline); background: var(--line); border-top: var(--hairline) solid var(--line); }
.footer__grid > * { background: var(--ground); padding: var(--space-6) var(--gutter) var(--space-7); display: grid; gap: var(--space-3); align-content: start; }
.footer__grid a { text-decoration: none; }
.footer__grid a:hover { text-decoration: underline; }
.footer__grid ul { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--space-2); font-size: var(--fs-small); }
.footer__word { font-size: clamp(2.5rem, 1rem + 6.4vw, 7.5rem); line-height: 0.9; letter-spacing: -0.035em; padding: var(--space-8) var(--gutter) var(--space-6); }
.footer__credits { padding: var(--space-5) var(--gutter); border-top: var(--hairline) solid var(--line); font: 400 var(--fs-micro)/1.6 var(--font-mono); color: var(--text-muted); letter-spacing: 0.02em; display: flex; flex-wrap: wrap; justify-content: space-between; gap: var(--space-4); }
.footer__credits a { color: inherit; }

/* ---- Event page ---------------------------------------------------------------------- */
.ev-head { display: grid; gap: var(--space-5); padding: var(--space-8) var(--gutter) var(--space-7); }
.ev-head .back { justify-self: start; }
.ev-meta { grid-template-columns: repeat(5, minmax(0, 1fr)); }
.ev-meta .cell { display: grid; gap: var(--space-2); padding: var(--space-5) var(--gutter); align-content: start; }
.ev-meta .label { color: var(--text-muted); }
.ev-meta .v { font-size: 1.25rem; line-height: 1.2; }
.ev-main { display: grid; grid-template-columns: minmax(0, var(--golden-fr)) minmax(0, 1fr); gap: var(--hairline); background: var(--line); border-top: var(--hairline) solid var(--line); }
.ev-main > * { background: var(--ground); min-width: 0; }
.ev-figure { margin: 0; position: relative; }
.ev-figure__frame { position: relative; aspect-ratio: 16 / 10; background: var(--dither-lo); overflow: hidden; }
.ev-figure__frame canvas, .ev-figure__frame img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.ev-figure__frame canvas { image-rendering: pixelated; }
.ev-figure__frame img { opacity: 0; transition: opacity 500ms var(--ease-std); }
.ev-figure.is-original img { opacity: 1; }
/* A contained image (the default Andromeda plate) is shown whole, centred on the dither ground. */
.feature__media canvas.is-contain, .ev-figure__frame canvas.is-contain { inset: 0; margin: auto; width: auto; height: 100%; max-width: 100%; aspect-ratio: 1; }
.ev-figure__frame img.is-contain { object-fit: contain; }
.ev-figure figcaption { display: flex; justify-content: space-between; gap: var(--space-4); align-items: center; padding: var(--space-3) var(--gutter); border-top: var(--hairline) solid var(--line); font: 400 var(--fs-micro)/1.4 var(--font-mono); color: var(--text-muted); letter-spacing: 0.04em; }
.ev-figure figcaption button { background: none; border: 0; padding: 0; color: var(--text); font: inherit; text-transform: uppercase; letter-spacing: var(--track-label); text-decoration: underline; text-underline-offset: 3px; }
.ev-body { padding: var(--space-7) var(--gutter) var(--space-8); display: grid; gap: var(--space-5); align-content: start; }
.prose { display: grid; gap: var(--space-4); max-width: 36em; }
.prose h3 { font-size: 1.5rem; margin-top: var(--space-3); }
.prose ul { margin: 0; padding-left: 1.1em; display: grid; gap: var(--space-2); }
.prose a { color: var(--text); text-decoration-color: var(--accent); }
.ev-side { display: grid; align-content: start; }
.ev-side > * { padding: var(--space-5) var(--gutter); border-bottom: var(--hairline) solid var(--line); }
.ev-side .label { color: var(--text-muted); margin-bottom: var(--space-3); display: block; }
.ev-actions { display: grid; gap: var(--space-3); }
.ev-actions .btn { width: 100%; justify-content: space-between; }
.speaker { display: grid; grid-template-columns: 88px minmax(0, 1fr); gap: var(--space-4); align-items: start; }
.speaker__photo { width: 88px; aspect-ratio: 1; background: var(--dither-lo); position: relative; overflow: hidden; clip-path: polygon(8px 0, 100% 0, 100% calc(100% - 8px), calc(100% - 8px) 100%, 0 100%, 0 8px); }
.speaker__photo canvas { width: 100%; height: 100%; image-rendering: pixelated; }
.speaker__mono { width: 88px; aspect-ratio: 1; display: grid; place-items: center; font-size: 2rem; letter-spacing: -0.02em; }
.speaker b { font-weight: 400; font-size: 1.25rem; display: block; }
.ev-moon { display: grid; grid-template-columns: 120px minmax(0, 1fr); gap: var(--space-4); align-items: center; }
/* Until the event renders, hold the page at about its final height so the incoming page is
   scrollable from its first paint and the scrollbar never drops out mid-transition. */
.ev-loading { min-height: 1300px; }
@media (max-width: 1279px) { .ev-loading { min-height: 2000px; } }
@media (max-width: 767px) { .ev-loading { min-height: 1900px; } }
.ev-moon .plate { --plate-size: 120px; --chamfer: 8px; }
.ev-nav { grid-template-columns: 1fr 1fr; }
.ev-nav a { display: grid; gap: var(--space-2); padding: var(--space-6) var(--gutter); text-decoration: none; }
.ev-nav a:last-child { text-align: right; }
.ev-missing { padding: var(--space-9) var(--gutter); display: grid; gap: var(--space-4); justify-items: start; }

/* ---- Page transition (panel rises with the destination label) ----------------------- */
.transition { position: fixed; inset: 0; z-index: 90; pointer-events: none; overflow: hidden; }
.transition__panel { position: absolute; inset: 0; background: var(--accent); --pattern: color-mix(in srgb, #000 16%, var(--accent)); translate: 0 100%; display: grid; place-items: center; }
/* One bracketed eyebrow, e.g. [ OPENING DETAILS ]; the destination word comes from the link's data-transition. */
.transition__label { font-size: clamp(0.875rem, 0.7rem + 0.5vw, 1.25rem); color: var(--ink-900); }
html.is-leaving .transition__panel { translate: 0 0; transition: translate 650ms var(--ease-sweep); }
html.is-entering .transition__panel { translate: 0 0; }
html.is-entered .transition__panel { translate: 0 -100%; transition: translate 800ms var(--ease-sweep) 120ms; }

/* ---- Reveal motion -------------------------------------------------------------------- */
/* Hidden states apply only once JS marks the document (html.js) and motion is allowed. */
@media (prefers-reduced-motion: no-preference) {
  html.js [data-reveal="rise"] { opacity: 0; translate: 0 28px; transition: opacity 700ms var(--ease-std), translate var(--dur-reveal) var(--ease-rise); transition-delay: calc(var(--d, 0) * 1ms); }
  html.js [data-reveal="rise"].is-in { opacity: 1; translate: 0 0; }

  html.js [data-reveal="lines"] .w { display: inline-block; overflow: hidden; vertical-align: top; padding-bottom: 0.08em; margin-bottom: -0.08em; }
  html.js [data-reveal="lines"] .w > span { display: inline-block; translate: 0 105%; transition: translate var(--dur-reveal) var(--ease-rise); transition-delay: calc(var(--i, 0) * var(--stagger)); }
  html.js [data-reveal="lines"].is-in .w > span { translate: 0 0; }

  /* Block wipe — every line fragment gets its own accent bar (box-decoration-break). */
  html.js [data-reveal="block"] .blk { color: transparent; background: linear-gradient(var(--accent), var(--accent)) 0 50% / 0% 100% no-repeat; -webkit-box-decoration-break: clone; box-decoration-break: clone; }
  html.js [data-reveal="block"].is-in .blk { animation: blk 1100ms var(--ease-sweep) forwards; animation-delay: calc(var(--d, 0) * 1ms); }

  html.js [data-reveal="rule"]::after { content: ""; position: absolute; left: 0; right: 0; top: -1px; height: 1px; background: var(--text); transform-origin: 0 50%; scale: 0 1; transition: scale 1200ms var(--ease-sweep), opacity 600ms 1200ms; }
  html.js [data-reveal="rule"].is-in::after { scale: 1 1; opacity: 0; }

  html.js .roll { display: inline-flex; overflow: hidden; height: 1em; line-height: 1; vertical-align: -0.08em; }
  html.js .roll__col { display: flex; flex-direction: column; transition: translate 1300ms var(--ease-rise); transition-delay: calc(var(--i, 0) * 70ms); }
  html.js .roll__col span { height: 1em; display: block; text-align: center; }
}
@keyframes blk {
  0%   { background-size: 0% 100%; background-position: 0 50%; color: transparent; }
  45%  { background-size: 100% 100%; background-position: 0 50%; color: transparent; }
  46%  { background-size: 100% 100%; background-position: 100% 50%; color: inherit; }
  100% { background-size: 0% 100%; background-position: 100% 50%; color: inherit; }
}

/* ---- Responsive ------------------------------------------------------------------------ */
@media (max-width: 1240px) {
  .nav__night .txt { display: none; }
  .nav__links a, .nav__end > * { white-space: nowrap; padding: 0 var(--space-4); }
  .event-row > a { grid-template-columns: 80px 132px minmax(0, 1fr) 170px 120px 20px; }
  .event-row__moon { display: none; }
}
@media (max-width: 1023px) {
  .nav__links { display: none; }
  .nav__menu { display: flex !important; }
  .nav__sheet { position: fixed; inset: var(--nav-h) 0 0; background: var(--ground); z-index: 49; display: grid; align-content: start; border-top: var(--hairline) solid var(--line); }
  .nav__sheet[hidden] { display: none; }
  .nav__sheet a { padding: var(--space-5) var(--gutter); border-bottom: var(--hairline) solid var(--line); font-size: var(--fs-h3); text-decoration: none; }
  .hero__grid { grid-template-columns: minmax(0, 1fr); }
  .hero__copy { padding-top: var(--space-7); }
  .hero__actions { flex-wrap: wrap; }
  .feature, .visit__body, .join__grid, .ev-main { grid-template-columns: minmax(0, 1fr); }
  .feature__media { min-height: 300px; }
  .map { min-height: 460px; }
  .join__art { min-height: 300px; }
  .club__cells { grid-template-columns: minmax(0, 1fr); }
  .footer__grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .footer__grid > :first-child { grid-column: 1 / -1; }
  .ev-meta { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .ev-meta > :last-child:nth-child(3n+2) { grid-column: span 2; }
  .ev-meta > :last-child:nth-child(3n+1) { grid-column: 1 / -1; }
  .section-head--split { grid-template-columns: minmax(0, 1fr); align-items: start; }
  .event-row > a { grid-template-columns: 72px minmax(0, 1fr) 20px; grid-template-areas: "date kind arrow" "date title arrow" "date meta arrow" "date status arrow"; row-gap: var(--space-2); align-items: start; }
  .event-row__date { grid-area: date; }
  .event-row__kind { grid-area: kind; }
  .event-row__main { grid-area: title; }
  .event-row__meta { grid-area: meta; }
  .event-row__status { grid-area: status; }
  .event-row__arrow { grid-area: arrow; align-self: center; }
}
@media (max-width: 767px) {
  .nav__word { font-size: 1rem; }
  .nav__night .txt, .nav__cta .txt-long { display: none; }
  .nav__cta .txt-short { display: inline; }
  .nav__end > * { padding: 0 var(--space-4); }
  .nav__logo { padding: 0 var(--space-4); border-right: 0; }
  .observatory__plate { padding: var(--space-4); }
  .plate__scrub { left: var(--space-4); right: var(--space-4); bottom: calc(var(--space-4) + var(--space-5)); }
  .events-more { display: flex; justify-content: space-between; flex-wrap: wrap; }
  .strip { grid-template-columns: minmax(0, 1fr); }
  .form__row { grid-template-columns: minmax(0, 1fr); }
  .footer__grid { grid-template-columns: minmax(0, 1fr); }
  .ev-meta { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .ev-meta > :last-child:nth-child(n) { grid-column: auto; }
  .ev-meta > :last-child:nth-child(odd) { grid-column: 1 / -1; }
  .ev-nav { grid-template-columns: minmax(0, 1fr); }
  .ev-nav a:last-child { text-align: left; }
  .site-panel__top { height: auto; }
  .bigrow svg { width: 28px; height: 28px; }
  .map__hint { display: none; }
}

@media (max-width: 479px) {
  .nav__logo { gap: var(--space-2); padding: 0 var(--space-3); }
  .nav__mark { width: 32px; height: 32px; }
  /* The hero buttons only stack where the pair can't fit; stacked, they run full width. */
  .hero__actions .btn { flex: 1 1 auto; }
}

/* Night mode — red-light: canvases re-render in red; the map is tinted by filter. */
html[data-night] .pin__core, html[data-night] .map__pager { background: var(--night-ink); }
html[data-night] .ev-figure__frame img, html[data-night] canvas.is-photo, html[data-night] .nav__mark { filter: grayscale(1) sepia(1) hue-rotate(-50deg) saturate(4) brightness(.6); }
html[data-night] .plate__mark { color: var(--night-dim); }
