@import url("https://fonts.googleapis.com/css2?family=Archivo+Black&family=Inter:wght@400;500;600;700&family=Space+Mono:wght@400;700&display=swap");

/* ==========================================================================
   ACID — EPK V3 template, tech/dubstep/acid electro DJ+producer
   pageLayout: full_bleed | hero.layoutId: centered_poster
   bookingCtaPlacement: inside_hero | motionPreset: immersive
   Black & white screen-printed flyer register, single acid-green accent.
   Signature: (1) chromatic-aberration glitch on the hero title, driven by
   animated text-shadow directly on the real <h1> text node — the renderer
   (renderV3Hero() in src/templates-v3/html.ts) emits ap-v3-hero-title as a
   single flat text node with no data-text attribute and no duplicated
   layer, so a content:attr(data-text) ::before/::after technique (as used
   in the static mockup) has no markup to key off of. text-shadow needs no
   extra DOM. (2) torn/serrated-edge divider between every section after
   the hero, via a clip-path sawtooth ::before on .ap-v3-section itself.
   Distinct from NOX's grain + double-impression signature by design.
   Hard zero-radius on all real UI chrome; no organic pseudo-blob exception
   needed — the torn edge is clip-path, not border-radius.
   ========================================================================== */

.actpub.theme-v3_acid {
  --bg: #060606;
  --bg-raised: #101010;
  --bg-raised-2: #161616;
  --ink: #edede6;
  --ink-dim: #8c8c86;
  --ink-faint: #4a4a46;
  --acid: #bfff3d;
  --acid-dim: #7c9e2a;
  --hairline: #2a2a26;
  --hairline-strong: #3e3e38;

  --ac-content-w: 1180px;
  --ac-px: clamp(1.25rem, 5vw, 4rem);
  --ac-section-y: 6.5rem;
  --ac-section-y-mobile: 3.25rem;

  background: var(--bg);
  color: var(--ink);
  font-family: "Inter", -apple-system, sans-serif;
  min-height: 100vh;
  position: relative;
  overflow-x: hidden;
}

.actpub.theme-v3_acid * {
  border-radius: 0 !important;
}

.actpub.theme-v3_acid .ap-container {
  max-width: none;
  padding: 0;
}

/* -------------------------------------------------------------------------
   Ambient grain + scanlines overlay (motionPreset: immersive)
   ------------------------------------------------------------------------- */

.actpub.theme-v3_acid::before {
  content: "";
  position: fixed;
  inset: 0;
  z-index: 999;
  pointer-events: none;
  opacity: 0.05;
  mix-blend-mode: overlay;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='140' height='140'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/></filter><rect width='100%25' height='100%25' filter='url(%23n)'/></svg>");
  animation: acidGrainShift 8s steps(8) infinite;
}

.actpub.theme-v3_acid::after {
  content: "";
  position: fixed;
  inset: 0;
  z-index: 998;
  pointer-events: none;
  opacity: 0.3;
  background: repeating-linear-gradient(
    to bottom,
    rgba(255, 255, 255, 0.025) 0px,
    rgba(255, 255, 255, 0.025) 1px,
    transparent 1px,
    transparent 3px
  );
}

@keyframes acidGrainShift {
  0% {
    transform: translate(0, 0);
  }
  20% {
    transform: translate(-2%, 3%);
  }
  40% {
    transform: translate(3%, -1%);
  }
  60% {
    transform: translate(-1%, -3%);
  }
  80% {
    transform: translate(2%, 2%);
  }
  100% {
    transform: translate(0, 0);
  }
}

@media (prefers-reduced-motion: reduce) {
  .actpub.theme-v3_acid::before {
    animation: none !important;
  }
}

/* -------------------------------------------------------------------------
   Torn/serrated edge divider — signature element #2. Applied to every
   section after the hero via a clip-path sawtooth ::before; the fill color
   is set per-section (--ac-torn-bg) so the tear reads as belonging to the
   section it sits on top of.
   ------------------------------------------------------------------------- */

.actpub.theme-v3_acid .ap-v3-section:not(.ap-v3-section--hero) {
  --ac-torn-bg: var(--bg);
  position: relative;
}

.actpub.theme-v3_acid .ap-v3-section:not(.ap-v3-section--hero)::before {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  top: -1px;
  height: 14px;
  background: var(--ac-torn-bg);
  clip-path: polygon(
    0% 100%,
    3% 20%,
    7% 90%,
    11% 10%,
    16% 80%,
    21% 15%,
    26% 95%,
    31% 25%,
    36% 85%,
    41% 5%,
    46% 75%,
    51% 30%,
    56% 90%,
    61% 15%,
    66% 80%,
    71% 10%,
    76% 95%,
    81% 20%,
    86% 85%,
    91% 5%,
    96% 75%,
    100% 100%
  );
  pointer-events: none;
  z-index: 3;
}

/* -------------------------------------------------------------------------
   Nav — zero baseline layout, template fully owns it
   ------------------------------------------------------------------------- */

.actpub.theme-v3_acid .ap-v3-site-nav {
  display: flex;
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  z-index: 500;
  align-items: center;
  justify-content: space-between;
  gap: 1.25rem;
  padding: 18px var(--ac-px);
  background: rgba(6, 6, 6, 0.82);
  backdrop-filter: blur(6px);
  border-bottom: 1px solid var(--hairline);
}

.actpub.theme-v3_acid .ap-v3-site-nav-brand {
  font-family: "Archivo Black", "Arial Black", sans-serif;
  font-size: 1.05rem;
  letter-spacing: 0.01em;
  text-transform: uppercase;
  color: var(--ink);
  text-decoration: none;
}

.actpub.theme-v3_acid .ap-v3-site-nav-links {
  display: none;
  gap: 24px;
}

.actpub.theme-v3_acid .ap-v3-site-nav-links a {
  font-family: "Space Mono", monospace;
  font-size: 0.7rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ink-dim);
  text-decoration: none;
  transition: color 0.2s ease;
}

.actpub.theme-v3_acid .ap-v3-site-nav-links a:hover {
  color: var(--acid);
}

.actpub.theme-v3_acid .ap-v3-site-nav-cta {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  font-family: "Space Mono", monospace;
  font-size: 0.68rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  padding: 0.55rem 1rem;
  border: 1px solid var(--acid);
  color: var(--acid);
  text-decoration: none;
  transition: background 0.2s ease, color 0.2s ease;
}

