/**
 * polytec Stadium FSE — wrapper styles.
 *
 * Most styling is driven by theme.json (Global Styles). This stylesheet holds
 * only what theme.json can't express:
 *
 *   - header band layout (single row, wordmark left, nav right)
 *   - footer 3-col info area + acknowledgement flags + operator logos
 *   - socket sliver
 *   - event-card scaffolding for Stage 5 wiring
 */

body { -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }

/* ────────────────────────────────────────────────────────────
   Accessibility — skip-link + screen-reader-text
   (VL-BUILD-STANDARDS §2.1a).

   `.skip-link` is the first focusable element in the DOM (lives in
   parts/header.html before the header pattern). Visually hidden by default
   via .screen-reader-text; becomes visible when keyboard-focused. Z-index
   sits above the fixed header (100) so it doesn't get clipped on focus.
   `.screen-reader-text` keeps the WP-standard name so assistive-tech testing
   tools recognise the pattern.
   ──────────────────────────────────────────────────────────── */
.screen-reader-text {
	border: 0;
	clip: rect(1px, 1px, 1px, 1px);
	clip-path: inset(50%);
	height: 1px;
	width: 1px;
	margin: -1px;
	overflow: hidden;
	padding: 0;
	position: absolute;
	word-wrap: normal;
}
.skip-link:focus {
	clip: auto;
	clip-path: none;
	height: auto;
	width: auto;
	display: block;
	background: var( --wp--preset--color--charcoal );
	color: var( --wp--preset--color--background );
	font-family: inherit;
	font-size: 0.9375rem;
	font-weight: 700;
	left: 1rem;
	top: 1rem;
	padding: 0.75rem 1.25rem;
	text-decoration: none;
	border-radius: 6px;
	z-index: 100001;
}

/* ────────────────────────────────────────────────────────────
   Mobile gutters (VL-BUILD-STANDARDS §14.7).
   Replaces theme.json's useRootPaddingAwareAlignments (which we keep `false`
   because that flag injects overflow-x:clip on <body>, silently breaking
   position:sticky on the header). Below 1100px we add gutters via direct CSS,
   and let `alignfull` elements break back out via negative margins.
   ──────────────────────────────────────────────────────────── */
@media ( max-width: 1100px ) {
	.wp-site-blocks { padding-inline: 1rem; }
	.wp-site-blocks > .alignfull,
	.wp-site-blocks > .wp-block-template-part {
		margin-inline: -1rem;
		width: calc(100% + 2rem);
	}
}

/* ────────────────────────────────────────────────────────────
   Header — position-fixed black band with shrink-on-scroll
   (VL-BUILD-STANDARDS §2.5).

   Layout: wordmark left | nav + social right. Heights are LITERAL pixels
   (CSS transitions can't interpolate `var()` or `clamp()` values, so the
   shrink animation needs concrete numbers). JS in assets/js/animations.js
   measures the rendered height into --header-height; .wp-site-blocks
   reads that var to offset page content below the fixed band.
   ──────────────────────────────────────────────────────────── */

.wp-site-blocks {
	padding-top: var(--header-height, 80px);
}

.site-header {
	position: fixed !important;
	top: var(--wp-admin--admin-bar--height, 0px) !important;
	left: 0 !important;
	right: 0 !important;
	z-index: 100;
	width: 100%;
	height: 80px;
	border-bottom: 1px solid var(--wp--preset--color--charcoal-deep);
	transition: height 0.25s ease, box-shadow 0.25s ease;
	display: flex;
	align-items: center;
}
.site-header.is-shrunk {
	height: 60px;
	box-shadow: 0 4px 18px rgba(0, 0, 0, 0.35);
}

.site-header__inner {
	width: 100%;
	max-width: 1310px;
	margin-inline: auto;
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: var(--wp--preset--spacing--40);
}

/* Only add internal gutters when the viewport is narrower than the content
   max-width — at wider viewports, the natural centring already gives the
   header room and inner padding just pushes the wordmark + nav inward
   unnecessarily. */
@media ( max-width: 1310px ) {
	.site-header__inner {
		padding-inline: var(--wp--preset--spacing--40);
	}
}

.site-header__wordmark {
	margin: 0;
	flex-shrink: 0;
	transition: max-width 0.25s ease;
}
.site-header__wordmark a {
	display: block;
	line-height: 0;
}
.site-header__wordmark img {
	display: block;
	width: auto;
	max-width: 280px;
	height: 42px;
	transition: height 0.25s ease;
}
.site-header.is-shrunk .site-header__wordmark img {
	height: 32px;
}

.site-header__right {
	display: flex;
	align-items: center;
	gap: var(--wp--preset--spacing--60);
}

/* Primary nav — bumped one tick for legibility on the dark band */
.site-header__nav.wp-block-navigation {
	font-size: 1.0625rem;
	font-weight: 600;
	row-gap: 0.25rem;
}
.site-header__nav .wp-block-navigation-item__content {
	padding: 0.25rem 0;
}

/* Social icons — square logos-only mode, sized to read on the band.
   Nudged down a few px so the geometric centre of the icons lines up with
   the optical centre of the nav text (text reads higher than its line-box
   centre, so flex centering alone leaves the icons looking too high). */
.site-header__social.wp-block-social-links {
	gap: 0.4rem !important;
	transform: translateY(3px);
}

