/**
 * AQ Treks — base theme stylesheet.
 * Mobile-first: min-width media queries only. Values come from theme.json
 * presets (var(--wp--preset--*)) — no hardcoded colors/sizes below.
 *
 * Deliberately NOT wrapped in @layer: WordPress's own global-styles output
 * (theme.json -> :where() selectors) is unlayered, and per the cascade-layers
 * spec any layered rule is weaker than an unlayered one regardless of
 * specificity or source order. This stylesheet is enqueued after
 * global-styles-inline-css, so plain rules here override it as expected.
 */

/* Reset */

*,
*::before,
*::after {
	box-sizing: border-box;
}

/*
 * WP Travel Engine's own compiled block CSS sets --primary-color: #147dfe
 * on :root (see dist/blocks.view-rtl.css) — that blue only measures 3.89:1
 * against white, under the 4.5:1 AA floor for the booking sidebar's text
 * buttons. Overriding the same custom property here is less fragile than
 * chasing every WTE class that reads it — EXCEPT that WTE prints its own
 * block CSS in wp_footer, after this stylesheet, and re-declares the same
 * :root variable a second time further down its own file. Source order
 * alone would let that second declaration win over ours despite equal
 * specificity, so this needs !important to hold regardless of print order.
 */
:root {
	--primary-color: var(--wp--preset--color--primary-dark) !important;
}

html {
	overflow-x: clip;
	-webkit-text-size-adjust: 100%;
}

body {
	overflow-x: clip;
}

img,
svg,
video {
	display: block;
	max-width: 100%;
	height: auto;
}

a {
	text-decoration: none;
}

/*
 * A link sitting inside a paragraph/list item of running prose (a trip's
 * overview copy, the Air Quality page body, "Before You Go" permit links,
 * ...) needs more than color alone to read as a link — the reset above
 * removes the one thing that gave it that on its own. Buttons, nav items
 * and cards all have their own distinct visual treatment already (a
 * background, a border, an icon) and never live inside a `p`/`li`, so this
 * is safely scoped to exactly the "link in a sentence" case WCAG's
 * link-in-text-block check is about.
 */
p a,
li a {
	text-decoration: underline;
}

/* Standard WordPress "visually hidden" utility — for headings and labels
   a screen reader needs but the design doesn't call for showing (e.g. a
   section heading that exists purely to keep the heading outline from
   skipping a level). Not focusable content, so no :focus-visible variant. */
.screen-reader-text {
	position: absolute;
	width: 1px;
	height: 1px;
	margin: -1px;
	padding: 0;
	overflow: hidden;
	clip-path: inset(50%);
	word-wrap: normal !important;
	border: 0;
}

:focus-visible {
	outline: 2px solid var(--wp--preset--color--primary);
	outline-offset: 2px;
}

/*
 * theme.json declares a 0px root padding so `useRootPaddingAwareAlignments`
 * generates the `.wp-site-blocks`/`.has-global-padding` plumbing (including
 * the alignfull negative-margin compensation) with no visible change at
 * desktop — this just overrides the same custom properties at mobile so
 * constrained content gets a small edge gutter instead of sitting flush
 * against the screen, while alignfull sections still reach true edge-to-edge.
 *
 * Has to target `body`, not `:root` — core's own global-styles-inline-css
 * declares these four custom properties directly on `body` (bundled into
 * its big color/font/line-height rule), and a custom property's own literal
 * value on an element always wins over whatever it'd otherwise inherit from
 * an ancestor like `:root`, regardless of which selector "looks" more
 * specific. Overriding on `:root` alone silently did nothing below `body`.
 */
@media (max-width: 55.99em) {

	body {
		--wp--style--root--padding-top: 0;
		--wp--style--root--padding-right: 8px;
		--wp--style--root--padding-bottom: 0;
		--wp--style--root--padding-left: 8px;
	}
}

/* Layout helpers */

/*
 * Condensed one step down the spacing scale from the original
 * spacing--80 default (measured ~81px live) — still a real section-
 * sized breather, just tighter. The per-section overrides below (dense
 * feature strip vs. sparse charm split) shift down by the same one step
 * each, so the "tighter/looser than the default" relationship between
 * sections stays intact — this isn't flattening that intentional
 * variation, just moving the whole scale down together.
 */
.aqt-section {
	padding-block: var(--aqt-section-pad-block, var(--wp--preset--spacing--70));
}

.aqt-section--surface {
	background-color: var(--wp--preset--color--surface);

	/* Default body text (#657176) on this background is 4.45:1 — 0.05
	   short of AA. Headings aren't affected (theme.json sets their color
	   directly on h1-h6, which wins over this inherited value) — this
	   only reaches plain paragraph/span text that would otherwise fall
	   back to the default body color. */
	color: var(--wp--preset--color--primary);
}

.aqt-section--dark {
	background-color: var(--wp--preset--color--primary-dark);
	color: var(--wp--preset--color--background);
}

.aqt-section--dark a {
	color: var(--wp--preset--color--background);
}

/* Components */

.aqt-pill {
	display: inline-flex;
	align-items: center;
	gap: var(--wp--preset--spacing--20);
	border-radius: 999px;
	padding-block: var(--wp--preset--spacing--30);
	padding-inline: var(--wp--preset--spacing--50);
	font-weight: 600;
	white-space: nowrap;
}

.aqt-pill--outline {
	border: 1px solid var(--wp--preset--color--border);
	color: var(--wp--preset--color--heading);
}

/*
 * Premium button system: rectangular corners instead of the old pill shape,
 * a soft gradient sheen, layered elevation shadow, a gentle glow on hover,
 * and a physical-feeling press on click — restrained rather than flashy,
 * per the client's brief. `.wp-element-button` is the class WordPress
 * stamps on every `core/button` link styled by theme.json's
 * `elements.button` (border-radius/colors/padding live there — see
 * theme.json), so this one rule covers every wp:button on the site
 * (including its `is-style-outline` variant) without touching individual
 * patterns. `.aqt-newsletter-form__submit` and `.aqt-journal-featured__cta`
 * are real buttons too but aren't `core/button` blocks, so they're listed
 * explicitly — as are WP Travel Engine's own "View Details" (`.wpte-button`)
 * and "Check Availability" (`.wpte-bf-btn.wte-book-now`) buttons, for the
 * same "every button on the site" uniformity, though the booking wizard's
 * smaller internal controls (package/traveler steppers) are left alone —
 * those toggle selected/active state via background color and restyling
 * them risks fighting that logic for no visible benefit. Badges/tags
 * (`.aqt-pill-badge`, topic pills, difficulty badges) are deliberately
 * excluded — they're labels, not buttons, and keep their pill shape.
 *
 * The rgba() values are the theme.json palette's `heading` (#151B1E) and
 * `primary` (#526B76) colors spelled out by hand, same as the hero overlay
 * further down this file — CSS custom properties can't be split into rgba()
 * channels on their own.
 */
.wp-element-button,
.aqt-newsletter-form__submit,
.aqt-journal-featured__cta,
.wpte-button,
.wpte-bf-btn.wte-book-now {
	background-image: linear-gradient(180deg, rgba(255, 255, 255, 0.16) 0%, rgba(255, 255, 255, 0) 45%, rgba(21, 27, 30, 0.08) 100%);
	box-shadow:
		0 1px 2px rgba(21, 27, 30, 0.08),
		0 6px 16px rgba(21, 27, 30, 0.12),
		inset 0 1px 0 rgba(255, 255, 255, 0.1);
	transition: box-shadow 0.2s cubic-bezier(0.4, 0, 0.2, 1);
}

.wp-element-button:hover,
.aqt-newsletter-form__submit:hover,
.aqt-journal-featured__cta:hover,
.wpte-button:hover,
.wpte-bf-btn.wte-book-now:hover {
	box-shadow:
		0 2px 6px rgba(21, 27, 30, 0.1),
		0 10px 24px rgba(21, 27, 30, 0.16),
		0 0 0 4px rgba(82, 107, 118, 0.16),
		inset 0 1px 0 rgba(255, 255, 255, 0.14);
}

/*
 * WP Travel Engine sets its own border-radius directly on these two classes
 * (100px on `.wpte-button`, 4px on the booking button) and reprints its
 * compiled CSS in `wp_footer`, after this stylesheet — same reprint-order
 * quirk as the trip-gallery height cap and trip-duration contrast fixes
 * elsewhere in this file, so it needs `!important` to actually stick.
 */
/* stylelint-disable no-descending-specificity --
   plain radius override, unrelated to the shadow/glow :hover rule above */
.wpte-button,
.wpte-bf-btn.wte-book-now {
	border-radius: 8px !important;
}
/* stylelint-enable no-descending-specificity */

/* Transform is layout-safe (compositor-only) but still motion, so it's
   gated behind reduced-motion same as everything else animated in this
   project — reduced-motion users still get the shadow/glow feedback above,
   just not the lift/press. */
@media (prefers-reduced-motion: no-preference) {

	.wp-element-button,
	.aqt-newsletter-form__submit,
	.aqt-journal-featured__cta,
	.wpte-button,
	.wpte-bf-btn.wte-book-now {
		transition: box-shadow 0.2s cubic-bezier(0.4, 0, 0.2, 1), transform 0.2s cubic-bezier(0.4, 0, 0.2, 1);
	}

	.wp-element-button:hover,
	.aqt-newsletter-form__submit:hover,
	.aqt-journal-featured__cta:hover,
	.wpte-button:hover,
	.wpte-bf-btn.wte-book-now:hover {
		transform: translateY(-1px);
	}

	.wp-element-button:active,
	.aqt-newsletter-form__submit:active,
	.aqt-journal-featured__cta:active,
	.wpte-button:active,
	.wpte-bf-btn.wte-book-now:active {
		transform: scale(0.97);
	}
}

.wp-element-button:active,
.aqt-newsletter-form__submit:active,
.aqt-journal-featured__cta:active,
.wpte-button:active,
.wpte-bf-btn.wte-book-now:active {
	box-shadow:
		0 1px 2px rgba(21, 27, 30, 0.1),
		inset 0 1px 0 rgba(255, 255, 255, 0.08);
}

.aqt-eyebrow {
	display: block;
	text-transform: uppercase;
	letter-spacing: 0.08em;
	font-weight: 600;
	color: var(--wp--preset--color--primary);
	margin-bottom: var(--wp--preset--spacing--20);
}

.aqt-section--dark .aqt-eyebrow,
.aqt-hero--video .aqt-eyebrow {
	color: var(--wp--preset--color--accent);
}

/* Main header */

/*
 * `position: fixed`, not `sticky` — confirmed by direct testing that
 * `position: sticky` silently fails to stick the moment this element
 * sits inside even one plain, otherwise-unstyled wrapper div (true
 * in a fresh throwaway test element too, not just this header), and
 * this header always has at least the template-part wrapper around it.
 * `fixed` doesn't depend on that at all — it's also the mechanism the
 * homepage's hero already used and had already proven reliable.
 */
.aqt-header {
	position: fixed;
	top: 0;
	left: 0;
	right: 0;
	z-index: 100;

	/* Tinted surface, not flat white, and separation from elevation instead
	   of a hairline — a plain white bar + 1px border-bottom is the most
	   recognised "AI nav" signature there is. */
	background-color: var(--wp--preset--color--surface);
	box-shadow: 0 1px 0 var(--wp--preset--color--border), 0 12px 24px -16px rgba(21, 27, 30, 0.18);
}

/*
 * The visible "gap" reported between the header and the first section on
 * every non-home page only ever showed up logged in: WP's admin bar is
 * `position: fixed` too, at a *higher* z-index than our header, and core
 * pushes the page down for it by putting `margin-top: 32px` (46px on the
 * ≤782px breakpoint below) on `<html>` — which shifts normal document flow
 * (so `<main>`'s own margin-block-start above ends up correctly offset)
 * but does nothing for an element that's `position: fixed` itself, since
 * that's positioned against the viewport, not `<html>`'s box. Left alone,
 * the header stays pinned to the real viewport top, the admin bar covers
 * its own top 32px, and `<main>` starts 32px lower than the header's
 * visible bottom edge — exactly the gap. Moving the header down to start
 * below the admin bar instead closes it.
 */
body.admin-bar .aqt-header {
	top: 32px;
}

@media screen and (max-width: 782px) {

	body.admin-bar .aqt-header {
		top: 46px;
	}
}

/*
 * Fixed positioning takes the header out of flow on every page, not just
 * the hero (which already relied on this and compensates with its own
 * zero-margin rule below). Everywhere else needs the opposite: enough
 * top space that content starts below the fixed header instead of
 * hidden behind it.
 */
body:not(.is-home-hero) .wp-site-blocks > main {
	margin-block-start: var(--wp--custom--header--height, 88px);
}

.aqt-header > .wp-block-group {
	min-height: var(--wp--custom--header--height, 88px);
	align-items: center;
}

/*
 * Hamburger trigger — hidden at desktop, where the nav stays inline.
 * A plain 3-bar icon that morphs into an X (`.is-active`, toggled by the
 * drawer script in header.html) rather than a second icon swapped in.
 */
.aqt-menu-toggle {
	display: none;
	flex-direction: column;
	justify-content: center;
	align-items: center;
	gap: 5px;
	width: 44px;
	height: 44px;
	flex-shrink: 0;
	border: none;
	background: none;
	cursor: pointer;
}

.aqt-menu-toggle__bar {
	width: 22px;
	height: 2px;
	border-radius: 1px;
	background-color: var(--wp--preset--color--heading);
	transition: transform 0.25s ease, opacity 0.25s ease;
}

.aqt-menu-toggle.is-active .aqt-menu-toggle__bar:nth-child(1) {
	transform: translateY(7px) rotate(45deg);
}

.aqt-menu-toggle.is-active .aqt-menu-toggle__bar:nth-child(2) {
	opacity: 0;
}

.aqt-menu-toggle.is-active .aqt-menu-toggle__bar:nth-child(3) {
	transform: translateY(-7px) rotate(-45deg);
}

@media (prefers-reduced-motion: reduce) {

	.aqt-menu-toggle__bar {
		transition: none;
	}
}

.aqt-drawer-backdrop {
	position: fixed;
	inset: 0;
	z-index: 190;
	background-color: rgba(21, 27, 30, 0.5);
	opacity: 0;
	visibility: hidden;
	transition: opacity 0.25s ease, visibility 0.25s ease;
}

.aqt-drawer-backdrop.is-open {
	opacity: 1;
	visibility: visible;
}

body.aqt-drawer-locked {
	overflow: hidden;
}

.aqt-drawer-close {
	display: none;
}

.aqt-brand {
	align-items: center;
}

.aqt-brand__logo-link {
	display: flex;
	position: relative;
	flex-shrink: 0;
}