.actpub.theme-v3_acid .ap-v3-site-nav-cta:hover {
  background: var(--acid);
  color: #060606;
}

@media (min-width: 721px) {
  .actpub.theme-v3_acid .ap-v3-site-nav-links {
    display: flex;
  }
}

@media (max-width: 1199px) {
  .actpub.ap-demo.theme-v3_acid .ap-v3-site-nav {
    top: var(--ap-demo-mobile-bar-h, 3.5rem);
  }
}

/* -------------------------------------------------------------------------
   Section rhythm + backgrounds
   ------------------------------------------------------------------------- */

.actpub.theme-v3_acid .ap-v3-section {
  margin: 0;
}

.actpub.theme-v3_acid .ap-v3-section:not(.ap-v3-section--hero) {
  padding: var(--ac-section-y) var(--ac-px);
}

.actpub.theme-v3_acid .ap-v3-section--practical-info,
.actpub.theme-v3_acid .ap-v3-section--media,
.actpub.theme-v3_acid .ap-v3-section--gallery,
.actpub.theme-v3_acid .ap-v3-section--gigs {
  background: var(--bg-raised);
  --ac-torn-bg: var(--bg-raised);
}

.actpub.theme-v3_acid .ap-v3-section--bio,
.actpub.theme-v3_acid .ap-v3-section--formulas,
.actpub.theme-v3_acid .ap-v3-section--quotes,
.actpub.theme-v3_acid .ap-v3-section--faq {
  background: var(--bg);
}

.actpub.theme-v3_acid .ap-v3-section--contact-cta {
  background: var(--acid);
  color: #060606;
  text-align: center;
  padding: 110px var(--ac-px);
  --ac-torn-bg: var(--acid);
}

.actpub.theme-v3_acid .ap-v3-section--footer {
  display: grid;
  gap: 0.6rem;
  justify-items: center;
  text-align: center;
  background: var(--bg);
  border-top: 1px solid var(--hairline);
  padding: 56px var(--ac-px) 40px;
}

/* -------------------------------------------------------------------------
   Hero — centered_poster. Full-bleed masked poster image, content anchored
   bottom, bookingCta inside hero, hookLinks as a ticket tab bar.
   ------------------------------------------------------------------------- */

.actpub.theme-v3_acid .ap-v3-section--hero {
  padding: 0;
  background: #000;
}

.actpub.theme-v3_acid .ap-v3-hero {
  position: relative;
  display: flex;
  align-items: flex-end;
  min-height: 100svh;
  overflow: hidden;
}

.actpub.theme-v3_acid .ap-v3-hero-centered {
  width: 100%;
  text-align: center;
  padding: 150px var(--ac-px) 64px;
}

.actpub.theme-v3_acid .ap-v3-hero-media {
  position: absolute;
  inset: 0;
  z-index: 0;
  overflow: hidden;
}

.actpub.theme-v3_acid .ap-v3-hero-media img,
.actpub.theme-v3_acid .ap-v3-hero-media video {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center 20%;
  filter: grayscale(1) contrast(1.35) brightness(0.62);
  opacity: 0.9;
}

.actpub.theme-v3_acid .ap-v3-hero-copy {
  position: relative;
  z-index: 2;
}

.actpub.theme-v3_acid .ap-v3-hero::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: none;
  background: linear-gradient(to top, #060606 0%, rgba(6, 6, 6, 0.55) 42%, rgba(6, 6, 6, 0.15) 65%, rgba(6, 6, 6, 0.55) 100%),
    linear-gradient(to right, #060606 0%, transparent 14%, transparent 86%, #060606 100%);
}

.actpub.theme-v3_acid .ap-v3-hero-meta {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: center;
  gap: 0.5rem;
  margin-bottom: 18px;
}

.actpub.theme-v3_acid .ap-v3-hero-style,
.actpub.theme-v3_acid .ap-v3-hero-location,
.actpub.theme-v3_acid .ap-v3-hero-lineup {
  font-family: "Space Mono", monospace;
  font-size: 0.78rem;
  letter-spacing: 0.3em;
  text-transform: uppercase;
  color: var(--acid);
}

.actpub.theme-v3_acid .ap-v3-hero-meta-separator {
  color: var(--ink-faint);
}

/* The renderer only ever emits a "·" separator span between locationLabel
   and lineupSummary — lineupSummary is hardcoded to null in the Render
   Model (see the spec's Hero contract), so that span never actually
   appears. There is no separator markup at all between styleLabel and
   locationLabel, so it's added here purely in CSS via an adjacent-sibling
   ::before, which only fires when both spans are actually present. */
.actpub.theme-v3_acid .ap-v3-hero-style + .ap-v3-hero-location::before {
  content: "·";
  margin-right: 0.5rem;
  color: var(--ink-faint);
}

.actpub.theme-v3_acid .ap-v3-hero-title {
  display: inline-block;
  margin: 0;
  font-family: "Archivo Black", "Arial Black", sans-serif;
  text-transform: uppercase;
  color: var(--ink);
  font-size: clamp(3.4rem, 12vw, 8.4rem);
  line-height: 0.86;
  letter-spacing: -0.01em;
}

/* Combine with the shared hero-intro fade-in (apV3HeroIntro) instead of
   replacing it outright — a plain `animation: acidGlitchShift ...` shorthand
   would override the shared rule's animation and leave opacity permanently
   at 0 (the shared rule sets `opacity: 0` and relies on its own animation to
   bring it to 1). See v3_iron_veil for the same established pattern. */
.actpub.theme-v3_acid .ap-v3-hero-title.ap-v3-hero-intro {
  animation-name: apV3HeroIntro, acidGlitchShift;
  animation-duration: var(--ap-v3-hero-intro-duration, 850ms), 7s;
  animation-timing-function: var(--ap-v3-hero-intro-ease, ease-out), ease;
  animation-fill-mode: both, none;
  animation-iteration-count: 1, infinite;
}

/* Chromatic-aberration glitch, driven purely by animated text-shadow on the
   real text node — see file header note for why (no data-text markup). */
@keyframes acidGlitchShift {
  0%,
  91%,
  100% {
    text-shadow: none;
    transform: translate(0, 0);
  }
  92% {
    text-shadow: 3px 0 rgba(255, 43, 77, 0.85), -3px 0 rgba(43, 224, 255, 0.85);
    transform: translate(1px, -1px);
  }
  93% {
    text-shadow: -3px 1px rgba(255, 43, 77, 0.85), 3px -1px rgba(43, 224, 255, 0.85);
    transform: translate(-1px, 0);
  }
  94% {
    text-shadow: 2px -1px rgba(255, 43, 77, 0.8), -2px 1px rgba(43, 224, 255, 0.8);
    transform: translate(1px, 1px);
  }
  95% {
    text-shadow: none;
    transform: translate(0, 0);
  }
  96% {
    text-shadow: -2px 0 rgba(255, 43, 77, 0.7), 2px 0 rgba(43, 224, 255, 0.7);
    transform: translate(-1px, 0);
  }
  97%,
  100% {
    text-shadow: none;
    transform: translate(0, 0);
  }
}

@media (prefers-reduced-motion: reduce) {
  .actpub.theme-v3_acid .ap-v3-hero-title {
    animation: none !important;
  }
}

.actpub.theme-v3_acid .ap-v3-hero-tagline {
  max-width: 32rem;
  margin: 22px auto 0;
  font-family: "Inter", sans-serif;
  font-weight: 500;
  font-size: clamp(1rem, 1.6vw, 1.25rem);
  color: var(--ink-dim);
  line-height: 1.5;
}

.actpub.theme-v3_acid .ap-v3-hero-booking {
  display: inline-block;
  margin-top: 34px;
  padding: 17px 46px;
  font-family: "Space Mono", monospace;
  font-size: 0.82rem;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  background: var(--acid);
  color: #060606;
  font-weight: 700;
  border: 1px solid var(--acid);
  text-decoration: none;
  transition: background 0.2s ease, color 0.2s ease;
}

.actpub.theme-v3_acid .ap-v3-hero-booking:hover,
.actpub.theme-v3_acid .ap-v3-hero-booking:focus-visible {
  background: transparent;
  color: var(--acid);
}

.actpub.theme-v3_acid .ap-v3-hero-hooks {
  margin-top: 46px;
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 0;
  border-top: 1px solid var(--hairline-strong);
}

.actpub.theme-v3_acid .ap-v3-hero-hook {
  font-family: "Space Mono", monospace;
  font-size: 0.68rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ink-faint);
  padding: 14px 18px;
  border-right: 1px solid var(--hairline-strong);
  text-decoration: none;
  transition: color 0.2s ease, background 0.2s ease;
}