/* Hide the in-header socials at narrow viewports — by the time the
   hamburger is visible there isn't room for wordmark + socials + button
   without crowding. The footer socket still carries the social icons so
   they remain reachable just below-the-fold.
   !important is needed: WP core ships `.wp-block-social-links.is-layout-flex
   { display: flex }` at 0,2,0 specificity, which beats our 0,1,0 class
   selector in the cascade. */
@media ( max-width: 768px ) {
	.site-header__social {
		display: none !important;
	}
}
.site-header__social .wp-block-social-link {
	width: 26px;
	height: 26px;
}
.site-header__social .wp-block-social-link svg {
	width: 18px;
	height: 18px;
}
.site-header__social .wp-block-social-link a:hover {
	transform: translateY(-1px);
	transition: transform 0.12s ease;
}

/* When admin-bar offsets the fixed header, also offset the content. */
.admin-bar .wp-site-blocks {
	padding-top: calc(var(--header-height, 80px));
}

/* ────────────────────────────────────────────────────────────
   Hamburger breakpoint extension (VL-BUILD-STANDARDS §14.7).

   WP's wp:navigation `overlayMenu="mobile"` flips to inline nav at
   600px. We want the hamburger to remain the only access method up to
   1200px (6 nav items + dropdown caret + bigger font would otherwise
   crowd alongside the wordmark + socials between ~600-1200px). The
   override hides the inline container + shows the toggle button across
   the extended 600-1200 range. Below 600 WP's native rules already do
   the same thing, so the override and WP's defaults agree there.
   ──────────────────────────────────────────────────────────── */
@media ( min-width: 600px ) and ( max-width: 1200px ) {
	.site-header .wp-block-navigation__responsive-container:not(.is-menu-open) {
		display: none !important;
	}
	.site-header .wp-block-navigation__responsive-container-open {
		display: flex !important;
		color: var(--wp--preset--color--background);
	}
}

/* Hamburger button hover / focus — uses currentColor on the SVG so a
   simple opacity bump signals interactivity without needing an accent. */
.site-header .wp-block-navigation__responsive-container-open:hover,
.site-header .wp-block-navigation__responsive-container-open:focus-visible {
	opacity: 0.7;
}

/* Scroll lock when drawer is open — global (safe because .is-menu-open
   only exists when the drawer is open). */
body:has( .wp-block-navigation__responsive-container.is-menu-open ) {
	overflow: hidden;
}

/* ────────────────────────────────────────────────────────────
   Hamburger drawer (VL-BUILD-STANDARDS §2.3).

   Slide-in panel from the right covering ~320px / 85vw, dark backdrop
   over the rest of the viewport. The position:fixed rules MUST stay
   inside the mobile media query — at desktop they would permanently
   cover the inline nav.
   ──────────────────────────────────────────────────────────── */
@media ( max-width: 1200px ) {
	/* Dimmed backdrop */
	.site-header .wp-block-navigation__responsive-close {
		position: fixed !important;
		inset: 0 !important;
		background: rgba(0, 0, 0, 0.5) !important;
		z-index: 9998 !important;
	}

	/* Container reset — transparent full-viewport wrapper */
	body .site-header .wp-block-navigation__responsive-container.is-menu-open {
		position: fixed !important;
		inset: 0 !important;
		width: 100% !important;
		height: 100% !important;
		background: none !important;
		z-index: 9998 !important;
		box-shadow: none !important;
		padding: 0 !important;
		animation: none !important;
		overflow: visible !important;
	}

	/* Drawer panel — slides in from right */
	.site-header .wp-block-navigation__responsive-dialog {
		position: fixed !important;
		top: 0 !important;
		right: 0 !important;
		bottom: 0 !important;
		left: auto !important;
		width: 320px !important;
		max-width: 85vw !important;
		height: 100dvh !important;
		background: var(--wp--preset--color--ink) !important;
		z-index: 9999 !important;
		overflow-y: auto !important;
		padding: calc( var(--header-height, 80px) + 0.5rem ) 2rem 2rem !important;
		box-shadow: -4px 0 24px rgba(0, 0, 0, 0.35) !important;
		animation: site-drawer-in 0.25s ease-out !important;
		display: flex !important;
		flex-direction: column !important;
	}

	@keyframes site-drawer-in {
		from { transform: translateX(100%); }
		to   { transform: translateX(0); }
	}

	/* Close (X) button — absolute (not fixed) inside the dialog so it
	   moves with the drawer's translateX animation. */
	.site-header .wp-block-navigation__responsive-container-close {
		position: absolute !important;
		top: 0 !important;
		right: 0 !important;
		bottom: auto !important;
		left: auto !important;
		width: 4rem !important;
		height: var(--header-height, 80px) !important;
		margin: 0 !important;
		padding: 0 !important;
		display: flex !important;
		align-items: center !important;
		justify-content: center !important;
		z-index: 1 !important;
		background: transparent !important;
		border: 0 !important;
		cursor: pointer !important;
		color: var(--wp--preset--color--background) !important;
	}

	/* Nav container inside drawer — column-stacked items */
	.site-header .is-menu-open .wp-block-navigation__container {
		flex-direction: column !important;
		align-items: stretch !important;
		width: 100% !important;
		gap: 0 !important;
	}
	.site-header .is-menu-open .wp-block-navigation-item {
		width: 100% !important;
	}
}

