/* ============================================================
   Boolin Tunes — main stylesheet
   Phase 3 in progress: aesthetic layer applied top-down.
   Currently styled: design tokens, body type, header + nav.
   Still on scaffold: hero, cards, sections, footer.
   ============================================================ */

/* Reset-lite */
*, *::before, *::after { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; }
body {
	margin: 0;
	font-family: var(--bt-font-body);
	font-weight: 400;
	line-height: 1.5;
	color: var(--bt-ink);
	background: var(--bt-bg);
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}
img, video { max-width: 100%; height: auto; display: block; }
a { color: inherit; text-decoration: underline; }
a:hover { text-decoration: none; }
button { font: inherit; cursor: pointer; }
h1, h2, h3, h4, h5, h6 {
	margin: 0 0 .35em;
	line-height: 1.2;
	font-family: var(--bt-font-display);
	font-weight: 600;
}
p { margin: 0 0 1em; }

/* ============================================================
   DESIGN TOKENS
   Phase 3 foundation — semantic hooks for the rest of the site
   to style against. Keep hex values here, reference elsewhere.
   ============================================================ */
:root {
	/* Type */
	--bt-font-body: 'Nunito Sans', system-ui, -apple-system, 'Segoe UI', Helvetica, Arial, sans-serif;
	--bt-font-display: 'Oswald', 'Nunito Sans', system-ui, -apple-system, sans-serif;

	/* Colour — white paper with a forest-leaning ink and muted poster accents.
	   Base white retained from C. Accents adopt A's dustier tones and add two
	   new roles: warm terracotta for highlight moments, moss for deep green
	   surfaces or borders when we want an earthier feel than pure ink. */
	--bt-ink: #1d2a22;                /* deep forest-ink — carries a slight green undertone */
	--bt-bg: #ffffff;
	--bt-muted: #5e6b62;              /* muted, slightly tinted to the forest */
	--bt-line: #d8d0bf;               /* warm cream-grey — slightly desaturated cream */
	--bt-accent: #6E8A5E;             /* sage — primary accent (active states, highlights) */
	--bt-accent-warm: #C5C086;        /* sand/khaki — warm secondary accent */
	--bt-accent-dark: #3B4937;        /* dark olive — deep secondary accent */
	--bt-moss: #2B3D33;               /* deep forest — section bgs / borders */

	/* Section accent — overridden per-section via body class (see section
	   override block lower in this file). Default = teal. Sectional UI
	   like eyebrows, numerals, and per-content-type borders read from
	   this rather than --bt-accent directly, so they shift with the
	   chapter while universal UI (nav, hover, focus) stays teal. */
	--bt-section-accent: var(--bt-accent);

	/* Dark Mode Overrides */
	--bt-dark-ink: #e2e8e4;
	--bt-dark-bg: #121814;
	--bt-dark-muted: #94a399;
	--bt-dark-line: #2d3831;
	--bt-dark-moss: #3a5a48;

	/* Patterns */
	--bt-pattern-halftone: rgba(0,0,0,0.08);
	--bt-pattern-stripes: rgba(0,0,0,0.04);

	/* Fixed Colours (for dark bands that don't flip) */
	--bt-fixed-ink: #1D291C;          /* deepest camo green — footer + review banner background, fixed across both light/dark modes */

	/* Cinema Hero Overlays */
	--bt-cinema-bg: rgba(29, 42, 34, 0.92);
	--bt-cinema-mid: rgba(29, 42, 34, 0.5);
	--bt-cinema-fade: rgba(29, 42, 34, 0.1);

	/* Layout */
	--bt-max: 1320px;
	--bt-gutter: 1.5rem;
	--bt-gap: 1.5rem;

	/* Fixed Technical Colours */
	--bt-white: #ffffff;
	--bt-black: #000000;
	
	/* Low-Alpha Overlays (Light on Dark) */
	--bt-alpha-w-02: rgba(255, 255, 255, 0.02);
	--bt-alpha-w-04: rgba(255, 255, 255, 0.04);
	--bt-alpha-w-10: rgba(255, 255, 255, 0.1);
	--bt-alpha-w-12: rgba(255, 255, 255, 0.12);
	--bt-alpha-w-15: rgba(255, 255, 255, 0.15);
	--bt-alpha-w-20: rgba(255, 255, 255, 0.2);
	--bt-alpha-w-50: rgba(255, 255, 255, 0.5);
	--bt-alpha-w-70: rgba(255, 255, 255, 0.7);
	--bt-alpha-w-80: rgba(255, 255, 255, 0.8);

	/* Low-Alpha Overlays (Dark on Light) */
	--bt-alpha-b-02: rgba(0, 0, 0, 0.02);
	--bt-alpha-b-10: rgba(0, 0, 0, 0.1);
	--bt-alpha-b-15: rgba(0, 0, 0, 0.15);
	--bt-alpha-b-45: rgba(0, 0, 0, 0.45);
	--bt-alpha-b-75: rgba(0, 0, 0, 0.75);

	/* Semantic Shadows & Effects */
	--bt-sh-ink: rgba(29, 42, 34, 0.18);
	--bt-sh-maroon: rgba(59, 73, 55, 0.45);
	--bt-sh-maroon-low: rgba(59, 73, 55, 0.15);
	--bt-sh-warm: rgba(197, 192, 134, 0.35);
	--bt-sh-teal: rgba(110, 138, 94, 0.18);
}

@media (prefers-color-scheme: dark) {
	:root:not(.is-light) {
		--bt-ink: var(--bt-dark-ink);
		--bt-bg: var(--bt-dark-bg);
		--bt-muted: var(--bt-dark-muted);
		--bt-line: var(--bt-dark-line);
		--bt-moss: var(--bt-dark-moss);
		--bt-pattern-halftone: rgba(255,255,255,0.08);
		--bt-pattern-stripes: rgba(255,255,255,0.04);
		--bt-cinema-bg: rgba(18, 24, 20, 0.95);
		--bt-cinema-mid: rgba(18, 24, 20, 0.6);
		--bt-cinema-fade: rgba(18, 24, 20, 0.2);

		/* Technical Overrides */
		--bt-white: #e2e8e4;
		--bt-black: #090c0a;
		--bt-sh-ink: rgba(0, 0, 0, 0.4);
		--bt-sh-maroon: rgba(0, 0, 0, 0.5);
		--bt-color-scaffold: #1a221d;
	}
}

/* ============================================================
   SECTION ACCENT MAP
   Each content type owns one of the four palette colours. The
   accent token --bt-section-accent gets reassigned by body class
   so any rule consuming it (eyebrows, numerals, FFO borders, etc)
   shifts colour at the section level — single source of truth.

   Mapping:
     Reviews     → teal (default, no override)
     Calendar    → teal (default, no override)
     News        → terracotta
     Interviews  → maroon
     Galleries   → terracotta
     Roundups    → moss (matched on tag-releases-roundup, not category)

   Body class names come from WP's body_class() — `category-{slug}`
   for category archives and single posts in that primary category,
   `tag-{slug}` for tag archives and tag-tagged single posts. The
   YMHM roundup template is triggered by the releases-roundup tag,
   so we key on that.
   ============================================================ */
body.category-news,
body.category-galleries {
	--bt-section-accent: var(--bt-accent-warm);
}
body.category-interviews {
	--bt-section-accent: var(--bt-accent-dark);
}
body.tag-releases-roundup {
	--bt-section-accent: var(--bt-moss);
}

:root.is-dark {
	--bt-ink: var(--bt-dark-ink);
	--bt-bg: var(--bt-dark-bg);
	--bt-muted: var(--bt-dark-muted);
	--bt-line: var(--bt-dark-line);
	--bt-moss: var(--bt-dark-moss);
	--bt-pattern-halftone: rgba(255,255,255,0.08);
	--bt-pattern-stripes: rgba(255,255,255,0.04);
	--bt-cinema-bg: rgba(18, 24, 20, 0.95);
	--bt-cinema-mid: rgba(18, 24, 20, 0.6);
	--bt-cinema-fade: rgba(18, 24, 20, 0.2);

	/* Technical Overrides */
	--bt-white: #e2e8e4;
	--bt-black: #090c0a;
	--bt-sh-ink: rgba(0, 0, 0, 0.4);
	--bt-sh-maroon: rgba(0, 0, 0, 0.5);
	--bt-color-scaffold: #1a221d;
}

.bt-container {
	max-width: var(--bt-max);
	margin: 0 auto;
	padding: 0 var(--bt-gutter);
}

/* Skip link */
.screen-reader-text {
	position: absolute;
	clip: rect(1px, 1px, 1px, 1px);
	word-wrap: normal;
}
.skip-link:focus {
	position: static;
	clip: auto;
	display: inline-block;
	padding: .5rem 1rem;
	background: var(--bt-ink);
	color: var(--bt-bg);
}

/* ============================================================
   HEADER — masthead + primary nav
   ============================================================ */
.bt-header {
	border-bottom: 1px solid var(--bt-ink);
	padding: 1.25rem 0;
	background: var(--bt-bg);
}
.bt-header__inner {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 2rem;
}

/* Brand — treated as a masthead: heavier weight, tightened tracking.
   Deliberately uses the BODY font (Nunito) not the display font (Oswald) —
   the masthead is a wordmark; Oswald is reserved for section headers and
   card titles where its condensed personality earns its place. */
.bt-header__brand { flex-shrink: 0; }
.bt-header__logo-link {
	display: block;
	text-decoration: none;
	line-height: 0;
}
.bt-header__logo {
	height: 72px;
	width: auto;
	max-width: 100%;
}
.bt-header__logo--light { display: block; }
.bt-header__logo--dark  { display: none; }

:root.is-dark .bt-header__logo--light { display: none; }
:root.is-dark .bt-header__logo--dark  { display: block; }

/* When system is dark and no class override exists */
@media (prefers-color-scheme: dark) {
	:root:not(.is-light) .bt-header__logo--light { display: none; }
	:root:not(.is-light) .bt-header__logo--dark  { display: block; }
}

/* Defensive cap on WP's Customise → Site Identity → Logo output.
   The theme uses .bt-header__logo for its own SVG/branding, but if
   anyone ever re-uploads a logo via Customise → Site Identity, WP
   renders <img class="custom-logo"> at intrinsic dimensions inside
   .bt-header__brand, which overflows the header (caused a bug during
   the prod migration). This rule ensures any future custom-logo image
   stays inside the masthead's vertical band regardless of upload size. */
.bt-header__brand .custom-logo {
	height: 72px;
	width: auto;
	max-width: 100%;
	display: block;
}

/* Primary nav links */
.bt-nav__list {
	display: flex;
	gap: 0; /* spacing comes from the pipe separators */
	align-items: center;
	list-style: none;
	margin: 0;
	padding: 0;
}
.bt-nav__list li {
	display: flex;
	align-items: center;
}
/* Pipe separator between items — editorial rhythm. */
.bt-nav__list li + li::before {
	content: "|";
	color: var(--bt-line);
	font-weight: 300;
	margin: 0 1.1rem;
}
.bt-nav__list a {
	font-size: 0.9375rem;
	font-weight: 600;
	letter-spacing: 0.005em;
	color: var(--bt-ink);
	text-decoration: none;
	padding: 0.25rem 0;
	display: inline-block;
	position: relative;
	white-space: nowrap;
}
.bt-nav__list a::after {
	content: "";
	position: absolute;
	left: 0;
	right: 0;
	bottom: -0.25rem;
	height: 2px;
	background: var(--bt-line);
	transform: scaleX(0);
	transition: transform 0.2s ease;
}
.bt-nav__list a:hover::after {
	transform: scaleX(1);
}
/* When an item is already in the current/active state, the underline
   is persistent. */