.actpub.theme-v3_acid .ap-v3-hero-hook:last-child {
  border-right: none;
}

.actpub.theme-v3_acid .ap-v3-hero-hook:hover {
  color: var(--acid);
  background: var(--bg-raised);
}

@media (max-width: 640px) {
  .actpub.theme-v3_acid .ap-v3-hero-hook {
    padding: 10px 12px;
  }
}

/* -------------------------------------------------------------------------
   Practical info — no baseline layout at all, template owns every hook.
   ------------------------------------------------------------------------- */

.actpub.theme-v3_acid .ap-v3-practical-info,
.actpub.theme-v3_acid .ap-v3-practical-shell {
  width: min(100%, var(--ac-content-w));
  margin: 0 auto;
}

.actpub.theme-v3_acid .ap-v3-practical-main {
  display: grid;
  gap: 2.2rem;
  min-width: 0;
}

.actpub.theme-v3_acid .ap-v3-practical-title {
  margin: 0;
  font-family: "Archivo Black", "Arial Black", sans-serif;
  text-transform: uppercase;
  font-size: clamp(1.7rem, 3.4vw, 2.6rem);
  line-height: 1.05;
  color: var(--ink);
}

.actpub.theme-v3_acid .ap-v3-practical-list,
.actpub.theme-v3_acid .ap-v3-practical-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(11rem, 1fr));
  gap: 1px;
  background: var(--hairline);
  border: 1px solid var(--hairline);
  margin: 0;
  padding: 0;
  list-style: none;
}

.actpub.theme-v3_acid .ap-v3-practical-item {
  background: var(--bg-raised);
  padding: 24px 20px;
  margin: 0;
}

.actpub.theme-v3_acid .ap-v3-practical-label {
  display: block;
  font-family: "Space Mono", monospace;
  font-size: 0.66rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--acid);
  margin: 0 0 8px;
}

.actpub.theme-v3_acid .ap-v3-practical-value {
  font-family: "Inter", sans-serif;
  font-weight: 600;
  font-size: 1rem;
  color: var(--ink);
  margin: 0;
}

.actpub.theme-v3_acid .ap-v3-availability-block {
  padding-top: 1.7rem;
  border-top: 1px dashed var(--hairline-strong);
}

.actpub.theme-v3_acid .ap-v3-availability-title {
  margin: 0 0 1.1rem;
  font-family: "Space Mono", monospace;
  font-size: 0.7rem;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--ink-dim);
}

.actpub.theme-v3_acid .ap-v3-availability-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.actpub.theme-v3_acid .ap-v3-availability-item {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
  padding: 0.4rem 0;
}

.actpub.theme-v3_acid .ap-v3-availability-month {
  font-family: "Space Mono", monospace;
  font-size: 0.72rem;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--ink);
}

.actpub.theme-v3_acid .ap-v3-availability-row {
  display: flex;
  align-items: center;
  gap: 14px;
}

.actpub.theme-v3_acid .ap-v3-availability-gauge {
  display: grid;
  grid-template-columns: repeat(10, minmax(0, 1fr));
  gap: 3px;
  flex: 1 1 auto;
}

.actpub.theme-v3_acid .ap-v3-availability-cell {
  display: block;
  height: 16px;
  background: var(--hairline-strong);
}

.actpub.theme-v3_acid .ap-v3-availability-cell--filled {
  background: var(--acid);
}

.actpub.theme-v3_acid .ap-v3-availability-state {
  font-family: "Space Mono", monospace;
  font-size: 0.66rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--ink-faint);
  flex: 0 0 10.5rem;
  width: 10.5rem;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.actpub.theme-v3_acid .ap-v3-practical-aside {
  position: relative;
  aspect-ratio: 4 / 5;
  overflow: hidden;
  background: var(--bg-raised-2);
  min-width: 0;
}

/* Standing rule (overrides the brief on this point): on mobile, image slots
   always come before their section's text, regardless of what the brief's
   desktop-oriented "above/below" wording says. Needs its own display:grid
   on mobile too — this shell has no baseline display:grid at any width,
   unlike bio/gigs, so order:-1 would silently do nothing without it. */
@media (max-width: 880px) {
  .actpub.theme-v3_acid .ap-v3-practical-shell--with-aside {
    display: grid;
    gap: 28px;
  }

  .actpub.theme-v3_acid .ap-v3-practical-aside {
    order: -1;
  }
}

