/* ------------------------------------------------------------------------- *
 * OCHBS homepage funnel — stat band, sticky ticket bar, "Who's Going"
 *
 * Deployed to: wp-content/uploads/ochbs-assets/ochbs-funnel.css
 * Loaded by:   mu-plugins/ochbs-funnel.php, only on _ochbs_funnel_page pages.
 *
 * The whole point of the band is that it fits on the first screen. Sizes are
 * clamped against viewport height as well as width, because the binding
 * constraint is 768px-tall laptops, not narrow phones.
 * ------------------------------------------------------------------------- */

/* The hero's .sw-track is ~8,500px of *transparent* space — the fixed .sw-sky
   does the painting. The moment the engine unpins those layers at the end of
   the run, the white <body> shows through, which is the blank band under the
   scroll section. Painting the hero container itself means there is never a
   moment with nothing behind the track. */
.elementor-element-ochbshero,
body.ochbs-funnel {
	background-color: #020617;
}

/* #020617 rather than the hero's #0c0f0d: What to Expect and the footer are
   already #020617, and two near-blacks meeting at a section edge reads as a
   seam rather than as one page. */
.ochbs-band {
	--ochbs-ink: #020617;
	--ochbs-cream: #f3efe6;
	--ochbs-muted: #b8b2a4;
	--ochbs-green: #1f7a4d;
	--ochbs-green-bright: #2a9a64;
	--ochbs-gold: #c9a227;

	box-sizing: border-box;
	width: 100%;
	padding: clamp(28px, 5vh, 64px) clamp(20px, 5vw, 64px);
	background: var(--ochbs-ink);
	color: var(--ochbs-cream);
	overflow: hidden;

	/* Own the whole first screen rather than leaving a strip of hero showing.
	   The hero's stage is fixed and full-viewport, so any gap underneath shows
	   the *middle* of the hero — which means its vertically-centred copy card,
	   sliced in half. A partial peek can never look deliberate here; a clean
	   handover can. 118px is the sticky header (36px utility bar + 82px nav). */
	display: flex;
	align-items: center;
	min-height: calc(100vh - 118px);

	/* The scroll hero mounts .sw-sky, .sw-stage and .sw-copylayer as
	   position:fixed, top:0, full-viewport, at z-index 0–60 — from page load,
	   not from the point the hero scrolls into view. Sitting above them in the
	   document is therefore not enough; without an explicit z-index the band is
	   painted over and the first screen is still the cinematic. 70 clears the
	   engine's highest layer (.sw-scrollbar at 60) and stays well under the
	   sticky bar (9000) and the age gate (10000).

	   The band stays in normal flow, so it scrolls away and hands the screen to
	   the hero exactly as before; only the paint order changes. */
	position: relative;
	z-index: 70;
}

.ochbs-band *,
.ochbs-stickybar * {
	box-sizing: border-box;
}

.ochbs-band__inner {
	width: 100%;
	max-width: 1180px;
	margin: 0 auto;
}

.ochbs-band__eyebrow {
	margin: 0 0 clamp(12px, 2vh, 22px);
	font-size: clamp(0.68rem, 1vw, 0.78rem);
	font-weight: 700;
	letter-spacing: 0.16em;
	text-transform: uppercase;
	color: var(--ochbs-gold);
}

.ochbs-band__eyebrow span {
	margin: 0 0.5em;
	opacity: 0.5;
}

.ochbs-band__title {
	/* Scales on height as well as width so it cannot eat the fold on a 768px
	   laptop, where the band has roughly 650px to work with once the sticky
	   header is accounted for. */
	margin: 0 0 clamp(20px, 3.5vh, 40px);
	font-size: clamp(1.9rem, min(5.2vw, 7vh), 4rem);
	font-weight: 800;
	line-height: 1.04;
	letter-spacing: -0.02em;
	max-width: 20ch;
	color: var(--ochbs-cream);
}

/* --- stat tiles ---------------------------------------------------------- */

.ochbs-band__stats {
	display: flex;
	flex-wrap: wrap;
	gap: clamp(16px, 3vw, 48px);
	margin: 0 0 clamp(22px, 4vh, 44px);
	padding: 0;
	list-style: none;
	border-top: 1px solid rgba(243, 239, 230, 0.14);
	border-bottom: 1px solid rgba(243, 239, 230, 0.14);
	padding-block: clamp(14px, 2.4vh, 26px);
}

.ochbs-band__stat {
	display: flex;
	flex-direction: column;
	gap: 2px;
	min-width: 0;
}