.aqt-brand__logo {

	/* Explicit width (not just height + width:auto) so a tight header row
	   can't flex-shrink the image off its intrinsic 396:180 ratio — that's
	   what was causing the Lighthouse image-aspect-ratio failure. */
	width: 132px;
	height: 60px;
	flex-shrink: 0;
	transition: opacity 0.3s ease;
}

/*
 * `--mono` is a second image, not a CSS filter on the one above —
 * `filter: brightness(0) invert(1)` zeroes every opaque pixel's RGB before
 * inverting, which would collapse this full lockup's linework and its
 * background into one indistinguishable blob. `logo-header-on-dark.webp`
 * (white lockup, shown here) and `logo-header-mono.webp` (black lockup,
 * the default state above) are two real brand-supplied assets instead —
 * background-color-keyed to transparent from their own flat dark/light
 * source tiles (`artifacts/web_dark_background.png` and
 * `artifacts/monochrome_web_logo.png`), then resized + converted to WebP
 * for the header specifically — so each renders correctly on whatever's
 * actually behind it: white-on-video for the transparent home-hero
 * header, black-on-surface everywhere else. The PNG originals of both
 * still exist (`logo-header-on-dark.png` is the watermark source
 * `tools/seed/seed-trek-packages.php` stamps onto trek photos —
 * `logo-header-mono.png` had no other use and was removed).
 */
.aqt-brand__logo--mono {
	position: absolute;
	inset: 0;
	opacity: 0;
	transition: opacity 0.3s ease;
}

/*
 * Primary nav (Destinations / Treks / Plan your trek / Journal / About us).
 * All five items share one flex row and one look, whether they open a
 * mega menu, a simple single-column dropdown, or nothing at all (Journal).
 * `<details>`/`<summary>` instead of `core/navigation-submenu` throughout —
 * the submenu block only allows nested navigation-link/navigation-submenu
 * children, so a real multi-column dropdown with an image tile can't live
 * inside one, and mixing it with hand-rolled dropdowns for the other items
 * was what caused the two groups to drift out of alignment/spacing in the
 * first place. `<details>` gets us click/tap-to-open with zero JS and free
 * keyboard support (Enter/Space); the only thing it doesn't do natively is
 * close-on-outside-click, which a small script in header.html handles.
 */

.aqt-primary-nav {
	position: relative;
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	column-gap: var(--wp--preset--spacing--50);
	row-gap: var(--wp--preset--spacing--10);
}

@media (min-width: 56em) {

	.aqt-primary-nav {
		flex-grow: 1;
		justify-content: center;
	}
}

.aqt-mega {

	/* No `position: relative` here at mobile widths on purpose: the nav is
	an off-canvas drawer there (see the `max-width: 55.99em` block below),
	and each panel expands inline under its own trigger instead of
	floating, so it doesn't need a positioned ancestor at all — see the
	`min-width: 56em` block for where each panel goes back to being an
	absolutely-positioned floating dropdown, which is what desktop wants. */
}

.aqt-mega__trigger {
	display: flex;
	align-items: center;
	gap: var(--wp--preset--spacing--10);
	list-style: none;
	cursor: pointer;
	padding: var(--wp--preset--spacing--20) 0;
	font-weight: 600;
	color: var(--wp--preset--color--heading);
}

.aqt-mega__trigger::-webkit-details-marker {
	display: none;
}

.aqt-mega__trigger::after {
	content: "";
	width: 8px;
	height: 8px;
	border-right: 2px solid currentcolor;
	border-bottom: 2px solid currentcolor;
	transform: rotate(45deg);
	margin-top: -4px;
	transition: transform var(--dur-fast, 160ms) ease;
}

.aqt-mega[open] .aqt-mega__trigger::after {
	transform: rotate(-135deg);
	margin-top: 2px;
}

.aqt-mega:hover .aqt-mega__trigger {
	color: var(--wp--preset--color--primary);
}

.aqt-mega__trigger--plain {
	text-decoration: none;
}

.aqt-mega__trigger--plain::after {
	content: none;
}

.aqt-mega__trigger--plain:hover {
	color: var(--wp--preset--color--primary);
}

.aqt-mega__panel {

	/* Absolute + viewport-width-via-100vw rather than static: `.aqt-mega` is
	one flex item in a `flexWrap:nowrap` header row, so a statically-flowed
	panel is squeezed into that item's own narrow column instead of the
	full header width. Breaking out of flow sidesteps the parent layout
	entirely on the small screens where this matters most. */
	position: absolute;
	top: 100%;
	left: 50%;
	z-index: 100;
	transform: translateX(-50%);
	width: 100vw;
	max-width: calc(100vw - (var(--wp--preset--spacing--40) * 2));
	margin-top: var(--wp--preset--spacing--20);
	padding: var(--wp--preset--spacing--40);

	/* Same glass treatment as the hero's "Talk to a guide" button
	   (`.aqt-hero .is-style-outline`), just less see-through — that button
	   floats over one dark video frame, this panel floats over anything
	   from page content to the video hero, and needs its own nav links
	   and the promo card's text to stay readable either way. */
	background-color: rgba(255, 255, 255, 0.75);
	backdrop-filter: blur(20px);
	-webkit-backdrop-filter: blur(20px);
	border: 1px solid rgba(255, 255, 255, 0.6);
	border-radius: 8px;
	box-shadow: 0 12px 32px rgba(21, 27, 30, 0.12);
	display: flex;
	flex-direction: column;
	gap: var(--wp--preset--spacing--40);
	max-height: 70vh;
	overflow-y: auto;
}

/* Browsers without backdrop-filter support get a fully opaque panel
   instead of a flat, unblurred tint sitting on top of whatever's behind
   it — the fallback is the same panel, just without the "glass" part. */
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {

	.aqt-mega__panel {
		background-color: var(--wp--preset--color--background);
		border-color: var(--wp--preset--color--border);
	}
}

.aqt-mega__col {
	display: flex;
	flex-direction: column;
	gap: var(--wp--preset--spacing--20);
}

.aqt-mega__heading {
	margin: 0;
	text-transform: uppercase;
	letter-spacing: 0.08em;
	font-size: var(--wp--preset--font-size--small);
	font-weight: 600;
	color: var(--wp--preset--color--body);
	border-bottom: 1px solid var(--wp--preset--color--border);
	padding-bottom: var(--wp--preset--spacing--10);
}

.aqt-mega__col a {
	font-weight: 400;
	color: var(--wp--preset--color--heading);
}

.aqt-mega__col a:hover {
	color: var(--wp--preset--color--primary);
}

.aqt-mega__promo {
	display: block;
	border-radius: 8px;
	overflow: hidden;
	background: var(--wp--preset--color--surface);
	position: relative;
}

.aqt-mega__promo img {
	width: 100%;
	height: 140px;
	object-fit: cover;
}

.aqt-mega__promo-eyebrow,
.aqt-mega__promo-title,
.aqt-mega__promo-cta {
	display: block;
	padding-inline: var(--wp--preset--spacing--30);
}

.aqt-mega__promo-eyebrow {
	margin-top: var(--wp--preset--spacing--30);
	text-transform: uppercase;
	letter-spacing: 0.08em;
	font-size: var(--wp--preset--font-size--small);
	font-weight: 600;
	color: var(--wp--preset--color--body);
}

.aqt-mega__promo-title {
	font-weight: 600;
	color: var(--wp--preset--color--heading);
	margin-top: var(--wp--preset--spacing--10);
}

.aqt-mega__promo-cta {
	font-weight: 600;
	color: var(--wp--preset--color--primary-dark);
	margin: var(--wp--preset--spacing--10) 0 var(--wp--preset--spacing--30);
}

@media (max-width: 55.99em) {

	/* Below the desktop breakpoint there isn't room for logo + all 5 nav
	   items + search on one line, so the nav moves off the row entirely
	   (`position: fixed`, taken out of flow — the row keeps to a single
	   line: logo, search, hamburger) and becomes an off-canvas drawer that
	   the hamburger button opens/closes. */
	.aqt-menu-toggle {
		display: flex;
	}

	.aqt-primary-nav {
		position: fixed;
		top: 0;
		right: 0;
		bottom: 0;
		z-index: 200;
		width: min(85vw, 360px);
		flex-direction: column;
		align-items: stretch;
		row-gap: 0;
		background-color: var(--wp--preset--color--background);
		padding: var(--wp--preset--spacing--80) var(--wp--preset--spacing--50) var(--wp--preset--spacing--50);
		box-shadow: -8px 0 32px rgba(21, 27, 30, 0.18);
		overflow-y: auto;
		transform: translateX(100%);
		transition: transform 0.3s ease;
	}

	@media (prefers-reduced-motion: reduce) {

		.aqt-primary-nav {
			transition: none;
		}
	}

	.aqt-primary-nav.is-open {
		transform: translateX(0);
	}

	.aqt-drawer-close {
		display: flex;
		align-items: center;
		justify-content: center;
		position: absolute;
		top: var(--wp--preset--spacing--30);
		right: var(--wp--preset--spacing--30);
		width: 44px;
		height: 44px;
		border: none;
		background: none;
		color: var(--wp--preset--color--heading);
		cursor: pointer;
	}

	/* Each nav item becomes a full-width row rather than a floating
	   dropdown trigger — the drawer is a narrow column, not the header
	   bar, so there's no "off to the side" for a panel to float over. */
	.aqt-mega {
		width: 100%;
		border-bottom: 1px solid var(--wp--preset--color--border);
	}

	.aqt-mega__trigger,
	.aqt-mega__trigger--plain {
		width: 100%;
		justify-content: space-between;
		min-height: 44px;
	}

	/*
	 * The drawer's background is always solid, even on the homepage where
	 * the floating header goes transparent with white trigger text over
	 * the hero video — an ID selector to unconditionally out-specificity
	 * `body.is-home-hero:not(.is-scrolled) .aqt-mega__trigger` (three
	 * classes deep), otherwise the drawer's nav items render invisible
	 * (white text on the drawer's white background) on the homepage.
	 */
	#aqt-primary-nav .aqt-mega__trigger,
	#aqt-primary-nav .aqt-mega__trigger--plain {
		color: var(--wp--preset--color--heading);
	}

	/* The panel expands inline below its trigger (native <details> accordion
	   behavior) instead of floating — same markup as desktop's mega menu,
	   just laid out flat since it's already inside a scrollable column. */
	.aqt-mega__panel {
		position: static;
		top: auto;
		left: auto;
		z-index: auto;
		transform: none;
		width: 100%;
		max-width: none;
		margin-top: 0;
		padding: 0 0 var(--wp--preset--spacing--40);
		background: none;
		backdrop-filter: none;
		-webkit-backdrop-filter: none;
		border: none;
		box-shadow: none;
		max-height: none;
		overflow-y: visible;
	}
}

@media (min-width: 56em) {

	.aqt-mega {
		position: relative;
	}

	.aqt-mega__panel {
		left: 0;
		transform: none;
		z-index: 100;
		width: max-content;
		max-width: none;
		min-width: 480px;
		max-height: none;
		overflow-y: visible;
		flex-direction: row;
		flex-wrap: nowrap;
	}

	.aqt-mega__col {
		min-width: 180px;
	}

	.aqt-mega__promo {
		width: 220px;
		flex-shrink: 0;
	}

	.aqt-mega__promo img {
		height: 110px;
	}

	/* Plan your trek / About us: one plain column of links, no promo tile —
	   the 480px mega-menu minimum would leave them looking like an empty
	   oversized box. */
	.aqt-mega--simple .aqt-mega__panel {
		min-width: 220px;
	}

	.aqt-mega--simple .aqt-mega__col {
		min-width: 0;
	}
}

/*
 * Search icon and hamburger sit right next to each other, not spread out
 * by the header row's own space-between — this group is one flex item in
 * that row (pinned to its trailing edge), with its own tight 2px gap
 * between the two controls.
 */
.aqt-header__actions {
	gap: 2px;
}

/*
 * A glass pill (frosted, blurred background) expands behind the input on
 * hover/focus-within alone — no JS required for that part. The solid
 * accent circle stays opaque and fixed at the row's trailing edge the
 * whole time, same silhouette as the reference "pill input + popped-out
 * circular button" pattern, just in our own glass + brand-colour
 * treatment instead of a flat white bar. The header script only covers
 * what CSS can't: a tap on a touch device (no real `:hover`) and closing
 * again on an outside click or Escape.
 */
.aqt-search {
	position: relative;
	display: flex;
	align-items: center;
}

/* The pill itself — a pseudo-element sized to the whole row (`inset: 0`
   automatically covers the input once it's expanded, since .aqt-search's
   own box grows with its content), kept below the input/button with
   z-index and out of the way of clicks with pointer-events. */
.aqt-search::before {
	content: "";
	position: absolute;
	inset: 0;
	z-index: 0;
	border-radius: 999px;
	background-color: rgba(255, 255, 255, 0.7);
	backdrop-filter: blur(16px);
	-webkit-backdrop-filter: blur(16px);
	border: 1px solid rgba(255, 255, 255, 0.6);
	box-shadow: 0 8px 24px rgba(21, 27, 30, 0.14);
	opacity: 0;
	transform: scaleX(0.4);
	transform-origin: right center;
	transition: opacity 0.2s ease, transform 0.25s ease;
	pointer-events: none;
}

.aqt-search:hover::before,
.aqt-search:focus-within::before,
.aqt-search.is-open::before {
	opacity: 1;
	transform: scaleX(1);
}

/* The input's own default focus outline is a hard rectangle — clashes
   with the rounded glass pill it sits inside. Move the ring onto the
   pill itself instead of just deleting it, so keyboard focus is still
   visible, just shaped to match. */
.aqt-search:focus-within::before {
	outline: 2px solid var(--wp--preset--color--primary);
	outline-offset: 2px;
}

@supports not ( (backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px)) ) {

	.aqt-search::before {
		background-color: var(--wp--preset--color--background);
	}
}

.aqt-search__toggle {
	position: relative;
	z-index: 1;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 44px;
	height: 44px;
	flex-shrink: 0;

	/* WP Travel Engine prints its own CSS in wp_footer, after this
	   stylesheet, and its generic `button[type="submit"]` padding wins
	   the source-order tie on any WTE-loaded page (trek grids, taxonomy
	   archives, …) unless forced — same fix shape as the button-radius
	   and trip-gallery height-cap overrides elsewhere in this file. */
	padding: 0 !important;
	border: none;
	border-radius: 999px;
	background-color: var(--wp--preset--color--primary-dark);
	color: var(--wp--preset--color--background);
	cursor: pointer;
	box-shadow: 0 6px 16px -4px rgba(21, 27, 30, 0.4);
	transition: background-color 0.2s ease, box-shadow 0.2s ease;
}