.actpub.theme-v3_acid .ap-v3-practical-aside img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  filter: grayscale(1) contrast(1.2);
}

@media (min-width: 881px) {
  .actpub.theme-v3_acid .ap-v3-practical-shell--with-aside {
    display: grid;
    grid-template-columns: 1.1fr 0.9fr;
    gap: 64px;
    align-items: start;
  }

  .actpub.theme-v3_acid .ap-v3-practical-shell--with-aside .ap-v3-practical-aside {
    position: sticky;
    top: 7rem;
  }
}

/* -------------------------------------------------------------------------
   Bio — single flat <p>, image left on desktop / above on mobile (order:-1
   at every width places the aside before the main text in both cases).
   ------------------------------------------------------------------------- */

.actpub.theme-v3_acid .ap-v3-bio-shell {
  width: min(100%, var(--ac-content-w));
  margin: 0 auto;
  gap: 2rem;
}

.actpub.theme-v3_acid .ap-v3-bio-main h2,
.actpub.theme-v3_acid .ap-v3-bio-tagline {
  margin: 0 0 22px;
  font-family: "Archivo Black", "Arial Black", sans-serif;
  text-transform: uppercase;
  font-size: clamp(1.6rem, 2.6vw, 2.1rem);
  color: var(--ink);
}

.actpub.theme-v3_acid .ap-v3-bio-text {
  max-width: 42rem;
  font-family: "Inter", sans-serif;
  font-size: 1.08rem;
  line-height: 1.75;
  color: var(--ink-dim);
}

.actpub.theme-v3_acid .ap-v3-bio-aside {
  position: relative;
  aspect-ratio: 4 / 5;
  overflow: hidden;
  background: var(--bg-raised-2);
  order: -1;
}

.actpub.theme-v3_acid .ap-v3-bio-aside img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  filter: grayscale(1) contrast(1.2);
}

@media (min-width: 881px) {
  .actpub.theme-v3_acid .ap-v3-bio-shell--with-aside {
    grid-template-columns: 0.85fr 1.15fr;
    gap: 64px;
    align-items: center;
  }

  .actpub.theme-v3_acid .ap-v3-bio-shell--with-aside .ap-v3-bio-aside {
    position: sticky;
    top: 7rem;
  }
}

/* -------------------------------------------------------------------------
   Media
   ------------------------------------------------------------------------- */

.actpub.theme-v3_acid .ap-v3-media-shell {
  width: min(100%, var(--ac-content-w));
  margin: 0 auto;
  gap: 3rem;
}

.actpub.theme-v3_acid .ap-v3-media-eyebrow {
  margin: 0;
  font-family: "Space Mono", monospace;
  font-size: 0.72rem;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--acid);
}

.actpub.theme-v3_acid .ap-v3-media-title {
  margin: 0;
  font-family: "Archivo Black", "Arial Black", sans-serif;
  text-transform: uppercase;
  font-size: clamp(1.4rem, 2.4vw, 1.9rem);
  color: var(--ink);
}

.actpub.theme-v3_acid .ap-v3-video-player-stage {
  border: 1px solid var(--hairline-strong);
  background: #000;
}

.actpub.theme-v3_acid .ap-v3-video-player-title,
.actpub.theme-v3_acid .ap-v3-audio-player-title,
.actpub.theme-v3_acid .ap-v3-audio-card-title {
  font-family: "Archivo Black", "Arial Black", sans-serif;
  text-transform: uppercase;
  color: var(--ink);
}

.actpub.theme-v3_acid .ap-v3-video-player-provider {
  font-family: "Space Mono", monospace;
  font-size: 0.68rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ink-faint);
}

.actpub.theme-v3_acid .ap-v3-video-player-link,
.actpub.theme-v3_acid .ap-v3-audio-player-link,
.actpub.theme-v3_acid .ap-v3-audio-card-cta {
  font-family: "Space Mono", monospace;
  font-size: 0.72rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--acid);
  font-weight: 700;
  text-decoration: none;
}

.actpub.theme-v3_acid .ap-v3-video-thumb {
  border: 1px solid var(--hairline-strong);
  opacity: 0.5;
  filter: grayscale(1) contrast(1.2);
  transition: opacity 0.2s ease, border-color 0.2s ease, filter 0.2s ease;
}

.actpub.theme-v3_acid .ap-v3-video-thumb.is-active,
.actpub.theme-v3_acid .ap-v3-video-thumb:hover {
  opacity: 1;
  border-color: var(--acid);
  filter: grayscale(0.3) contrast(1.2);
}

.actpub.theme-v3_acid .ap-v3-audio-player--embed,
.actpub.theme-v3_acid .ap-v3-audio-player--fallback {
  padding: 1.2rem;
  background: var(--bg-raised-2);
  border: 1px solid var(--hairline-strong);
}

.actpub.theme-v3_acid .ap-v3-audio-player-eyebrow {
  font-family: "Space Mono", monospace;
  font-size: 0.68rem;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--acid);
}

.actpub.theme-v3_acid .ap-v3-audio-player-meta,
.actpub.theme-v3_acid .ap-v3-audio-player-duration,
.actpub.theme-v3_acid .ap-v3-audio-card-meta,
.actpub.theme-v3_acid .ap-v3-audio-card-duration {
  font-family: "Space Mono", monospace;
  font-size: 0.68rem;
  letter-spacing: 0.05em;
  color: var(--ink-faint);
}