.ochbs-band__stat-value {
	font-size: clamp(1.6rem, min(4vw, 5vh), 2.9rem);
	font-weight: 800;
	line-height: 1;
	letter-spacing: -0.02em;
	color: var(--ochbs-green-bright);
	font-variant-numeric: tabular-nums;
}

.ochbs-band__stat-label {
	font-size: clamp(0.66rem, 0.9vw, 0.76rem);
	font-weight: 600;
	letter-spacing: 0.14em;
	text-transform: uppercase;
	color: var(--ochbs-muted);
}

/* --- buttons ------------------------------------------------------------- */

.ochbs-band__cta {
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
}

/* Written as real properties rather than relying on inherited link styling:
   the theme and the Elementor kit both style anchors, and a CTA that silently
   changes colour after a kit edit is worse than a slightly verbose rule. */
.ochbs-band .ochbs-btn,
.ochbs-stickybar .ochbs-stickybar__cta {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-height: 52px;
	padding: 0.9rem 2.1rem;
	border: 1px solid transparent;
	border-radius: 999px;
	font-size: clamp(0.82rem, 1vw, 0.95rem);
	font-weight: 700;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	text-decoration: none;
	line-height: 1.1;
	transition: background-color 0.2s ease, border-color 0.2s ease, color 0.2s ease;
}

.ochbs-band .ochbs-btn--primary {
	background: var(--ochbs-green);
	border-color: var(--ochbs-green);
	color: var(--ochbs-cream);
}

.ochbs-band .ochbs-btn--primary:hover,
.ochbs-band .ochbs-btn--primary:focus {
	background: var(--ochbs-green-bright);
	border-color: var(--ochbs-green-bright);
	color: #fff;
}

.ochbs-band .ochbs-btn--ghost {
	background: transparent;
	border-color: rgba(243, 239, 230, 0.3);
	color: var(--ochbs-cream);
}

.ochbs-band .ochbs-btn--ghost:hover,
.ochbs-band .ochbs-btn--ghost:focus {
	background: rgba(243, 239, 230, 0.08);
	border-color: rgba(243, 239, 230, 0.55);
}

.ochbs-band .ochbs-btn:focus-visible,
.ochbs-stickybar__cta:focus-visible {
	outline: 2px solid var(--ochbs-cream);
	outline-offset: 3px;
}

/* --- sticky ticket bar --------------------------------------------------- */

.ochbs-stickybar {
	--ochbs-cream: #f3efe6;
	--ochbs-green: #1f7a4d;
	--ochbs-green-bright: #2a9a64;

	position: fixed;
	left: 0;
	right: 0;
	bottom: 0;
	z-index: 9000; /* under the age gate (10000), over page content */
	display: flex;
	align-items: center;
	justify-content: center;
	gap: clamp(12px, 2vw, 28px);
	padding: 12px clamp(14px, 3vw, 32px);
	padding-bottom: calc(12px + env(safe-area-inset-bottom, 0px));
	background: rgba(2, 6, 23, 0.94);
	-webkit-backdrop-filter: blur(10px);
	backdrop-filter: blur(10px);
	border-top: 1px solid #1e293b;
	color: var(--ochbs-cream);

	transform: translateY(110%);
	visibility: hidden;
	transition: transform 0.28s ease, visibility 0.28s ease;
}

.ochbs-stickybar.is-visible {
	transform: translateY(0);
	visibility: visible;
}

/* Parked over the footer, where it would cover the newsletter form. */
.ochbs-stickybar.is-parked {
	transform: translateY(110%);
	visibility: hidden;
}

.ochbs-stickybar__facts {
	margin: 0;
	font-size: clamp(0.72rem, 1.1vw, 0.9rem);
	font-weight: 600;
	letter-spacing: 0.04em;
	color: var(--ochbs-cream);
}

.ochbs-stickybar .ochbs-stickybar__cta {
	min-height: 44px;
	padding: 0.65rem 1.6rem;
	background: var(--ochbs-green);
	border-color: var(--ochbs-green);
	color: var(--ochbs-cream);
	white-space: nowrap;
}

.ochbs-stickybar .ochbs-stickybar__cta:hover,
.ochbs-stickybar .ochbs-stickybar__cta:focus {
	background: var(--ochbs-green-bright);
	border-color: var(--ochbs-green-bright);
	color: #fff;
}