/* Nav item links inside the drawer — full-width stacked, divider rule. */
.site-header .is-menu-open .wp-block-navigation-item__content {
	display: block !important;
	width: 100% !important;
	padding: 0.875rem 0 !important;
	text-align: left !important;
	color: var(--wp--preset--color--background) !important;
	border-bottom: 1px solid rgba(255, 255, 255, 0.1);
}

/* ────────────────────────────────────────────────────────────
   Membership page — long-scroll rebuild (2026-05-20)
   ──────────────────────────────────────────────────────────── */

/* Sticky anchor nav — sits below the fixed header. Uses the JS-measured
   --header-live-height so it tracks the header's shrunk state (60px once the
   user scrolls past 60px). Falls back to --header-height (unshrunk = 80px,
   used for .wp-site-blocks document offset) if the live var isn't set yet
   — that's the correct value before scroll anyway. WP core's
   --wp-admin--admin-bar--height is auto-set when a logged-in admin is viewing
   the front end (0 otherwise) — without this term, the sticky band slides up
   behind the site-header when an admin scrolls. */
.membership-sticky-nav {
	position: sticky;
	top: calc( var( --header-live-height, var( --header-height, 80px ) ) + var( --wp-admin--admin-bar--height, 0px ) );
	z-index: 50;
}
.membership-sticky-nav__inner {
	width: 100%;
}
.membership-sticky-nav__anchors .wp-block-button__link {
	font-size: 0.9375rem;
	padding: 0.45rem 0.95rem;
}
.membership-sticky-nav .wp-block-button__link {
	border-radius: 999px;
}

/* Benefit cards — 6-up grid. Each card is bounded by a 1px rule border on a
   white bg (matching .pricing-card lower on the page so the membership page
   reads with one consistent card vocabulary). Icon sits inside a 48x48
   surface-2 tile inside the card; heading + body stack beneath. The card
   border anchors the group, the inner tile gives the icon visual weight. */
.benefit-card {
	background: var( --wp--preset--color--background );
	border: 1px solid var( --wp--preset--color--rule );
	border-radius: 12px;
	padding: 1.5rem;
	height: 100%;
	text-align: center;
}
.benefit-card__icon {
	display: block;
	box-sizing: border-box;
	width: 48px;
	height: 48px;
	padding: 10px;
	margin: 0 0 1rem;
	background: var( --wp--preset--color--surface-2 );
	border-radius: 10px;
	color: var( --wp--preset--color--charcoal );
}

/* Event tiles — minimal cards, used in the "What you'll see" grid. */
.event-tile {
	background: var( --wp--preset--color--background );
	border: 1px solid var( --wp--preset--color--rule );
	border-radius: 8px;
	padding: 1rem 1.1rem;
	min-height: 100%;
}

/* Pricing cards — featured one wears a thicker charcoal border (no accent
   colour in the monochrome palette, charcoal IS the brand secondary). */
.pricing-card {
	border: 1px solid var( --wp--preset--color--rule );
	border-radius: 12px;
	padding: 1.75rem;
	height: 100%;
	display: flex;
	flex-direction: column;
	gap: 0.5rem;
}
.pricing-card--featured {
	border-width: 2px;
	border-color: var( --wp--preset--color--charcoal );
	position: relative;
}
.pricing-card__badge {
	display: inline-block;
	align-self: flex-start;
	background: var( --wp--preset--color--charcoal );
	color: var( --wp--preset--color--background );
	padding: 0.2rem 0.7rem;
	border-radius: 999px;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	font-weight: 700;
	margin: 0 0 0.25rem;
}
.pricing-card__price {
	margin: 0.25rem 0 0.5rem;
}

/* Media-text seating block — keep a sensible cap so the seating map
   doesn't dominate the screen on wide viewports. */
.wp-block-media-text .wp-block-media-text__media img {
	max-width: 100%;
	height: auto;
}

/* ────────────────────────────────────────────────────────────
   Corporate Hospitality page — duplicate cards (Private Suites /
   Open Boxes) with decision tag, image, icon-led benefits list,
   then a single CTA. Layout is two equal columns above 782px;
   stacks below. The two cards share the same shell (.hospitality-card)
   so the structure stays visually parallel — buyer compares like-for-like.
   ──────────────────────────────────────────────────────────── */
.hospitality-card {
	background: var( --wp--preset--color--background );
	border: 1px solid var( --wp--preset--color--rule );
	border-radius: 10px;
	padding: 1.5rem;
	height: 100%;
	display: flex;
	flex-direction: column;
	gap: 1rem;
}
.hospitality-card__media {
	margin: -1.5rem -1.5rem 0;
}
.hospitality-card__media img {
	width: 100%;
	height: auto;
	border-top-left-radius: 10px;
	border-top-right-radius: 10px;
	display: block;
}
.hospitality-card__tag {
	display: inline-block;
	align-self: flex-start;
	background: var( --wp--preset--color--charcoal );
	color: var( --wp--preset--color--background );
	padding: 0.3rem 0.75rem;
	border-radius: 999px;
	letter-spacing: 0.04em;
	text-transform: uppercase;
	font-weight: 700;
	margin: 0;
}