.actpub.theme-v3_acid .ap-v3-audio-player-artwork,
.actpub.theme-v3_acid .ap-v3-audio-card-artwork-placeholder,
.actpub.theme-v3_acid .ap-v3-audio-card-artwork {
  background: linear-gradient(150deg, var(--acid-dim), #0a0a0a);
}

.actpub.theme-v3_acid .ap-v3-audio-card {
  background: var(--bg-raised-2);
  border-left: 3px solid transparent;
  padding: 16px 18px;
  transition: border-color 0.2s ease;
}

.actpub.theme-v3_acid .ap-v3-audio-card:hover,
.actpub.theme-v3_acid .ap-v3-audio-card--featured {
  border-left-color: var(--acid);
}

/* -------------------------------------------------------------------------
   Formulas — 3 cards, no per-card color (mono + accent), CSS counter badge.
   ------------------------------------------------------------------------- */

.actpub.theme-v3_acid .ap-v3-formulas-shell {
  width: min(100%, var(--ac-content-w));
  margin: 0 auto;
}

.actpub.theme-v3_acid .ap-v3-formulas-title {
  margin: 0;
  font-family: "Archivo Black", "Arial Black", sans-serif;
  text-transform: uppercase;
  font-size: clamp(1.7rem, 3.4vw, 2.6rem);
  color: var(--ink);
}

.actpub.theme-v3_acid .ap-v3-formulas-intro {
  margin: 0 0 1rem;
  max-width: 38rem;
  color: var(--ink-dim);
}

.actpub.theme-v3_acid .ap-v3-formulas-grid {
  gap: 1px;
  background: var(--hairline);
  border: 1px solid var(--hairline);
  grid-template-columns: repeat(3, 1fr);
  counter-reset: acid-formula;
}

.actpub.theme-v3_acid .ap-v3-formula-card {
  gap: 0;
  padding: 34px 28px;
  background: var(--bg-raised);
  border: 0;
  box-shadow: none;
  backdrop-filter: none;
  position: relative;
  counter-increment: acid-formula;
}

.actpub.theme-v3_acid .ap-v3-formula-card--featured {
  background: var(--bg-raised-2);
}

.actpub.theme-v3_acid .ap-v3-formula-card-head {
  position: relative;
}

.actpub.theme-v3_acid .ap-v3-formula-index {
  position: absolute;
  top: 0;
  right: 0;
  font-family: "Space Mono", monospace;
  font-size: 0.72rem;
  letter-spacing: 0.1em;
  color: var(--acid-dim);
}

.actpub.theme-v3_acid .ap-v3-formula-index::before {
  content: counter(acid-formula, decimal-leading-zero);
}

.actpub.theme-v3_acid .ap-v3-formula-featured {
  width: fit-content;
  margin: 0 0 0.8rem;
  padding: 4px 9px;
  font-family: "Space Mono", monospace;
  font-size: 0.62rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  background: var(--acid);
  color: #060606;
}

.actpub.theme-v3_acid .ap-v3-formula-featured--placeholder {
  visibility: hidden;
}

.actpub.theme-v3_acid .ap-v3-formula-title-row {
  align-items: flex-start;
  padding-right: 2.4rem;
  margin-bottom: 0.6rem;
}

.actpub.theme-v3_acid .ap-v3-formula-title {
  margin: 0;
  font-family: "Archivo Black", "Arial Black", sans-serif;
  text-transform: uppercase;
  font-size: 1.2rem;
  color: var(--ink);
}

.actpub.theme-v3_acid .ap-v3-formula-price {
  font-family: "Space Mono", monospace;
  font-weight: 700;
  font-size: 1rem;
  color: var(--ink);
  background: none;
  border: 0;
  padding: 0;
}

.actpub.theme-v3_acid .ap-v3-formula-description {
  margin: 0 0 1.4rem;
  color: var(--ink-dim);
  font-size: 0.94rem;
  line-height: 1.6;
}

.actpub.theme-v3_acid .ap-v3-formula-meta {
  gap: 0.6rem;
  padding-top: 0.6rem;
  margin-bottom: 1.2rem;
  border-top: 1px solid var(--hairline-strong);
}

.actpub.theme-v3_acid .ap-v3-formula-detail-label {
  font-family: "Space Mono", monospace;
  font-size: 0.66rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ink-faint);
}

.actpub.theme-v3_acid .ap-v3-formula-stat {
  font-family: "Space Mono", monospace;
  font-size: 0.78rem;
  font-weight: 700;
  color: var(--ink);
}

.actpub.theme-v3_acid .ap-v3-formula-cta {
  width: fit-content;
  min-height: 0;
  border: 1px solid var(--acid);
  background: transparent;
  color: var(--acid);
  font-family: "Space Mono", monospace;
  font-size: 0.72rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  padding: 13px 20px;
  transition: background 0.2s ease, color 0.2s ease;
}

.actpub.theme-v3_acid .ap-v3-formula-cta:hover,
.actpub.theme-v3_acid .ap-v3-formula-cta:focus-visible {
  background: var(--acid);
  color: #060606;
}

@media (max-width: 880px) {
  .actpub.theme-v3_acid .ap-v3-formulas-grid {
    display: flex;
    grid-template-columns: none;
    overflow-x: auto;
    overflow-y: hidden;
    gap: 1px;
    scroll-snap-type: x proximity;
    padding-bottom: 0.5rem;
    min-width: 0;
  }

  .actpub.theme-v3_acid .ap-v3-formula-card {
    flex: 0 0 82%;
    scroll-snap-align: start;
  }
}

/* -------------------------------------------------------------------------
   Gallery — full-bleed dense grid, first item featured 2x2, desaturated +
   hover zoom. Mobile is always a horizontal-scroll carousel (mandatory —
   never a stacked/2-col grid at true mobile widths, even though the desktop
   treatment is a custom dense grid).
   ------------------------------------------------------------------------- */

.actpub.theme-v3_acid .ap-v3-section--gallery {
  padding-left: 0;
  padding-right: 0;
}

.actpub.theme-v3_acid .ap-v3-gallery-shell {
  width: 100%;
  margin: 0;
  gap: 0;
}

.actpub.theme-v3_acid .ap-v3-gallery-shell > h2 {
  margin: 0 0 24px;
  padding: 0 var(--ac-px);
  font-family: "Archivo Black", "Arial Black", sans-serif;
  text-transform: uppercase;
  font-size: clamp(1.7rem, 3.4vw, 2.6rem);
  color: var(--ink);
}

.actpub.theme-v3_acid .ap-v3-gallery-frame {
  padding: 0;
  min-width: 0;
}

.actpub.theme-v3_acid .ap-v3-gallery {
  gap: 6px;
  /* .ap-v3-gallery is itself a grid item of .ap-v3-gallery-frame (baseline
     display:grid). Grid items default to min-width:auto, which lets a flex
     child's content dictate the track size instead of respecting the
     container's own width — this silently defeats overflow-x:auto on
     mobile (the strip never scrolls, items end up wrapping/stacking
     instead of peeking sideways) and .actpub's overflow-x:hidden then just
     clips whatever tries to escape. min-width:0 forces it to actually
     respect the grid cell's width so the internal scroll container works. */
  min-width: 0;
}

.actpub.theme-v3_acid .ap-v3-section:not(.ap-v3-section--layout-masonry) .ap-v3-gallery-item {
  position: relative;
  background: var(--bg-raised-2);
  width: 260px;
  height: 220px;
}

