/* ===================================================================
   Voyamore Core — Shared frontend tokens & utilities
   Loaded once and declared as a dependency by every feature's CSS.
   Honors `<html class="dark">` for dark-mode flip.
   =================================================================== */

:root {
	--vym-bg:                #F4F1EA;
	--vym-bg-soft:           #F9F6EF;
	--vym-surface:           #FFFFFF;
	--vym-text:              #1A1612;
	--vym-muted:             #6B6760;
	--vym-accent:            #0FAFCB;
	--vym-accent-hover:      #0C94AC;
	--vym-pill-fg:           #FFFFFF;
	--vym-border:            rgba(26, 22, 18, 0.10);
	--vym-border-strong:     rgba(26, 22, 18, 0.18);
	--vym-glass:             rgba(255, 255, 255, 0.65);
	--vym-scrim:             rgba(0, 0, 0, 0.55);
	--vym-shadow:            rgba(60, 45, 30, 0.18);
	--vym-shadow-lg:         0 30px 60px -30px rgba(0, 0, 0, 0.20);
	--vym-card-text:         #FFFFFF;

	--vym-radius:            14px;
	--vym-radius-sm:         8px;
	--vym-radius-lg:         22px;
	--vym-radius-pill:       999px;

	--vym-maxw:              1240px;
	--vym-ease:              cubic-bezier(0.4, 0, 0.2, 1);

	--vym-font-display:      "Playfair Display", "Times New Roman", serif;
	/* Routed through Oxygen's global --font so the host theme can rebind
	   the UI typography in one place. The 17 downstream selectors that
	   use var(--vym-font-ui) inherit the change automatically. */
	--vym-font-ui:           var(--font);
}

:root.dark,
html.dark {
	--vym-bg:                #0B0F1A;
	--vym-bg-soft:           #0F1422;
	--vym-surface:           #131929;
	--vym-text:              #F0EDE6;
	--vym-muted:             #8892A4;
	--vym-accent:            #0FAFCB;
	--vym-accent-hover:      #1DB7D2;
	--vym-pill-fg:           #0B0F1A;
	--vym-border:            rgba(255, 255, 255, 0.08);
	--vym-border-strong:     rgba(255, 255, 255, 0.16);
	--vym-glass:             rgba(255, 255, 255, 0.04);
	--vym-scrim:             rgba(0, 0, 0, 0.65);
	--vym-shadow:            rgba(0, 0, 0, 0.60);
	--vym-shadow-lg:         0 30px 60px -20px rgba(0, 0, 0, 0.6);
	--vym-card-text:         #F0EDE6;
}

/* ---------- Reveal-on-scroll utility ---------- */
.vym-reveal {
	opacity: 0;
	transform: translateY(20px);
	transition: opacity 0.8s var(--vym-ease), transform 0.8s var(--vym-ease);
	will-change: opacity, transform;
}
.vym-reveal.in {
	opacity: 1;
	transform: translateY(0);
}
.vym-reveal[data-vym-delay="100"] { transition-delay: 0.10s; }
.vym-reveal[data-vym-delay="200"] { transition-delay: 0.20s; }
.vym-reveal[data-vym-delay="300"] { transition-delay: 0.30s; }
.vym-reveal[data-vym-delay="400"] { transition-delay: 0.40s; }

/* ---------- Typography utilities (scoped to feature wrappers) ---------- */
.vym-display {
	font-family: var(--vym-font-display);
	font-weight: 400;
	letter-spacing: -0.005em;
	line-height: 1.05;
}
.vym-display em {
	font-style: italic;
	font-weight: 400;
	color: var(--vym-accent);
}

.vym-eyebrow {
	font-family: var(--vym-font-ui);
	font-size: 12px;
	text-transform: uppercase;
	letter-spacing: 0.18em;
	color: var(--vym-muted);
	font-weight: 500;
}

.vym-section-head {
	display: flex;
	align-items: end;
	justify-content: space-between;
	gap: 32px;
	flex-wrap: wrap;
	margin-bottom: 48px;
}
.vym-section-head h2 {
	font-family: var(--vym-font-display);
	font-weight: 400;
	font-size: clamp(32px, 4.5vw, 52px);
	line-height: 1.05;
	margin: 12px 0 0;
	letter-spacing: -0.005em;
	color: var(--vym-text);
}
.vym-section-head h2 em {
	font-style: italic;
	color: var(--vym-accent);
	font-weight: 400;
}
.vym-section-head .vym-section-sub {
	color: var(--vym-muted);
	font-size: 15px;
	max-width: 420px;
	margin: 0;
}