/* --- "Who's Going" ------------------------------------------------------- *
 * Palette below is the site's own, from Elementor kit 16738, rather than the
 * hero's greens:
 *   #020617  Dark Background          #01172A  Dark Surface
 *   #1E293B  Secondary Dark Surface / Borders (Dark Mode)
 *   #A5BE4C  Primary                  #60A5FA  Secondary
 * The band above keeps the hero palette deliberately — it is the approved
 * reference — so only this section and the panels move onto the kit tokens.
 */

/* Scoped to the Elementor id-class, not a `.ochbs-who` wrapper — no such
   element exists; the section's markup only carries the BEM-ish child names. */
.elementor-element-ochbswho {
	--kit-bg: #020617;
	--kit-surface: #01172a;
	--kit-border: #1e293b;
	--kit-primary: #a5be4c;
}

.ochbs-who__head {
	margin-bottom: clamp(28px, 4vw, 48px);
}

.ochbs-who__title {
	margin: 0 0 10px;
	font-size: clamp(1.6rem, 3.4vw, 2.6rem);
	font-weight: 800;
	letter-spacing: -0.02em;
	line-height: 1.1;
	color: #f3efe6;
}

.ochbs-who__sub {
	margin: 0;
	font-size: clamp(0.92rem, 1.4vw, 1.05rem);
	line-height: 1.5;
	/* The kit's Accent (#64748B) is too dark for body copy on #020617, and it
	   has no lighter slate, so this stays a neutral white tint rather than
	   inventing a hue that is not in the palette. */
	color: rgba(255, 255, 255, 0.72);
	max-width: 52ch;
}

.ochbs-who__row-title {
	margin: clamp(28px, 4vw, 44px) 0 clamp(14px, 2vw, 22px);
	font-size: 0.74rem;
	font-weight: 700;
	letter-spacing: 0.18em;
	text-transform: uppercase;
	color: #c9a227;
}

.ochbs-who__more {
	margin-top: 4px;
}

/* Pull "Who's Going" up over the hero's dead tail.
   --ochbs-hero-trim is measured and set by ochbs-hero-init-funnel.js; see the
   note there. z-index 70 puts this section above the engine's parked stage
   layers (0–60) so it covers them rather than sliding underneath. */
.elementor-element-ochbswho {
	position: relative;
	z-index: 70;
	margin-top: calc(-1 * var(--ochbs-hero-trim, 0px));
}

/* Elementor's container is a flex column, and these three widgets were being
   sized as flex items rather than to their content — the sponsor grid's wrapper
   computed to 124px against 603px of cards, so on mobile (2 columns, 4 rows)
   the cards painted outside their box and collided with the exhibitor wall
   below. Pin them to content height and stop them shrinking. */
.elementor-element-ochbswhospc,
.elementor-element-ochbswhoexg,
.elementor-element-ochbswhofan {
	height: auto;
	min-height: 0;
	flex: 0 0 auto;
	align-self: stretch;
	width: 100%;
}

/* --- platinum sponsor flip cards ---------------------------------------- */

.ochbs-flipgrid {
	display: grid;
	grid-template-columns: repeat(4, 1fr);
	gap: clamp(12px, 1.6vw, 22px);
	margin: 0;
	padding: 0;
	list-style: none;
}

.ochbs-flip {
	perspective: 1200px;
}

.ochbs-flip__inner {
	position: relative;
	display: block;
	width: 100%;
	aspect-ratio: 4 / 3;
	padding: 0;
	border: 0;
	background: none;
	cursor: pointer;
	transform-style: preserve-3d;
	transition: transform 0.55s cubic-bezier(0.2, 0.7, 0.2, 1);
	font: inherit;
	text-align: left;
}

/* The card is a <button>, and the Elementor kit uppercases every button on the
   site — which inherits into the bio and shouts the whole company description
   in caps. The reset has to out-rank `.elementor-kit-16738 button`, which is
   (0,1,1); a bare `.ochbs-flip__inner` is only (0,1,0) and loses. Two classes
   settle it, since class count is weighed before element count. */
.ochbs-flipgrid button.ochbs-flip__inner,
.ochbs-flipgrid button.ochbs-flip__inner span {
	text-transform: none;
	letter-spacing: normal;
	/* Buttons inherit white-space:nowrap from the theme's button styling, which
	   laid the whole bio out as one 1,460px line running off the card. */
	white-space: normal;
	overflow-wrap: anywhere;
}

/* Restated at this specificity because the shorthand above resets `display` on
   spans; the clamp only works on a -webkit-box. */