.aqt-search__toggle:hover {
	background-color: var(--wp--preset--color--primary);
	box-shadow: 0 10px 22px -6px rgba(21, 27, 30, 0.45);
}

@media (prefers-reduced-motion: no-preference) {

	.aqt-search__toggle {
		transition: background-color 0.2s ease, box-shadow 0.2s ease, transform 0.2s ease;
	}

	.aqt-search__toggle:active {
		transform: scale(0.92);
	}
}

.aqt-search__input {
	position: relative;
	z-index: 1;
	width: 0;
	min-width: 0;
	height: 44px;
	padding-inline: 0;
	border: none;
	background: none;
	font: inherit;
	font-size: var(--wp--preset--font-size--small);
	color: var(--wp--preset--color--heading);
	opacity: 0;
	transition: width 0.25s ease, opacity 0.2s ease, padding 0.25s ease;
}

.aqt-search__input:focus-visible {

	/* The pill (`.aqt-search:focus-within::before`) carries the focus
	   ring instead — a rectangle here would clash with the rounded pill. */
	outline: none;
}

.aqt-search:hover .aqt-search__input,
.aqt-search:focus-within .aqt-search__input,
.aqt-search.is-open .aqt-search__input {

	/* Capped, not just 200px flat — the search icon and hamburger now sit
	   right next to each other (`.aqt-header__actions`), so on a narrow
	   phone a flat 200px expansion can outgrow the space actually left
	   between the logo and that pair and shove the hamburger toward/off
	   the viewport edge. `min()` still reaches 200px wherever there's
	   room (tablet/desktop) and only backs off once the viewport can't
	   fit it. 242px is measured against real rendered viewports
	   (320-500px, headless Chrome + CDP device metrics) at zero root
	   padding, not just worked out on paper — the naive arithmetic (logo
	   box + icon+gap+hamburger + row padding) undercounted by ~12px in
	   practice, and flexbox `space-between` won't clamp the overflow for
	   us if this runs short. The root-padding variables are added on top
	   (not baked into the 242 constant) so this stays correct if that
	   padding value ever changes again. */
	width: min(200px, calc(100vw - 242px - var(--wp--style--root--padding-left) - var(--wp--style--root--padding-right)));
	opacity: 1;
	padding-inline-start: var(--wp--preset--spacing--40);
}

.aqt-search__input::placeholder {
	color: var(--wp--preset--color--body);
	opacity: 0.7;
}

@media (prefers-reduced-motion: reduce) {

	.aqt-search::before,
	.aqt-search__input {
		transition: none;
	}
}

/* Footer */

.aqt-footer {
	padding-block: var(--wp--preset--spacing--80);
}

.aqt-footer__newsletter {
	gap: var(--wp--preset--spacing--60);
	align-items: center;
	padding-bottom: var(--wp--preset--spacing--70);
}

.aqt-footer__logo {
	display: block;
	width: 168px;
	height: auto;
	margin-bottom: var(--wp--preset--spacing--30);
}

.aqt-footer .wp-block-separator {
	opacity: 0.16;
	margin-block: var(--wp--preset--spacing--70);
}

.aqt-footer__columns h4 {
	text-transform: uppercase;
	letter-spacing: 0.06em;
	opacity: 0.6;
	margin-bottom: var(--wp--preset--spacing--40);
}

.aqt-footer__columns ul {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: var(--wp--preset--spacing--30);
}

/* stylelint-disable no-descending-specificity --
   unrelated BEM component, no real overlap.

   `text-decoration: none` overrides the global `li a`/`p a` underline reset
   (see the top of this file) — that rule exists so a link inline in a
   sentence still reads as a link without relying on color alone, but every
   link here IS the entire list item or line, not one word inside running
   prose, so there's nothing for the underline to disambiguate. */
.aqt-footer__columns a,
.aqt-footer p a {
	color: rgba(255, 255, 255, 0.78);
	text-decoration: none;
}
/* stylelint-enable no-descending-specificity */

.aqt-footer__columns a:hover {
	color: var(--wp--preset--color--background);
}

/*
 * Socials sit under the address details in the brand column now (first
 * column of aqt-footer__columns), not the closing bottom bar.
 *
 * `.aqt-footer__columns .aqt-footer__socials` (two classes) rather than
 * plain `.aqt-footer__socials` — `.wp-block-social-links` is itself a
 * `<ul>`, so without the extra specificity here `.aqt-footer__columns ul`
 * above (a class + a type selector, same specificity weight) would win the
 * `flex-direction: column` it sets for the nav lists and stack the icons
 * instead of running them in a row.
 */
.aqt-footer__columns .aqt-footer__socials {
	flex-direction: row;
	gap: var(--wp--preset--spacing--20);
	margin-top: var(--wp--preset--spacing--40);
}

.aqt-footer__contact-line {
	display: flex;
	align-items: center;
	gap: var(--wp--preset--spacing--20);
	margin: var(--wp--preset--spacing--20) 0 0;
}

.aqt-footer__contact-line svg {
	flex-shrink: 0;
	opacity: 0.7;
}

/* Newsletter signup form */

.aqt-newsletter-form__status {
	color: var(--wp--preset--color--accent);
	font-size: var(--wp--preset--font-size--small);
	margin: 0 0 var(--wp--preset--spacing--20);
}

.aqt-newsletter-form__form {
	display: flex;
	gap: var(--wp--preset--spacing--20);
	flex-wrap: wrap;
}

.aqt-newsletter-form__privacy {

	/* 0.6 measured under the 4.5:1 AA floor against the dark footer, same
	issue as .aqt-footer__bottom p above — 0.8 clears it. */
	color: rgba(255, 255, 255, 0.8);
	font-size: var(--wp--preset--font-size--small);
	margin: var(--wp--preset--spacing--20) 0 0;
}

/*
 * WP Travel Engine's own frontend stylesheet sets a global
 * input[type="email"] rule (specificity 0,1,1) for its own form fields,
 * which otherwise beats this class alone (0,1,0) regardless of source
 * order — that was leaving this input transparent-on-dark, a 1.06:1
 * contrast failure. `input.aqt-newsletter-form__input` (0,2,0) outranks it.
 *
 * `width`/`flex` are set explicitly here for a related but separate
 * reason: `trip-archive.css` (only enqueued on trip/archive pages, not
 * the homepage — see `WteAssetGate.php`) also carries bare `input{width:
 * 100%}` and `input{flex:1}` rules. Those are lower specificity than this
 * whole class, but this rule never used to set either property at all,
 * so there was nothing here to "win" — WTE's rule applied uncontested and
 * stretched this input to fill the row on exactly those two page types,
 * shoving the "Sign up" button onto its own line and making the footer
 * newsletter look structurally different depending which template it
 * rendered on. Declaring both properties here, even though the values
 * are unremarkable, is what actually closes the gap.
 */
input.aqt-newsletter-form__input {
	width: auto;
	flex: 0 1 320px;
	min-width: 260px;
	border: none;
	border-radius: 8px;
	padding-block: var(--wp--preset--spacing--30);
	padding-inline: var(--wp--preset--spacing--50);
	font-family: inherit;
	font-size: var(--wp--preset--font-size--medium);
	color: var(--wp--preset--color--heading);
	background: var(--wp--preset--color--background);
}

@media (max-width: 55.99em) {

	/* The 320px flex-basis/260px min-width above is sized for the row's
	   desktop width. At mobile widths the row itself is much narrower —
	   input(260) + gap(20) + button(~110) doesn't fit under ~400px, so
	   it wrapped to two lines. Let the input actually flex here (grow
	   *and* shrink to fill whatever's left after the button) instead of
	   holding out for a fixed basis it can't get. */
	input.aqt-newsletter-form__input {
		flex: 1 1 140px;
		min-width: 140px;
	}
}

/* stylelint-disable-next-line no-descending-specificity --
   layout/color properties here, unrelated to the shared shadow/glow rule
   above that also targets this class */
.aqt-newsletter-form__submit {
	border: none;
	border-radius: 8px;
	padding-block: var(--wp--preset--spacing--30);
	padding-inline: var(--wp--preset--spacing--50);
	background: var(--wp--preset--color--background);
	color: var(--wp--preset--color--heading);
	font-family: inherit;
	font-weight: 600;
	font-size: var(--wp--preset--font-size--medium);
	cursor: pointer;
	white-space: nowrap;
}

.aqt-newsletter-form__submit:hover {
	background: var(--wp--preset--color--accent);
}

.aqt-footer__bottom {
	margin-top: var(--wp--preset--spacing--70);
	padding-top: var(--wp--preset--spacing--50);
	border-top: 1px solid rgba(255, 255, 255, 0.14);
	gap: var(--wp--preset--spacing--30);
}

.aqt-footer__bottom p {

	/* 0.6 measured at 3.91:1 against the footer background — under the 4.5:1
	AA floor for body text. 0.8 clears it with margin (WCAG contrast is a
	minimum, not a target). */
	opacity: 0.8;
	margin: 0;
}

/*
 * Homepage — hero
 *
 * Full-bleed looping video, edge-to-edge and bled up under the transparent
 * header (see the `.is-home-hero` rules above) — text on the left, a
 * click-through gallery of real trek cards on the right. `.aqt-hero__media`
 * is `alignfull` so it opts out of the section's own `layout:constrained`
 * (which only centers non-full children — see the note higher up this file
 * about that gotcha), while `.aqt-hero__inner` stays a plain constrained
 * child and gets the actual 1280px content column.
 */

.aqt-hero--video {
	position: relative;
	overflow: hidden;
	display: flex;
	align-items: center;
	min-height: 100vh;
	color: var(--wp--preset--color--background);
}

.aqt-hero__media {
	position: absolute;
	inset: 0;
	z-index: 0;
}

.aqt-hero__video,
.aqt-hero__media-fallback {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
}

.aqt-hero__media-fallback {
	display: none;
}

.aqt-hero__scrim {
	position: absolute;
	inset: 0;
	background-image: linear-gradient(100deg, rgba(21, 27, 30, 0.82) 0%, rgba(21, 27, 30, 0.55) 45%, rgba(21, 27, 30, 0.28) 100%);
}

/* Autoplaying video is non-essential motion, and a muted background loop on
   a metered mobile connection is dead weight — both get the static poster
   frame instead of the real video. */
@media (prefers-reduced-motion: reduce), (max-width: 55.99em) {

	.aqt-hero__video {
		display: none;
	}

	.aqt-hero__media-fallback {
		display: block;
	}
}

.aqt-hero__inner {
	position: relative;
	z-index: 1;
	width: 100%;

	/* Safe area under the fixed header (`--wp--custom--header--height`) plus
	   real breathing room, so the headline never starts flush against the
	   floating nav. */
	padding-block: calc(var(--wp--custom--header--height, 88px) + var(--wp--preset--spacing--60)) var(--wp--preset--spacing--80);
}

.aqt-hero__grid {
	column-gap: clamp(var(--wp--preset--spacing--60), 6vw, var(--wp--preset--spacing--80));
}

.aqt-hero__subhead {
	max-width: 46ch;
	color: rgba(255, 255, 255, 0.85);
}

/* Reusable "primary action" arrow suffix — not every button gets one (see
web-artifacts screenshots: "Explore treks"/"See charm treks"/"Itinerary" do,
"View all treks" doesn't), so it's opt-in per button. */
.aqt-btn-arrow .wp-block-button__link::after {
	content: "\2192";
	margin-left: 8px;
}

/* Icon + label control that opens the full-length video, not a `wp:button`
   — no fill, just an outlined circle so it reads as secondary next to the
   solid "Explore treks" button. */
.aqt-hero__play-trigger {
	display: inline-flex;
	align-items: center;
	gap: var(--wp--preset--spacing--30);
	border: none;
	background: none;
	padding: 0;
	color: inherit;
	font: inherit;
	font-weight: 600;
	cursor: pointer;
}

.aqt-hero__play-icon {
	display: flex;
	align-items: center;
	justify-content: center;

	/* 44px — meets the 44x44 touch-target floor even though the visible
	   ring reads smaller. */
	width: 44px;
	height: 44px;
	flex-shrink: 0;
	border: 1.5px solid rgba(255, 255, 255, 0.7);
	border-radius: 999px;
	background-color: rgba(255, 255, 255, 0.12);
	transition: background-color 0.2s ease, transform 0.2s ease;
}

/* The play triangle's own shape sits slightly left of visual center inside
   a circle — nudge it right by eye rather than fuss with the viewBox. */
.aqt-hero__play-icon svg {
	margin-left: 2px;
}

.aqt-hero__play-trigger:hover .aqt-hero__play-icon {
	background-color: rgba(255, 255, 255, 0.24);
}

@media (prefers-reduced-motion: no-preference) {

	.aqt-hero__play-trigger:active .aqt-hero__play-icon {
		transform: scale(0.92);
	}
}

/*
 * Full-viewport <dialog> rather than the real Fullscreen API — same result
 * (video takes over the screen with its own controls and a close button)
 * without Fullscreen's permission prompts and inconsistent behaviour across
 * browsers/iframes. Native <dialog> already gives us Escape-to-close, focus
 * trapping, and returning focus to the trigger on close for free.
 */
.aqt-video-modal {
	position: fixed;
	inset: 0;
	z-index: 1000;

	/* inset: 0 on a fixed element already fills the viewport exactly —
	   100vw/100vh would over-measure past a visible desktop scrollbar. */
	width: 100%;
	height: 100%;
	max-width: none;
	max-height: none;
	margin: 0;
	padding: 0;
	border: none;
	background-color: rgba(10, 12, 13, 0.96);
}

.aqt-video-modal[open] {
	display: flex;
	align-items: center;
	justify-content: center;
}

.aqt-video-modal::backdrop {
	background-color: rgba(0, 0, 0, 0.6);
}

@media (prefers-reduced-motion: no-preference) {

	.aqt-video-modal[open] {
		animation: aqt-video-modal-in 0.25s cubic-bezier(0.4, 0, 0.2, 1) both;
	}

	@keyframes aqt-video-modal-in {

		from {
			opacity: 0;
		}
	}
}

.aqt-video-modal__player {
	width: 100%;
	height: 100%;
	object-fit: contain;
}

.aqt-video-modal__close {
	position: absolute;
	top: var(--wp--preset--spacing--40);
	right: var(--wp--preset--spacing--40);
	display: flex;
	align-items: center;
	justify-content: center;
	width: 44px;
	height: 44px;
	border: 1.5px solid rgba(255, 255, 255, 0.5);
	border-radius: 999px;
	background-color: rgba(255, 255, 255, 0.08);
	color: var(--wp--preset--color--background);
	cursor: pointer;
	transition: background-color 0.2s ease;
}

.aqt-video-modal__close:hover {
	background-color: rgba(255, 255, 255, 0.2);
}