/* ---------- Pill buttons (scoped utility) ---------- */
.vym-pill {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	padding: 11px 22px;
	border-radius: var(--vym-radius-pill);
	font-family: var(--vym-font-ui);
	font-size: 13px;
	font-weight: 500;
	letter-spacing: 0.04em;
	transition: transform 0.25s var(--vym-ease), background 0.25s var(--vym-ease),
		border-color 0.25s var(--vym-ease), color 0.25s var(--vym-ease), box-shadow 0.25s var(--vym-ease);
	cursor: pointer;
	white-space: nowrap;
	text-decoration: none;
	border: 1px solid transparent;
}
.vym-pill-primary {
	background: var(--vym-accent);
	color: var(--vym-pill-fg);
	font-weight: 600;
}
.vym-pill-primary:hover {
	transform: translateY(-2px);
	box-shadow: 0 12px 32px -10px rgba(15, 175, 203, 0.5);
	background: var(--vym-accent-hover);
	color: var(--vym-pill-fg);
}
.vym-pill-ghost {
	background: transparent;
	border-color: var(--vym-border);
	color: var(--vym-text);
}
.vym-pill-ghost:hover {
	border-color: var(--vym-text);
	background: var(--vym-glass);
	color: var(--vym-text);
}
.vym-pill svg {
	width: 14px;
	height: 14px;
	stroke: currentColor;
	fill: none;
	stroke-width: 1.8;
	flex-shrink: 0;
}
/* Saved state — pill flips to the accent fill so it reads as "active". */
.vym-pill-ghost.is-saved,
.vym-pill-ghost.is-active {
	background: var(--vym-accent);
	color: var(--vym-pill-fg);
	border-color: var(--vym-accent);
}
.vym-pill-ghost.is-saved svg,
.vym-pill-ghost.is-active svg { fill: currentColor; }

/* ---------- Custom select dropdown (.vym-vs-*) ----------
   Markup is built by VoyamoreCore.select(selectEl). The original
   <select> stays in the DOM (hidden) and remains the source of truth
   for form submission and `change` events. */
.vym-vs { position: relative; width: 100%; }
.vym-vs-trigger {
	width: 100%;
	display: flex;
	align-items: center;
	gap: 12px;
	padding: 13px 18px;
	background: var(--vym-surface);
	border: 1px solid var(--vym-border);
	border-radius: var(--vym-radius-pill);
	color: var(--vym-muted);
	font-family: var(--vym-font-ui);
	font-size: 14px;
	cursor: pointer;
	text-align: left;
	transition: border-color 0.25s var(--vym-ease), box-shadow 0.25s var(--vym-ease), color 0.25s var(--vym-ease);
}
.vym-vs-trigger:hover { border-color: var(--vym-muted); color: var(--vym-text); }
.vym-vs-trigger:focus-visible {
	outline: none;
	border-color: var(--vym-accent);
	box-shadow: 0 0 0 4px rgba(15, 175, 203, 0.18);
}
.vym-vs.open .vym-vs-trigger { border-color: var(--vym-accent); color: var(--vym-text); }
.vym-vs-trigger.has-value { color: var(--vym-text); }
.vym-vs-trigger.has-value .vym-vs-icon { color: var(--vym-accent); }