/* Benefits stack inside a hospitality card — icon + body row. */
.hospitality-benefits {
	margin: 0;
	padding: 0;
}
.hospitality-benefit {
	display: flex;
	align-items: flex-start;
	gap: 0.75rem;
}
.hospitality-benefit p {
	margin: 0;
	line-height: 1.45;
}
.hospitality-benefit__icon {
	flex: 0 0 auto;
	width: 22px;
	height: 22px;
	color: var( --wp--preset--color--charcoal );
	margin-top: 0.1rem;
}

/* "Why polytec for hospitality" — 3-up reassurance band, white-on-charcoal. */
.why-card {
	text-align: center;
	padding: 0.5rem 0.75rem;
	color: var( --wp--preset--color--background );
}
.why-card__icon {
	display: block;
	margin: 0 auto 0.85rem;
	color: var( --wp--preset--color--background );
}
.why-card h3 {
	color: var( --wp--preset--color--background );
}

/* Page-hero overlay text (corporate hospitality + future cover-based heroes).
   The wp:cover useFeaturedImage:true template renders with no inner content;
   pages that put their OWN wp:cover with inner content into the body need
   the inner heading + paragraph to read on the dimmed background. */
.wp-block-cover.page-hero .wp-block-cover__inner-container :where(h1, h2, p) {
	color: var( --wp--preset--color--background );
	text-shadow: 0 2px 18px rgba( 0, 0, 0, 0.35 );
}

/* ────────────────────────────────────────────────────────────
   VL house pattern — inner-page hero (VL-BUILD-STANDARDS §14.8).
   page.html / single.html / single-event.html each render a
   wp:cover {"useFeaturedImage":true} with className page-hero / post-hero /
   event-hero. The cover block uses object-fit:cover natively; object-position
   defaults to 50% 50% but the polytecstadium plugin's `Hero Focal Point` ACF
   fields + the theme's `render_block` filter override it per-post.
   ──────────────────────────────────────────────────────────── */
.wp-site-blocks > .wp-block-cover.page-hero,
.wp-site-blocks > .wp-block-cover.post-hero,
.wp-site-blocks > .wp-block-cover.event-hero {
	margin-block-start: 0 !important;
}

/* VL fleet hero standard (2026-06-01) — viewport-relative height, clamped.
   Replaces the old fixed-px caps (page/post 430–550px, event 550–700px) so
   heroes scale with the viewport instead of looking thin on large monitors /
   oversized on small ones. clamp(floor, Xdvh, ceiling): the floor keeps a
   usable hero on short screens, the ceiling stops 4K monitors getting an
   absurd hero (and needing a 4K-tall source); dvh avoids the mobile address-
   bar jump. !important is required to beat the cover block's INLINE
   min-height (page/post 430px, event 550px set via the template minHeight attr). */

/* Tier height is governed by CLASS, wherever the hero cover sits — the theme's
   template hero (direct child of .wp-site-blocks) AND any author-built cover
   placed in page content that carries the same hero class. Governing by class
   rather than DOM position keeps every hero consistent (e.g. /corporate-
   hospitality/ uses an authored cover with overlay copy; /getting-here/ uses
   the template hero — both must land on the same tier). */

/* Compact hero (Tier 3) — standard content pages + posts. */
.wp-block-cover.page-hero,
.wp-block-cover.post-hero {
	min-height: clamp( 260px, 45dvh, 460px ) !important;
}

/* Impact hero (Tier 1) — event/key-landing heroes get the full-bleed
   homepage-grade treatment. Designer banner art lives here; the contain toggle
   (below) handles off-ratio creative that must show whole. */
.wp-block-cover.event-hero {
	min-height: clamp( 480px, 75dvh, 840px ) !important;
}

/* "Show full banner image" mode (ACF hero_image_contain = true) — the cover
   stops cropping and instead letterboxes the image inside a surface-2 grey
   background. Use for marketing banners where the entire artwork must be
   visible regardless of viewport aspect. */
.wp-block-cover.hero--contain {
	background-color: var( --wp--preset--color--surface-2 ) !important;
}
.wp-block-cover.hero--contain .wp-block-cover__image-background {
	object-fit: contain !important;
}
/* The dim overlay would tint the grey letterbox bars — kill it in contain mode. */
.wp-block-cover.hero--contain .wp-block-cover__background {
	display: none;
}

/* Same "contain" treatment applied to event-grid card thumbnails (rendered
   via wp:post-featured-image inside the Query Loop). The card image keeps
   its 16:9 aspect ratio box, but the banner art letterboxes inside the
   surface-2 grey instead of cropping at the edges. */
.wp-block-post-featured-image.hero--contain {
	background-color: var( --wp--preset--color--surface-2 );
}
.wp-block-post-featured-image.hero--contain img {
	object-fit: contain !important;
}

/* No featured image on the post -> the cover renders an empty container
   (no <img class="wp-block-cover__image-background">). Collapse it so we
   don't get an empty min-height: 430px band sitting under the header. */
.wp-block-cover.page-hero:not(:has(.wp-block-cover__image-background)),
.wp-block-cover.post-hero:not(:has(.wp-block-cover__image-background)),
.wp-block-cover.event-hero:not(:has(.wp-block-cover__image-background)) {
	display: none;
}

/* The home page hero (front-page.html's wp:image alignfull) still wants the
   same flush-to-header behaviour — first-child alignfull after the header
   sits without the default block-start margin. */