.ochbs-flipgrid button.ochbs-flip__inner .ochbs-flip__bio {
	display: -webkit-box;
	-webkit-line-clamp: 7;
	line-clamp: 7;
	-webkit-box-orient: vertical;
	overflow: hidden;
}

/* Re-apply the caps only where they are the design. */
.ochbs-flipgrid button.ochbs-flip__inner .ochbs-flip__name,
.ochbs-flipgrid button.ochbs-flip__inner .ochbs-flip__link {
	text-transform: uppercase;
	letter-spacing: 0.12em;
}

.ochbs-flip__inner:hover,
.ochbs-flip__inner:focus-visible,
.ochbs-flip__inner.is-flipped {
	transform: rotateY(180deg);
}

.ochbs-flip__inner:focus-visible {
	outline: 2px solid #f3efe6;
	outline-offset: 4px;
}

.ochbs-flip__face {
	position: absolute;
	inset: 0;
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	gap: 10px;
	padding: 18px;
	border-radius: 14px;
	/* Safari still needs the prefix, and without it both faces render at once. */
	-webkit-backface-visibility: hidden;
	backface-visibility: hidden;
	overflow: hidden;
}

/* Cream front: the sponsor logos are black marks drawn for light backgrounds
   and disappear entirely on the section's near-black. */
.ochbs-flip__front {
	background: #f3efe6;
}

.ochbs-flip__front img {
	max-width: 78%;
	max-height: 58%;
	width: auto;
	height: auto;
	object-fit: contain;
}

.ochbs-flip__name {
	font-size: 0.7rem;
	font-weight: 700;
	letter-spacing: 0.12em;
	text-transform: uppercase;
	color: #4a4a44;
	text-align: center;
}

.ochbs-flip__nologo {
	font-size: 1rem;
	font-weight: 800;
	color: #020617;
	text-align: center;
}

/* align-items:stretch, not flex-start: a flex-start column sizes each child to
   its own content, so the bio became one max-content line running off the card
   instead of wrapping inside it. */
.ochbs-flip__back {
	align-items: stretch;
	justify-content: flex-start;
	gap: 8px;
	/* Kit Dark Surface + Borders (Dark Mode), replacing an invented green. */
	background: #01172a;
	border: 1px solid #1e293b;
	color: #fff;
	transform: rotateY(180deg);
	text-align: left;
}

.ochbs-flip__back > * {
	min-width: 0;
}

.ochbs-flip__back-name {
	font-size: 0.92rem;
	font-weight: 800;
	letter-spacing: -0.01em;
}

/* Bios run from 100 to 2,300 characters; clamp so a long one cannot push the
   link off the card, and the card height stays uniform across the grid. */
.ochbs-flip__bio {
	font-size: 0.78rem;
	line-height: 1.45;
	color: rgba(255, 255, 255, 0.74);
	overflow: hidden;
	display: -webkit-box;
	-webkit-line-clamp: 7;
	line-clamp: 7;
	-webkit-box-orient: vertical;
}

.ochbs-flip__link {
	margin-top: auto;
	font-size: 0.7rem;
	font-weight: 700;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	color: #a5be4c;
}

@media screen and (max-width: 1023px) {
	.ochbs-flipgrid {
		grid-template-columns: repeat(2, 1fr);
	}
}

@media screen and (max-width: 479px) {
	.ochbs-flip__bio {
		font-size: 0.72rem;
	}
}

/* --- speaker fan -------------------------------------------------------- */

.ochbs-fan {
	--p: 0;
	position: relative;
	min-height: clamp(240px, 30vw, 340px);
}

.ochbs-fan__list {
	position: relative;
	display: block;
	height: clamp(240px, 30vw, 340px);
	margin: 0;
	padding: 0;
	list-style: none;
}

/* Every circle starts stacked in the centre and travels out to its own slot as
   --p goes 0 -> 1. The slot is derived from --i so the markup carries no
   layout maths, and eight items fan symmetrically about the centre. */
.ochbs-fan__item {
	--slot: calc(var(--i) - 3.5); /* -3.5 … +3.5 for eight items */
	position: absolute;
	top: 50%;
	left: 50%;
	width: clamp(84px, 9vw, 124px);
	aspect-ratio: 1;
	margin: 0;
	transform: translate(-50%, -50%)
		translateX(calc(var(--slot) * var(--p) * clamp(96px, 10.5vw, 146px)))
		translateY(calc(var(--slot) * var(--slot) * var(--p) * 7px))
		rotate(calc(var(--slot) * var(--p) * 4deg));
	transition: transform 0.45s cubic-bezier(0.2, 0.7, 0.2, 1);
	z-index: calc(10 - var(--i));
}