.bt-nav__list .current-menu-item > a::after,
.bt-nav__list .current-menu-parent > a::after,
.bt-nav__list .current-menu-ancestor > a::after,
.bt-nav__list .current_page_item > a::after,
.bt-nav__list .current-post-parent > a::after,
.bt-nav__list .current-post-ancestor > a::after {
	transform: scaleX(1);
	background: var(--bt-accent);
}

/* Right-side actions: social icons + compact search */
.bt-header__actions {
	display: flex;
	align-items: center;
	gap: 1rem;
	flex-shrink: 0;
}

/* Social icon links */
.bt-header__social {
	display: flex;
	align-items: center;
	gap: 0.5rem;
	list-style: none;
	margin: 0;
	padding: 0;
}
.bt-header__social a {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	color: var(--bt-ink);
	text-decoration: none;
	padding: 0.25rem;
	transition: color 0.15s;
}
.bt-header__social a:hover { color: var(--bt-accent); }

/* Theme Toggle — simple icon switch */
.bt-theme-toggle {
	background: none;
	border: none;
	padding: 0.4rem;
	color: var(--bt-ink);
	display: inline-flex;
	align-items: center;
	justify-content: center;
	cursor: pointer;
	transition: color 0.15s, transform 0.2s;
	border-radius: 50%;
}
.bt-theme-toggle:hover {
	color: var(--bt-accent);
	background: var(--bt-alpha-b-02);
}
.bt-theme-toggle svg {
	width: 20px;
	height: 20px;
	fill: none;
	stroke: currentColor;
	stroke-width: 2;
	stroke-linecap: round;
	stroke-linejoin: round;
}
/* Show/hide icons based on theme state */
.bt-theme-toggle__sun { display: none; }
.bt-theme-toggle__moon { display: block; }

:root.is-dark .bt-theme-toggle__sun { display: block; }
:root.is-dark .bt-theme-toggle__moon { display: none; }

/* When system is dark and no class override exists */
@media (prefers-color-scheme: dark) {
	:root:not(.is-light) .bt-theme-toggle__sun { display: block; }
	:root:not(.is-light) .bt-theme-toggle__moon { display: none; }
}

/* Compact search in the header — underline-only, editorial.
   Default .bt-searchform styling (used on 404/search pages) is defined below;
   these overrides scope it to the header context. */
.bt-header__search .bt-searchform {
	display: flex;
	align-items: center;
	border: none;
	border-bottom: 1px solid var(--bt-line);
	width: 200px;
	transition: border-color 0.15s;
}
.bt-header__search .bt-searchform:focus-within {
	border-bottom-color: var(--bt-ink);
}
.bt-header__search .bt-searchform__input {
	flex: 1;
	min-width: 0;
	border: none;
	background: transparent;
	padding: 0.4rem 0;
	font: inherit;
	font-size: 0.875rem;
	color: var(--bt-ink);
	outline: none;
}
.bt-header__search .bt-searchform__input::placeholder { color: var(--bt-muted); }
.bt-header__search .bt-searchform__submit {
	background: none;
	border: none;
	padding: 0 0 0 0.5rem;
	color: var(--bt-ink);
	display: inline-flex;
	align-items: center;
	justify-content: center;
	transition: color 0.15s;
}
.bt-header__search .bt-searchform__submit:hover { color: var(--bt-accent); }

/* Default search form (search.php, 404.php) — lightly styled, not scoped to header */
.bt-searchform {
	display: flex;
	align-items: stretch;
	border: 1px solid var(--bt-line);
	max-width: 420px;
}
.bt-searchform__input {
	flex: 1;
	min-width: 0;
	border: none;
	background: transparent;
	padding: 0.6rem 0.75rem;
	font: inherit;
	outline: none;
}
.bt-searchform__submit {
	background: none;
	border: none;
	border-left: 1px solid var(--bt-line);
	padding: 0 0.9rem;
	display: inline-flex;
	align-items: center;
	color: var(--bt-ink);
}
.bt-searchform__submit:hover { color: var(--bt-accent); }

/* Burger button — hidden on desktop, visible on mobile */
.bt-header__burger {
	display: none;
	background: none;
	border: none;
	padding: .5rem;
	cursor: pointer;
	width: 56px;
	height: 56px;
	flex-direction: column;
	justify-content: center;
	align-items: center;
	gap: 7px;
}
.bt-header__burger-bar {
	display: block;
	width: 28px;
	height: 3px;
	background: var(--bt-ink);
	transition: transform .2s, opacity .2s;
}
/* When open, bars form an X */
.bt-header__burger[aria-expanded="true"] .bt-header__burger-bar:nth-child(1) {
	transform: translateY(10px) rotate(45deg);
}
.bt-header__burger[aria-expanded="true"] .bt-header__burger-bar:nth-child(2) {
	opacity: 0;
}
.bt-header__burger[aria-expanded="true"] .bt-header__burger-bar:nth-child(3) {
	transform: translateY(-10px) rotate(-45deg);
}
@media (prefers-reduced-motion: reduce) {
	.bt-header__burger-bar { transition: none; }
}

/* Mobile: hide nav by default, reveal as a panel when burger is open.
   Theme toggle stays visible in the header — without it, mobile users
   have no way to switch dark/light. The other actions (socials and
   search) collapse since they're accessible from the footer / via the
   nav menu respectively. */
@media (max-width: 900px) {
	.bt-header__burger {
		display: flex;
		/* Push burger to the right edge — flex order overrides DOM
		   position so we keep the toggle left of nav for source-order
		   accessibility while putting the burger visually on the right. */
		order: 3;
		margin-left: auto;
	}
	.bt-header__actions {
		display: flex;
		gap: 0.25rem;
		order: 2;
	}
	.bt-header__actions .bt-header__social,
	.bt-header__actions .bt-header__search,
	.bt-header__actions .bt-theme-toggle { display: none; }

	.bt-nav {
		display: none;
		position: absolute;
		top: 100%;
		left: 0;
		right: 0;
		background: var(--bt-bg);
		border-bottom: 1px solid var(--bt-line);
		padding: 1rem var(--bt-gutter);
		z-index: 50;
	}
	.bt-nav.is-open { display: block; }
	.bt-nav__list {
		flex-direction: column;
		gap: .75rem;
	}
	.bt-nav__list li + li::before { display: none; }
	.bt-header { position: relative; }
}

/* Section spacing — no bottom border; section-header acts as divider */
.bt-section {
	padding: 1.5rem 0;
	position: relative; /* anchor for any pseudo-element decorations */
	isolation: isolate; /* contains pseudo-element z-index within this section */
	border-bottom: 1px solid var(--bt-line);
}
/* The dark "Our picks" section has its own band styling (background +
   pseudo-element rules), no extra divider needed. */
.bt-section--dark { border-bottom: none; }
/* The hero is the first section — no top, no bottom; the next section
   provides its own top edge via the previous section's bottom. */
.bt-section--hero { border-bottom: none; }
/* Hero gets slightly less bottom padding so the feed starts tighter */
.bt-section--hero {
	padding-top: 1.25rem;
	padding-bottom: 1rem;
}

.bt-section-header {
	display: flex;
	align-items: center;
	gap: 1.25rem;
	margin-bottom: 1.25rem;
}
.bt-section-header__title {
	margin: 0;
	font-family: var(--bt-font-display);
	font-weight: 700;
	font-size: 1.5rem;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	line-height: 1;
	flex-shrink: 0;
	color: var(--bt-ink);
	/* Subtle letterpress shadow — same vocabulary as review score
	   and YMHM numerals. Reads as printed-on-paper, not bug. */
	text-shadow: 1px 1px 0 var(--bt-sh-warm);
}
/* .bt-section-header__rule removed — rule element is no longer rendered
   in the DOM after Firefox rendering issues at desktop widths. To restore:
   (1) re-add the <span class="bt-section-header__rule"> in
       boolin_section_header() in inc/template-tags.php
   (2) uncomment the two rules below. Start with grid instead of flex on
       .bt-section-header if returning to this. */
.bt-section-header__more {
	flex-shrink: 0;
	font-size: 0.75rem;
	font-weight: 700;
	letter-spacing: 0.14em;
	text-transform: uppercase;
	color: var(--bt-muted);
	text-decoration: none;
	transition: color 0.15s;
	/* Generous padding gives this a touch-friendly tap target without
	   shifting its visual position (negative margin cancels the extra). */
	padding: 0.75rem 0.5rem;
	margin: -0.75rem -0.5rem;
}
.bt-section-header__more:hover { color: var(--bt-accent); }

/* Grid utilities */
.bt-grid { display: grid; gap: var(--bt-gap); }
.bt-grid--3 { grid-template-columns: repeat(3, 1fr); }
.bt-grid--4 { grid-template-columns: repeat(4, 1fr); }
.bt-grid--2 { grid-template-columns: repeat(2, 1fr); }

/* News grid — compact side-by-side cards in 3 cols, with internal rules
   between columns and rows. Assumes up to 6 items (3×2). */
.bt-grid--news {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	gap: 1.5rem;
}
.bt-grid--news > * {
	padding: 0;
}

@media (max-width: 900px) {
	.bt-grid--3, .bt-grid--4 { grid-template-columns: repeat(2, 1fr); }
	.bt-grid--news { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 600px) {
	.bt-grid--3 { grid-template-columns: 1fr; }
	/* Reviews stay 2-col on mobile — portrait cards remain scannable. */
	.bt-grid--4 { grid-template-columns: repeat(2, 1fr); }
	/* Interviews stack to single column — overlay text is too cramped at 2-col. */
	.bt-grid--interviews { grid-template-columns: 1fr; }
	.bt-grid--news { grid-template-columns: 1fr; }
}

/* Hero — carousel + latest rail */
.bt-hero {
	display: grid;
	grid-template-columns: 2fr 1fr;
	gap: var(--bt-gap);
	align-items: start;
}
@media (max-width: 900px) {
	.bt-hero { grid-template-columns: 1fr; }
}

/* ============================================================
   CAROUSEL
   Slides are stacked via absolute positioning so transitions
   between them can cross-fade. Arrows live inside the image
   container. Title tabs below the viewport let users jump to
   any slide by name. Autoplay supports a per-tab progress bar
   driven by --bt-carousel-autoplay, set by JS from data-autoplay.
   ============================================================ */
.bt-carousel { position: relative; }
.bt-carousel__viewport {
	position: relative;
	aspect-ratio: 3 / 2;
}
.bt-carousel__slide {
	position: absolute;
	inset: 0;
	opacity: 0;
	visibility: hidden;
	/* Hide after opacity fade completes; reveal instantly when becoming active. */
	transition: opacity 0.5s ease, visibility 0s linear 0.5s;
}
.bt-carousel__slide.is-active {
	opacity: 1;
	visibility: visible;
	z-index: 1;
	transition: opacity 0.5s ease, visibility 0s linear 0s;
}
.bt-carousel__link {
	display: block;
	text-decoration: none;
	color: inherit;
	width: 100%;
	height: 100%;
}
.bt-carousel__img {
	width: 100%;
	height: 100%;
	overflow: hidden;
	position: relative; /* anchor for the arrows */
	border-radius: 12px; /* soften the hero image — applied to wrapper so overlaid arrows inherit bounds */
}
.bt-carousel__img img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
	transition: transform 0.8s ease;
}
.bt-carousel__slide.is-active .bt-carousel__img img {
	/* Subtle Ken-Burns-style settle: zoom in slightly as the slide becomes active.
	   Gives the autoplay some motion without being obtrusive. */
	transform: scale(1.03);
}

.bt-carousel__text .bt-cat-label {
	display: inline-block;
	margin: 0 0 .5rem;
}
.bt-carousel__title {
	font-family: var(--bt-font-display);
	font-weight: 700;
	font-size: 1.875rem;
	line-height: 1.15;
	letter-spacing: 0.01em;
	margin: .25rem 0 .5rem;
	color: var(--bt-ink);
	transition: color 0.15s;
}
.bt-carousel__link:hover .bt-carousel__title { color: var(--bt-accent); }
.bt-carousel__meta { font-size: .9rem; color: var(--bt-muted); margin: 0; }