.wp-site-blocks > header + .alignfull,
.wp-site-blocks > header + figure.wp-block-image.alignfull,
.wp-site-blocks > header + .wp-block-cover.alignfull {
	margin-top: 0;
}

/* WP applies a default 16px block-gap between siblings of .wp-site-blocks, so
   <main> ends up with margin-block: 16px and <footer> with margin-block-start:
   16px. On pages where the content begins or ends with an alignfull section
   (hero cover, surface-bg form), those margins show up as white strips above
   the hero and between the form and the footer. Kill the margins entirely —
   main has its own padding-top/-bottom for breathing room, and alignfull
   sections that intentionally want to run edge-to-edge get to do so. */
.wp-site-blocks > main {
	margin-block: 0;
}
.wp-site-blocks > footer {
	margin-block-start: 0;
}

/* page.html wraps wp:post-content inside <main> with padding 50/60. When a
   page's content STARTS or ENDS with an alignfull block (inline cover hero,
   surface-bg form section, sticky anchor nav, etc.), that padding becomes a
   visible white band above/below the coloured region. Collapse the relevant
   side so alignfull regions truly run edge-to-edge against the header / footer.
   Inner sections that want their own padding declare it on themselves. */
main.wp-block-group:has(> .wp-block-post-content > :first-child.alignfull) {
	padding-top: 0 !important;
}
main.wp-block-group:has(> .wp-block-post-content > :last-child.alignfull) {
	padding-bottom: 0 !important;
}

/* Membership sticky nav — when it's the first content block on the page it
   must sit flush against the site-header. The :has() rule above kills main's
   padding-top; this rule kills the nav's own block-start margin too. */
.membership-sticky-nav {
	margin-block-start: 0 !important;
}

/* Sticky-nav "Jump to" label — small caps utility text that introduces the
   chip buttons. Visible at desktop; hides below 600px where the chips already
   wrap and an extra label would crowd the row. */
.membership-sticky-nav__label {
	margin: 0 0.25rem 0 0;
	font-size: 0.75rem;
	font-weight: 700;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	color: var( --wp--preset--color--surface-2 );
	white-space: nowrap;
}
@media ( max-width: 600px ) {
	.membership-sticky-nav__label {
		display: none;
	}
}

/* ────────────────────────────────────────────────────────────
   Footer — charcoal panel: partner strip, 3-col info, then black socket
   ──────────────────────────────────────────────────────────── */
/* Footer info area sits one shade deeper than the partner band above,
   creating a 3-step gradient on the page bottom: partner band charcoal
   #3d3f40 → footer info charcoal-deep #2c2e30 → socket black #000. */
.site-footer {
	background-color: var(--wp--preset--color--charcoal-deep);
	color: var(--wp--preset--color--background);
}
.site-footer a { color: inherit; text-decoration: underline; text-underline-offset: 3px; }
.site-footer a:hover { text-decoration: none; }

/* Partner band sits on the polytec brand charcoal (#3d3f40) — dramatic
   stepping from the white content sections above. Logos would normally
   blend on dark, so each .partner-grid__item gets a WHITE PLATE: the
   item itself becomes a rounded white card hosting its logo, restoring
   maximum legibility regardless of the logo's own colour treatment. The
   headings invert to white to read on charcoal. */
.site-footer__partners-band {
	background-color: var(--wp--preset--color--charcoal);
	color: var(--wp--preset--color--background);
}
.site-footer__partners-band .partner-grid__heading {
	color: var(--wp--preset--color--background);
}
.site-footer__partners-band .partner-grid__item {
	background-color: var(--wp--preset--color--background);
	border-radius: 6px;
	padding: 0.85rem 0.75rem;
	box-shadow: 0 2px 8px rgba(0, 0, 0, 0.25);
}
.site-footer__partners .partner-grid + .partner-grid {
	margin-top: 0.5rem;
}

/* Info area heading style */
.site-footer__heading {
	color: var(--wp--preset--color--background) !important;
	margin: 0 0 0.75rem;
	font-weight: 600;
}

/* Operator logos row (CCC + VenuesLive) */
.site-footer__operators {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 1rem;
	margin-top: 1.25rem;
}
.site-footer__operator {
	max-height: 50px;
	width: auto;
	display: block;
}

/* Acknowledgement flag SVGs (Aboriginal + Torres Strait Islander).
   Fixed HEIGHT only — width is auto so each flag renders at its native
   aspect (Aboriginal ≈ 5:3, TSI = 2:1). Forcing both into the same width
   was distorting the proportions; matching heights is the proper visual
   alignment for flags shown side-by-side. */
.site-footer__flags {
	display: flex;
	gap: 0.6rem;
	margin-bottom: 1rem;
	align-items: center;
}
.site-footer__flag {
	display: block;
	height: 40px;
	width: auto;
	flex: 0 0 auto;
}

/* Socket sliver — black band with copyright LEFT, secondary nav + socials RIGHT.
   Compact: small font, thin padding, light typography. The right cluster
   (nav + socials) wraps under copyright on narrow viewports via flex-wrap. */