/*
 * Development notice modal (inc/DevelopmentNotice.php) — a small centered
 * card, not the video modal's full-viewport takeover. `<dialog>`'s own UA
 * styles already center it on `showModal()`; we just override its box.
 */
.aqt-dev-notice {
	position: fixed;
	inset: 0;
	z-index: 1000;
	width: min(440px, calc(100% - var(--wp--preset--spacing--50) * 2));
	max-width: none;
	max-height: calc(100% - var(--wp--preset--spacing--50) * 2);
	margin: auto;
	padding: var(--wp--preset--spacing--60);
	border: none;
	border-radius: 16px;
	background-color: var(--wp--preset--color--background);
	box-shadow: 0 24px 48px rgba(21, 27, 30, 0.28);
}

.aqt-dev-notice::backdrop {
	background-color: rgba(10, 12, 13, 0.55);
}

@media (prefers-reduced-motion: no-preference) {

	.aqt-dev-notice[open] {
		animation: aqt-dev-notice-in 0.25s cubic-bezier(0.4, 0, 0.2, 1) both;
	}

	@keyframes aqt-dev-notice-in {

		from {
			opacity: 0;
			transform: translateY(8px) scale(0.98);
		}
	}
}

.aqt-dev-notice__heading {
	margin: 0 0 var(--wp--preset--spacing--30);
	padding-right: var(--wp--preset--spacing--60);
	font-size: var(--wp--preset--font-size--large);
}

.aqt-dev-notice__message {
	margin: 0;
	color: var(--wp--preset--color--body);
	white-space: pre-line;
}

.aqt-dev-notice__actions {
	display: flex;
	justify-content: flex-end;
	margin-top: var(--wp--preset--spacing--50);
}

.aqt-dev-notice__close {
	position: absolute;
	top: var(--wp--preset--spacing--40);
	right: var(--wp--preset--spacing--40);
	display: flex;
	align-items: center;
	justify-content: center;
	width: 36px;
	height: 36px;
	border: 1px solid var(--wp--preset--color--border);
	border-radius: 999px;
	background-color: var(--wp--preset--color--surface);
	color: var(--wp--preset--color--heading);
	cursor: pointer;
	transition: background-color 0.2s ease;
}

.aqt-dev-notice__close:hover {
	background-color: var(--wp--preset--color--border);
}

/*
 * The trek gallery: a stack of real `<a href>` cards (all always in the
 * DOM — this is a real internal link to every card's trip page regardless
 * of which one is on top, not JS-injected content), positioned by a
 * `data-slot` attribute the inline script in this pattern sets on click.
 * Slot 0 = active, 1 = peeking "next" card, 2 = fully offstage. Three slots
 * cover any number of cards; extras just also get capped at slot 2.
 */
.aqt-hero__gallery {
	position: relative;
	max-width: 340px;
	aspect-ratio: 4 / 5;
	margin-inline: auto;
}

.aqt-hero__card {
	position: absolute;
	inset: 0;
	display: block;
	border-radius: 20px;
	overflow: hidden;
	background: var(--wp--preset--color--surface);
	pointer-events: none;
	box-shadow:
		0 2px 4px rgba(21, 27, 30, 0.1),
		0 16px 32px rgba(21, 27, 30, 0.28);
}

.aqt-hero__card[data-slot="0"] {
	transform: translateX(0) scale(1);
	opacity: 1;
	z-index: 3;
	pointer-events: auto;
}

.aqt-hero__card[data-slot="1"] {
	transform: translateX(55%) scale(0.92);
	opacity: 0.95;
	z-index: 2;
}

.aqt-hero__card[data-slot="2"] {
	transform: translateX(160%) scale(0.85);
	opacity: 0;
	z-index: 1;
}

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

.aqt-hero__card-label {
	position: absolute;
	inset: auto 0 0 0;
	display: flex;
	flex-direction: column;
	gap: 2px;
	padding: var(--wp--preset--spacing--40);
	background-image: linear-gradient(to top, rgba(21, 27, 30, 0.8), transparent);
	color: var(--wp--preset--color--background);
}

.aqt-hero__card-title {
	font-weight: 700;
}

.aqt-hero__card-place {
	font-size: var(--wp--preset--font-size--small);
	opacity: 0.85;
}

.aqt-hero__gallery-next {
	position: absolute;
	z-index: 4;
	right: -18px;
	top: 50%;
	transform: translateY(-50%);
	display: flex;
	align-items: center;
	justify-content: center;
	width: 44px;
	height: 44px;
	border: none;
	border-radius: 999px;
	background: var(--wp--preset--color--background);
	color: var(--wp--preset--color--heading);
	cursor: pointer;
	box-shadow: 0 8px 20px rgba(21, 27, 30, 0.3);
}

@media (max-width: 55.99em) {

	.aqt-hero__gallery {

		/* Columns stack here, so the gallery drops below the CTA row
		   instead of sitting in its own side column — `margin-inline:
		   auto` (which centers it in the desktop column) would leave it
		   visibly offset from "Explore treks" above it. Flush left to
		   match. */
		max-width: 260px;
		margin-inline: 0;
	}

	.aqt-hero__gallery-next {
		width: 40px;
		height: 40px;
	}
}

/*
 * Entrance: the text column fades/slides up in a short stagger (the classic
 * "immersive hero" reveal). Card-slot swaps and the gallery button both
 * already animate via `transform`/`opacity` transitions defined above and
 * on the button rule further down — this block only covers the one-shot
 * entrance.
 */
.aqt-hero__reveal {
	opacity: 0;
	transform: translateY(16px);
}

@media (prefers-reduced-motion: no-preference) {

	.aqt-hero__reveal {
		animation: aqt-hero-reveal 0.6s cubic-bezier(0.4, 0, 0.2, 1) both;
	}

	.aqt-hero__content .aqt-hero__reveal:nth-child(2) {
		animation-delay: 90ms;
	}

	.aqt-hero__content .aqt-hero__reveal:nth-child(3) {
		animation-delay: 180ms;
	}

	.aqt-hero__content .aqt-hero__reveal:nth-child(4) {
		animation-delay: 270ms;
	}

	.aqt-hero__gallery {
		animation: aqt-hero-gallery-in 0.7s cubic-bezier(0.4, 0, 0.2, 1) both;
		animation-delay: 150ms;
	}

	.aqt-hero__card {
		transition: transform 0.5s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.5s ease;
	}

	.aqt-hero__gallery-next {
		transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1);
	}

	.aqt-hero__gallery-next:hover {
		transform: translateY(-50%) scale(1.08);
	}

	.aqt-hero__gallery-next:active {
		transform: translateY(-50%) scale(0.94);
	}

	@keyframes aqt-hero-reveal {

		to {
			opacity: 1;
			transform: translateY(0);
		}
	}

	@keyframes aqt-hero-gallery-in {

		from {
			opacity: 0;
			transform: translateY(24px) scale(0.97);
		}

		to {
			opacity: 1;
			transform: translateY(0) scale(1);
		}
	}
}

@media (prefers-reduced-motion: reduce) {

	.aqt-hero__reveal {
		opacity: 1;
		transform: none;
	}
}

/* theme.json's heading element style targets h1-h6 directly (low
specificity, but it's a rule on the element itself, so an ancestor's
`color` never gets a chance to inherit down to it) — dark sections need
their own heading-color rule, not just `color` on the wrapper. */
.aqt-section--dark :where(h1, h2, h3, h4, h5, h6),
.aqt-hero--video :where(h1, h2, h3, h4, h5, h6) {
	color: var(--wp--preset--color--background);
}

/* Homepage / related-treks — trek grid + card (aqtreks/trek-grid block) */

.aqt-trek-grid {
	display: grid;
	grid-template-columns: repeat(var(--aqt-trek-columns, 1), 1fr);
	gap: var(--wp--preset--spacing--60);
	margin: var(--wp--preset--spacing--60) 0 0;
	padding: 0;
	list-style: none;
}

@media (min-width: 40em) {

	.aqt-trek-grid {
		--aqt-trek-columns: 2;
	}
}

@media (min-width: 64em) {

	.aqt-trek-grid {
		--aqt-trek-columns: 3;
	}
}

.aqt-trek-card {
	background: var(--wp--preset--color--background);
	border: 1px solid var(--wp--preset--color--border);
	border-radius: 12px;
	overflow: hidden;
	display: flex;
	flex-direction: column;
}

.aqt-trek-card__media {
	position: relative;
	display: block;
	aspect-ratio: 4 / 3;
}

.aqt-trek-card__media img {
	width: 100%;
	height: 100%;
	object-fit: cover;
}

.aqt-trek-card__days {
	position: absolute;
	right: var(--wp--preset--spacing--30);
	bottom: var(--wp--preset--spacing--30);
	background: rgba(21, 27, 30, 0.78);
	color: var(--wp--preset--color--background);
	font-size: 0.6875rem;
	font-weight: 600;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	padding: 4px 10px;
	border-radius: 999px;
}

.aqt-trek-card__body {
	padding: var(--wp--preset--spacing--50);
	display: flex;
	flex-direction: column;
	gap: var(--wp--preset--spacing--20);
	flex-grow: 1;
}

.aqt-trek-card__eyebrow {
	margin: 0;
	text-transform: uppercase;
	letter-spacing: 0.06em;
	font-weight: 600;
	font-size: var(--wp--preset--font-size--small);
	color: var(--wp--preset--color--primary);
}

.aqt-trek-card__title {
	margin: 0;
	font-size: var(--wp--preset--font-size--large);
}

/* `text-decoration: none` overrides the global `li a` underline reset (see
   the top of this file) — the whole card is an `<li>`, so both this title
   link and `.aqt-trek-card__link` below inherit that "link in running
   prose" rule despite not being running prose at all; the card's own
   border/hover-lift/arrow already mark them as links. */
/* stylelint-disable-next-line no-descending-specificity --
   unrelated BEM component, no real overlap */
.aqt-trek-card__title a {
	color: var(--wp--preset--color--heading);
	text-decoration: none;
}

.aqt-trek-card__difficulty {
	display: flex;
	align-items: center;
	gap: var(--wp--preset--spacing--20);
	margin: 0;
	color: var(--wp--preset--color--body);
	font-size: var(--wp--preset--font-size--small);
}

.aqt-trek-card__difficulty svg {
	color: var(--wp--preset--color--primary);
	flex-shrink: 0;
}

.aqt-trek-card__rating {
	display: flex;
	align-items: center;
	gap: var(--wp--preset--spacing--20);
	margin: 0;
	font-size: var(--wp--preset--font-size--small);
	color: var(--wp--preset--color--body);
}

.aqt-trek-card__stars {
	color: #ebad34;
	letter-spacing: 1px;
}

.aqt-trek-card__rating strong {
	color: var(--wp--preset--color--heading);
}

.aqt-trek-card__footer {
	margin-top: auto;
	padding-top: var(--wp--preset--spacing--30);
	border-top: 1px solid var(--wp--preset--color--border);
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	flex-wrap: wrap;
	gap: var(--wp--preset--spacing--20) var(--wp--preset--spacing--30);
}

.aqt-trek-card__price {
	font-size: var(--wp--preset--font-size--large);
	font-weight: 700;
	color: var(--wp--preset--color--heading);
	white-space: nowrap;
}

.aqt-trek-card__price-label {
	font-size: var(--wp--preset--font-size--small);
	font-weight: 400;
	color: var(--wp--preset--color--body);
	margin-right: 4px;
}

.aqt-trek-card__link {
	font-weight: 600;
	font-size: var(--wp--preset--font-size--small);
	color: var(--wp--preset--color--primary-dark);
	text-decoration: none;
	white-space: nowrap;
}

.aqt-trek-card__link::after {
	content: " \2192";
}

.aqt-trek-grid__view-all {
	margin-top: var(--wp--preset--spacing--70);
}

/* Search results — mixed treks + journal posts, one shared card style */

.aqt-search-count__text {
	color: rgba(255, 255, 255, 0.75);
	margin: var(--wp--preset--spacing--20) 0 0;
}

.aqt-search-results__grid {
	display: grid;
	grid-template-columns: repeat(var(--aqt-search-columns, 1), 1fr);
	gap: var(--wp--preset--spacing--60);
	margin: 0;
	padding: 0;
	list-style: none;
}

@media (min-width: 40em) {

	.aqt-search-results__grid {
		--aqt-search-columns: 2;
	}
}

@media (min-width: 64em) {

	.aqt-search-results__grid {
		--aqt-search-columns: 3;
	}
}

.aqt-search-result {
	background: var(--wp--preset--color--background);
	border: 1px solid var(--wp--preset--color--border);
	border-radius: 12px;
	overflow: hidden;
	display: flex;
	flex-direction: column;
}

.aqt-search-result__media {
	display: block;
	aspect-ratio: 4 / 3;
	background: var(--wp--preset--color--surface);
}

.aqt-search-result__media img {
	width: 100%;
	height: 100%;
	object-fit: cover;
}

.aqt-search-result__body {
	padding: var(--wp--preset--spacing--40);
}

.aqt-search-result__type {
	display: block;
	text-transform: uppercase;
	letter-spacing: 0.06em;
	font-size: var(--wp--preset--font-size--small);
	font-weight: 600;
	color: var(--wp--preset--color--primary);
	margin-bottom: var(--wp--preset--spacing--10);
}

.aqt-search-result__title {
	margin: 0 0 var(--wp--preset--spacing--10);
}

/* stylelint-disable-next-line no-descending-specificity --
   unrelated BEM component, no real overlap */
.aqt-search-result__title a {
	color: var(--wp--preset--color--heading);
}

.aqt-search-result__meta {
	font-size: var(--wp--preset--font-size--small);
	color: var(--wp--preset--color--body);
	margin: 0 0 var(--wp--preset--spacing--20);
}

.aqt-search-result__excerpt {
	font-size: var(--wp--preset--font-size--small);
	color: var(--wp--preset--color--body);
	margin: 0;
}

.aqt-search-results__empty {
	text-align: center;
	padding-block: var(--wp--preset--spacing--60);
}

.aqt-search-results__pagination {
	justify-content: center;
	margin-top: var(--wp--preset--spacing--70);
}

/* Homepage — feature strip */

/* Tighter than the section default — four short, dense items don't need
   as much air as a sparse image/text split does (see .aqt-charm below).
   Shifted down one step with the default's own condensing above. */
.aqt-features {
	--aqt-section-pad-block: var(--wp--preset--spacing--50);
}

/*
 * Icon inline with the heading, not stacked above it — a centered icon
 * tile above an h3 above two lines of body, repeated across N equal
 * columns, is the single most-recognised AI feature-grid shape. Inline
 * keeps the icon as a small marker rather than the card's visual anchor.
 */