/* Two classes, because these are <button>s and `.elementor-kit-16738 button`
   (0,1,1) sets a 6px radius and its own border colour — which rendered the
   "circles" as green squares. */
.ochbs-fan .ochbs-fan__dot {
	display: block;
	width: 100%;
	height: 100%;
	padding: 0;
	border: 3px solid rgba(243, 239, 230, 0.9);
	border-radius: 50%;
	background: #01172a;
	cursor: pointer;
	overflow: hidden;
	box-shadow: 0 10px 30px rgba(0, 0, 0, 0.45);
	transition: border-color 0.2s ease, transform 0.2s ease;
}

.ochbs-fan__dot img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
}

.ochbs-fan .ochbs-fan__dot:hover,
.ochbs-fan .ochbs-fan__dot:focus-visible {
	border-color: #a5be4c;
	transform: scale(1.06);
}

.ochbs-fan .ochbs-fan__dot:focus-visible {
	outline: 2px solid #f3efe6;
	outline-offset: 3px;
}

@media screen and (max-width: 767px) {
	/* Eight circles cannot fan across a phone without overlapping into mush.
	   Drop out of the absolute layout into a plain two-row grid — the faces are
	   the content; the fan is a desktop flourish, not a requirement.
	   (An earlier attempt kept the fan here using mod() and a ternary inside
	   calc(); neither is valid CSS, so the whole rule was being discarded.) */
	.ochbs-fan,
	.ochbs-fan__list {
		height: auto;
		min-height: 0;
	}

	.ochbs-fan__list {
		display: grid;
		grid-template-columns: repeat(4, 1fr);
		gap: 14px;
		place-items: center;
	}

	.ochbs-fan__item {
		position: static;
		width: 100%;
		max-width: 88px;
		transform: none;
		opacity: calc(0.35 + (var(--p) * 0.65));
		transition: opacity 0.4s ease;
	}
}

/* --- speaker panel ------------------------------------------------------ */

.ochbs-panel {
	position: fixed;
	inset: 0;
	z-index: 9500;
	display: none;
}

.ochbs-panel.is-open {
	display: block;
}

.ochbs-panel__scrim {
	position: absolute;
	inset: 0;
	background: rgba(2, 6, 23, 0.72);
	-webkit-backdrop-filter: blur(4px);
	backdrop-filter: blur(4px);
}

.ochbs-panel__card {
	position: relative;
	max-width: 560px;
	max-height: 84vh;
	margin: 8vh auto 0;
	padding: clamp(24px, 3vw, 36px);
	border-radius: 18px;
	background: #01172a;
	color: #f3efe6;
	overflow-y: auto;
	box-shadow: 0 30px 80px rgba(0, 0, 0, 0.6);
}

/* Two classes again — the kit paints every button green with a 6px radius. */
.ochbs-panel .ochbs-panel__close {
	position: absolute;
	top: 12px;
	right: 14px;
	width: 40px;
	height: 40px;
	padding: 0;
	border: 1px solid rgba(243, 239, 230, 0.2);
	border-radius: 50%;
	background: rgba(243, 239, 230, 0.08);
	color: #f3efe6;
	font-size: 1.4rem;
	line-height: 1;
	cursor: pointer;
}

.ochbs-panel .ochbs-panel__close:hover,
.ochbs-panel .ochbs-panel__close:focus {
	background: rgba(243, 239, 230, 0.2);
	border-color: rgba(243, 239, 230, 0.45);
	color: #f3efe6;
}

.ochbs-panel__head {
	display: flex;
	align-items: center;
	gap: 16px;
	margin-bottom: 18px;
}

.ochbs-panel__photo img {
	width: 92px;
	height: 92px;
	border-radius: 50%;
	object-fit: cover;
	display: block;
}

.ochbs-panel__name {
	margin: 0;
	font-size: 1.3rem;
	font-weight: 800;
	color: #f3efe6;
}

.ochbs-panel__role {
	margin: 4px 0 0;
	font-size: 0.85rem;
	color: rgba(255, 255, 255, 0.66);
}

.ochbs-panel__bio {
	font-size: 0.92rem;
	line-height: 1.6;
	color: rgba(255, 255, 255, 0.78);
	white-space: pre-line;
}

.ochbs-panel__links {
	display: flex;
	flex-wrap: wrap;
	gap: 10px;
	margin-top: 20px;
}