.actpub.theme-v3_acid .ap-v3-gallery-image {
  filter: grayscale(1) contrast(1.25);
  transition: transform 0.5s ease, filter 0.5s ease;
}

.actpub.theme-v3_acid .ap-v3-gallery-item:hover .ap-v3-gallery-image {
  transform: scale(1.06);
  filter: grayscale(0.3) contrast(1.25);
}

.actpub.theme-v3_acid .ap-v3-gallery-nav {
  width: 42px;
  height: 42px;
  border: 1px solid var(--hairline-strong);
  background: rgba(6, 6, 6, 0.6);
  color: var(--ink);
  transition: background 0.15s ease, border-color 0.15s ease, color 0.15s ease;
}

.actpub.theme-v3_acid .ap-v3-gallery-nav:hover:not(:disabled) {
  background: var(--acid);
  border-color: var(--acid);
  color: #060606;
}

/* Aligned to the template's own 880px mobile threshold (used everywhere
   else — bio/practical/gigs/quotes/formulas) instead of an independent
   720px value: at 721–880px, every other section was already in mobile
   mode while this dense 4-col grid was still active, which is exactly the
   inconsistency that made the gallery read as "not a carousel on mobile". */
/* Scoped to :not(--layout-masonry): this dense 4-col/180px-row grid is the
   "strip" desktop design from the brief. Without the :not() exclusion, it
   has the same specificity as the shared baseline's own masonry grid rule
   and — loading after it — would win and force masonry photos (meant to
   flow at their natural aspect ratio) into uniform 180px rows instead,
   which is exactly the kind of "looks fine with the brief's own layoutId,
   breaks with the other supported one" bug this note exists to prevent. */
@media (min-width: 881px) {
  .actpub.theme-v3_acid .ap-v3-section:not(.ap-v3-section--layout-masonry) .ap-v3-gallery {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    grid-auto-rows: 180px;
    overflow: visible;
  }

  .actpub.theme-v3_acid .ap-v3-section:not(.ap-v3-section--layout-masonry) .ap-v3-gallery-item {
    width: 100%;
    height: 100%;
  }

  .actpub.theme-v3_acid .ap-v3-section:not(.ap-v3-section--layout-masonry) .ap-v3-gallery-item:first-child {
    grid-column: span 2;
    grid-row: span 2;
  }
}

/* True mobile: explicit carousel reset. Never a stacked/2-col grid here,
   even though the section above defines a custom desktop grid — see the
   mobile checklist note on gallery/formulas carousels. */
@media (max-width: 880px) {
  .actpub.theme-v3_acid .ap-v3-gallery {
    display: flex;
    grid-template-columns: none;
    overflow-x: auto;
    overflow-y: hidden;
    scroll-snap-type: x proximity;
  }

  .actpub.theme-v3_acid .ap-v3-gallery-item {
    flex: 0 0 82%;
    width: auto;
    height: 220px;
    scroll-snap-align: start;
  }

  .actpub.theme-v3_acid .ap-v3-gallery-item:first-child {
    grid-column: auto;
    grid-row: auto;
  }

  /* The brief only specced the "strip" gallery layout, but an act using
     this template can independently be configured with layoutId:
     "masonry" (confirmed live — the gallery renderer supports both, and
     unlike "strip", "masonry" has no carousel behavior at all from the
     shared baseline at any width, mobile included). Every template must
     handle both variants defensively, not just the one the brief happened
     to spec — see v3_iron_veil/v3_pop_rock for the same pattern. */
  .actpub.theme-v3_acid .ap-v3-section.ap-v3-section--layout-masonry .ap-v3-gallery {
    display: flex;
    grid-template-columns: none;
    overflow-x: auto;
    overflow-y: hidden;
    gap: 6px;
    scroll-snap-type: x proximity;
    min-width: 0;
  }

  .actpub.theme-v3_acid .ap-v3-section.ap-v3-section--layout-masonry .ap-v3-gallery-item--masonry {
    flex: 0 0 82%;
    width: auto;
    margin: 0;
    scroll-snap-align: start;
  }

  .actpub.theme-v3_acid .ap-v3-section.ap-v3-section--layout-masonry .ap-v3-gallery-image--masonry {
    height: 220px;
    max-height: none;
  }
}

/* -------------------------------------------------------------------------
   Quotes — single instance, items[0] styled as the "signature quote".
   ------------------------------------------------------------------------- */

.actpub.theme-v3_acid .ap-v3-quotes-shell {
  width: min(100%, var(--ac-content-w));
  margin: 0 auto;
  text-align: center;
}

.actpub.theme-v3_acid .ap-v3-quotes-shell > h2 {
  margin: 0 0 1rem;
  font-family: "Archivo Black", "Arial Black", sans-serif;
  text-transform: uppercase;
  font-size: clamp(1.7rem, 3.4vw, 2.6rem);
  color: var(--ink);
}

.actpub.theme-v3_acid .ap-v3-quotes {
  gap: 2.4rem;
}

.actpub.theme-v3_acid .ap-v3-quote {
  padding: 0 12px;
}

.actpub.theme-v3_acid .ap-v3-quote-text {
  font-family: "Archivo Black", "Arial Black", sans-serif;
  font-size: 1.15rem;
  line-height: 1.4;
  text-transform: uppercase;
  color: var(--ink);
}

.actpub.theme-v3_acid .ap-v3-quote:first-child .ap-v3-quote-text {
  color: var(--acid);
  font-size: 1.4rem;
}

.actpub.theme-v3_acid .ap-v3-quote-author {
  margin-top: 16px;
  font-family: "Space Mono", monospace;
  font-size: 0.7rem;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--ink-faint);
}

/* Mandatory: --count-two/--count-many must collapse to one column at true
   mobile widths — the shared baseline never does this on its own. */
@media (max-width: 880px) {
  .actpub.theme-v3_acid .ap-v3-quotes.ap-v3-quotes--count-two,
  .actpub.theme-v3_acid .ap-v3-quotes.ap-v3-quotes--count-many {
    grid-template-columns: minmax(0, 1fr);
  }

  .actpub.theme-v3_acid .ap-v3-quote:first-child .ap-v3-quote-text {
    font-size: 1.2rem;
  }
}

/* -------------------------------------------------------------------------
   Gigs — no ticket CTA (field doesn't exist). Aside image right on desktop,
   below on mobile (natural DOM order, no reorder needed).
   ------------------------------------------------------------------------- */