.aqt-feature__head {
	align-items: center;
	gap: var(--wp--preset--spacing--20);
	margin-bottom: var(--wp--preset--spacing--20);
}

.aqt-feature__icon {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 32px;
	height: 32px;
	flex-shrink: 0;
	border-radius: 999px;
	background: var(--wp--preset--color--background);
	color: var(--wp--preset--color--primary-dark);
}

.aqt-feature h3 {
	margin: 0;
}

.aqt-feature p {

	/* Body Slate on Glacier Mist measures 4.45:1 — just under the 4.5:1 AA
	floor. Primary Dark clears it comfortably. */
	color: var(--wp--preset--color--primary-dark);
	margin: 0;
}

/* Homepage — charm split */

/* More generous than the section default — a sparse image/text split
   earns the extra air the dense feature strip above doesn't need.
   Shifted down one step with the default's own condensing above. */
.aqt-charm {
	--aqt-section-pad-block: var(--wp--preset--spacing--80);
}

.aqt-charm__media {
	aspect-ratio: 4 / 3;
	border-radius: 12px;
	background-image: url(../images/homepage/charm-lodges.jpg);
	background-size: cover;
	background-position: center;
}

/* Homepage — air quality treks teaser */

.aqt-air-quality__row {
	align-items: center;
	gap: var(--wp--preset--spacing--60);
	margin-bottom: var(--wp--preset--spacing--50);
}

.aqt-air-quality__copy {
	flex: 2 1 320px;
}

.aqt-air-quality__stat {
	flex: 1 1 200px;
	text-align: center;
	background-color: var(--wp--preset--color--background);
	border: 1px solid var(--wp--preset--color--border);
	border-radius: 12px;
	padding: var(--wp--preset--spacing--50);
}

.aqt-air-quality__stat-number {
	margin: 0;
	font-size: var(--wp--preset--font-size--display);
	font-weight: 700;
	color: var(--wp--preset--color--primary-dark);
}

.aqt-air-quality__stat-label {
	margin: var(--wp--preset--spacing--10) 0 0;
	font-size: var(--wp--preset--font-size--small);
	color: var(--wp--preset--color--body);
}

/*
 * Air Quality Treks page. `.schema-faq*` classes come from Yoast's own
 * `yoast/faq-block` save markup (see `aqtreks_seed_faq_block()` in
 * `tools/seed/seed-trek-packages.php`) — styled here rather than left as
 * plain unstyled div/strong/p, since this page (unlike a trip page) really
 * does render `post_content` on the front end.
 */
.aqt-air-quality-page {
	max-width: 75ch;
	margin-inline: auto;
}

.aqt-air-quality-page .schema-faq {
	display: flex;
	flex-direction: column;
	gap: var(--wp--preset--spacing--40);
	margin-top: var(--wp--preset--spacing--40);
}

.aqt-air-quality-page .schema-faq-section {
	border-bottom: 1px solid var(--wp--preset--color--border);
	padding-bottom: var(--wp--preset--spacing--40);
}

.aqt-air-quality-page .schema-faq-question {
	display: block;
	margin-bottom: var(--wp--preset--spacing--20);
	color: var(--wp--preset--color--heading);
}

.aqt-air-quality-page .schema-faq-answer {
	margin: 0;
	color: var(--wp--preset--color--body);
}

/*
 * Homepage — trail journal grid
 *
 * Core's own Query Loop CSS puts an explicit `width: calc(100% / 3 - 1.25em
 * + 1.25em / 3)` on each `<li>` (block-library/style.css,
 * `.wp-block-post-template.is-flex-container.columns-3 > li`, 4 combined
 * classes). Switching the parent to `display: grid` — like the first
 * attempt here did — doesn't remove that: the percentage just resolves
 * against the grid cell instead of the row, so a "33%" item becomes 33% of
 * an already-33%-wide cell. Same double-shrink bug as the WTE trip card
 * fix elsewhere in this file. Fix is the same shape: override the `<li>`
 * width directly, with enough specificity (and our own breakpoints, since
 * core only defines one `@media (min-width: 600px)` step for every column
 * count) rather than changing display type.
 */

.aqt-journal__grid .wp-block-post-template.is-flex-container {
	gap: var(--wp--preset--spacing--60) !important;
	margin: var(--wp--preset--spacing--60) 0 0;
	list-style: none;
	padding: 0;
}

.aqt-journal__grid .wp-block-post-template.is-flex-container > li {
	width: 100% !important;
}

@media (min-width: 40em) {

	.aqt-journal__grid .wp-block-post-template.is-flex-container.columns-3 > li,
	.aqt-journal__grid .wp-block-post-template.is-flex-container.columns-4 > li {
		width: calc(50% - var(--wp--preset--spacing--60) / 2) !important;
	}
}

@media (min-width: 64em) {

	.aqt-journal__grid .wp-block-post-template.is-flex-container.columns-3 > li {
		width: calc(33.333% - var(--wp--preset--spacing--60) * 2 / 3) !important;
	}

	.aqt-journal__grid .wp-block-post-template.is-flex-container.columns-4 > li {
		width: calc(25% - var(--wp--preset--spacing--60) * 3 / 4) !important;
	}
}

.aqt-journal-card__media {
	position: relative;
	border-radius: 12px;
	overflow: hidden;
	aspect-ratio: 3 / 2;
}

/* stylelint-disable-next-line no-descending-specificity --
   unrelated BEM component, no real overlap */
.aqt-journal-card__media a {

	/* An inline (the default) anchor reserves phantom line-height space
	below the image — invisible here since the parent clips it, but the
	anchor's own layout box still reports that extra height to hit-testing
	tools, which measured it overlapping the title link below the card
	(Lighthouse/axe `target-size`, WCAG 2.2 SC 2.5.8). Block avoids it. */
	display: block;
	height: 100%;
}

.aqt-journal-card__media img {
	width: 100%;
	height: 100%;
	object-fit: cover;
}

.aqt-journal-card__topic {
	position: absolute;
	top: var(--wp--preset--spacing--30);
	left: var(--wp--preset--spacing--30);
	z-index: 1;
}

/* stylelint-disable-next-line no-descending-specificity --
   unrelated BEM component, no real overlap */
.aqt-journal-card__topic a {
	display: inline-block;
	background: rgba(21, 27, 30, 0.78);
	color: var(--wp--preset--color--background);
	text-transform: uppercase;
	letter-spacing: 0.04em;
	font-weight: 600;
	font-size: 0.6875rem;
	padding: 4px 10px;
	border-radius: 999px;
}

.aqt-journal-card__date {
	display: block;
	color: var(--wp--preset--color--body);
	margin-top: var(--wp--preset--spacing--40);
}

.aqt-journal-card h2,
.aqt-journal-card h3 {
	line-height: 1.35;
	margin: var(--wp--preset--spacing--20) 0 0;
}

/* stylelint-disable no-descending-specificity --
   unrelated BEM component, no real overlap */
.aqt-journal-card h2 a,
.aqt-journal-card h3 a {

	/* Same tap-target floor as .aqt-journal-card__link below — the title
	link's own text renders under 24px tall, which is what Lighthouse's
	target-size audit was catching on both the homepage teaser grid
	(h3) and the journal archive (h2 — see the page-journal.html
	heading-order fix). */
	display: inline-block;
	padding-block: var(--wp--preset--spacing--10);
	color: var(--wp--preset--color--heading);
}
/* stylelint-enable no-descending-specificity */

.aqt-journal-card__excerpt {
	color: var(--wp--preset--color--body);
	margin: var(--wp--preset--spacing--20) 0 0;
}

.aqt-journal-card__link {

	/* Padding (not just line-height) so the tap target clears the 24x24px
	   Lighthouse/WCAG floor — the text alone renders shorter than that. */
	display: inline-block;
	margin-top: var(--wp--preset--spacing--20);
	padding-block: var(--wp--preset--spacing--20);
	font-weight: 600;
	font-size: var(--wp--preset--font-size--small);
	color: var(--wp--preset--color--primary-dark);
}

/* Testimonials block */

.aqt-testimonials {
	background-color: var(--wp--preset--color--surface);
}

.aqt-testimonials__inner {

	/* Was a hardcoded 1400px left over from before the sitewide unification
	   to a single 1280px content width (theme.json's contentSize/wideSize)
	   — every other section resolves to 1280px through the "constrained"
	   layout system, so this one alone sat wider and out of alignment. */
	max-width: 1280px;
	margin-inline: auto;
}

.aqt-testimonials__grid {
	display: grid;
	grid-template-columns: repeat(var(--aqt-testimonial-columns, 1), 1fr);
	gap: var(--wp--preset--spacing--50);
	margin-top: var(--wp--preset--spacing--60);
}

@media (min-width: 40em) {

	.aqt-testimonials__grid {
		--aqt-testimonial-columns: 2;
	}
}

@media (min-width: 64em) {

	.aqt-testimonials__grid {
		--aqt-testimonial-columns: 3;
	}
}

.aqt-testimonial {
	background: var(--wp--preset--color--background);
	border: 1px solid var(--wp--preset--color--border);
	border-radius: 12px;
	padding: var(--wp--preset--spacing--50);
	margin: 0;
	display: flex;
	flex-direction: column;
	gap: var(--wp--preset--spacing--30);
}

.aqt-testimonial__stars {
	color: #ebad34;
	letter-spacing: 2px;
}

.aqt-testimonial__quote {
	margin: 0;
	flex-grow: 1;
}

.aqt-testimonial__quote p {
	margin: 0;
	color: var(--wp--preset--color--heading);
}

.aqt-testimonial__meta {
	display: flex;
	flex-direction: column;
	font-size: var(--wp--preset--font-size--small);
	padding-top: var(--wp--preset--spacing--30);
	border-top: 1px solid var(--wp--preset--color--border);
}

.aqt-testimonial__author {
	font-weight: 600;
	color: var(--wp--preset--color--heading);
}

/* stylelint-disable-next-line no-descending-specificity --
   unrelated BEM component, no real overlap */
.aqt-testimonial__trip a {
	color: var(--wp--preset--color--body);
}

/* Related treks block (single trip page) — shares the .aqt-trek-grid/
.aqt-trek-card skin above, since it's the same aqtreks/trek-grid block. */

.aqt-related-treks {
	background-color: var(--wp--preset--color--surface);
}

/* Guide cards block */

.aqt-guides__grid {
	display: grid;
	grid-template-columns: repeat(var(--aqt-guide-columns, 1), 1fr);
	gap: var(--wp--preset--spacing--60);
	max-width: 1400px;
}

@media (min-width: 40em) {

	.aqt-guides__grid {
		--aqt-guide-columns: 2;
	}
}

@media (min-width: 64em) {

	.aqt-guides__grid {
		--aqt-guide-columns: 4;
	}
}

.aqt-guide-card__photo {
	aspect-ratio: 1;
	border-radius: 12px;
	overflow: hidden;
	background-color: var(--wp--preset--color--surface);
}

.aqt-guide-card__photo img {
	width: 100%;
	height: 100%;
	object-fit: cover;
}

.aqt-guide-card__body {
	padding-top: var(--wp--preset--spacing--40);
}

.aqt-guide-card__name {
	margin: 0;
	font-size: var(--wp--preset--font-size--large);
}

.aqt-guide-card__specialty {
	color: var(--wp--preset--color--primary);
	font-weight: 600;
	font-size: var(--wp--preset--font-size--small);
	margin: var(--wp--preset--spacing--10) 0 0;
}

.aqt-guide-card__years {
	color: var(--wp--preset--color--body);
	font-size: var(--wp--preset--font-size--small);
	margin: var(--wp--preset--spacing--10) 0 0;
}

.aqt-guide-card__bio {
	margin: var(--wp--preset--spacing--20) 0 0;
}

/* Trail Journal archive (templates/page-journal.html) */

.aqt-journal-archive .wp-block-post-title {
	margin-bottom: var(--wp--preset--spacing--30);
}

.aqt-journal-archive .wp-block-post-content {
	max-width: 65ch;
	color: var(--wp--preset--color--body);
	margin-bottom: var(--wp--preset--spacing--70);
}

/* Journal topic tabs */

.aqt-journal-tabs {
	gap: var(--wp--preset--spacing--50);
	border-bottom: 1px solid var(--wp--preset--color--border);
	margin-bottom: var(--wp--preset--spacing--60);
	flex-wrap: wrap;
}

.aqt-journal-tabs__item {
	margin: 0;
	padding-bottom: var(--wp--preset--spacing--30);
	font-weight: 600;
	color: var(--wp--preset--color--body);
	border-bottom: 2px solid transparent;
}

/* stylelint-disable-next-line no-descending-specificity --
   unrelated BEM component, no real overlap */
.aqt-journal-tabs__item a {
	color: inherit;
}

.aqt-journal-tabs__item.is-active {
	color: var(--wp--preset--color--heading);
	border-bottom-color: var(--wp--preset--color--primary-dark);
}

/* Pill badges shared by the featured post and its topic term */

.aqt-pill-badge {
	display: inline-block;
	margin: 0;
	padding-block: var(--wp--preset--spacing--10);
	padding-inline: var(--wp--preset--spacing--30);
	border-radius: 999px;
	font-size: var(--wp--preset--font-size--small);
	font-weight: 600;
	color: var(--wp--preset--color--background);
	background: var(--wp--preset--color--primary-dark);
}

.aqt-pill-badge--outline {
	color: var(--wp--preset--color--primary-dark);
	background: transparent;
	border: 1px solid var(--wp--preset--color--primary-dark);
}

/* stylelint-disable-next-line no-descending-specificity --
   unrelated BEM component, no real overlap */
.aqt-pill-badge a {
	color: inherit;
}

/* Featured post row */

.aqt-journal-featured {
	align-items: stretch;
	gap: var(--wp--preset--spacing--60);
	margin-bottom: var(--wp--preset--spacing--80);
}

.aqt-journal-featured__media,
.aqt-journal-featured__body {
	flex: 1 1 0;
	min-width: 280px;
}

/*
 * The block attribute sets `flexWrap:nowrap` (desktop wants media and body
 * side by side, never an accidental early wrap) — but that also meant the
 * row never wraps on its own at mobile widths either, and with each child's
 * `min-width:280px` there's no room to shrink into, so it just overflowed
 * instead of stacking. Force a column stack below the same breakpoint used
 * everywhere else in this file, and drop the min-width so the media/body
 * blocks can actually take the full row width once stacked.
 */
@media (max-width: 55.99em) {

	.aqt-journal-featured {
		flex-direction: column;
	}

	.aqt-journal-featured__media,
	.aqt-journal-featured__body {
		min-width: 0;
		flex-basis: auto;
	}
}

.aqt-journal-featured__media {
	border-radius: 12px;
	overflow: hidden;
	aspect-ratio: 4 / 3;
}