.site-socket {
	background-color: var(--wp--preset--color--ink);
	color: var(--wp--preset--color--background);
	font-size: 0.8125rem;
	letter-spacing: 0.02em;
}
.site-socket a { color: inherit; }
.site-socket__inner {
	gap: 1rem;
	row-gap: 0.5rem;
}
.site-socket__copy {
	margin: 0;
}
.site-socket__right {
	display: flex;
	align-items: center;
	gap: 1.25rem;
}
.site-socket__nav.wp-block-navigation {
	font-size: 0.8125rem;
	row-gap: 0.25rem;
}
.site-socket__nav .wp-block-navigation-item__content {
	padding: 0;
}
.site-socket__social.wp-block-social-links {
	gap: 0.4rem !important;
	transform: translateY(1px);
}
.site-socket__social .wp-block-social-link {
	width: 22px;
	height: 22px;
}
.site-socket__social .wp-block-social-link svg {
	width: 15px;
	height: 15px;
}

/* ────────────────────────────────────────────────────────────
   Event card — used by templates/parts that render Query Loop on event
   ──────────────────────────────────────────────────────────── */
.event-card {
	border: 1px solid var(--wp--preset--color--rule);
	background: var(--wp--preset--color--background);
}
.event-card__date {
	font-size: 0.9375rem;
	font-weight: 600;
	color: var(--wp--preset--color--charcoal);
	margin: 0;
}

.event-detail__date {
	font-size: 1rem;
	font-weight: 600;
	color: var(--wp--preset--color--charcoal);
	margin: 0 0 0.5rem;
}

/* Single-event 2-column layout — content left (2/3), CTA + cash-free sidebar
   right (1/3). Below 782px the wp:columns block stacks automatically, putting
   content first and the sidebar (CTAs + notice) underneath. The sidebar is
   sticky on desktop so the CTAs stay in view while the visitor reads. */
.event-detail__sidebar {
	display: flex;
	flex-direction: column;
	gap: 1rem;
}
@media ( min-width: 1024px ) {
	.event-detail__sidebar {
		position: sticky;
		top: calc( var( --header-live-height, var( --header-height, 80px ) ) + var( --wp-admin--admin-bar--height, 0px ) + 1.5rem );
		align-self: flex-start;
	}
}

/* Vertical button stack inside the sidebar — full-width buttons stacked. The
   wp:buttons block's `orientation: vertical` already does flex-direction:column
   in core CSS, but we explicitly set the gap here so it doesn't fall back to
   the row default. */
.event-detail__ctas {
	gap: 0.5rem;
}
.event-detail__ctas .wp-block-button {
	width: 100%;
}
.event-detail__ctas .wp-block-button__link {
	width: 100%;
	text-align: center;
}

/* Cash-Free notice card. Charcoal background, white text, 10px radius —
   matches the visual weight of the hospitality / pricing cards used elsewhere
   so the sidebar reads as a coherent stack of card elements. */
.event-detail__notice {
	margin-top: 0;
}
.event-detail__notice :where(h3) {
	margin-top: 0;
}
.event-detail__notice :where(p) {
	margin-bottom: 0;
}
.event-card__title {
	font-size: clamp(1.375rem, 1.4vw + 1rem, 1.625rem);
	line-height: 1.25;
	font-weight: 700;
	margin: 0 0 0.5rem;
}
.event-card__actions {
	display: flex;
	flex-wrap: wrap;
	gap: 0.5rem;
	margin-top: 1rem;
}

/* Buttons inside event cards — tighter padding so they read as actions, not heroes */
:where(.wp-block-button__link) {
	transition: background-color 120ms ease-out, color 120ms ease-out, border-color 120ms ease-out;
}

/* Solid (default) button hover — charcoal -> black. Theme.json declares this
   via the "button" element ":hover" key, but the generated CSS is unreliable
   across WP versions, so we restate it here as the source of truth. */
.wp-block-button:not(.is-style-outline) > .wp-block-button__link:hover,
.wp-block-button:not(.is-style-outline) > .wp-block-button__link:focus-visible {
	background-color: var( --wp--preset--color--foreground );
	color: var( --wp--preset--color--background );
}

/* Outline button hover — transparent fill flips to charcoal, text inverts to
   white. Used by the "Find Out More" CTA on event cards (is-style-outline). */
.wp-block-button.is-style-outline > .wp-block-button__link:hover,
.wp-block-button.is-style-outline > .wp-block-button__link:focus-visible {
	background-color: var( --wp--preset--color--charcoal );
	color: var( --wp--preset--color--background );
	border-color: var( --wp--preset--color--charcoal );
}

/* Hide buttons whose URL binding resolved empty (e.g. Hospitality button
   on an event where show_hospitality_link is OFF). The parent
   .wp-block-button gets hidden too via :has() so layout doesn't show a gap.
   Modern browser support is fine (Chrome 105+, Safari 15.4+, Firefox 121+);
   fallback for older browsers is just the empty button rendering as a no-op
   click target — acceptable degradation. */
.wp-block-button:has(> a[href=""]),
.wp-block-button:has(> a:not([href])) {
	display: none;
}
.wp-block-button__link[href=""],
.wp-block-button__link:not([href]) {
	display: none;
}

/* Gravity Forms buttons — match the wp:button preset (charcoal bg, white text,
   6px radius) so form CTAs read as part of the same button family as the rest
   of the site. Targets Submit, Next, Previous, and Save & Continue on every
   form (subscribe, contact, hospitality enquiry, membership signup). */