.ochbs-panel__links a {
	padding: 8px 16px;
	border: 1px solid rgba(243, 239, 230, 0.28);
	border-radius: 999px;
	font-size: 0.76rem;
	font-weight: 700;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	text-decoration: none;
	color: #f3efe6;
}

.ochbs-panel__links a:hover {
	border-color: #a5be4c;
	color: #a5be4c;
}

.ochbs-panel__links .ochbs-panel__full {
	background: #a5be4c;
	border-color: #a5be4c;
	color: #020617;
}

body.ochbs-panel-open {
	overflow: hidden;
}

/* These were rendering blue: the kit styles links with its Secondary (#60A5FA)
   at a specificity a bare `.ochbs-more` could not beat, so the colour declared
   here never applied. Two classes settle it, and the colour is now the kit's
   Primary — the same green used by the header's Get Tickets button. */
.elementor-element-ochbswho .ochbs-more,
.elementor-element-ochbswho a.ochbs-more {
	display: inline-block;
	margin-top: 14px;
	font-size: 0.82rem;
	font-weight: 700;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	text-decoration: none;
	color: var(--kit-primary, #a5be4c);
}

.elementor-element-ochbswho .ochbs-more:hover,
.elementor-element-ochbswho .ochbs-more:focus,
.elementor-element-ochbswho a.ochbs-more:hover,
.elementor-element-ochbswho a.ochbs-more:focus {
	color: #fff;
	text-decoration: underline;
}

/* Logo walls read as one field of brands rather than a patchwork of competing
   backgrounds; colour returns on hover so individual brands stay findable. */
.ochbs-logowall .jet-listing-grid__item img {
	filter: grayscale(1);
	opacity: 0.72;
	transition: filter 0.2s ease, opacity 0.2s ease;
}

.ochbs-logowall .jet-listing-grid__item img:hover {
	filter: grayscale(0);
	opacity: 1;
}

/* JetEngine gutters the grid with negative margins on the items wrapper, so it
   renders wider than its container and the wall hangs off both edges on narrow
   screens. Neutralise the negative margin and gutter with padding instead. */
.ochbs-logowall .jet-listing-grid__items {
	margin-left: 0;
	margin-right: 0;
	width: 100%;
	max-width: 100%;
}

/* Deliberately NOT restyling the item box itself. Listing template 17973 lays
   out its own card, and overriding it with display:flex + padding here left the
   card and the logo inside it offset from one another on narrow screens. The
   only things worth imposing are the grayscale treatment and the wrapper's
   gutter; the template owns the rest. */
.ochbs-logowall .jet-listing-grid__item {
	min-width: 0;
}

/* The shared Exhibitor Listing template renders company name and a second
   field under the logo. At eight across those clip mid-word ("Hundred",
   "Argent"), which reads as broken rather than dense. This row exists to show
   how many brands are coming, and the mark carries that on its own — the names
   live one click away in the directory the link below points at. */
.ochbs-logowall .jet-listing-dynamic-field {
	display: none;
}

.ochbs-logowall .jet-listing-grid__item img {
	max-height: 62px;
	width: auto;
	object-fit: contain;
}

/* Faces are the one place colour earns its keep — a wall of grey headshots
   reads as stock photography rather than as people who are actually coming. */
.ochbs-facewall .jet-listing-grid__item img {
	aspect-ratio: 1 / 1;
	width: 100%;
	object-fit: cover;
	border-radius: 50%;
}

@media (prefers-reduced-motion: reduce) {
	.ochbs-stickybar,
	.ochbs-band .ochbs-btn,
	.ochbs-logowall .jet-listing-grid__item img {
		transition: none;
	}
}

/* --- narrow ------------------------------------------------------------- */

@media screen and (max-width: 719px) {
	.ochbs-band__title {
		max-width: none;
	}

	.ochbs-band__stats {
		display: grid;
		grid-template-columns: repeat(4, 1fr);
		gap: 10px;
	}

	.ochbs-band__cta {
		flex-direction: column;
		align-items: stretch;
	}

	.ochbs-band .ochbs-btn {
		width: 100%;
	}

	/* The facts line is the first thing to go when there is no room for both
	   it and the button. */
	.ochbs-stickybar {
		gap: 10px;
	}

	.ochbs-stickybar__facts {
		flex: 1 1 auto;
		min-width: 0;
	}
}

@media screen and (max-width: 419px) {
	.ochbs-stickybar__facts {
		font-size: 0.68rem;
	}
}