/* stylelint-disable-next-line no-descending-specificity --
   unrelated BEM component, no real overlap */
.aqt-journal-featured__media a {
	display: block;
	height: 100%;
}

.aqt-journal-featured__media img {
	width: 100%;
	height: 100%;
	object-fit: cover;
}

.aqt-journal-featured__body {
	display: flex;
	flex-direction: column;
	justify-content: center;
}

.aqt-journal-featured__badges {
	gap: var(--wp--preset--spacing--20);
	margin-bottom: var(--wp--preset--spacing--30);
}

.aqt-journal-featured__body .wp-block-post-title {
	margin: 0 0 var(--wp--preset--spacing--30);
}

.aqt-journal-featured__body .wp-block-post-excerpt {
	color: var(--wp--preset--color--body);
	margin: 0 0 var(--wp--preset--spacing--30);
}

/* stylelint-disable-next-line no-descending-specificity --
   layout/color properties here, unrelated to the shared shadow/glow rule
   above that also targets this class */
.aqt-journal-featured__cta {
	display: inline-block;
	align-self: flex-start;
	padding-block: var(--wp--preset--spacing--30);
	padding-inline: var(--wp--preset--spacing--50);
	border-radius: 8px;
	font-weight: 600;
	color: var(--wp--preset--color--background);
	background: var(--wp--preset--color--primary-dark);
}

.aqt-journal-featured__cta:hover {
	background: var(--wp--preset--color--primary);
}

.aqt-journal-archive__pagination {
	justify-content: center;
	gap: var(--wp--preset--spacing--30);
	margin-top: var(--wp--preset--spacing--70);
}

.aqt-journal-archive__pagination .page-numbers {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 36px;
	height: 36px;
	padding-inline: var(--wp--preset--spacing--20);
	border-radius: 999px;
	color: var(--wp--preset--color--heading);
}

.aqt-journal-archive__pagination .page-numbers.current {
	background: var(--wp--preset--color--primary-dark);
	color: var(--wp--preset--color--background);
}

.aqt-journal-archive__pagination a.page-numbers:hover {
	background: var(--wp--preset--color--surface);
}

/*
 * Single journal post (templates/single.html)
 *
 * The header, media and content blocks are all direct children of one
 * `layout:{type:constrained,contentSize:800px}` group rather than each
 * having its own separate constrained wrapper — WordPress's "constrained"
 * layout generates CSS that centers *children* of the container
 * (`.wp-container-... > :where(...) { max-width; margin-inline:auto }`),
 * not the container itself. A `max-width` rule on `.aqt-post__header`
 * directly (an earlier version of this file had one) shrinks that
 * container to 800px with no margin, so it sits flush left inside its
 * full-bleed `.aqt-post` ancestor instead of being centered — the auto
 * margins land on its children, which are now the same width as their
 * already-800px parent, so centering them does nothing visible. Don't
 * re-add a width rule to `.aqt-post__header`/`.aqt-post__media` directly;
 * let them stay plain children of the constrained group above them.
 */

.aqt-post__topic {
	margin-bottom: var(--wp--preset--spacing--30);
}

/* stylelint-disable-next-line no-descending-specificity --
   unrelated BEM component, no real overlap */
.aqt-post__topic a {

	/* Reuse the same pill treatment as the journal card's topic badge —
	just not absolutely positioned, since here it sits above the title
	rather than over a photo. */
	display: inline-block;
	padding-block: var(--wp--preset--spacing--10);
	padding-inline: var(--wp--preset--spacing--30);
	border-radius: 999px;
	font-size: var(--wp--preset--font-size--small);
	font-weight: 600;
	color: var(--wp--preset--color--background);
	background: var(--wp--preset--color--primary-dark);
}

.aqt-post__subtitle {
	font-size: var(--wp--preset--font-size--large);
	color: var(--wp--preset--color--body);
	margin: 0 0 var(--wp--preset--spacing--30);
}

.aqt-post-byline {
	font-size: var(--wp--preset--font-size--small);
	color: var(--wp--preset--color--body);
	padding-bottom: var(--wp--preset--spacing--50);
	border-bottom: 1px solid var(--wp--preset--color--border);
	margin: 0 0 var(--wp--preset--spacing--60);
}

.aqt-post__media {
	border-radius: 12px;
	overflow: hidden;
	margin-bottom: var(--wp--preset--spacing--60);
	max-height: 75vh;
}

/* width:100% + height:auto lets tall/narrow photos render at their natural
   aspect ratio like before; max-height clamps that to 75vh on short
   viewports or portrait shots, and object-fit:cover crops (rather than
   squashing) once the clamp kicks in. */
.aqt-post__media img {
	display: block;
	width: 100%;
	height: auto;
	max-height: 75vh;
	object-fit: cover;
}

.aqt-post__content {

	/* No max-width/ch cap here on purpose: the article now lives in a real
	75%-width column (.aqt-post__main, ~960px at the 1280px section width)
	next to a sidebar, not a full-bleed section — that column width is
	already a reasonable line length, an extra cap would just leave dead
	space next to the sidebar instead of improving readability. */
	color: var(--wp--preset--color--body);
}

.aqt-post__content h2 {
	margin-top: var(--wp--preset--spacing--60);
}

.aqt-post-pullquote {
	margin: var(--wp--preset--spacing--50) 0;
	padding-left: var(--wp--preset--spacing--40);
	border-left: 3px solid var(--wp--preset--color--primary-dark);
	font-size: var(--wp--preset--font-size--large);
	font-weight: 600;
	color: var(--wp--preset--color--heading);
}

.aqt-post-pullquote p {
	margin: 0;
}

.aqt-post-figure {
	margin: var(--wp--preset--spacing--50) 0;
}

.aqt-post-figure__image {
	width: 100%;
	height: auto;
	border-radius: 12px;
}

.aqt-post-figure figcaption {
	font-size: var(--wp--preset--font-size--small);
	color: var(--wp--preset--color--body);
	margin-top: var(--wp--preset--spacing--20);
}

.aqt-post__tags {
	gap: var(--wp--preset--spacing--20);
	flex-wrap: wrap;
	margin-top: var(--wp--preset--spacing--70);
	padding-top: var(--wp--preset--spacing--50);
	border-top: 1px solid var(--wp--preset--color--border);
}

/* stylelint-disable-next-line no-descending-specificity --
   unrelated BEM component, no real overlap */
.aqt-post__tags a {
	display: inline-block;
	padding-block: var(--wp--preset--spacing--10);
	padding-inline: var(--wp--preset--spacing--30);
	border-radius: 999px;
	font-size: var(--wp--preset--font-size--small);
	font-weight: 600;
	color: var(--wp--preset--color--primary-dark);
	border: 1px solid var(--wp--preset--color--border);
}

/* Single journal post: 75/25 content + sidebar layout */

.aqt-post__layout {
	gap: var(--wp--preset--spacing--70);
	align-items: flex-start;
}

.aqt-post__sidebar {
	position: sticky;
	top: calc(var(--wp--custom--header--height, 88px) + var(--wp--preset--spacing--50));
}

.aqt-sidebar-widget {
	padding: var(--wp--preset--spacing--50);
	background: var(--wp--preset--color--surface);
	border-radius: 12px;
	margin-bottom: var(--wp--preset--spacing--40);
}

.aqt-sidebar-widget__heading {
	margin: 0 0 var(--wp--preset--spacing--40);
	text-transform: uppercase;
	letter-spacing: 0.06em;
	font-size: var(--wp--preset--font-size--small);
	font-weight: 600;
	color: var(--wp--preset--color--heading);
}

.aqt-related-links__list {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: var(--wp--preset--spacing--30);
}

.aqt-related-links__item {
	display: flex;
	gap: var(--wp--preset--spacing--20);
	align-items: flex-start;
}

.aqt-related-links__media {
	display: block;
	flex-shrink: 0;
	width: 64px;
	height: 64px;
	border-radius: 8px;
	overflow: hidden;
	background: var(--wp--preset--color--border);
}

.aqt-related-links__media img {
	width: 100%;
	height: 100%;
	object-fit: cover;
}

.aqt-related-links__body {
	display: flex;
	flex-direction: column;
	gap: var(--wp--preset--spacing--10);
	min-width: 0;
}

.aqt-related-links__title {
	font-size: var(--wp--preset--font-size--small);
	font-weight: 600;
	color: var(--wp--preset--color--heading);
	line-height: 1.35;
}

/* stylelint-disable-next-line no-descending-specificity --
   unrelated BEM component, no real overlap */
.aqt-related-links__title:hover {
	color: var(--wp--preset--color--primary);
}

.aqt-related-links__meta {
	font-size: var(--wp--preset--font-size--small);

	/* --body at 0.8 opacity measured 3.09:1 on this widget's --surface
	   background — the same "body text on --surface" shortfall as the
	   other contrast fixes in this file, made worse by the opacity
	   reduction. --primary at full opacity clears AA at 4.99:1. */
	color: var(--wp--preset--color--primary);
}

@media (max-width: 55.99em) {

	.aqt-post__sidebar {
		position: static;
	}
}

/* Destination archive (templates/taxonomy-destination.html) */

.aqt-destination-hero .wp-block-term-description {
	max-width: 65ch;
	opacity: 0.85;
}

/*
 * 404 page (templates/404.html)
 *
 * Same dark-hero shell as the destination archive above, plus a big
 * numeral and an always-visible search box — unlike the header's
 * `.aqt-search`, this one doesn't need to expand-on-hover since it's the
 * page's main content, not a corner of the nav.
 */

.aqt-404__code {
	font-weight: 800;
	font-size: clamp(4rem, 12vw, 8rem);
	line-height: 1;
	margin: 0;
	color: var(--wp--preset--color--accent);
}

/*
 * Same FSE gotcha documented in this theme's CLAUDE.md for
 * templates/single.html: a `layout:constrained` group centers its direct
 * children via `margin-left/right: auto !important` — a no-op for a
 * full-width child (h1/buttons/numeral above render at the group's own
 * 1280px `contentSize`, so centering a 1280px box inside a wider viewport
 * still lands its left edge at the same inset every full-width sibling
 * gets), but it actively re-centers a child that also carries its own
 * *narrower* `max-width`, like the lede and search box below — that's
 * what put them adrift in the middle of the hero instead of lined up with
 * everything else.
 *
 * A flat `margin-left: 0` fixes the drift but overshoots: it pins the
 * element to the constrained group's own left edge (x=0 — that group has
 * no padding of its own; every sibling's inset is manufactured by ITS
 * OWN centering, not a real padded column), not to the 72.5px inset the
 * full-width siblings happen to land on. The `calc()` below reproduces
 * core's own centering formula, but anchored to the *fixed* content size
 * (`--wp--style--global--content-size`, the same 1280px theme.json sets
 * for `contentSize`) rather than to this element's own narrower width —
 * which is exactly what makes it land on the same inset as a sibling
 * that's centered at the full 1280px.
 */
.aqt-404__lede {
	max-width: 60ch;
	opacity: 0.85;
	margin-top: var(--wp--preset--spacing--20);
	margin-right: auto !important;
	margin-bottom: var(--wp--preset--spacing--50);
	margin-left: calc((100% - min(var(--wp--style--global--content-size, 1280px), 100%)) / 2) !important;
}

.aqt-404-search {
	display: flex;
	flex-wrap: wrap;
	gap: var(--wp--preset--spacing--20);
	max-width: 560px;
	margin-right: auto !important;
	margin-bottom: var(--wp--preset--spacing--50);
	margin-left: calc((100% - min(var(--wp--style--global--content-size, 1280px), 100%)) / 2) !important;
}

.aqt-404-search__input {
	flex: 1 1 320px;
	min-width: 200px;
	border: none;
	border-radius: 8px;
	padding-block: var(--wp--preset--spacing--30);
	padding-inline: var(--wp--preset--spacing--50);
	font-family: inherit;
	font-size: var(--wp--preset--font-size--medium);
	color: var(--wp--preset--color--heading);
	background: var(--wp--preset--color--background);
}

.aqt-404-search__input:focus-visible {
	outline: 2px solid var(--wp--preset--color--accent);
	outline-offset: 2px;
}

/* stylelint-disable-next-line no-descending-specificity --
   layout/color properties only, unrelated to the shared button
   shadow/glow rule that also targets .wp-element-button */
.aqt-404-search__submit {
	flex: 0 0 auto;
	border: none;
	white-space: nowrap;

	/* Explicit colors rather than the button element's theme.json default
	   (--primary-dark bg / white text) — that default is the same color as
	   .aqt-section--dark's own background, so an unstyled button here would
	   all but disappear. Same fix shape as the hero's "Explore treks"
	   button. */
	background: var(--wp--preset--color--background);
	color: var(--wp--preset--color--heading);
}

.aqt-404__links {
	gap: var(--wp--preset--spacing--50);
	margin-top: var(--wp--preset--spacing--40);
	margin-bottom: var(--wp--preset--spacing--40);
}

.aqt-404__links p {
	margin: 0;
}

.aqt-trek-grid__empty {
	max-width: 60ch;
	color: var(--wp--preset--color--body);
	padding: var(--wp--preset--spacing--60) 0;
}

.aqt-route-help {
	align-items: center;
	flex-wrap: wrap;
	gap: var(--wp--preset--spacing--50);
	background: var(--wp--preset--color--surface);
	border-radius: 12px;
	padding: var(--wp--preset--spacing--60);
	margin-top: var(--wp--preset--spacing--70);
}

.aqt-route-help h3 {
	margin: 0 0 var(--wp--preset--spacing--20);
}

.aqt-route-help p {
	margin: 0;

	/* --body on this card's --surface background measured 4.45:1 — just
	   under the 4.5:1 AA floor for normal-weight text. --heading clears it
	   at 15.4:1 (same token the card's own h3 already uses). */
	color: var(--wp--preset--color--heading);
}

/*
 * Quick-answer callout — sits at the top of a trip's Overview tab content
 * (part of the `overview` REST field's own HTML, not a separate block),
 * giving AI search engines and skimming readers a self-contained 40-60
 * word answer before the full page content. Reuses the surface/border
 * tokens already established elsewhere rather than introducing new colors.
 */
.aqt-quick-answer {
	background-color: var(--wp--preset--color--surface);
	border-left: 3px solid var(--wp--preset--color--primary);
	border-radius: 4px;
	padding: var(--wp--preset--spacing--40) var(--wp--preset--spacing--50);
	margin-bottom: var(--wp--preset--spacing--50);
}

.aqt-quick-answer p {
	margin: 0;

	/* Default body text (#657176) on this box's --surface background is
	   4.45:1 — 0.05 short of AA. --primary clears it at 4.99:1 and is
	   already the color of the border-left above, so it reads as
	   intentional rather than a random swap. */
	color: var(--wp--preset--color--primary);
	font-weight: 500;
}