/* Arrow buttons — round, centered on the image, subtle backdrop */
.bt-carousel__arrow {
	position: absolute;
	top: 50%;
	transform: translateY(-50%);
	z-index: 2;
	width: 44px;
	height: 44px;
	padding: 0;
	border: none;
	border-radius: 50%;
	background: var(--bt-bg);
	opacity: 0.92;
	color: var(--bt-ink);
	cursor: pointer;
	display: flex;
	align-items: center;
	justify-content: center;
	transition: background 0.15s, color 0.15s;
	box-shadow: 0 2px 8px var(--bt-alpha-b-15);
}
.bt-carousel__arrow:hover,
.bt-carousel__arrow:focus-visible {
	background: var(--bt-ink);
	color: var(--bt-white);
	outline: none;
}
.bt-carousel__arrow--prev { left: 1rem; }
.bt-carousel__arrow--next { right: 1rem; }

@media (max-width: 600px) {
	.bt-carousel__arrow { width: 40px; height: 40px; }
	.bt-carousel__arrow--prev { left: 0.5rem; }
	.bt-carousel__arrow--next { right: 0.5rem; }
	.bt-carousel__title { font-size: 1.4rem; }
}

/* Title tabs — a row of slide titles beneath the carousel.
   Active slide gets a teal top underline AND an animated progress
   bar that fills left-to-right over the autoplay interval.
   Mobile: horizontal scroll. */
.bt-carousel__tabs {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(0, 1fr));
	gap: 0;
	margin-top: 1rem;
	border-top: 1px solid var(--bt-line);
}
.bt-carousel__tab {
	background: none;
	border: none;
	border-top: 3px solid transparent; /* kept transparent — progress bar is the indicator */
	margin-top: -1px; /* align with the 1px rule above */
	padding: 1rem 0.75rem 0.85rem;
	text-align: left;
	font-family: var(--bt-font-display);
	font-weight: 600;
	font-size: 1.0625rem;
	line-height: 1.25;
	letter-spacing: 0.01em;
	color: var(--bt-muted);
	cursor: pointer;
	transition: color 0.15s;
	min-width: 0;
	position: relative;
}
.bt-carousel__tab:hover { color: var(--bt-ink); }
.bt-carousel__tab.is-active {
	color: var(--bt-ink);
	/* deliberately no static border here — the progress bar is the visual cue */
}
.bt-carousel__tab-text {
	display: -webkit-box;
	-webkit-line-clamp: 2;
	-webkit-box-orient: vertical;
	overflow: hidden;
	text-overflow: ellipsis;
}

/* Progress bar — countdown style: starts at full width, depletes as the slide
   ages, hits empty right when the next slide loads. Reset to full each time
   the active tab changes (the JS toggles the class to restart animation). */
.bt-carousel__tab-progress {
	position: absolute;
	left: 0;
	top: -3px; /* sits exactly on top of the transparent border */
	height: 3px;
	width: 100%;
	background: var(--bt-accent);
	transform: scaleX(0);
	transform-origin: right;
	pointer-events: none;
}
.bt-carousel__tab.is-active .bt-carousel__tab-progress {
	animation: btCarouselProgress var(--bt-carousel-autoplay, 7s) linear forwards;
}
.bt-carousel.is-paused .bt-carousel__tab.is-active .bt-carousel__tab-progress {
	animation-play-state: paused;
}
@keyframes btCarouselProgress {
	from { transform: scaleX(1); }
	to   { transform: scaleX(0); }
}

@media (max-width: 700px) {
	/* Hide the tab strip on mobile — the image arrows already provide
	   slide navigation, and the horizontally-scrolling tabs read as
	   broken layout (next tab title peeks off the right edge). */
	.bt-carousel__tabs { display: none; }
}

/* Latest posts rail */
.bt-hero__rail {
	border-left: 1px solid var(--bt-line);
	padding-left: var(--bt-gap);
}
@media (max-width: 900px) {
	.bt-hero__rail { display: none; }
}
.bt-hero__rail-heading {
	font-size: .75rem;
	font-weight: 700;
	letter-spacing: .18em;
	text-transform: uppercase;
	color: var(--bt-muted);
	margin: 0 0 1rem;
}
.bt-hero__rail-list {
	list-style: none;
	margin: 0;
	padding: 0;
}
.bt-hero__rail-item {
	display: grid;
	grid-template-columns: 80px 1fr;
	gap: 0.75rem;
	padding: 0.85rem 0;
	border-bottom: 1px solid var(--bt-line);
	align-items: start;
}
.bt-hero__rail-item:first-child { padding-top: 0; }
.bt-hero__rail-item:last-child { border-bottom: none; padding-bottom: 0; }

.bt-hero__rail-thumb {
	display: block;
	aspect-ratio: 1;
	overflow: hidden;
	background: var(--bt-line); /* graceful fallback if image missing */
}
.bt-hero__rail-thumb img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
	transition: transform 0.3s ease;
}
.bt-hero__rail-thumb:hover img { transform: scale(1.04); }

.bt-hero__rail-text { min-width: 0; } /* allow title to wrap, not overflow */
.bt-hero__rail-title {
	font-size: 0.9375rem;
	line-height: 1.3;
	font-weight: 700;
	margin: 0.25rem 0 0.25rem;
}
.bt-hero__rail-link {
	color: var(--bt-ink);
	text-decoration: none;
}
.bt-hero__rail-link:hover { color: var(--bt-accent); }
.bt-hero__rail-meta { font-size: .75rem; color: var(--bt-muted); margin: 0; }

@media (prefers-reduced-motion: reduce) {
	.bt-hero__rail-thumb img { transition: none; }
	.bt-hero__rail-thumb:hover img { transform: none; }
}

/* Respect prefers-reduced-motion — disable transitions and Ken Burns zoom.
   For the progress bar, lock it to full on the active tab so reduced-motion
   users still see which slide is current (just no animated countdown). */
@media (prefers-reduced-motion: reduce) {
	.bt-carousel__slide,
	.bt-carousel__tab,
	.bt-carousel__img img { transition: none !important; }
	.bt-carousel__slide.is-active .bt-carousel__img img { transform: none !important; }
	.bt-carousel__link:hover .bt-carousel__img img { transform: none !important; }
	.bt-carousel__tab-progress { animation: none !important; transform: scaleX(0) !important; }
	.bt-carousel__tab.is-active .bt-carousel__tab-progress { transform: scaleX(1) !important; }
}

/* Card */
.bt-card__link { text-decoration: none; display: block; color: inherit; }
.bt-card__img {
	aspect-ratio: 4 / 3;
	margin-bottom: .75rem;
	overflow: hidden;
	/* Subtle inset shadow — image sits "in" the page, slight printed
	   feel. Stays soft so the image's own contrast is preserved. */
	box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.08);
	position: relative;
}
.bt-card__img img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
}
.bt-card__img--tall { aspect-ratio: 3 / 4; }
.bt-card__img--square { aspect-ratio: 1 / 1; }
.bt-card__img--wide { aspect-ratio: 16 / 9; }
.bt-card__title { font-size: 1.1rem; line-height: 1.3; margin: 0 0 .25rem; }
.bt-card__title--large { font-size: 1.5rem; line-height: 1.25; margin: .5rem 0 .5rem; }
.bt-card__title--compact { font-size: 1rem; line-height: 1.3; margin: .5rem 0 0; }
.bt-card__meta { font-size: .85rem; color: var(--bt-muted); }
.bt-card__excerpt { font-size: .95rem; line-height: 1.5; margin: .25rem 0 .5rem; }
.bt-card--review .bt-card__excerpt { font-style: italic; }

/* ============================================================
   CARD HOVER — universal affordance across all card variants
   Image zoom + title shift to accent. Interview cards opt out
   of the title shift (title sits on a dark gradient overlay).
   ============================================================ */
.bt-card__img { overflow: hidden; }
.bt-card__img img,
.bt-card--interview__media img {
	transition: transform 0.4s ease;
}
.bt-card:hover .bt-card__img img,
.bt-card:hover .bt-card--interview__media img {
	transform: scale(1.04);
}
.bt-card__title,
.bt-card__title a {
	transition: color 0.15s;
}
.bt-card:hover .bt-card__title,
.bt-card:hover .bt-card__title a,
.bt-card:hover .bt-card__link {
	color: var(--bt-accent);
}
/* Interview overlay title is white on a gradient — don't tint it */
.bt-card--interview:hover .bt-card__title,
.bt-card--interview:hover .bt-card__link { color: inherit; }

@media (prefers-reduced-motion: reduce) {
	.bt-card__img img,
	.bt-card--interview__media img { transition: none; }
	.bt-card:hover .bt-card__img img,
	.bt-card:hover .bt-card--interview__media img { transform: none; }
}

/* ============================================================
   NEWS CARD — compact side-by-side (thumb right, text left)
   Used in the News section on the homepage, 3 cols × 2 rows.
   ============================================================ */
.bt-card--news .bt-card__inner {
	display: grid;
	grid-template-columns: 120px 1fr;
	gap: 1.25rem;
	align-items: center;
}
.bt-card--news .bt-card__title {
	font-size: 1.0625rem;
	line-height: 1.3;
	font-weight: 700;
	margin: 0;
}
.bt-card--news .bt-card__link {
	color: var(--bt-ink);
	text-decoration: underline;
	text-underline-offset: 3px;
	text-decoration-thickness: 1px;
	text-decoration-color: var(--bt-line);
	transition: color 0.15s, text-decoration-color 0.15s;
}
.bt-card--news:hover .bt-card__link {
	color: var(--bt-accent);
	text-decoration-color: var(--bt-accent);
}
.bt-card--news .bt-card__thumb {
	display: block;
	aspect-ratio: 1;
	overflow: hidden;
	background: var(--bt-line);
}
.bt-card--news .bt-card__thumb img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
	transition: transform 0.4s ease;
}
.bt-card--news:hover .bt-card__thumb img { transform: scale(1.04); }

/* ============================================================
   FEATURED CARD — "Our picks" section
   Image on top, category label, underlined title, author byline.
   Designed to work on either light or dark section backgrounds;
   colour tokens flip via .bt-section--dark overrides below.
   ============================================================ */
.bt-card--featured .bt-card__img {
	aspect-ratio: 16 / 10;
	margin-bottom: 1rem;
}
.bt-card--featured .bt-card__text {
	text-align: center;
}
.bt-card--featured .bt-cat-label {
	margin-bottom: 0.5rem;
}
.bt-card--featured .bt-card__title {
	font-size: 1.375rem;
	line-height: 1.2;
	font-weight: 700;
	margin: 0 0 0.5rem;
}
.bt-card--featured .bt-card__title a {
	color: inherit;
	text-decoration: underline;
	text-underline-offset: 3px;
	text-decoration-thickness: 1px;
}
.bt-card--featured .bt-card__byline {
	font-size: 0.8rem;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	color: var(--bt-muted);
	margin: 0;
}
.bt-card--featured .bt-card__byline strong {
	font-weight: 700;
	color: var(--bt-ink);
}

/* ============================================================
   OUR PICKS SECTION — light zine-aesthetic feature zone.
   White surface with a layered pattern overlay:
   - Halftone dot pattern (bold, low opacity) for that DIY
     Xerox/photocopy feel
   - Repeating diagonal stripe giving riso-print grit
   - Top + bottom bold ink rules bracket the section
   ============================================================ */