.gform_wrapper .gform_button,
.gform_wrapper .gform_next_button,
.gform_wrapper .gform_previous_button,
.gform_wrapper .gform_save_link {
	background-color: var( --wp--preset--color--charcoal );
	color: var( --wp--preset--color--background );
	border: 0;
	border-radius: 6px;
	font-family: inherit;
	font-weight: 600;
	font-size: 0.9375rem;
	line-height: 1.2;
	padding: 0.75rem 1.25rem;
	cursor: pointer;
	transition: background-color 120ms ease-out;
	text-decoration: none;
}
.gform_wrapper .gform_button:hover,
.gform_wrapper .gform_next_button:hover,
.gform_wrapper .gform_previous_button:hover,
.gform_wrapper .gform_save_link:hover {
	background-color: var( --wp--preset--color--foreground );
	color: var( --wp--preset--color--background );
}

/* The gform_required_legend filter returns an empty string, but GF still
   prints the wrapping <p class="gform_required_legend"></p>. Hide the empty
   shell so it doesn't add vertical margin. */
.gform_wrapper .gform_required_legend {
	display: none;
}

/* Gravity Forms checkbox / radio groups — GF defaults pack the choices tight
   and float the input flush against the label. Give each .gchoice row its own
   line, align the input + label baselines with a small gap, and bump the
   between-row spacing so groups are scannable (My enquiry is about / Marketing
   consent / etc.). */
.gform_wrapper .gfield_checkbox,
.gform_wrapper .gfield_radio {
	display: flex;
	flex-direction: column;
	gap: 0.55rem;
	margin: 0;
	padding: 0;
}
.gform_wrapper .gfield_checkbox .gchoice,
.gform_wrapper .gfield_radio .gchoice {
	display: flex;
	align-items: flex-start;
	gap: 0.6rem;
	line-height: 1.4;
}
.gform_wrapper .gfield_checkbox .gchoice input[type="checkbox"],
.gform_wrapper .gfield_radio .gchoice input[type="radio"] {
	flex: 0 0 auto;
	width: 1rem;
	height: 1rem;
	margin: 0.2rem 0 0;
	accent-color: var( --wp--preset--color--charcoal );
}
.gform_wrapper .gfield_checkbox .gchoice label,
.gform_wrapper .gfield_radio .gchoice label {
	margin: 0;
	font-weight: 400;
	cursor: pointer;
}

/* Marketing-consent single checkbox (standalone .gfield with one .gchoice) —
   give the long inline consent text room to breathe next to the box. */
.gform_wrapper .gfield--type-consent .gfield_consent_label,
.gform_wrapper .gfield .ginput_container_consent {
	display: flex;
	align-items: flex-start;
	gap: 0.6rem;
	line-height: 1.45;
}
.gform_wrapper .gfield .ginput_container_consent input[type="checkbox"] {
	flex: 0 0 auto;
	width: 1rem;
	height: 1rem;
	margin: 0.2rem 0 0;
	accent-color: var( --wp--preset--color--charcoal );
}

/* Skip-link is the first child of .wp-site-blocks, bumping the fixed header off
   :first-child - WP block-gap then adds an unwanted 24px margin above the header
   (a visible gap below the fixed header). The fixed header must never have a top margin. */
.wp-site-blocks > header.wp-block-template-part,
.wp-site-blocks > main { margin-block-start: 0 !important; }

/* ---------------------------------------------------------------------------
   Phase 3 — Induction page (/induction/, blank template page-induction.html).
   Mobile-first: kill any horizontal overflow + give the form a safe gutter,
   keep all inputs inside the viewport, and brand the GF buttons (the form's
   own grid handles half-width-on-desktop / full-on-mobile via layoutGridColumnSpan).
   Scoped to .induction-page so nothing leaks to the rest of the site.
--------------------------------------------------------------------------- */
.induction-page { overflow-x: hidden; }
/* The blank induction template has no fixed site header, so drop the global
   .wp-site-blocks header-height top padding that would otherwise leave a gap
   above the brand bar. Scoped via :has() so only the induction page is affected. */