/* Single trip: booking card */

.aqt-booking-card__enquiry-link {

	/* The global `a { text-decoration: none }` reset makes this link
	   indistinguishable from the paragraph text around it by color alone —
	   underline it back so it passes as a real link-in-text-block. */
	text-decoration: underline;
}

/*
 * Single trip: split gallery (aqtreks/trip-gallery-split).
 *
 * Stacks on mobile; splits 60/40 from tablet up. Every tile gets a fixed
 * aspect-ratio so nothing shifts on image load (a CLS concern per
 * `04-performance.md`).
 */
.aqt-gallery-split {
	display: grid;
	gap: var(--wp--preset--spacing--30);
	grid-template-columns: 1fr;
}

@media (min-width: 56em) {

	.aqt-gallery-split {
		grid-template-columns: 3fr 2fr;
	}

	/*
	 * Grid's `align-items: stretch` sounds like it should size `.side` to
	 * match `.main`'s row height automatically, but `.main`'s own
	 * `aspect-ratio` and `.side`'s real (large, varying) photos fight that:
	 * the row ends up sized to whichever side has the taller *intrinsic*
	 * content, and the other side doesn't reliably stretch to match. Real
	 * photos, not a CSS ratio, so this is measured in JS instead — see the
	 * gallery block's own inline script — and this rule just gives the
	 * tiles a height to fill once that JS sets `.side`'s height in pixels.
	 */
	.aqt-gallery-split__side-tile {
		aspect-ratio: auto;
		height: 100%;
	}
}

.aqt-gallery-split__main {
	position: relative;
	aspect-ratio: 4 / 3;
	overflow: hidden;
	border-radius: 12px;
	background: var(--wp--preset--color--surface);
}

.aqt-gallery-split__slide {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
}

.aqt-gallery-split__prev,
.aqt-gallery-split__next {
	position: absolute;
	top: 50%;
	z-index: 1;
	display: flex;
	align-items: center;
	justify-content: center;
	width: 44px;
	height: 44px;
	transform: translateY(-50%);
	border: none;
	border-radius: 999px;
	background: var(--wp--preset--color--background);
	color: var(--wp--preset--color--heading);
	cursor: pointer;
	box-shadow: 0 8px 20px rgba(21, 27, 30, 0.3);
}

.aqt-gallery-split__prev {
	left: var(--wp--preset--spacing--30);
}

.aqt-gallery-split__next {
	right: var(--wp--preset--spacing--30);
}

.aqt-gallery-split__side {
	display: grid;
	grid-template-rows: 1fr 1fr;
	gap: var(--wp--preset--spacing--30);
}

.aqt-gallery-split__side-tile {
	position: relative;
	aspect-ratio: 4 / 3;
	overflow: hidden;
	border-radius: 12px;
	background: var(--wp--preset--color--surface);
}

.aqt-gallery-split__side-tile img {
	width: 100%;
	height: 100%;
	object-fit: cover;
}

.aqt-gallery-split__view-gallery {
	position: absolute;
	right: var(--wp--preset--spacing--30);
	bottom: var(--wp--preset--spacing--30);
	display: inline-flex;
	align-items: center;
	gap: var(--wp--preset--spacing--20);
	border: none;
	border-radius: 999px;
	padding-block: var(--wp--preset--spacing--20);
	padding-inline: var(--wp--preset--spacing--40);
	background-color: var(--wp--preset--color--primary-dark);
	color: var(--wp--preset--color--background);
	font-weight: 600;
	font-size: var(--wp--preset--font-size--small);
	cursor: pointer;
}

.aqt-gallery-split__view-gallery:hover {
	background-color: var(--wp--preset--color--primary);
}

.aqt-gallery-lightbox {
	position: fixed;
	inset: 0;
	z-index: 1000;
	width: 100%;
	height: 100%;
	max-width: none;
	max-height: none;
	margin: 0;
	padding: 0;
	border: none;
	background-color: rgba(10, 12, 13, 0.96);
}

.aqt-gallery-lightbox[open] {
	display: flex;
	align-items: center;
	justify-content: center;
}

.aqt-gallery-lightbox::backdrop {
	background-color: rgba(0, 0, 0, 0.6);
}

.aqt-gallery-lightbox__image {
	max-width: 90vw;
	max-height: 85vh;
	object-fit: contain;
}

.aqt-gallery-lightbox__close,
.aqt-gallery-lightbox__prev,
.aqt-gallery-lightbox__next {
	position: absolute;
	display: flex;
	align-items: center;
	justify-content: center;
	width: 44px;
	height: 44px;
	border: 1.5px solid rgba(255, 255, 255, 0.5);
	border-radius: 999px;
	background-color: rgba(255, 255, 255, 0.08);
	color: var(--wp--preset--color--background);
	cursor: pointer;
}

.aqt-gallery-lightbox__close {
	top: var(--wp--preset--spacing--40);
	right: var(--wp--preset--spacing--40);
}

.aqt-gallery-lightbox__prev {
	left: var(--wp--preset--spacing--40);
	top: 50%;
	transform: translateY(-50%);
}

.aqt-gallery-lightbox__next {
	right: var(--wp--preset--spacing--40);
	top: 50%;
	transform: translateY(-50%);
}

.aqt-gallery-lightbox__close:hover,
.aqt-gallery-lightbox__prev:hover,
.aqt-gallery-lightbox__next:hover {
	background-color: rgba(255, 255, 255, 0.2);
}

/*
 * Single trip: sticky tabs (wptravelenginetripblocks/tab, hand-authored in
 * single-trip.html — it's a static block with no PHP render callback, so
 * its markup lives literally in the template, generated once via WordPress's
 * own block serializer rather than hand-typed, then verified against a real
 * page load).
 */
.aqt-section--tabs {
	padding-block: 0;
}

/*
 * Condensing + unifying the trip tabs' vertical rhythm, measured directly
 * on a real rendered page rather than guessed from tokens (values here
 * didn't come from a design decision, just whatever WTE's own per-block
 * `--content-padding-*` custom properties and the browser's unstyled
 * default `<h2>` margin happened to add up to):
 *   - Each panel's own top/bottom padding (`--content-padding-top/bottom`,
 *     set once on the shared wrapper below and inherited by every panel)
 *     was 24px + 24px = 48px between one tab's content and the next tab's
 *     heading. Halved to 16px + 16px.
 *   - Every panel's heading-to-content gap relied on the browser's plain
 *     default `<h2>` margin (~36.5px) — real, but never a value we chose,
 *     and FAQ's heading (wrapped in its own flex row alongside the
 *     "Expand all" toggle) didn't inherit it at all, landing at a
 *     mismatched 16px instead. Both now use the same explicit 24px.
 * (Rule itself lives further down, after `.aqt-before-you-go`'s own
 * heading rules — same selector shape, lower specificity there needs to
 * come first.)
 */

/*
 * The tab bar needs to span the full 1280px section width (matching the
 * reference), but WTE's own click handler does
 * `button.closest('.wpte-block_tab-container').querySelectorAll(panels)`
 * at setup time — if the tabs `<ul>` ever ends up outside that container,
 * `.closest()` returns null and the very next line throws, which kills
 * the whole script (sticky pinning, scrollspy, click-to-scroll, all of
 * it, since one throw aborts the rest of the IIFE). So the sidebar moves
 * *into* this container as a third child instead of the tab block moving
 * out of a two-column layout — `<ul>` never leaves, `.closest()` never
 * breaks. The container becomes the grid: tab bar spans both columns on
 * row 1, content and sidebar sit side by side on row 2.
 */
.wpte-block_tab-container {
	position: relative;
	display: grid;
	grid-template-columns: 1fr;
	row-gap: var(--wp--preset--spacing--50);
	align-items: start;
}

@media (min-width: 56em) {

	.wpte-block_tab-container {
		grid-template-columns: 1fr 340px;
		column-gap: var(--wp--preset--spacing--70);
	}
}

/*
 * Wraps the tabs `<ul>` and the Book Now button as flex siblings instead
 * of `position: absolute` guesswork — the old fixed `top` offset never
 * actually matched the tab row's real height, so the button sat a few
 * pixels low and taller than the row around it. The pairing JS in
 * single-trip.html only switches this to `position: fixed` once the bar
 * pins (inline style, so it wins over this rule automatically) — it
 * doesn't care which parent wraps the two elements, only their classes.
 */
.aqt-tab-bar-row {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: var(--wp--preset--spacing--30);
	grid-column: 1 / -1;
}

/*
 * `.wpte-block_tabs.fixed-top` sets its own `z-index: 11` (WTE's CSS) and
 * an opaque white background. Once pinned, Book Now's own fixed box sits
 * horizontally *within* the tabs `<ul>`'s full 1280px-wide box (the ul
 * itself is that wide even though the visible buttons only fill part of
 * it) — without a higher z-index of its own, the ul's opaque background
 * paints over it and the button just visually disappears, even though
 * its position and content are both correct (confirmed with
 * `document.elementFromPoint()` landing on the ul, not the button).
 */
.aqt-tab-bar__book-now {
	position: relative;
	z-index: 12;
}

/*
 * WTE's own `.fixed-top` rule sets `left: 0; right: 0` — full viewport
 * width once pinned, not the 1280px content width it has while static.
 * `left`/`right` both set (not auto) plus a `max-width` here is the
 * standard way to center a fixed element within that span instead of
 * letting it stretch full-bleed: the box shrinks to `max-width` and the
 * (auto) side margins absorb the rest.
 */
.wpte-block_tabs.fixed-top {
	max-width: 1280px;
	margin-inline: auto !important;

	/* WTE's own default is `justify-content: center` — invisible while
	   static (the ul is only ever as wide as its buttons need), but once
	   pinned and capped at 1280px there's real leftover width in the box,
	   and centering bunches the tabs in the middle with dead space on
	   both sides instead of sitting flush left like the reference. */
	justify-content: flex-start !important;
}

.wpte-block_tab-content {
	grid-column: 1;
	--content-padding-top: 16px;
	--content-padding-bottom: 16px;
}

/*
 * WTE's own tab JS behaves completely differently by viewport, not just
 * by dropping the sticky-pin behavior: on desktop it shows every panel
 * at once and tab clicks just scroll to one (confirmed by reading the
 * DOM live — clicking a tab never toggles a panel's `display`, only
 * `window.scrollY`), but below its own internal breakpoint it inline-
 * styles every panel except the active one to `display: none`, i.e. a
 * real show-one-hide-the-rest tab switcher. That's the opposite of what
 * a long, scrollable trip page should do on a phone — force every panel
 * visible (`!important` to beat the inline style) and hide the now-
 * pointless tab button row entirely, leaving one continuous page.
 */
@media (max-width: 55.99em) {

	.wpte-block_tabs {
		display: none !important;
	}

	.wp-block-wptravelenginetripblocks-tab-content {
		display: block !important;
	}
}

.wpte-block_tab-button {
	gap: var(--wp--preset--spacing--10);
	white-space: nowrap;
}

/*
 * WTE's own click handler reads `event.target.dataset.id` and expects it
 * to be the `<button>` itself — confirmed by the exact console error this
 * fixes: clicking directly on the icon/label makes those child elements
 * the event target instead, `dataset.id` comes back undefined, and their
 * `document.getElementById(undefined).style...` throws. `pointer-events:
 * none` makes every click on this button resolve to the button itself
 * regardless of which child visually sits under the cursor.
 */
.wpte-block_tab-button svg,
.wpte-block_tab-button span {
	pointer-events: none;
}

.wpte-block_tab-button svg {
	flex-shrink: 0;
}

.aqt-tab-bar__book-now .wte-book-now svg {
	pointer-events: none;
}

.aqt-tab-bar__book-now .wte-book-now {
	display: inline-flex;
	align-items: center;
	gap: var(--wp--preset--spacing--10);
	white-space: nowrap;

	/* Matches the tab buttons' own padding exactly (12px 16px) so the
	   two sit at the same height instead of WTE's own default (16px 24px)
	   making this button visibly taller than the row it's paired with. */
	padding: 12px 16px !important;
	font-size: 16px;
	line-height: 1.5;
}

@media (max-width: 47.99em) {

	.aqt-tab-bar__book-now {
		display: none;
	}
}

/*
 * Recolor WTE's own highlight-icon medallions to brand slate. Sizing and
 * spacing are left to their native inline-flex layout (`margin-left:
 * calc(-1em - 4px)`, `vertical-align: middle`) — it already sits tight
 * against the text; the oversized 32px absolutely-positioned circle this
 * replaced (plus the connecting line) fought that instead of using it.
 */
.aqt-highlights-timeline .wpte-trip-highlights .wte-block-icon {
	font-size: 14px;
	background-color: var(--wp--preset--color--primary-dark) !important;
	color: var(--wp--preset--color--background) !important;
}

/* Single trip: FAQ header — heading + the same expand-all toggle the
   itinerary tab uses, already in one flex row via this group's own
   block-level layout attribute (`justifyContent: space-between`). */
.aqt-faq-header {
	align-items: center;
	margin-bottom: var(--wp--preset--spacing--50);
}

/* The switch itself (`.expand-all-button input[type=checkbox]`) is only
   24px tall by WTE's own design — padding the wrapping label/toggle area
   keeps a real ≥44px touch target without resizing the switch visually. */
.aqt-faq-header .aib-button-toggle,
#itinerary .aib-button-toggle {
	display: inline-flex;
	align-items: center;
	min-height: 44px;
	cursor: pointer;
}

/*
 * WP Travel Engine still enqueues its classic (non-FSE) template's
 * `single-trip.css` for the real booking-modal script's sake (see
 * `Filters\Template::include_trip_template()` — that stylesheet's own
 * `.faq-row` rule boxes and pads each row for a layout we don't use here.
 * Overriding rather than dequeuing: the same file also carries real
 * booking-modal styling we can't safely drop.
 */
.wp-travel-engine-faq-tab-content .faq-row {
	border: none !important;
	padding: 0 !important;
	border-radius: 0 !important;
}

/*
 * WTE's itinerary/FAQ accordions read a per-block `--primary-color`
 * custom property declared right on the elements that use it (a
 * generated, per-instance selector) — more specific than anything we can
 * set on an ancestor, custom properties or not, so `:root`'s override
 * above never reaches them. Overriding the rendered colors directly.
 */
.wpte-block_tab-content .accordion-tabs-toggle .rotator {
	background-color: var(--wp--preset--color--primary-dark) !important;
	border-color: var(--wp--preset--color--primary-dark) !important;
}

.wpte-block_tab-content .accordion-tabs-toggle .rotator::before,
.wpte-block_tab-content .accordion-tabs-toggle .rotator::after {
	background-color: var(--wp--preset--color--primary-dark) !important;
}