.bt-section--dark {
	background-color: var(--bt-bg);
	color: var(--bt-ink);
	background-image:
		/* Halftone dots — largish, low opacity */
		radial-gradient(circle at 10px 10px, var(--bt-pattern-halftone) 2px, transparent 2.5px),
		/* Diagonal zine stripes — add motion */
		repeating-linear-gradient(135deg, var(--bt-pattern-stripes) 0 2px, transparent 2px 14px);
	background-size: 20px 20px, auto;
	border-top: 4px solid var(--bt-ink);
	border-bottom: 4px solid var(--bt-ink);
	padding: 3.5rem 0;
	margin-bottom: 3rem;
	position: relative;
}
/* Accent slash — teal diagonal stripe top-right, maroon bottom-left.
   Small, unobtrusive; gives the section its "curated" stamp without
   shouting. Uses the brand accents intentionally. */
.bt-section--dark::before,
.bt-section--dark::after {
	content: "";
	position: absolute;
	width: 60px;
	height: 8px;
	transform: rotate(-12deg);
	pointer-events: none;
}
.bt-section--dark::before {
	top: 1rem;
	right: 2rem;
	background: var(--bt-accent);
}
.bt-section--dark::after {
	bottom: 1rem;
	left: 2rem;
	background: var(--bt-accent-dark);
}
@media (max-width: 600px) {
	.bt-section--dark::before,
	.bt-section--dark::after { display: none; }
}

/* Section header inside Our picks — stays ink, but uses the accent rule */
.bt-section--dark .bt-section-header__title { color: var(--bt-ink); }
.bt-section--dark .bt-section-header__more { color: var(--bt-muted); }
.bt-section--dark .bt-section-header__more:hover { color: var(--bt-accent); }

/* Cards inside Our picks — ink text on white card areas; nothing to override here */

/* Interview cards — overlay title on image */
.bt-card--interview .bt-card__link {
	display: block;
	position: relative;
}
.bt-card--interview__media {
	position: relative;
	aspect-ratio: 16 / 9;
	overflow: hidden;
	background: var(--bt-black);
}
.bt-card--interview__media img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
}
.bt-card--interview__overlay {
	position: absolute;
	inset: 0;
	display: flex;
	align-items: flex-end;
	padding: 1.25rem 1.5rem;
	background: linear-gradient(
		to bottom,
		transparent 40%,
		var(--bt-alpha-b-75) 100%
	);
}
.bt-card--interview__title {
	color: var(--bt-white);
	font-size: 1.5rem;
	line-height: 1.2;
	margin: 0;
}

/* Post — long-form reading layout */
.bt-post { padding: 2rem 0 3rem; }

/* Reading column — narrow centred column for long-form prose.
   Matches historic site width. Reviews share this 720px reading width
   for prose; the review header and review module break out wider via
   the .bt-reading--review wrapper below. */
.bt-reading {
	max-width: 720px;
	margin: 0 auto;
	padding: 0 var(--bt-gutter);
}

/* Reviews: 840px reading column — wide enough for the score module
   header + body prose, narrow enough for comfortable line-length on
   long-form text. Also defines the section-rule's horizontal extent
   beneath the article (rule sits inside .bt-reading--review). */
.bt-reading--review {
	max-width: 840px;
}

.bt-post__header {
	text-align: center;
	margin-bottom: 2rem;
	padding-bottom: 1.5rem;
	border-bottom: 1px solid var(--bt-line);
}
.bt-post__header .bt-cat-label {
	display: inline-block;
	margin-bottom: 1rem;
}
.bt-post__title {
	font-size: 2.25rem;
	line-height: 1.2;
	margin: 0 0 1rem;
}
.bt-post__byline {
	color: var(--bt-muted);
	font-size: .95rem;
	margin: 0;
}

/* ============================================================
   REVIEW HEADER (layout B — asymmetric split)
   Square artwork on the left, title + metadata on the right.
   Replaces the centered header + separate landscape hero for
   posts in the Reviews category.
   ============================================================ */
.bt-post__header--review {
	text-align: left;
	display: grid;
	grid-template-columns: 280px 1fr;
	gap: 2rem;
	align-items: center;
	padding-bottom: 2rem;
	margin: 0 auto 2.5rem;
	border-bottom: 1px solid var(--bt-line);
}
.bt-post__header--review .bt-cat-label {
	display: inline-block;
	margin: 0 0 0.75rem;
	padding-bottom: 3px;
	border-bottom: 1px solid var(--bt-section-accent);
	color: var(--bt-section-accent);
}
.bt-post__header-art {
	aspect-ratio: 1;
	overflow: hidden;
	background: #000;
	box-shadow: 0 8px 28px rgba(29, 42, 34, 0.18);
}
.bt-post__header-art img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
}
/* Artist reads as the primary title (big Oswald display) */
.bt-post__header--review .bt-post__title--artist {
	font-family: var(--bt-font-display);
	font-weight: 700;
	font-size: 3rem;
	letter-spacing: 0.01em;
	line-height: 1.05;
	color: var(--bt-ink);
	margin: 0 0 0.5rem;
}
/* Album title — italic body font, secondary weight */
.bt-post__album {
	font-family: var(--bt-font-body);
	font-size: 1.375rem;
	font-weight: 600;
	font-style: italic;
	color: var(--bt-ink);
	margin: 0 0 1.25rem;
	line-height: 1.3;
}
.bt-post__header--review .bt-post__byline {
	margin: 0;
}

@media (max-width: 700px) {
	.bt-post__header--review {
		grid-template-columns: 1fr;
		gap: 1.25rem;
		text-align: center;
	}
	.bt-post__header-art {
		max-width: 260px;
		margin: 0 auto;
	}
	.bt-post__header--review .bt-post__title--artist { font-size: 2rem; }
	.bt-post__header--review .bt-cat-label { margin-top: 0.5rem; }
}

/* ============================================================
   CINEMATIC HERO (interviews)
   Full-bleed featured image with title overlay on a dark gradient.
   Breaks out of the article's reading column via 100vw trick; sits
   flush against both sides of the viewport.
   ============================================================ */
.bt-post__cinema {
	position: relative;
	width: 100vw;
	margin-left: calc(50% - 50vw);
	margin-right: calc(50% - 50vw);
	margin-bottom: 2.5rem;
	overflow: hidden;
	background: var(--bt-ink);
}
.bt-post__cinema-media {
	width: 100%;
	aspect-ratio: 16 / 9;
	max-height: 70vh;
	overflow: hidden;
}
.bt-post__cinema-img,
.bt-post__cinema-media img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
}
/* Gradient overlay for legibility over any photo */
.bt-post__cinema-overlay {
	position: absolute;
	inset: 0;
	display: flex;
	align-items: flex-end;
	padding: 0;
	background: linear-gradient(
		to top,
		var(--bt-cinema-bg) 0%,
		var(--bt-cinema-mid) 40%,
		var(--bt-cinema-fade) 70%,
		transparent 100%
	);
}
.bt-post__cinema-inner {
	max-width: var(--bt-max);
	width: 100%;
	margin: 0 auto;
	padding: 2.5rem var(--bt-gutter) 2.25rem;
	color: #fff;
}
.bt-post__cinema-inner .bt-cat-label {
	color: #fff;
	opacity: 0.8;
	margin-bottom: 0.75rem;
}
.bt-post__cinema-inner .bt-cat-label:hover { opacity: 1; }
.bt-post__title--cinema {
	font-family: var(--bt-font-display);
	font-weight: 700;
	font-size: 3rem;
	letter-spacing: 0.01em;
	line-height: 1.1;
	color: var(--bt-white);
	margin: 0 0 0.75rem;
	max-width: 24ch;
}
.bt-post__byline--cinema {
	color: var(--bt-alpha-w-80);
	font-size: 0.95rem;
	margin: 0;
}
.bt-post__byline--cinema strong { color: var(--bt-white); }
.bt-post__cinema-inner .bt-meta { color: var(--bt-alpha-w-80); }
.bt-post__cinema-inner .bt-meta__author { color: var(--bt-white); font-weight: 600; }

@media (max-width: 700px) {
	.bt-post__cinema-media { aspect-ratio: 4 / 5; }
	.bt-post__title--cinema { font-size: 2rem; }
	.bt-post__cinema-inner { padding: 2rem var(--bt-gutter) 1.5rem; }
}

/* Default hero — used on non-review, non-interview long-form posts */
.bt-post__hero {
	margin: 0 0 2rem;
}
.bt-post__hero img {
	width: 100%;
	height: auto;
	display: block;
}

.bt-post__body {
	font-size: 1.1rem;
	line-height: 1.7;
}
.bt-post__body p { margin: 0 0 1.25em; }
.bt-post__body h2,
.bt-post__body h3 { margin: 1.25em 0 .35em; line-height: 1.3; }
.bt-post__body a { color: inherit; text-decoration: underline; }
.bt-post__body img { max-width: 100%; height: auto; }
.bt-post__body blockquote {
	border-left: 3px solid var(--bt-ink);
	padding-left: 1.25rem;
	margin: 1.5em 0;
	font-style: italic;
	font-size: 1.15rem;
}

/* ============================================================
   GALLERY / LIVE REPORT POSTS
   Compact header (no hero, no category label shown), less top
   padding so the content sits higher on the page. H2s in the
   body mark each band's set and get a display-font band-name
   treatment to give the page more editorial rhythm.
   ============================================================ */
.bt-post--gallery { padding-top: 0.5rem; }

/* Gallery body width — 980px. Wide enough for Meow Gallery image
   grids to breathe without crushing rows; narrow enough to feel
   composed within the 1320px container. */
.bt-post__body--gallery {
	max-width: 980px;
	margin-left: auto;
	margin-right: auto;
}

/* Meow Gallery / WP core gallery — trim trailing margin.
   Meow's stylesheet ships with margin-bottom on .mgl-gallery (and core
   gallery blocks ship similar). Combined with the gallery body's own
   bottom-margin, this leaves a noticeable empty band beneath the last
   row of images. Pull it tight here. */
.bt-post__body--gallery .mgl-gallery,
.bt-post__body--gallery .wp-block-gallery,
.bt-post__body--gallery .gallery {
	margin-bottom: 0;
}
/* Belt-and-braces: zero the bottom margin on the gallery body's last
   child whatever it is — covers cases where Meow wraps in an extra
   container or the editor leaves a trailing empty paragraph. */
.bt-post__body--gallery > *:last-child {
	margin-bottom: 0;
}

.bt-post__header--compact {
	margin-bottom: 1.5rem;
	padding-bottom: 1rem;
}
/* Hide the category label on gallery headers — it's redundant
   alongside the "LIVE REPORT:" prefix in the title. Category stays
   in the DB / primary-category metadata for SEO and archive use. */
.bt-post__header--compact .bt-cat-label { display: none; }

/* H2 band names inside a gallery body.
   Display font, uppercase, centred, with a thin rule beneath to
   signal a set-break within a long report. Applies only to the
   gallery body so other post types' H2s are untouched. */
.bt-post__body--gallery h2 {
	font-family: var(--bt-font-display);
	font-weight: 700;
	font-size: 2.25rem;
	letter-spacing: 0.04em;
	text-transform: uppercase;
	text-align: center;
	color: var(--bt-ink);
	margin: 1.5em 0 0.5em;
	padding-bottom: 0.5rem;
	position: relative;
	line-height: 1.1;
}
.bt-post__body--gallery h2::after {
	content: "";
	display: block;
	width: 60px;
	height: 2px;
	background: var(--bt-ink);
	margin: 0.75rem auto 0;
}

/* News posts use the standard .bt-reading column (720px). No override
   needed — the reading wrapper already applies to news via the
   template's .bt-reading wrapper. If a wider or narrower width is
   desired later, add a .bt-post--news .bt-reading override here. */