.actpub.theme-v3_acid .ap-v3-gigs-shell {
  width: min(100%, var(--ac-content-w));
  margin: 0 auto;
  gap: 2rem;
}

.actpub.theme-v3_acid .ap-v3-gigs-main h2 {
  margin: 0 0 1rem;
  font-family: "Archivo Black", "Arial Black", sans-serif;
  text-transform: uppercase;
  font-size: clamp(1.7rem, 3.4vw, 2.6rem);
  color: var(--ink);
}

.actpub.theme-v3_acid .ap-v3-gigs {
  gap: 0;
  grid-template-columns: minmax(0, 1fr);
}

/* 3-column row at every width: date | main (venue/meta) | status, flush
   right — see v3_da_street for the verified pattern this follows.
   .ap-v3-gig-date-block is unwrapped via display:contents so its two
   children (.ap-v3-gig-date, .ap-v3-gig-status) become direct grid items
   of .ap-v3-gig alongside .ap-v3-gig-main; explicit grid-column/grid-row
   on all three pins the visual order regardless of DOM/auto-placement
   order. */
.actpub.theme-v3_acid .ap-v3-gig {
  display: grid;
  width: 100%;
  grid-template-columns: minmax(6.25rem, 7rem) minmax(0, 1fr) auto;
  align-items: center;
  gap: 0.5rem 1.2rem;
  padding: 20px 0;
  border-bottom: 1px solid var(--hairline);
}

.actpub.theme-v3_acid .ap-v3-gig:last-child {
  border-bottom: 0;
}

.actpub.theme-v3_acid .ap-v3-gig-date-block {
  display: contents;
}

.actpub.theme-v3_acid .ap-v3-gig-date {
  grid-column: 1;
  grid-row: 1;
  display: flex;
  flex-direction: row;
  align-items: baseline;
  gap: 0.4rem;
  font-family: "Space Mono", monospace;
  font-size: 0.85rem;
  color: var(--acid);
}

.actpub.theme-v3_acid .ap-v3-gig-main {
  grid-column: 2;
  grid-row: 1;
}

.actpub.theme-v3_acid .ap-v3-gig-date-month,
.actpub.theme-v3_acid .ap-v3-gig-date-year {
  font-size: 0.62rem;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--ink-faint);
}

.actpub.theme-v3_acid .ap-v3-gig-date-day {
  font-size: 1.3rem;
}

.actpub.theme-v3_acid .ap-v3-gig-status {
  grid-column: 3;
  grid-row: 1;
  justify-self: end;
  font-family: "Space Mono", monospace;
  font-size: 0.62rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  padding: 5px 10px;
  border: 1px solid var(--hairline-strong);
  color: var(--ink-faint);
  background: transparent;
}

.actpub.theme-v3_acid .ap-v3-gig-status--upcoming {
  border-color: var(--acid);
  color: var(--acid);
  background: transparent;
}

.actpub.theme-v3_acid .ap-v3-gig-status--past {
  border-color: var(--hairline-strong);
  color: var(--ink-faint);
  background: transparent;
}

.actpub.theme-v3_acid .ap-v3-gig-status--cancelled {
  border-color: #6b3030;
  color: #a85a5a;
  background: transparent;
}

.actpub.theme-v3_acid .ap-v3-gig-venue {
  font-family: "Inter", sans-serif;
  font-weight: 700;
  font-size: 1rem;
  color: var(--ink);
}

.actpub.theme-v3_acid .ap-v3-gig-meta {
  font-family: "Space Mono", monospace;
  font-size: 0.72rem;
  letter-spacing: 0.03em;
  color: var(--ink-dim);
}

.actpub.theme-v3_acid .ap-v3-gig--past {
  opacity: 0.6;
}

.actpub.theme-v3_acid .ap-v3-gig--cancelled .ap-v3-gig-venue,
.actpub.theme-v3_acid .ap-v3-gig--cancelled .ap-v3-gig-meta {
  opacity: 0.45;
  text-decoration: line-through;
}

.actpub.theme-v3_acid .ap-v3-gigs-aside {
  /* Desktop keeps the brief's right-column placement (natural DOM order,
     no reorder needed — the min-width query below just sets the grid
     columns). Mobile always puts image slots before their section's text
     per the standing rule, regardless of the brief's own "en dessous"
     wording — see the max-width query further down. */
  position: relative;
  aspect-ratio: 3 / 4;
  overflow: hidden;
  background: var(--bg-raised-2);
  min-width: 0;
}

.actpub.theme-v3_acid .ap-v3-gigs-aside img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  filter: grayscale(1) contrast(1.2);
}

@media (max-width: 880px) {
  .actpub.theme-v3_acid .ap-v3-gigs-aside {
    order: -1;
  }
}

@media (min-width: 881px) {
  .actpub.theme-v3_acid .ap-v3-gigs-shell--with-aside {
    grid-template-columns: 1fr 0.55fr;
    gap: 56px;
    align-items: start;
  }

  .actpub.theme-v3_acid .ap-v3-gigs-shell--with-aside .ap-v3-gigs-aside {
    position: sticky;
    top: 7rem;
  }

}

/* Mandatory mobile gig-date fixes: date column narrowed to fit the smaller
   day font, status badge stays flush right, venue + meta wrap on one line. */
@media (max-width: 880px) {
  .actpub.theme-v3_acid .ap-v3-gig-date-day {
    font-size: 1.1rem;
  }

  .actpub.theme-v3_acid .ap-v3-gig {
    grid-template-columns: minmax(5.75rem, 6.5rem) minmax(0, 1fr) auto;
    gap: 0.5rem 0.75rem;
    padding: 16px 0;
  }

  .actpub.theme-v3_acid .ap-v3-gig-main {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    column-gap: 0.5rem;
    row-gap: 0.15rem;
    width: 100%;
  }

  .actpub.theme-v3_acid .ap-v3-gig-meta {
    margin: 0;
  }

  .actpub.theme-v3_acid .ap-v3-gig-meta::before {
    content: "\2013";
    margin-right: 0.4rem;
  }
}

/* -------------------------------------------------------------------------
   FAQ — title + items only, no intro/CTA/aside.
   ------------------------------------------------------------------------- */

.actpub.theme-v3_acid .ap-v3-faq-shell {
  width: min(100%, 50rem);
  margin: 0 auto;
}

.actpub.theme-v3_acid .ap-v3-faq-title {
  margin: 0 0 1rem;
  font-family: "Archivo Black", "Arial Black", sans-serif;
  text-transform: uppercase;
  font-size: clamp(1.7rem, 3.4vw, 2.6rem);
  color: var(--ink);
}