.wpte-block_tab-content .itinerary-row::before {
	content: none !important;
}

.wpte-block_tab-content .itinerary-row .title::before {
	background-color: var(--wp--preset--color--primary-dark) !important;
	border-color: var(--wp--preset--color--primary-dark) !important;
}

.wpte-block_tab-content .expand-all-button input[type="checkbox"]:checked {
	background-color: var(--wp--preset--color--primary-dark) !important;
}

/*
 * Itinerary's "Expand all" toggle isn't a template-level sibling of the
 * "Itinerary" heading the way FAQ's is — it's rendered *inside* WTE's own
 * `wptravelenginetripblocks/itinerary` block output, several levels
 * below the `<h2>`. Pulling the intermediate wrappers into a flex row
 * with the heading isn't safe (WTE's own itinerary JS does plain
 * `querySelector` DOM work, not geometry, but flattening that much
 * markup with `display: contents` to get there is real risk for a
 * cosmetic ask) — positioning the toggle against the heading's own
 * offset is the lower-risk way to land it in the same visual row.
 * Desktop only: stacks normally below the heading on narrow screens,
 * where there's no spare width for it to share a row anyway.
 */
@media (min-width: 56em) {

	#itinerary {
		position: relative;
	}

	#itinerary .wte-toggle-button-wrap {
		position: absolute;
		top: 24px;
		right: 0;
		margin: 0;
	}
}

/* Single trip: Before You Go tab (aqtreks/before-you-go) — editor-authored
   WYSIWYG content via wp_editor(), so this just styles plain classic-editor
   output (p/h2/img), not a custom markup shape. */
.aqt-before-you-go p {
	margin: 0 0 var(--wp--preset--spacing--40);
	color: var(--wp--preset--color--body);
}

.aqt-before-you-go img {
	margin: var(--wp--preset--spacing--30) 0;
	border-radius: 12px;
}

.aqt-before-you-go h2,
.aqt-before-you-go h3 {
	margin-top: var(--wp--preset--spacing--50);
}

.wpte-block_tab-content > .wp-block-wptravelenginetripblocks-tab-content > h2 {
	margin-bottom: var(--wp--preset--spacing--50);
}

.aqt-before-you-go__empty {
	color: var(--wp--preset--color--body);
}

/* Single trip: Departures tab (aqtreks/departures-list) */
.aqt-departures__filters {
	display: flex;
	flex-wrap: wrap;
	gap: var(--wp--preset--spacing--30);
	margin-bottom: var(--wp--preset--spacing--50);
}

.aqt-departures__filter-group {
	display: flex;
	flex-wrap: wrap;
	gap: var(--wp--preset--spacing--10);
}

.aqt-departures__filter-btn {
	display: inline-flex;
	align-items: center;
	min-height: 44px;
	border: 1px solid var(--wp--preset--color--border);
	border-radius: 999px;
	padding-block: var(--wp--preset--spacing--10);
	padding-inline: var(--wp--preset--spacing--30);
	background: var(--wp--preset--color--background);
	color: var(--wp--preset--color--body);
	font-size: var(--wp--preset--font-size--small);
	cursor: pointer;
}

.aqt-departures__filter-btn.is-active {
	border-color: var(--wp--preset--color--primary-dark);
	background: var(--wp--preset--color--primary-dark);
	color: var(--wp--preset--color--background);
}

.aqt-departures__grid {
	display: grid;
	gap: var(--wp--preset--spacing--30);
}

@media (min-width: 40em) {

	.aqt-departures__grid {
		grid-template-columns: repeat(2, 1fr);
	}
}

.aqt-departures__card {
	border: 1px solid var(--wp--preset--color--border);
	border-radius: 12px;
	padding: var(--wp--preset--spacing--40);
}

.aqt-departures__card-date {
	font-weight: 600;
	margin-bottom: var(--wp--preset--spacing--10);
}

.aqt-departures__card-price {
	color: var(--wp--preset--color--primary-dark);
	font-weight: 700;
	margin-bottom: var(--wp--preset--spacing--20);
}

.aqt-departures__card-pax {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var(--wp--preset--spacing--20);
	color: var(--wp--preset--color--body);
	font-size: var(--wp--preset--font-size--small);
	margin-bottom: var(--wp--preset--spacing--30);
}

/* Single trip: Routes tab elevation chart (aqtreks/elevation-chart) */
.aqt-elevation-chart {
	margin-top: var(--wp--preset--spacing--50);
}

.aqt-elevation-chart__svg {
	width: 100%;
	height: auto;
}

.aqt-elevation-chart__line {
	stroke: var(--wp--preset--color--primary-dark);
	stroke-width: 2;
}

.aqt-elevation-chart__point {
	fill: var(--wp--preset--color--primary-dark);
}

.aqt-elevation-chart__altitude,
.aqt-elevation-chart__label {
	font-size: 11px;
	fill: var(--wp--preset--color--body);
}

.aqt-elevation-chart__empty,
.aqt-departures__empty,
.aqt-reviews__empty {
	color: var(--wp--preset--color--body);
	padding-block: var(--wp--preset--spacing--50);
}

/* Single trip: Reviews tab (aqtreks/trip-reviews) */
.aqt-reviews__summary {
	display: flex;
	align-items: center;
	gap: var(--wp--preset--spacing--20);
	margin-bottom: var(--wp--preset--spacing--50);
}

.aqt-reviews__score {
	font-size: var(--wp--preset--font-size--x-large);
	font-weight: 700;
}

.aqt-reviews__stars {
	color: var(--wp--preset--color--primary-dark);
}

.aqt-reviews__count {
	color: var(--wp--preset--color--body);
	font-size: var(--wp--preset--font-size--small);
}

.aqt-reviews__list {
	display: grid;
	gap: var(--wp--preset--spacing--40);
}

@media (min-width: 40em) {

	.aqt-reviews__list {
		grid-template-columns: repeat(2, 1fr);
	}
}

/*
 * Single trip: sticky sidebar — same sticky shape already proven on the
 * journal template's .aqt-post__sidebar, offset by the tab bar's own
 * height (~50px) rather than the header's: the pairing script in
 * single-trip.html hides the site header for exactly as long as this
 * sidebar is within its own sticky range (Overview through Reviews), so
 * the tab bar — pinned flush to the viewport top during that same range
 * — is the only thing the sidebar ever needs to clear.
 */

/*
 * Every tab panel opens with an `<h2>` that carries the theme's global
 * "space before a heading" margin on top of the panel's own 24px
 * (`--content-padding-top`, set per-instance by WTE) — so the *visible*
 * start of "Overview" sits noticeably lower than the panel box itself.
 * The sidebar has no such margin, so without this it starts ~60px above
 * the Overview heading instead of level with it. Dropping the redundant
 * heading margin (zeroed generally, not just Overview — every panel
 * opens the same way) and padding the sidebar to match the panel's own
 * 24px lines both up exactly.
 */
.wpte-block_tab-content > .wp-block-wptravelenginetripblocks-tab-content > *:first-child {
	margin-top: 0;
}

.aqt-trip__sidebar {
	position: sticky;
	top: calc(50px + var(--wp--preset--spacing--50));
	padding-top: 24px;
	grid-column: 1;
}

@media (min-width: 56em) {

	.aqt-trip__sidebar {
		grid-column: 2;
	}
}

@media (max-width: 55.99em) {

	.aqt-trip__sidebar {
		position: static;
	}
}

/*
 * WTE's own `booking` block carries a *second*, independent sticky
 * behavior baked into its block styles (`dist/blocks/view.css`,
 * `@media (max-width: 1024px)`): `position: fixed; bottom: 0; width:
 * 100vw; z-index: 111` — a bottom-pinned mobile booking bar, kept
 * deliberately (this is the "sticky bottom" price/CTA bar) rather than
 * flattened into the sidebar's normal flow. The show/hide toggle (see
 * `templates/single-trip.html`) is what keeps this from permanently
 * covering content: collapsed, the bar is just the toggle button;
 * expanded, `.aqt-price-tiers` (tiers + breakdown + Send Inquiry +
 * Download Brochure) grows the bar's own height to show all of it,
 * still pinned to the bottom.
 */

/* Single trip: price tiers (aqtreks/price-tiers) */
.aqt-price-tiers__list {
	display: flex;
	flex-direction: column;
	gap: var(--wp--preset--spacing--20);
}

.aqt-price-tiers__tier {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: var(--wp--preset--spacing--20);
	border: 1px solid var(--wp--preset--color--border);
	border-radius: 8px;
	padding: var(--wp--preset--spacing--30);
	cursor: pointer;
}

.aqt-price-tiers__tier:has(.aqt-price-tiers__radio:checked) {
	border-color: var(--wp--preset--color--primary-dark);
	background-color: var(--wp--preset--color--surface);
}

.aqt-price-tiers__tier-price {
	font-weight: 700;
}

/* Default body text on the --surface background above is 4.45:1 — 0.05
   short of AA. --primary-dark clears it with a healthy margin (10.46:1). */
.aqt-price-tiers__tier:has(.aqt-price-tiers__radio:checked) .aqt-price-tiers__tier-label,
.aqt-price-tiers__tier:has(.aqt-price-tiers__radio:checked) .aqt-price-tiers__tier-price {
	color: var(--wp--preset--color--primary-dark);
}

.aqt-price-tiers__tier--extra {
	display: none;
}

.aqt-price-tiers.is-expanded .aqt-price-tiers__tier--extra {
	display: flex;
}

.aqt-price-tiers__show-more {
	display: inline-flex;
	align-items: center;
	min-height: 44px;
	margin-top: var(--wp--preset--spacing--20);
	border: none;
	background: none;
	color: var(--wp--preset--color--primary-dark);
	font-weight: 600;
	text-decoration: underline;
	cursor: pointer;
}

.aqt-price-tiers__breakdown {
	display: flex;
	flex-direction: column;
	gap: var(--wp--preset--spacing--10);
	margin-block: var(--wp--preset--spacing--40);
	padding-top: var(--wp--preset--spacing--30);
	border-top: 1px solid var(--wp--preset--color--border);
}

.aqt-price-tiers__breakdown p {
	display: flex;
	justify-content: space-between;
	margin: 0;
}

.aqt-price-tiers__actions {
	display: flex;
	flex-direction: column;
	gap: var(--wp--preset--spacing--20);
}

.aqt-price-tiers__enquiry-btn,
.aqt-price-tiers__brochure-btn {
	display: inline-flex;
	width: 100%;
	align-items: center;
	justify-content: center;
	gap: var(--wp--preset--spacing--10);
	text-align: center;
}

.aqt-price-tiers__enquiry-btn {
	cursor: pointer;
}

/* Single trip: enquiry dialog (trip-enquiry moved here from a standalone
   page section — "Send Inquiry" in the sidebar is its only entry point). */
.aqt-enquiry-modal {
	position: fixed;
	inset: 0;
	z-index: 1000;
	width: min(90vw, 640px);
	height: auto;
	max-height: 85vh;
	overflow-y: auto;
	margin: auto;
	border: none;
	border-radius: 12px;
	padding: var(--wp--preset--spacing--60);
}

.aqt-enquiry-modal::backdrop {
	background-color: rgba(0, 0, 0, 0.6);
}

.aqt-enquiry-modal__close {
	position: absolute;
	top: var(--wp--preset--spacing--30);
	right: var(--wp--preset--spacing--30);
	display: flex;
	align-items: center;
	justify-content: center;
	width: 44px;
	height: 44px;
	border: 1px solid var(--wp--preset--color--border);
	border-radius: 999px;
	background: var(--wp--preset--color--background);
	color: var(--wp--preset--color--heading);
	cursor: pointer;
}

/* Single trip: booking sidebar retheme — WTE's pricing/highlights blocks
   default to a blue accent (--primary-color: #147dfe in their own
   compiled CSS); this brings the parts without a direct color attribute
   in line with the slate palette. WTE reprints its CSS in wp_footer,
   after this stylesheet, so ties need !important — same fix shape as the
   trip-duration/booking-button contrast overrides elsewhere in this file. */
/* stylelint-disable-next-line no-descending-specificity --
   unrelated BEM component, no real overlap */
.wp-block-wptravelenginetripblocks-global-highlights .wte-block-icon {
	color: var(--wp--preset--color--primary-dark) !important;
}

/*
 * Front page only: header floats transparently over the video hero instead
 * of sitting in its own solid bar (`ThemeSetup::add_body_classes()` adds
 * `is-home-hero` to <body>; header.html's own inline script adds
 * `is-scrolled` once you scroll past the hero). `:not(.is-scrolled)` carries
 * the transparent/white-text look — once `.is-scrolled` lands, these rules
 * simply stop matching and the header's normal (dark-on-white) CSS applies
 * again with no explicit "undo" needed, other than restoring the background
 * itself, which really was overridden. Placed at the end of the file, after
 * every base component rule it overrides, on purpose — putting it earlier
 * flags as "descending specificity" against dozens of unrelated later rules
 * that just happen to share a class name.
 */
body.is-home-hero header.wp-block-template-part {
	position: fixed;
	top: 0;
	left: 0;
	right: 0;
	z-index: 100;
}

/*
 * Taking the header out of flow above leaves a gap: core's global styles
 * put `margin-block-start: 1.5rem` on every child of .wp-site-blocks after
 * the first (normal vertical rhythm between stacked sections). With the
 * header fixed, <main> becomes the first thing actually occupying flow
 * space, so it still gets that margin — a 24px white strip at the very top
 * of the page, above the hero, that the fixed header floats over instead
 * of sitting flush against.
 */
body.is-home-hero .wp-site-blocks > main {
	margin-block-start: 0;
}

body.is-home-hero .aqt-header {
	transition: background-color 0.3s ease, box-shadow 0.3s ease;
}

body.is-home-hero.is-scrolled .aqt-header {
	background-color: var(--wp--preset--color--surface);
	box-shadow: 0 1px 0 var(--wp--preset--color--border), 0 12px 24px -16px rgba(21, 27, 30, 0.18);
}

body.is-home-hero:not(.is-scrolled) .aqt-header {
	background-color: transparent;
	box-shadow: none;
}

body.is-home-hero:not(.is-scrolled) .aqt-mega__trigger {
	color: var(--wp--preset--color--background);
}

body.is-home-hero:not(.is-scrolled) .aqt-mega:hover .aqt-mega__trigger,
body.is-home-hero:not(.is-scrolled) .aqt-mega__trigger--plain:hover {
	color: var(--wp--preset--color--accent);
}

body.is-home-hero:not(.is-scrolled) .aqt-brand__logo {
	opacity: 0;
}

body.is-home-hero:not(.is-scrolled) .aqt-brand__logo--mono {
	opacity: 1;
}