/* ============================================================
   ROUNDUP / RELEASES YOU MAY HAVE MISSED
   Monthly column of ~9 release write-ups, each authored via the
   "Release Entry" block pattern. Numbering is pure CSS counter —
   editors don't type the numbers. Each entry is a core/group with
   the class .bt-release-entry, containing title / label / blurb /
   FFO / embed blocks in that order.
   ============================================================ */

/* Header band — sits above the reading column, breaks out wider.
   Styled differently from the standard post header because the
   roundup has a series identity to establish. */
.bt-post--roundup { margin-top: 0; }

/* YMHM uses standard 720px reading column — matches news/article
   width throughout for visual consistency. Entries fit a smaller
   media block within this column (see grid below). */

/* Rounded-corner variant of .bt-post__hero — used for YMHM posts where
   the featured image is an Instagram-style graphic. Lives inside the
   reading column (no breakout), gets soft-rounded corners. */
.bt-post__hero--rounded img {
	border-radius: 12px;
	background: #000;
}

.bt-roundup__header {
	margin: 1.5rem 0 1.5rem;
}
.bt-roundup__eyebrow {
	font-family: var(--bt-font-display);
	font-size: 0.75rem;
	font-weight: 700;
	letter-spacing: 0.22em;
	text-transform: uppercase;
	margin: 0 0 0.75rem;
	display: flex;
	align-items: center;
	gap: 0.75rem;
	flex-wrap: wrap;
}
.bt-roundup__eyebrow-lead {
	color: var(--bt-section-accent);
	text-shadow: 1px 1px 0 var(--bt-sh-warm);
}
.bt-roundup__eyebrow-sep { color: var(--bt-muted); opacity: 0.5; }
.bt-roundup__eyebrow-series {
	color: var(--bt-ink);
	text-shadow: 1px 1px 0 var(--bt-sh-warm);
}

.bt-roundup__title {
	font-family: var(--bt-font-display);
	font-weight: 700;
	font-size: 2.25rem;
	letter-spacing: 0.01em;
	line-height: 1.1;
	color: var(--bt-ink);
	margin: 0 0 0.5rem;
	max-width: 28ch;
	text-shadow: 2px 2px 0 var(--bt-sh-warm);
}
.bt-roundup__byline {
	color: var(--bt-muted);
	font-size: 0.9375rem;
	margin: 0 0 1.5rem;
}

/* Intro paragraph inside the body — slightly larger, standfirst treatment */
.bt-post__body--roundup > .bt-roundup__intro,
.bt-post__body--roundup > p.bt-roundup__intro {
	font-size: 1.25rem;
	line-height: 1.55;
	color: var(--bt-ink);
	margin: 0 0 2.5rem;
	padding-bottom: 1.75rem;
	border-bottom: 1px solid var(--bt-line);
	font-weight: 500;
}

/* Container counter — numbers the entries automatically */
.bt-post__body--roundup {
	counter-reset: bt-release;
}

/* Individual release entry — float-based layout (v0.9.11+).

   Posts authored with the v0.9.6+ block pattern wrap the embed in
   .bt-release-entry__media. The media block floats left, blurb text
   naturally wraps around it. FFO sits below with clear:both as the
   entry's footer.

   Why float over grid: floats are bog-standard CSS that work without
   the :has() pseudo-class or grid-template-areas — both of which have
   specificity quirks with Gutenberg's block wrappers. Float-based
   layout is robust against any nesting Gutenberg adds.

   Layout (desktop):
       title (full width)
       label (full width)
       [media floated]  blurb wraps around →
                        blurb continues full width below media
       ffo (clear:both, full width)

   Mobile: media drops to full width, blurb stacks below. */
.bt-release-entry {
	position: relative;
	counter-increment: bt-release;
	margin: 0 0 3.5rem;
	padding: 0 0 2.5rem 70px;
	border-bottom: 1px solid var(--bt-line);
}
.bt-release-entry::after {
	/* Clearfix — ensures floated media doesn't escape the entry */
	content: "";
	display: table;
	clear: both;
}
.bt-release-entry:last-of-type {
	border-bottom: none;
	margin-bottom: 2rem;
}

/* Big numeral pinned to the left */
.bt-release-entry::before {
	content: counter(bt-release, decimal-leading-zero);
	position: absolute;
	left: 0;
	top: 0;
	font-family: var(--bt-font-display);
	font-weight: 700;
	font-size: 2.5rem;
	line-height: 1;
	color: var(--bt-section-accent);
	letter-spacing: -0.02em;
	/* Warm sand drop-shadow — kept consistent regardless of section
	   colour. The shadow gives the numerals their letterpress feel,
	   reading as a printed-on-paper texture rather than a colour
	   signal. Tying it to --bt-section-accent would lose that texture
	   (moss-on-moss looks flat, dark-olive-on-dark-olive muddy). */
	text-shadow: 2px 2px 0 rgba(197, 192, 134, 0.35);
}

/* Title line — "Band Name — Album Title"
   Gutenberg pattern ships this as an h3 with <strong> wrapping the band name
   and em/en-dash separating title. We style the h3 as one unit and let the
   <strong> provide the weight differential. */
.bt-release-entry__title {
	font-family: var(--bt-font-display);
	font-weight: 500;
	font-size: 1.5rem;
	line-height: 1.2;
	letter-spacing: 0.005em;
	margin: 0 0 0.35rem;
	color: var(--bt-ink);
}
.bt-release-entry__title strong {
	font-weight: 700;
}
/* If editors use italic for the album part, keep that legible */
.bt-release-entry__title em {
	font-family: var(--bt-font-body);
	font-weight: 600;
	font-style: italic;
	font-size: 1.25rem;
}

/* Label line — small-caps, muted */
.bt-release-entry__label {
	font-family: var(--bt-font-display);
	font-size: 0.75rem;
	font-weight: 600;
	letter-spacing: 0.18em;
	text-transform: uppercase;
	color: var(--bt-muted);
	margin: 0 0 1.25rem;
}

/* Blurb — the prose; uses the body-prose font + rhythm */
.bt-release-entry__blurb {
	font-size: 1.0625rem;
	line-height: 1.6;
	color: var(--bt-ink);
	margin: 0 0 1.25rem;
}
/* Author byline is authored as an <em> at the end of the blurb. The
   "— " em-dash cue visually separates it already; we add subtle colour. */
.bt-release-entry__blurb em {
	font-style: italic;
	color: var(--bt-muted);
	font-weight: 500;
}

/* FFO line — "fans of" tags. Sits in the left column under the media
   block (in grid layout), forming a unified video+meta unit.

   Body uses the body font so commas/ampersands render cleanly — display
   font (Oswald) made punctuation feel awkward at this size. FFO: label
   keeps display font for the "tag" feel. */
.bt-release-entry__ffo {
	font-family: var(--bt-font-body);
	font-size: 0.95rem;
	font-weight: 500;
	line-height: 1.55;
	color: var(--bt-ink);
	margin: 1rem 0 0.5rem;
	padding: 0.7rem 1rem;
	background: rgba(0, 0, 0, 0.04);
	border-left: 3px solid var(--bt-section-accent);
	box-sizing: border-box;
	clear: both; /* sits below the floated media regardless of blurb height */
}
.bt-release-entry__ffo strong {
	font-family: var(--bt-font-display);
	color: var(--bt-section-accent);
	font-weight: 700;
	letter-spacing: 0.14em;
	text-transform: uppercase;
	font-size: 0.85em;
	margin-right: 0.4rem;
	text-shadow: 1px 1px 0 var(--bt-sh-warm);
}

/* ===== Embed media block — new floating layout (v0.9.6+) =====
   The block pattern wraps any embed (YouTube, Spotify, Bandcamp) in a
   .bt-release-entry__media div, positioned between label and blurb in
   source order. We float it left at desktop so the blurb wraps around
   it — Bandcamp Daily-style entry density without sacrificing the embed.

   Width is capped at 320px so the blurb has room. On narrow viewports
   we drop the float and let the embed go full-width, stacking above the
   blurb naturally.

   The .bt-release-entry__media wrapper itself comes from the block
   pattern — older posts authored before the v0.9.6 pattern update won't
   have it; the legacy embed rules below catch those. */
.bt-release-entry__media {
	float: left;
	width: 280px;
	margin: 0.25rem 1.5rem 0.75rem 0;
	clear: left; /* if a previous entry's float somehow leaked, clear it */
}
.bt-release-entry__media iframe {
	width: 100%;
	height: auto !important;
	display: block;
	border: 1px solid var(--bt-line);
	background: #000;
	/* Default aspect for any iframe that hasn't had its aspect ratio
	   set by the lite-YouTube facade swap (eg. Spotify, Bandcamp, or
	   the brief moment before main.js runs). The lite-YouTube swap
	   sets aspect-ratio inline on the post-click iframe, overriding this. */
	aspect-ratio: 16 / 9;
}
/* Once the lite-YouTube facade has been clicked and the real player is
   loaded, drop the aspect ratio fallback — JS has set the correct one
   inline based on the original iframe's intrinsic dimensions, so a 4:3
   video plays at 4:3 instead of being letterboxed into 16:9. */
.bt-release-entry__media iframe.bt-lite-yt-loaded {
	aspect-ratio: auto;
}
/* Spotify keeps its taller fixed height even inside the media block */
.bt-release-entry__media .wp-block-embed-spotify iframe {
	aspect-ratio: auto;
	min-height: 352px;
}
/* Lite-YouTube facade — JS replaces iframes with this on page load.
   .bt-lite-yt is the clickable thumbnail; clicking expands it to a real
   iframe (handled in main.js). The thumbnail uses YouTube's hqdefault.jpg
   served from i.ytimg.com — no API call needed, no consent prompt until
   the user actually clicks play. */
.bt-lite-yt {
	position: relative;
	display: block;
	width: 100%;
	aspect-ratio: 16 / 9;
	background-color: #000;
	background-size: cover;
	background-position: center;
	cursor: pointer;
	border: 1px solid var(--bt-line);
	overflow: hidden;
	transition: transform 0.18s;
}
.bt-lite-yt:hover { transform: scale(1.01); }
.bt-lite-yt::before {
	/* Play button — circular, semi-transparent, centred */
	content: "";
	position: absolute;
	top: 50%;
	left: 50%;
	width: 56px;
	height: 56px;
	transform: translate(-50%, -50%);
	background: rgba(0, 0, 0, 0.7);
	border-radius: 50%;
	transition: background 0.18s;
}
.bt-lite-yt::after {
	/* Play triangle — drawn with a CSS triangle, slightly offset right
	   so it visually centres in the circle (optical correction) */
	content: "";
	position: absolute;
	top: 50%;
	left: 50%;
	width: 0;
	height: 0;
	transform: translate(-40%, -50%);
	border-left: 14px solid #fff;
	border-top: 9px solid transparent;
	border-bottom: 9px solid transparent;
}
.bt-lite-yt:hover::before { background: var(--bt-section-accent); }
.bt-lite-yt:focus-visible {
	outline: 3px solid var(--bt-accent);
	outline-offset: 2px;
}

/* Legacy embed rules — for roundup posts authored before the v0.9.6
   pattern update, where the iframe sits at the bottom of the entry
   without the .bt-release-entry__media wrapper. Keeps old posts looking
   reasonable without forcing the editor to migrate them. */
.bt-release-entry > iframe,
.bt-release-entry > figure iframe,
.bt-release-entry > .wp-block-embed iframe {
	width: 100%;
	aspect-ratio: 16 / 9;
	height: auto !important;
	display: block;
	border: 1px solid var(--bt-line);
	background: #000;
}
.bt-release-entry > .wp-block-embed-spotify iframe {
	aspect-ratio: auto;
	min-height: 352px;
}
.bt-release-entry > figure,
.bt-release-entry > .wp-block-embed {
	margin: 0;
}