.actpub.theme-v3_acid .ap-v3-faq-list {
  border-top: 1px solid var(--hairline);
}

.actpub.theme-v3_acid .ap-v3-faq-item {
  border-bottom: 1px solid var(--hairline);
}

.actpub.theme-v3_acid .ap-v3-faq-trigger {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 20px;
  padding: 22px 0;
  font-family: "Inter", sans-serif;
  font-weight: 600;
  font-size: 1.02rem;
  color: var(--ink);
  cursor: pointer;
  list-style: none;
}

.actpub.theme-v3_acid .ap-v3-faq-trigger::-webkit-details-marker {
  display: none;
}

.actpub.theme-v3_acid .ap-v3-faq-trigger::after {
  content: "+";
  flex-shrink: 0;
  font-family: "Space Mono", monospace;
  font-size: 1.3rem;
  color: var(--acid);
}

.actpub.theme-v3_acid .ap-v3-faq-item[open] .ap-v3-faq-trigger::after {
  content: "\2013";
}

.actpub.theme-v3_acid .ap-v3-faq-panel {
  padding: 0 0 22px;
}

.actpub.theme-v3_acid .ap-v3-faq-answer p {
  margin: 0;
  max-width: 40rem;
  color: var(--ink-dim);
  font-size: 0.95rem;
  line-height: 1.65;
}

/* -------------------------------------------------------------------------
   Contact CTA — full acid-green surface, actName hidden via CSS only (DOM
   node stays, per the Render Model contract), custom helperTop via
   texts.sections.contact-cta.title in the template config.
   ------------------------------------------------------------------------- */

.actpub.theme-v3_acid .ap-v3-contact-cta {
  width: min(100%, 40rem);
  margin: 0 auto;
  display: grid;
  gap: 18px;
  justify-items: center;
}

.actpub.theme-v3_acid .ap-v3-contact-cta-brand {
  display: none;
}

.actpub.theme-v3_acid .ap-v3-contact-cta-main {
  display: grid;
  gap: 18px;
  justify-items: center;
}

.actpub.theme-v3_acid .ap-v3-contact-cta-helper {
  margin: 0;
  max-width: 34rem;
  font-family: "Space Mono", monospace;
  font-size: 0.78rem;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: #060606;
}

.actpub.theme-v3_acid .ap-v3-contact-cta-link {
  display: inline-block;
  margin-top: 4px;
  padding-bottom: 6px;
  border-bottom: 4px solid #060606;
  font-family: "Archivo Black", "Arial Black", sans-serif;
  text-transform: uppercase;
  font-size: clamp(2rem, 5vw, 3.6rem);
  color: #060606;
  text-decoration: none;
  transition: opacity 0.2s ease;
}

.actpub.theme-v3_acid .ap-v3-contact-cta-link:hover,
.actpub.theme-v3_acid .ap-v3-contact-cta-link:focus-visible {
  opacity: 0.68;
}

/* -------------------------------------------------------------------------
   Footer — two components, blended into one continuous dark zone (V3
   section: plain black, quiet, centered; PublishedFooter: bg-raised).
   ------------------------------------------------------------------------- */

.actpub.theme-v3_acid .ap-v3-footer-title {
  margin: 0;
  font-family: "Archivo Black", "Arial Black", sans-serif;
  text-transform: uppercase;
  font-size: 1.3rem;
  color: var(--ink);
}

.actpub.theme-v3_acid .ap-v3-footer-email {
  margin-top: 10px;
  display: inline-block;
  font-family: "Space Mono", monospace;
  font-size: 0.8rem;
  color: var(--ink-faint);
  text-decoration: none;
  transition: color 0.15s ease;
}

.actpub.theme-v3_acid .ap-v3-footer-email:hover,
.actpub.theme-v3_acid .ap-v3-footer-email:focus-visible {
  color: var(--acid);
}

.actpub.theme-v3_acid footer.ap-published-footer {
  --ap-footer-bg: var(--bg-raised);
  --ap-footer-text: var(--ink-dim);
  --ap-footer-title: var(--ink);
  --ap-footer-link: var(--ink-dim);
  --ap-footer-link-hover: var(--acid);
  --ap-footer-meta: var(--ink-faint);
  --ap-footer-border: transparent;
  --ap-footer-radius: 0;
  --ap-footer-shadow: none;
  --ap-footer-backdrop: none;
  width: 100%;
  margin: 0;
  padding: 36px var(--ac-px);
}

.actpub.theme-v3_acid .ap-footer-act-name {
  font-family: "Space Mono", monospace;
  font-size: 0.78rem;
  letter-spacing: 0.1em;
  text-transform: uppercase;
}

.actpub.theme-v3_acid .ap-footer-social {
  font-family: "Space Mono", monospace;
  font-size: 0.72rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
}

.actpub.theme-v3_acid .ap-footer-links a,
.actpub.theme-v3_acid .ap-footer-links-item span {
  font-family: "Space Mono", monospace;
  font-size: 0.66rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
}

.actpub.theme-v3_acid .ap-footer-date {
  font-family: "Space Mono", monospace;
  font-size: 0.66rem;
  letter-spacing: 0.06em;
}

/* -------------------------------------------------------------------------
   Lightbox — keep zero-radius consistent
   ------------------------------------------------------------------------- */

.actpub.theme-v3_acid .ap-lightbox img {
  box-shadow: none;
}

.actpub.theme-v3_acid .ap-lightbox-close,
.actpub.theme-v3_acid .ap-lightbox-nav {
  border: 1px solid var(--hairline-strong);
  background: rgba(6, 6, 6, 0.75);
}

/* -------------------------------------------------------------------------
   Responsive — general section rhythm at true mobile widths
   ------------------------------------------------------------------------- */

@media (max-width: 880px) {
  .actpub.theme-v3_acid .ap-v3-section:not(.ap-v3-section--hero) {
    padding: var(--ac-section-y-mobile) 1.25rem;
  }

  .actpub.theme-v3_acid .ap-v3-section--gallery {
    padding-left: 0;
    padding-right: 0;
  }

  .actpub.theme-v3_acid .ap-v3-gallery-shell > h2 {
    padding: 0 1.25rem;
  }

  .actpub.theme-v3_acid .ap-footer-brand,
  .actpub.theme-v3_acid .ap-footer-meta {
    flex-wrap: wrap;
  }
}