.vym-vs-icon {
	flex: 0 0 18px;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	color: var(--vym-muted);
	transition: color 0.25s var(--vym-ease);
}
.vym-vs-icon svg {
	width: 18px;
	height: 18px;
	stroke: currentColor;
	fill: none;
	stroke-width: 1.6;
	stroke-linecap: round;
	stroke-linejoin: round;
}
.vym-vs-label {
	flex: 1;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.vym-vs-caret {
	flex: 0 0 10px;
	display: inline-flex;
	color: var(--vym-muted);
	transition: transform 0.25s var(--vym-ease), color 0.25s var(--vym-ease);
}
.vym-vs-caret svg { width: 10px; height: 6px; stroke: currentColor; fill: none; }
.vym-vs.open .vym-vs-caret { transform: rotate(180deg); color: var(--vym-text); }

.vym-vs-menu {
	position: absolute;
	top: calc(100% + 8px);
	left: 0;
	right: 0;
	background: var(--vym-surface);
	border: 1px solid var(--vym-border);
	border-radius: 18px;
	box-shadow: 0 28px 56px -18px var(--vym-shadow), 0 4px 12px -6px var(--vym-shadow);
	padding: 6px;
	display: none;
	z-index: 100;
	max-height: 320px;
	overflow-y: auto;
	transform-origin: top center;
	animation: vymVsIn 0.18s var(--vym-ease);
}
.vym-vs.open .vym-vs-menu { display: block; }
@keyframes vymVsIn {
	from { opacity: 0; transform: translateY(-6px) scale(0.98); }
	to   { opacity: 1; transform: translateY(0) scale(1); }
}
.vym-vs-opt {
	display: flex;
	align-items: center;
	gap: 10px;
	width: 100%;
	padding: 11px 14px;
	border-radius: 12px;
	font-size: 14px;
	color: var(--vym-text);
	text-align: left;
	font-family: inherit;
	cursor: pointer;
	border: 0;
	background: transparent;
	transition: background 0.15s, color 0.15s;
}
.vym-vs-opt:hover { background: rgba(15, 175, 203, 0.10); color: var(--vym-text); }
.vym-vs-opt-label { flex: 1; }
.vym-vs-opt .vym-vs-check {
	width: 14px;
	height: 14px;
	color: var(--vym-accent);
	opacity: 0;
	flex: 0 0 14px;
	transition: opacity 0.15s var(--vym-ease);
}
.vym-vs-opt .vym-vs-check svg {
	width: 100%;
	height: 100%;
	stroke: currentColor;
	fill: none;
	stroke-width: 2.4;
	stroke-linecap: round;
	stroke-linejoin: round;
}
.vym-vs-opt.is-selected {
	color: var(--vym-text);
	font-weight: 600;
	background: rgba(15, 175, 203, 0.08);
}
.vym-vs-opt.is-selected .vym-vs-check { opacity: 1; }

/* Compact variant — used inside sort row */
.vym-vs.is-compact .vym-vs-trigger {
	padding: 6px 10px;
	background: transparent;
	border: 1px solid transparent;
	border-radius: var(--vym-radius-pill);
	font-size: 12px;
	text-transform: uppercase;
	letter-spacing: 0.14em;
	font-weight: 600;
	color: var(--vym-text);
	gap: 8px;
}
.vym-vs.is-compact .vym-vs-trigger:hover { border-color: var(--vym-border); }
.vym-vs.is-compact.open .vym-vs-trigger { border-color: var(--vym-accent); }
.vym-vs.is-compact .vym-vs-icon { display: none; }
.vym-vs.is-compact .vym-vs-menu { left: auto; right: 0; min-width: 220px; }
.vym-vs.is-compact .vym-vs-opt {
	text-transform: none;
	letter-spacing: 0;
	font-weight: 500;
	font-size: 13px;
}

/* The native select gets hidden once enhanced. */
select.vym-vs-source {
	position: absolute;
	width: 1px;
	height: 1px;
	padding: 0;
	margin: -1px;
	overflow: hidden;
	clip: rect(0, 0, 0, 0);
	white-space: nowrap;
	border: 0;
}

/* ==================================================================
   Ticket card — shared component
   Used by both [voyamore_deals_filter] and [voyamore_hot_deals].
   CSS-mask perforation between info and stub gives the boarding-pass
   look. Markup contract:
     .vym-ticket
       .vym-ticket-top
         .vym-deal-tag         (optional, top-left)
         .vym-deal-fav         (optional, top-right — needs JS to be interactive)
         .vym-ticket-img       (background-image holder)
         .vym-deal-price       (optional, bottom-left)
       .vym-ticket-info
         .vym-deal-date
         .vym-deal-title
         .vym-deal-route
       .vym-ticket-perf        (dashed-line cutout)
       .vym-ticket-stub
         .vym-deal-when
         .vym-deal-view
   ================================================================== */

.vym-ticket {
	background: var(--vym-surface);
	border-radius: var(--vym-radius);
	overflow: hidden;
	transition: transform 0.35s var(--vym-ease), filter 0.35s var(--vym-ease);
	display: flex;
	flex-direction: column;
	position: relative;
	cursor: pointer;
	color: var(--vym-text);
	text-decoration: none;
	filter: drop-shadow(0 8px 24px rgba(0, 0, 0, 0.06));
	-webkit-mask:
		radial-gradient(circle 10px at 0 calc(100% - 68px), transparent 99%, #000 100%),
		radial-gradient(circle 10px at 100% calc(100% - 68px), transparent 99%, #000 100%);
	-webkit-mask-composite: source-in;
	mask:
		radial-gradient(circle 10px at 0 calc(100% - 68px), transparent 99%, #000 100%),
		radial-gradient(circle 10px at 100% calc(100% - 68px), transparent 99%, #000 100%);
	mask-composite: intersect;
}
.vym-ticket:hover {
	transform: translateY(-6px);
	filter: drop-shadow(0 22px 36px rgba(0, 0, 0, 0.14));
}

.vym-ticket-top {
	aspect-ratio: 4 / 3;
	overflow: hidden;
	position: relative;
}
.vym-ticket-img {
	width: 100%;
	height: 100%;
	background-color: #2a1410;
	background-position: center;
	background-size: cover;
	transition: transform 0.7s var(--vym-ease);
	position: relative;
}
.vym-ticket:hover .vym-ticket-img { transform: scale(1.06); }
.vym-ticket-img::after {
	content: "";
	position: absolute;
	inset: 0;
	background: linear-gradient(180deg, rgba(0, 0, 0, 0) 50%, rgba(0, 0, 0, 0.6) 100%);
}

.vym-ticket .vym-deal-tag {
	position: absolute;
	top: 14px;
	left: 14px;
	background: var(--vym-accent);
	color: var(--vym-pill-fg);
	font-size: 10px;
	font-weight: 700;
	letter-spacing: 0.18em;
	padding: 6px 10px;
	border-radius: 4px;
	text-transform: uppercase;
	z-index: 2;
}

.vym-deal-fav {
	position: absolute;
	top: 14px;
	right: 14px;
	width: 36px;
	height: 36px;
	border-radius: 50%;
	background: rgba(0, 0, 0, 0.35);
	backdrop-filter: blur(10px);
	-webkit-backdrop-filter: blur(10px);
	color: #fff;
	z-index: 3;
	display: flex;
	align-items: center;
	justify-content: center;
	transition: background 0.25s, color 0.25s;
	cursor: pointer;
	border: 0;
}
.vym-deal-fav:hover, .vym-deal-fav.is-active {
	background: var(--vym-accent);
	color: var(--vym-pill-fg);
}
.vym-deal-fav.is-active svg { fill: currentColor; }
.vym-deal-fav svg { width: 16px; height: 16px; }

.vym-ticket .vym-deal-price {
	position: absolute;
	bottom: 16px;
	left: 18px;
	font-size: 36px;
	font-weight: 700;
	color: #fff;
	line-height: 1;
	letter-spacing: -0.01em;
	z-index: 2;
	text-shadow: 0 2px 20px rgba(0, 0, 0, 0.4);
}
.vym-ticket .vym-deal-price small {
	font-size: 12px;
	color: #fff;
	font-weight: 500;
	margin-left: 6px;
	letter-spacing: 0.04em;
}

.vym-ticket-info {
	background: var(--vym-surface);
	padding: 22px 22px;
	display: flex;
	flex-direction: column;
	gap: 6px;
	flex: 1;
}
.vym-ticket-info .vym-deal-date {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	font-size: 11px;
	text-transform: uppercase;
	letter-spacing: 0.15em;
	color: var(--vym-muted);
	margin-bottom: 2px;
}
.vym-ticket-info .vym-deal-date svg {
	width: 12px;
	height: 12px;
	stroke: currentColor;
	fill: none;
	stroke-width: 1.6;
}
.vym-ticket-info .vym-deal-title {
	font-size: 17px;
	font-weight: 500;
	margin: 0;
	line-height: 1.3;
	letter-spacing: -0.005em;
	color: var(--vym-text);
}
.vym-ticket-info .vym-deal-route {
	font-size: 13px;
	color: var(--vym-muted);
	letter-spacing: 0.02em;
}

.vym-ticket-perf {
	position: relative;
	height: 24px;
	background: var(--vym-surface);
	display: flex;
	align-items: center;
	padding: 0 18px;
}
.vym-ticket-perf::before {
	content: "";
	flex: 1;
	border-top: 1px dashed var(--vym-border);
}

.vym-ticket-stub {
	background: var(--vym-surface);
	padding: 0 22px;
	height: 56px;
	box-sizing: border-box;
	display: flex;
	align-items: center;
	justify-content: space-between;
}
.vym-ticket-stub .vym-deal-when {
	font-size: 11px;
	text-transform: uppercase;
	letter-spacing: 0.15em;
	color: var(--vym-muted);
}
.vym-ticket-stub .vym-deal-view {
	font-size: 13px;
	font-weight: 600;
	color: var(--vym-accent);
	letter-spacing: 0.04em;
	display: inline-flex;
	align-items: center;
	gap: 6px;
	transition: gap 0.25s var(--vym-ease);
	white-space: nowrap;
}
.vym-ticket:hover .vym-deal-view { gap: 10px; }

.vym-ticket.vym-reveal { transition: opacity 0.7s var(--vym-ease), transform 0.7s var(--vym-ease); }