/* Mobile / narrow viewport: drop the float, full-width embed.
   Below 700px the blurb-wrap-around starts looking cramped (blurb gets
   <30 chars per line); cleaner to stack. */
@media (max-width: 700px) {
	.bt-release-entry__media {
		float: none;
		width: 100%;
		max-width: 100%;
		margin: 0 0 1rem;
	}
	.bt-release-entry__ffo { margin-top: 0.5rem; }
}

/* ===== End embed media block ===== */

/* Playlist embed at the bottom of the post — sits in a wider container */
.bt-post__body--roundup > .wp-block-embed-spotify {
	margin-top: 3rem;
	padding-top: 2rem;
	/* Double rule — closing band of the article, more rustic
	   than a single solid line. Reads as a section terminator. */
	border-top: 4px double var(--bt-ink);
}
.bt-post__body--roundup > .wp-block-embed-spotify::before {
	content: "The playlist";
	display: block;
	font-family: var(--bt-font-display);
	font-size: 0.8rem;
	font-weight: 700;
	letter-spacing: 0.18em;
	text-transform: uppercase;
	color: var(--bt-section-accent);
	margin-bottom: 1rem;
}

@media (max-width: 700px) {
	.bt-roundup__title { font-size: 1.75rem; }
	.bt-release-entry {
		padding-left: 50px;
		margin-bottom: 2.5rem;
		padding-bottom: 2rem;
	}
	.bt-release-entry::before { font-size: 1.875rem; }
	.bt-release-entry__title { font-size: 1.25rem; }
	.bt-release-entry__title em { font-size: 1.0625rem; }
}


.bt-review-module {
	display: grid;
	grid-template-columns: 180px auto 1fr;
	gap: 1.75rem;
	align-items: stretch;
	margin: 3rem 0 2rem;
	padding: 2rem 2.25rem;
	background-color: var(--bt-fixed-ink);
	/* Subtle white-based texture matching footer — remains visible on fixed dark background. */
	background-image: repeating-linear-gradient(
		135deg,
		rgba(255, 255, 255, 0.02) 0 1px,
		transparent 1px 8px
	);
	color: #fff;
	/* Standardized 1px borders on all sides */
	border: 1px solid var(--bt-alpha-w-20);
	position: relative;
	overflow: hidden;
	}

.bt-review-module__art {
	aspect-ratio: 1;
	overflow: hidden;
	background: #000;
	/* Triple-outline frame — feels pressed into the page */
	box-shadow:
		0 0 0 1px rgba(255, 255, 255, 0.15),
		0 0 0 4px rgba(29, 41, 28, 0.9),
		0 0 0 5px rgba(110, 138, 94, 0.4),
		0 10px 28px rgba(0, 0, 0, 0.45);
}
.bt-review-module__art img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
}

/* Score — with rustic bracket marks around the number */
.bt-review-module__score {
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	padding: 0 1.5rem;
	/* Dashed rather than solid verticals — more weathered */
	border-left: 1px dashed rgba(255, 255, 255, 0.18);
	border-right: 1px dashed rgba(255, 255, 255, 0.18);
	text-align: center;
	line-height: 1;
	position: relative;
}
.bt-review-module__score-label {
	font-family: var(--bt-font-display);
	font-size: 0.7rem;
	font-weight: 600;
	letter-spacing: 0.22em;
	text-transform: uppercase;
	color: #fff;
	opacity: 0.8;
	margin-bottom: 0.75rem;
	/* Letterpress shadow — matches the score number's offset feel */
	text-shadow: 1px 1px 0 var(--bt-sh-maroon-low);
}
.bt-review-module__score-number {
	font-family: var(--bt-font-display);
	font-weight: 700;
	font-size: 5.5rem;
	letter-spacing: -0.02em;
	color: #fff;
	display: inline-block;
	position: relative;
	padding: 0 0.85rem;
	/* Offset text-shadow kept — reads like letterpress registration error */
	text-shadow: 2px 2px 0 var(--bt-sh-maroon);
}
.bt-review-module__score-number::before,
.bt-review-module__score-number::after {
	content: "";
	position: absolute;
	top: 8%;
	bottom: -2%;
	width: 12px;
	/* Warm terracotta brackets — reads cleaner against ink+moss than teal */
	border-color: var(--bt-accent-warm);
}
.bt-review-module__score-number::before {
	left: 0;
	border-left: 2px solid;
	border-top: 2px solid;
	border-bottom: 2px solid;
}
.bt-review-module__score-number::after {
	right: 0;
	border-right: 2px solid;
	border-top: 2px solid;
	border-bottom: 2px solid;
}
.bt-review-module__score-suffix {
	font-family: var(--bt-font-display);
	font-weight: 500;
	font-size: 0.95rem;
	color: rgba(255, 255, 255, 0.55);
	margin-top: 0.5rem;
	letter-spacing: 0.1em;
	text-shadow: 1px 1px 0 var(--bt-sh-maroon-low);
}

.bt-review-module__meta {
	display: flex;
	flex-direction: column;
	justify-content: center;
	gap: 1rem;
}

/* Facts list — key/value pairs */
.bt-review-module__facts {
	display: grid;
	grid-template-columns: 1fr;
	gap: 0;
	margin: 0;
}
.bt-review-module__fact {
	display: grid;
	grid-template-columns: 110px 1fr;
	gap: 1rem;
	align-items: baseline;
	padding: 0.65rem 0;
	/* Dotted — rustic printed-field divider */
	border-bottom: 1px dotted rgba(255, 255, 255, 0.2);
}
.bt-review-module__fact:first-child { padding-top: 0; }
.bt-review-module__fact:last-child { border-bottom: none; padding-bottom: 0; }
.bt-review-module__fact dt {
	font-family: var(--bt-font-display);
	font-size: 0.7rem;
	font-weight: 600;
	letter-spacing: 0.18em;
	text-transform: uppercase;
	color: #fff;
	opacity: 0.8;
	margin: 0;
	text-shadow: 1px 1px 0 var(--bt-sh-maroon-low);
}
.bt-review-module__fact dd {
	margin: 0;
	font-size: 1rem;
	font-weight: 500;
	color: #fff;
}