.wp-site-blocks:has( > .induction-page ) { padding-top: 0 !important; }
.induction-page > main {
	box-sizing: border-box;
	padding-left: 16px;
	padding-right: 16px;
}
/* Everything in the form stays within its box — stops the right-edge leak. */
.induction-page .gform_wrapper,
.induction-page .gform_wrapper form,
.induction-page .gform_wrapper .gform_body,
.induction-page .gform_wrapper .gform_fields { max-width: 100%; box-sizing: border-box; }
.induction-page .gform_wrapper input[type="text"],
.induction-page .gform_wrapper input[type="email"],
.induction-page .gform_wrapper input[type="tel"],
.induction-page .gform_wrapper input[type="number"],
.induction-page .gform_wrapper input[type="url"],
.induction-page .gform_wrapper select,
.induction-page .gform_wrapper textarea {
	max-width: 100%;
	box-sizing: border-box;
	/* Darker border + subtle grey fill so the field edges read on a phone. */
	border: 1px solid var( --wp--preset--color--gray-mid ) !important;
	background-color: var( --wp--preset--color--surface ) !important;
	border-radius: 6px;
	/* 16px min font-size stops iOS auto-zoom on focus; comfortable touch height. */
	font-size: 1rem;
	padding: 0.7rem 0.85rem;
}
.induction-page .gform_wrapper input[type="text"]:focus,
.induction-page .gform_wrapper input[type="email"]:focus,
.induction-page .gform_wrapper input[type="tel"]:focus,
.induction-page .gform_wrapper textarea:focus,
.induction-page .gform_wrapper select:focus {
	border-color: var( --wp--preset--color--charcoal ) !important;
	background-color: #fff !important;
	outline: 2px solid var( --wp--preset--color--charcoal );
	outline-offset: 0;
}
/* Larger radio / checkbox controls + tap-friendly choice rows (mobile/tablet). */
.induction-page .gform_wrapper .gfield_radio input[type="radio"],
.induction-page .gform_wrapper .gfield_checkbox input[type="checkbox"] {
	width: 1.45rem;
	height: 1.45rem;
	margin-top: 0.1rem;
	accent-color: var( --wp--preset--color--charcoal );
	flex: 0 0 auto;
}
.induction-page .gform_wrapper .gfield_radio .gchoice,
.induction-page .gform_wrapper .gfield_checkbox .gchoice {
	display: flex;
	align-items: flex-start;
	gap: 0.6rem;
	margin-bottom: 0.6rem;
}
.induction-page .gform_wrapper .gfield_radio .gchoice label,
.induction-page .gform_wrapper .gfield_checkbox .gchoice label {
	font-size: 1rem;          /* normal body size — only the control is enlarged */
	line-height: 1.4;
	padding-top: 0.15rem;
}

/* Acknowledgement fields (.ps-ack) — group the confirm control in a subtle
   grey box so it reads as the "action" for the section above it, and keep its
   label SMALLER than the section <h3> heading (item 2). */
.induction-page .gform_wrapper .gfield.ps-ack {
	background: var( --wp--preset--color--surface );
	border: 1px solid var( --wp--preset--color--rule );
	border-radius: 8px;
	padding: 0.9rem 1.1rem;
	margin-top: 0.4rem;
}
.induction-page .gform_wrapper .gfield.ps-ack > .gfield_label {
	font-size: 0.9375rem;
	font-weight: 600;
	color: var( --wp--preset--color--gray-mid );
	text-transform: uppercase;
	letter-spacing: 0.02em;
	margin-bottom: 0.4rem;
}
/* Brand the form controls (GF's default theme is blue; brand is monochrome). */
.induction-page .gform_wrapper .gform_page_footer input[type="submit"],
.induction-page .gform_wrapper .gform_page_footer input[type="button"],
.induction-page .gform_wrapper .gform_footer input[type="submit"],
.induction-page .gform_wrapper .gform_footer button,
.induction-page .gform_wrapper .gform_page_footer button,
.induction-page .gform_wrapper button.gform-button {
	background-color: var( --wp--preset--color--charcoal ) !important;
	border-color: var( --wp--preset--color--charcoal ) !important;
	color: #fff !important;
	border-radius: 6px;
	/* Tap-friendly: ~52px min height + larger label (mobile/tablet majority). */
	min-height: 52px;
	font-size: 1.0625rem;
	font-weight: 600;
	padding: 0.85rem 1.9rem;
}
/* Full-width buttons on mobile for an easy thumb target. */
@media (max-width: 781px) {
	.induction-page .gform_wrapper .gform_page_footer input[type="submit"],
	.induction-page .gform_wrapper .gform_page_footer input[type="button"],
	.induction-page .gform_wrapper .gform_footer input[type="submit"],
	.induction-page .gform_wrapper .gform_footer button,
	.induction-page .gform_wrapper .gform_page_footer button {
		width: 100%;
	}
	/* GF adds margin-left:8px to the 2nd footer button; when stacked that
	   pushes Next off-alignment. Zero it and use a vertical gap instead. */
	.induction-page .gform_wrapper .gform_page_footer input + input,
	.induction-page .gform_wrapper .gform_page_footer input + button,
	.induction-page .gform_wrapper .gform_page_footer button + input,
	.induction-page .gform_wrapper .gform_page_footer button + button {
		margin-left: 0 !important;
		margin-top: 0.75rem;
	}
}
.induction-page .gform_wrapper .gform_page_footer input[type="submit"]:hover,
.induction-page .gform_wrapper .gform_footer input[type="submit"]:hover,
.induction-page .gform_wrapper button.gform-button:hover {
	background-color: #000 !important;
	border-color: #000 !important;
}
/* Previous = secondary (outline), Next/Submit = primary (filled charcoal). */
.induction-page .gform_wrapper .gform_page_footer input.gform_previous_button,
.induction-page .gform_wrapper .gform_page_footer button.gform_previous_button {
	background-color: #fff !important;
	color: var( --wp--preset--color--charcoal ) !important;
	border: 2px solid var( --wp--preset--color--charcoal ) !important;
}
.induction-page .gform_wrapper .gform_page_footer input.gform_previous_button:hover,
.induction-page .gform_wrapper .gform_page_footer button.gform_previous_button:hover {
	background-color: var( --wp--preset--color--surface-2 ) !important;
	color: #000 !important;
}
/* The "I do not understand" stop message. */
.induction-page .ps-induction-stop { margin: 4px 0 0; }
@media (min-width: 782px) {
	.induction-page > main { padding-left: 0; padding-right: 0; }
}