.bt-review-module__release {
	font-size: 0.95rem;
	line-height: 1.55;
	color: rgba(255, 255, 255, 0.85);
}
.bt-review-module__release p { margin: 0; }
.bt-review-module__release p + p { margin-top: 0.5rem; }
.bt-review-module__release a {
	color: var(--bt-section-accent);
	text-decoration: underline;
	text-underline-offset: 3px;
}
.bt-review-module__release a:hover { color: #fff; }

.bt-review-module__order {
	align-self: flex-start;
	margin-top: 0.5rem;
	display: inline-flex;
	align-items: center;
	gap: 0.5rem;
	padding: 0.7rem 1.1rem;
	background: var(--bt-accent);
	color: #fff;
	font-family: var(--bt-font-display);
	font-weight: 700;
	font-size: 0.875rem;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	text-decoration: none;
	transition: background 0.15s, color 0.15s, transform 0.15s;
	/* Rustic press-plate border */
	box-shadow: 2px 2px 0 var(--bt-moss);
}
.bt-review-module__order:hover,
.bt-review-module__order:focus-visible {
	background: #fff;
	color: var(--bt-ink);
	outline: none;
	box-shadow: 3px 3px 0 var(--bt-moss);
}
.bt-review-module__order svg { flex-shrink: 0; }

/* Pre-order variant — outlined rather than solid so it sits next to
   "Order Now" without competing visually. Text uses ink (dark) on a
   transparent background — base rule sets `color: #fff` which works
   on the accent fill but is invisible on the page background; this
   override restores legibility for the outlined treatment. Hover
   inverts to the solid accent fill, mirroring the base button. */
.bt-review-module__order--preorder {
	background: transparent;
	color: #fff;
	border: 1px solid var(--bt-accent);
	/* Subtle press-plate shadow at rest — same vocabulary as solid
	   variant, dimmed via lower opacity so the outlined state still
	   feels lighter than the solid CTA. */
	box-shadow: 2px 2px 0 var(--bt-sh-maroon-low);
}
.bt-review-module__order--preorder:hover,
.bt-review-module__order--preorder:focus-visible {
	background: var(--bt-accent);
	color: #fff;
	border-color: var(--bt-accent);
	box-shadow: 3px 3px 0 var(--bt-moss);
}

@media (max-width: 700px) {
	.bt-review-module {
		grid-template-columns: 1fr;
		gap: 1.25rem;
		padding: 1.5rem;
		border-left-width: 4px;
		border-right-width: 4px;
	}
	.bt-review-module__art {
		max-width: 220px;
		margin: 0 auto;
	}
	.bt-review-module__score {
		padding: 1rem 0;
		border-left: none;
		border-right: none;
		border-top: 1px dashed rgba(255, 255, 255, 0.18);
		border-bottom: 1px dashed rgba(255, 255, 255, 0.18);
	}
	.bt-review-module__score-number { font-size: 4.5rem; }
	.bt-review-module__meta { text-align: center; align-items: center; }
	.bt-review-module__fact {
		grid-template-columns: 1fr;
		gap: 0.25rem;
	}
	.bt-review-module__order { align-self: center; }
}

/* Meta */
.bt-meta { color: var(--bt-muted); font-size: .9rem; }
.bt-cat-label {
	display: inline-block;
	font-size: .75rem;
	font-weight: 700;
	letter-spacing: .12em;
	text-transform: uppercase;
	text-decoration: none;
	color: var(--bt-muted);
	margin-bottom: .5rem;
	/* Half-pixel-feel letterpress shadow — at this small text size
	   it reads as edge texture, not offset. Reinforces printed feel. */
	text-shadow: 1px 1px 0 var(--bt-sh-warm);
}
.bt-cat-label:hover { color: var(--bt-accent); }

/* Tags */
.bt-tags {
	display: flex;
	flex-wrap: wrap;
	gap: .5rem;
	list-style: none;
	margin: 1rem 0;
	padding: 0;
}
.bt-tags__item a {
	display: inline-block;
	padding: .25rem .6rem;
	border: 1px solid var(--bt-line);
	font-size: .8rem;
	text-decoration: none;
}

/* Prev/Next */
.bt-prevnext {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: var(--bt-gap);
	margin: 2rem 0;
}
.bt-prevnext__link {
	display: block;
	padding: 1rem;
	border: 1px solid var(--bt-line);
	text-decoration: none;
}
.bt-prevnext__label { display: block; font-size: .8rem; color: var(--bt-muted); }
.bt-prevnext__title { display: block; font-weight: 500; margin: .25rem 0 .5rem; }
@media (max-width: 600px) {
	.bt-prevnext { grid-template-columns: 1fr; }
}

/* ============================================================
   PODCAST EMBED WRAPPER
   Wrap any third-party podcast player (RedCircle, Spotify, etc.)
   in .bt-podcast to get a consistent themed frame: "LISTEN" eyebrow,
   subtle grain, teal rule accent. The iframe's own controls/colours
   remain as the provider ships them.
   ============================================================ */
.bt-podcast {
	margin: 2rem 0;
	padding: 1.25rem 1.5rem 1.5rem;
	background: var(--bt-bg);
	border: 1px solid var(--bt-line);
	border-top: 3px solid var(--bt-accent);
	position: relative;
}
.bt-podcast::before {
	content: "Listen";
	display: block;
	font-family: var(--bt-font-display);
	font-size: 0.7rem;
	font-weight: 600;
	letter-spacing: 0.22em;
	text-transform: uppercase;
	color: var(--bt-accent);
	margin-bottom: 0.75rem;
}
/* Tame the "Powered by RedCircle" microcopy they inject */
.bt-podcast p[style] {
	margin-top: 0.5rem !important;
	font-size: 10px !important;
	color: var(--bt-muted) !important;
	text-align: right;
}
.bt-podcast .redcircle-link {
	color: var(--bt-muted) !important;
}
.bt-podcast .redcircle-link:hover {
	color: var(--bt-accent) !important;
}


.bt-archive-header {
	padding: 1.5rem 0 2rem;
	margin-bottom: 2rem;
	border-bottom: 1px solid var(--bt-ink);
}
.bt-archive-header__eyebrow {
	font-family: var(--bt-font-display);
	font-size: 0.75rem;
	font-weight: 600;
	letter-spacing: 0.18em;
	text-transform: uppercase;
	color: var(--bt-muted);
	margin: 0 0 0.75rem;
}
.bt-archive-header__title {
	font-family: var(--bt-font-display);
	font-weight: 700;
	font-size: 2.5rem;
	letter-spacing: 0.02em;
	line-height: 1.1;
	margin: 0;
	color: var(--bt-ink);
}
.bt-archive-header__desc {
	color: var(--bt-muted);
	font-size: 1rem;
	line-height: 1.5;
	max-width: 65ch;
	margin: 0.75rem 0 0;
}

.bt-archive-grid { margin-bottom: 3rem; }
.bt-archive-empty {
	color: var(--bt-muted);
	padding: 3rem 0;
	text-align: center;
}

/* Pagination — underneath the archive grid */
.bt-pagination,
.pagination,
.nav-links {
	display: flex;
	justify-content: center;
	gap: 0.5rem;
	margin: 2rem 0 3rem;
	font-family: var(--bt-font-display);
	font-size: 0.875rem;
	font-weight: 600;
	letter-spacing: 0.04em;
	text-transform: uppercase;
}
.bt-pagination .page-numbers,
.pagination .page-numbers,
.nav-links .page-numbers {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 40px;
	height: 40px;
	padding: 0 0.75rem;
	border: 1px solid var(--bt-line);
	color: var(--bt-ink);
	text-decoration: none;
	transition: border-color 0.15s, color 0.15s;
}
.bt-pagination .page-numbers:hover,
.pagination .page-numbers:hover,
.nav-links .page-numbers:hover {
	border-color: var(--bt-ink);
	color: var(--bt-accent);
}
.bt-pagination .page-numbers.current,
.pagination .page-numbers.current,
.nav-links .page-numbers.current {
	background: var(--bt-ink);
	color: var(--bt-white);
	border-color: var(--bt-ink);
}

@media (max-width: 600px) {
	.bt-archive-header__title { font-size: 1.875rem; }
}


/* ============================================================
   FOOTER
   Dark ink band closing the page. Flows directly from the dark
   "Our picks" section above. Brand leads the top row; the bottom
   row sits on a thin teal rule.
   ============================================================ */
.bt-footer {
	background: var(--bt-fixed-ink);
	color: rgba(255, 255, 255, 0.8);
	padding: 4.5rem 0 2rem;
	margin-top: 0;
	position: relative;
	overflow: hidden;
	/* Subtle white-based texture — remains visible on fixed dark background. */
	background-image: repeating-linear-gradient(
		135deg,
		rgba(255, 255, 255, 0.02) 0 1px,
		transparent 1px 8px
	);
}
/* Subtle radial vignette anchored top-right gives the band depth
   without being noticeable as a gradient. */
.bt-footer::before {
	content: "";
	position: absolute;
	top: -200px;
	right: -200px;
	width: 600px;
	height: 600px;
	background: radial-gradient(
		circle,
		rgba(83, 153, 157, 0.08) 0%,
		transparent 60%
	);
	pointer-events: none;
}
.bt-footer > .bt-container { position: relative; }

.bt-footer__top {
	display: grid;
	/* Brand gets the most room; 2 equal-ish columns after */
	grid-template-columns: 1.75fr 1fr 1.25fr;
	gap: 3rem;
	margin-bottom: 3rem;
}

/* Brand — masthead echo of the header treatment, bigger and more confident */
.bt-footer__brand-col { display: flex; flex-direction: column; }
.bt-footer__brand {
	font-family: var(--bt-font-body);
	font-size: 2.25rem;
	font-weight: 800;
	letter-spacing: -0.025em;
	line-height: 1;
	color: #fff;
	margin: 0 0 1rem;
}
/* Small accent stripe beneath the brand mark — anchors the column
   and picks up the teal from the column headings. */
.bt-footer__brand-col::after {
	content: "";
	display: block;
	width: 48px;
	height: 3px;
	background: var(--bt-accent);
	margin: 0 0 1.25rem;
	order: 2;
}
.bt-footer__brand { order: 1; }
.bt-footer__tagline {
	color: rgba(255, 255, 255, 0.7);
	font-family: var(--bt-font-body);
	font-size: 0.95rem;
	line-height: 1.6;
	margin: 0;
	max-width: 32ch;
	order: 3;
}

/* Column headings — small-caps, with a subtle underline bar for
   magazine-style column tops. */
.bt-footer__heading {
	font-family: var(--bt-font-display);
	font-size: 0.75rem;
	font-weight: 700;
	letter-spacing: 0.2em;
	text-transform: uppercase;
	color: var(--bt-accent);
	margin: 0 0 1.25rem;
	padding-bottom: 0.85rem;
	border-bottom: 1px solid rgba(255, 255, 255, 0.12);
	position: relative;
}
/* Short coloured stripe anchoring the heading's underline. */
.bt-footer__heading::after {
	content: "";
	position: absolute;
	left: 0;
	bottom: -1px;
	width: 28px;
	height: 1px;
	background: var(--bt-accent);
}

/* Link lists — Nunito, no bullets, with a nudge-on-hover effect */
.bt-footer__list {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 0.65rem;
}
.bt-footer__list a {
	color: #fff;
	text-decoration: none;
	font-size: 0.9375rem;
	transition: color 0.18s, transform 0.18s;
	display: inline-block;
}
.bt-footer__list a:hover {
	color: var(--bt-accent);
	transform: translateX(4px);
}

/* Follow column — blurb + social row + optional newsletter CTA */
.bt-footer__follow-blurb {
	font-size: 0.875rem;
	line-height: 1.5;
	color: rgba(255, 255, 255, 0.7);
	margin: 0 0 1.25rem;
}

.bt-footer__social {
	display: flex;
	gap: 0.75rem;
	list-style: none;
	margin: 0;
	padding: 0;
}
.bt-footer__social a {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 40px;
	height: 40px;
	color: #fff;
	text-decoration: none;
	border: 1px solid rgba(255, 255, 255, 0.2);
	border-radius: 50%;
	transition: color 0.18s, border-color 0.18s, background 0.18s, transform 0.18s;
}
.bt-footer__social a:hover {
	color: var(--bt-fixed-ink);
	background: var(--bt-accent);
	border-color: var(--bt-accent);
	transform: translateY(-2px);
}
.bt-footer__social svg { width: 18px; height: 18px; }

/* Rule separating top block from bottom row — simpler than the
   previous gradient version. Small accent square sits above the
   rule at the right edge as a nod to the publication's pulse. */
.bt-footer__rule {
	height: 1px;
	width: 100%;
	background: rgba(255, 255, 255, 0.15);
	margin: 0 0 1.75rem;
	position: relative;
}
.bt-footer__rule::after {
	content: "";
	position: absolute;
	right: 0;
	top: -3px;
	width: 7px;
	height: 7px;
	background: var(--bt-accent);
}

/* Bottom row — copyright + credit */
.bt-footer__bottom {
	display: grid;
	grid-template-columns: 1fr 1fr;
	align-items: center;
	gap: 1.5rem;
	font-family: var(--bt-font-display);
	font-size: 0.75rem;
	font-weight: 600;
	letter-spacing: 0.14em;
	text-transform: uppercase;
	color: rgba(255, 255, 255, 0.5);
}
.bt-footer__bottom p { margin: 0; }
.bt-footer__copy { justify-self: start; }
.bt-footer__credit { justify-self: end; }
.bt-footer__copy-mark { color: var(--bt-accent); margin-right: 0.25rem; }

@media (max-width: 900px) {
	.bt-footer__top {
		grid-template-columns: 1fr 1fr;
		gap: 2.5rem;
	}
	.bt-footer__brand-col { grid-column: 1 / -1; }
	.bt-footer__brand { font-size: 2rem; }
	.bt-footer__bottom {
		grid-template-columns: 1fr 1fr;
	}
}
@media (max-width: 600px) {
	.bt-footer { padding-top: 3rem; }
	.bt-footer__top {
		grid-template-columns: 1fr;
		gap: 2.25rem;
	}
	.bt-footer__brand { font-size: 1.75rem; }
	.bt-footer__bottom {
		grid-template-columns: 1fr;
		justify-items: center;
		gap: 0.75rem;
		text-align: center;
	}
	.bt-footer__copy, .bt-footer__credit { justify-self: center; }
}

/* ============================================================
   404 PAGE
   Lost-in-the-pit treatment: huge distressed 404 glyph up top,
   friendly copy, prominent search, then quick-nav chips.
   ============================================================ */
.bt-404 {
	padding: 3rem 0 5rem;
	text-align: center;
	max-width: 780px;
	margin: 0 auto;
}
.bt-404__hero { margin-bottom: 0.5rem; }
.bt-404__glyph {
	font-family: var(--bt-font-display);
	font-weight: 700;
	font-size: clamp(7rem, 18vw, 13rem);
	letter-spacing: -0.04em;
	line-height: 0.9;
	margin: 0;
	color: var(--bt-ink);
	/* Offset teal shadow — matches the review-score letterpress feel */
	text-shadow:
		4px 4px 0 var(--bt-accent),
		8px 8px 0 var(--bt-sh-maroon-low);
}
.bt-404__text { margin: 1.5rem auto 2.25rem; max-width: 56ch; }
.bt-404__title {
	font-family: var(--bt-font-display);
	font-weight: 700;
	font-size: 2rem;
	letter-spacing: 0.01em;
	line-height: 1.15;
	margin: 0 0 1rem;
	color: var(--bt-ink);
}
.bt-404__lede {
	color: var(--bt-muted);
	font-size: 1.0625rem;
	line-height: 1.55;
	margin: 0;
}

/* Inline search form — big, prominent, centered */
.bt-404__search {
	display: flex;
	gap: 0.5rem;
	max-width: 520px;
	margin: 0 auto 2rem;
	padding: 0 var(--bt-gutter);
}
.bt-404__search .bt-search__input {
	flex: 1;
	padding: 0.85rem 1rem;
	font-size: 1rem;
	font-family: var(--bt-font-body);
	background: var(--bt-white);
	color: var(--bt-ink);
	border: 1px solid var(--bt-line);
	transition: border-color 0.15s, box-shadow 0.15s;
}
.bt-404__search .bt-search__input:focus {
	outline: none;
	border-color: var(--bt-accent);
	box-shadow: 0 0 0 2px var(--bt-sh-teal);
}
.bt-404__search .bt-search__submit {
	padding: 0 1.4rem;
	background: var(--bt-ink);
	color: var(--bt-white);
	border: none;
	cursor: pointer;
	font-family: var(--bt-font-display);
	font-weight: 700;
	font-size: 0.875rem;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	transition: background 0.15s;
}
.bt-404__search .bt-search__submit:hover { background: var(--bt-accent); }

/* Quick-nav chips — not a rail, just short links */
.bt-404__chips ul {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-wrap: wrap;
	justify-content: center;
	gap: 0.5rem;
}
.bt-404__chips a {
	display: inline-block;
	padding: 0.55rem 1rem;
	background: transparent;
	color: var(--bt-ink);
	text-decoration: none;
	border: 1px solid var(--bt-line);
	font-family: var(--bt-font-display);
	font-size: 0.8125rem;
	font-weight: 600;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	transition: color 0.15s, border-color 0.15s, background 0.15s;
}
.bt-404__chips a:hover {
	color: #fff;
	background: var(--bt-ink);
	border-color: var(--bt-ink);
}

/* ============================================================
   SEARCH RESULTS PAGE
   Query form at top → result count + filter chips → a stacked
   list of results with thumb, category, title, excerpt.
   ============================================================ */
.bt-search {
	padding: 2.5rem 0 4rem;
	max-width: 880px;
	margin: 0 auto;
}
.bt-search__form {
	display: flex;
	gap: 0.5rem;
	margin-bottom: 1.5rem;
	padding-bottom: 1.5rem;
	border-bottom: 1px solid var(--bt-line);
}
.bt-search__form .bt-search__input {
	flex: 1;
	padding: 0.85rem 1rem;
	font-size: 1.0625rem;
	font-family: var(--bt-font-body);
	background: var(--bt-white);
	color: var(--bt-ink);
	border: 1px solid var(--bt-line);
	transition: border-color 0.15s, box-shadow 0.15s;
}
.bt-search__form .bt-search__input:focus {
	outline: none;
	border-color: var(--bt-accent);
	box-shadow: 0 0 0 2px var(--bt-sh-teal);
}
.bt-search__form .bt-search__submit {
	padding: 0 1.4rem;
	background: var(--bt-ink);
	color: var(--bt-white);
	border: none;
	cursor: pointer;
	font-family: var(--bt-font-display);
	font-weight: 700;
	font-size: 0.875rem;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	transition: background 0.15s;
}
.bt-search__form .bt-search__submit:hover { background: var(--bt-accent); }

.bt-search__count {
	font-family: var(--bt-font-display);
	font-size: 0.8125rem;
	font-weight: 600;
	letter-spacing: 0.14em;
	text-transform: uppercase;
	color: var(--bt-muted);
	margin: 0 0 1rem;
}

/* Filter chips — placeholder UI per template comment */
.bt-search__filters ul {
	list-style: none;
	margin: 0 0 2rem;
	padding: 0;
	display: flex;
	flex-wrap: wrap;
	gap: 0.4rem;
	border-bottom: 1px solid var(--bt-line);
	padding-bottom: 1rem;
}
.bt-search__filters a {
	display: inline-block;
	padding: 0.4rem 0.9rem;
	text-decoration: none;
	color: var(--bt-muted);
	border: 1px solid var(--bt-line);
	font-family: var(--bt-font-display);
	font-size: 0.75rem;
	font-weight: 600;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	transition: color 0.15s, border-color 0.15s, background 0.15s;
}
.bt-search__filters a:hover {
	color: var(--bt-ink);
	border-color: var(--bt-ink);
}
.bt-search__filters a[aria-current="page"] {
	color: #fff;
	background: var(--bt-ink);
	border-color: var(--bt-ink);
}

/* Results list — stacked rows, not a card grid */
.bt-search__results {
	list-style: none;
	margin: 0 0 2rem;
	padding: 0;
	counter-reset: bt-result;
}
.bt-search__result {
	border-bottom: 1px solid var(--bt-line);
}
.bt-search__result:first-child { border-top: 1px solid var(--bt-line); }
.bt-search__result-link {
	display: grid;
	grid-template-columns: 140px 1fr;
	gap: 1.5rem;
	padding: 1.25rem 0;
	text-decoration: none;
	color: inherit;
	align-items: center;
	transition: background 0.15s;
}
.bt-search__result-link:hover {
	background: var(--bt-alpha-b-02);
}
.bt-search__result-thumb {
	aspect-ratio: 4 / 3;
	overflow: hidden;
	background: var(--bt-line);
}
.bt-search__result-thumb img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
	transition: transform 0.3s;
}
.bt-search__result-link:hover .bt-search__result-thumb img {
	transform: scale(1.04);
}
.bt-search__result-text .bt-cat-label {
	display: inline-block;
	margin-bottom: 0.5rem;
}
.bt-search__result-title {
	font-family: var(--bt-font-display);
	font-weight: 700;
	font-size: 1.3rem;
	line-height: 1.2;
	margin: 0 0 0.5rem;
	color: var(--bt-ink);
	transition: color 0.15s;
}
.bt-search__result-link:hover .bt-search__result-title {
	color: var(--bt-accent);
}
.bt-search__result-excerpt {
	color: var(--bt-muted);
	font-size: 0.95rem;
	line-height: 1.5;
	margin: 0 0 0.5rem;
}
.bt-search__result-meta {
	font-size: 0.8125rem;
	color: var(--bt-muted);
	margin: 0;
}

.bt-search__empty {
	padding: 3rem 0;
	text-align: center;
	color: var(--bt-muted);
	font-size: 1.0625rem;
}

@media (max-width: 600px) {
	.bt-search__result-link {
		grid-template-columns: 100px 1fr;
		gap: 1rem;
		padding: 1rem 0;
	}
	.bt-search__result-title { font-size: 1.125rem; }
}


/* ============================================================
   RELEASES CALENDAR (/releases/)
   Month-grouped grid of release cards. Desktop 4-up, mobile 3-up.
   Past releases fade slightly. Click does nothing — pure visual
   reference. No individual release URLs.
   ============================================================ */
.bt-releases {
	padding: 2rem 0 4rem;
}
.bt-releases__header {
	text-align: center;
	margin-bottom: 2rem;
	padding-bottom: 1.5rem;
	border-bottom: 1px solid var(--bt-line);
}
.bt-releases__title {
	font-family: var(--bt-font-display);
	font-weight: 800;
	font-size: 2.5rem;
	letter-spacing: -0.01em;
	margin: 0 0 0.5rem;
	color: var(--bt-ink);
}
.bt-releases__sub {
	color: var(--bt-muted);
	font-size: 1rem;
	margin: 0;
}

/* Month navigation strip */
.bt-releases__monthnav {
	display: flex;
	align-items: center;
	gap: 1rem;
	margin-bottom: 2.5rem;
}
.bt-releases__monthnav-arrow {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 36px;
	height: 36px;
	border: 1px solid var(--bt-line);
	border-radius: 50%;
	color: var(--bt-ink);
	text-decoration: none;
	font-size: 1rem;
	transition: border-color 0.15s, color 0.15s, background 0.15s;
	flex-shrink: 0;
}
.bt-releases__monthnav-arrow:hover {
	background: var(--bt-ink);
	color: #fff;
	border-color: var(--bt-ink);
}
/* Disabled arrow — rendered as a span (not <a>) when there's no
   prev/next month with releases. Keeps layout stable so the chip
   strip doesn't reflow at the start/end of the month list. */
.bt-releases__monthnav-arrow.is-disabled {
	opacity: 0.3;
	pointer-events: none;
}
.bt-releases__monthnav-list {
	display: flex;
	gap: 0.5rem;
	list-style: none;
	margin: 0;
	padding: 0;
	flex: 1;
	min-width: 0; /* lets the strip shrink below content width on mobile */
	justify-content: center;
	/* Horizontally scrollable strip — supports swipe on touch devices.
	   On desktop with a small number of months, all chips fit and the
	   list doesn't need to scroll. Scrollbar is hidden for cleanliness;
	   focus-visible on chips remains for keyboard users. */
	overflow-x: auto;
	scrollbar-width: none;
	-ms-overflow-style: none;
	scroll-snap-type: x proximity;
	-webkit-overflow-scrolling: touch;
}
.bt-releases__monthnav-list::-webkit-scrollbar { display: none; }
.bt-releases__monthnav-list li {
	scroll-snap-align: center;
	flex-shrink: 0;
}
.bt-releases__monthnav-chip {
	display: inline-block;
	padding: 0.5rem 0.85rem;
	font-family: var(--bt-font-display);
	font-size: 0.75rem;
	font-weight: 700;
	letter-spacing: 0.12em;
	text-transform: uppercase;
	color: var(--bt-muted);
	text-decoration: none;
	white-space: nowrap;
	border: 1px solid transparent;
	transition: color 0.15s, border-color 0.15s, background 0.15s;
}
.bt-releases__monthnav-chip:hover {
	color: var(--bt-ink);
	border-color: var(--bt-line);
}
.bt-releases__monthnav-chip.is-active {
	color: var(--bt-bg);
	background: var(--bt-accent);
	border-color: var(--bt-accent);
}

/* Month section header (printed between groups of cards) */
.bt-releases__month {
	font-family: var(--bt-font-display);
	font-weight: 700;
	font-size: 1.25rem;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	color: var(--bt-ink);
	margin: 2.5rem 0 1.25rem;
	padding-bottom: 0.5rem;
	border-bottom: 1px solid var(--bt-line);
}
.bt-releases__month:first-of-type { margin-top: 0; }

/* Card grid */
.bt-releases__grid {
	display: grid;
	/* minmax(0, 1fr) — not bare 1fr — so columns don't expand to fit
	   long unbreakable tokens (e.g. an artist name like
	   "ONCHOCERCIASIS ESOPHAGOGASTRODUODENOSCOPY" would otherwise force
	   its column wider, and since grid columns are global, all cards
	   in that column at every row would inherit the wider sizing). */
	grid-template-columns: repeat(4, minmax(0, 1fr));
	gap: 1.75rem 1.25rem;
	margin-bottom: 1rem;
}
@media (max-width: 900px) {
	.bt-releases__grid { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 1.5rem 1rem; }
}
@media (max-width: 600px) {
	.bt-releases__grid { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 1.25rem 0.75rem; }
}

/* Release card */
.bt-release-card { display: flex; flex-direction: column; }
.bt-release-card.is-past { opacity: 0.6; }
.bt-release-card__cover {
	aspect-ratio: 1 / 1;
	background: var(--bt-color-scaffold, #f5f5f5);
	overflow: hidden;
	margin-bottom: 0.75rem;
	border-radius: 4px;
}
.bt-release-card__cover img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
}
.bt-release-card__cover-placeholder {
	width: 100%;
	height: 100%;
	background: repeating-linear-gradient(
		45deg,
		var(--bt-alpha-b-02) 0 8px,
		var(--bt-color-scaffold, #f5f5f5) 8px 16px
	);
}
.bt-release-card__body {
	font-size: 0.875rem;
	line-height: 1.4;
}
.bt-release-card__artist {
	font-family: var(--bt-font-display);
	font-size: 0.7rem;
	font-weight: 700;
	letter-spacing: 0.12em;
	text-transform: uppercase;
	color: var(--bt-muted);
	margin: 0 0 0.2rem;
	/* Allow long unbreakable tokens (artist names without spaces) to
	   wrap rather than overflow. Pairs with minmax(0,1fr) on the grid. */
	overflow-wrap: anywhere;
}
.bt-release-card__title {
	font-size: 0.95rem;
	font-weight: 700;
	color: var(--bt-ink);
	margin: 0 0 0.4rem;
	line-height: 1.3;
	overflow-wrap: anywhere;
}
.bt-release-card__meta {
	display: flex;
	align-items: baseline;
	gap: 0.5rem;
	margin: 0;
	font-size: 0.75rem;
	color: var(--bt-muted);
	flex-wrap: wrap;
}
.bt-release-card__type {
	font-family: var(--bt-font-display);
	font-weight: 700;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	color: var(--bt-accent);
	font-size: 0.7rem;
}
.bt-release-card__date {
	color: var(--bt-muted);
}

@media (max-width: 600px) {
	.bt-releases__title { font-size: 1.875rem; }
	.bt-release-card__title { font-size: 0.85rem; }
	.bt-release-card__artist { font-size: 0.65rem; letter-spacing: 0.1em; }
	.bt-release-card__meta { font-size: 0.7rem; gap: 0.35rem; }
	.bt-releases__monthnav-arrow { width: 32px; height: 32px; }
}

.bt-releases__empty {
	text-align: center;
	padding: 3rem 1rem;
	color: var(--bt-muted);
	font-size: 1rem;
	background: var(--bt-color-scaffold, #fafafa);
}
