/* XenWeb site styles — uses CSS custom properties from _ThemeStyles.cshtml */

/* Body */
body {
    background-color: var(--xw-primary-bg, #1a1a2e);
    color: var(--xw-primary-font, #ffffff);
    /* --xw-body-font is set only by a Look (Layer B); otherwise the system stack below is used. */
    font-family: var(--xw-body-font, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif);
    min-height: 100vh;
    display: flex;
    flex-direction: column;
}

/* Main content area */
.xw-main {
    flex: 1;
}

/* Hero section */
.xw-hero {
    background-color: var(--xw-nav-bg, #0f3460);
    background-size: cover;
    background-position: center;
    padding: 4rem 0;
    text-align: center;
}

.xw-hero-heading {
    color: var(--xw-nav-font, #ffffff);
    font-weight: 700;
    font-size: 2.25rem;
    margin-bottom: 0.75rem;
}

.xw-hero-subheading {
    color: var(--xw-nav-font, #ffffff);
    opacity: 0.85;
    font-size: 1.15rem;
    margin-bottom: 0;
}

/* Full-bleed photo band shared by the Hero and Call to Action blocks. When either carries a
   background image it gets .xw-image-band: the photo is cover-sized and a dark scrim sits behind
   the (light) heading / subheading / button text so it stays legible over any photo. The content
   container is lifted above the scrim. */
.xw-image-band {
    position: relative;
    background-size: cover;
    background-position: center;
}

.xw-image-band::before {
    content: "";
    position: absolute;
    inset: 0;
    background-color: rgba(0, 0, 0, 0.4);
    pointer-events: none;
}

.xw-image-band > .container {
    position: relative;
    z-index: 1;
}

/* Category banner header */
.xw-category-banner {
    background-color: var(--xw-nav-bg, #0f3460);
    border-radius: var(--xw-radius, 0.5rem);
    padding: 0.75rem 1.25rem;
}

.xw-category-banner-title {
    color: var(--xw-nav-font, #ffffff);
    font-weight: 600;
    margin: 0;
}

.xw-category-banner-image {
    width: 100%;
    max-height: 250px;
    object-fit: cover;
    border-radius: var(--xw-radius, 0.5rem);
}

/* Navbar */
.xw-navbar {
    background-color: var(--xw-nav-bg, #0f3460);
}

.xw-navbar-brand {
    color: var(--xw-nav-font, #ffffff) !important;
    font-weight: 600;
    font-size: 1.25rem;
}

.xw-nav-link {
    color: var(--xw-nav-font, #ffffff) !important;
    opacity: 0.85;
    transition: opacity 0.2s;
}

.xw-nav-link:hover {
    opacity: 1;
}

.xw-navbar-toggler {
    border-color: rgba(255, 255, 255, 0.3);
}

.xw-navbar-toggler .navbar-toggler-icon {
    background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255,255,255,0.7%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
}

.xw-logo {
    max-height: 40px;
    width: auto;
}

/* Overlay header (#3772) — a transparent, sticky nav floating over a full-bleed first section that
   fades to a solid background once scrolled past it. Opt-in per page via page settings
   (WebPages.SettingsJson headerMode=overlay); a solid-header page is completely untouched. --xw-nav-h
   is the measured nav height (set by xenweb-blocks.js); the fallback keeps it sensible before/without
   JS. */
.xw-navbar.xw-navbar-overlay {
    position: sticky;
    top: 0;
    z-index: 1030;
    background-color: transparent;
    transition: background-color 0.3s ease;
}

/* Light-touch legibility while transparent over the photo: shadow the text, not the whole bar, so the
   header stays readable without the permanent heavy scrim the design brief warned against. Only while
   transparent — once scrolled to the solid bar the shadow isn't needed. */
.xw-navbar.xw-navbar-overlay:not(.xw-navbar-scrolled) .xw-navbar-brand,
.xw-navbar.xw-navbar-overlay:not(.xw-navbar-scrolled) .xw-nav-link {
    text-shadow: 0 1px 4px rgba(0, 0, 0, 0.55);
}

/* Scrolled past the hero (or the mobile menu is open): fade to the solid nav colour. */
.xw-navbar.xw-navbar-overlay.xw-navbar-scrolled,
.xw-navbar.xw-navbar-overlay:has(.navbar-collapse.show) {
    background-color: var(--xw-nav-bg, #0f3460);
    box-shadow: 0 2px 10px rgba(0, 0, 0, 0.18);
}

/* Pull the first section up under the sticky nav and let its own background paint full-bleed to the
   very top of the viewport. The wrapper's top padding is zeroed for the first section so no body-
   background gap shows above the photo (the section's own spacing would otherwise leave a dark band
   under the transparent bar); the block's root element then gets enough top padding to clear the nav.
   The background lives on that root element (hero/CTA/carousel/banner), so it reaches the top while the
   heading clears the bar — for whatever block leads the page, not just the hero. */
body.xw-header-overlay .xw-main > .xw-section:first-child {
    margin-top: calc(-1 * var(--xw-nav-h, 72px));
    padding-top: 0;
}

body.xw-header-overlay .xw-main > .xw-section:first-child > :first-child {
    padding-top: calc(var(--xw-nav-h, 72px) + 3rem);
}

/* Cards */
.xw-card {
    background-color: var(--xw-secondary-bg, #16213e);
    border: 1px solid rgba(255, 255, 255, 0.1);
    /* --xw-radius / --xw-shadow are set only by a Look (Layer B); the fallbacks keep today's look. */
    border-radius: var(--xw-radius, 0.5rem);
    box-shadow: var(--xw-shadow, none);
    transition: transform 0.2s, box-shadow 0.2s;
}

.xw-card:hover {
    transform: translateY(-4px);
    box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3);
}

.xw-card-title {
    color: var(--xw-secondary-font, #e0e0e0);
    font-weight: 600;
}

.xw-card-text {
    color: var(--xw-secondary-font, #e0e0e0);
    opacity: 0.8;
}

.xw-card-footer {
    background-color: transparent;
    border-top: 1px solid rgba(255, 255, 255, 0.1);
    color: var(--xw-secondary-font, #e0e0e0);
    opacity: 0.7;
}

.xw-card-img {
    border-radius: var(--xw-radius, 0.5rem) var(--xw-radius, 0.5rem) 0 0;
    max-height: 200px;
    object-fit: cover;
}

/* Circular card image */
.xw-card-img-circle {
    width: 120px;
    height: 120px;
    border-radius: 50%;
    overflow: hidden;
    display: flex;
    align-items: center;
    justify-content: center;
    background-color: var(--xw-primary-bg, #ffffff);
    border: 3px solid var(--xw-nav-bg, #0f3460);
}

.xw-card-img-circle img {
    width: 100%;
    height: 100%;
    object-fit: cover;
}

.xw-card-img-circle .fa-solid {
    font-size: 2.5rem;
    color: var(--xw-nav-bg, #0f3460);
}

/* Headings */
.xw-heading {
    color: var(--xw-primary-font, #ffffff);
    font-weight: 700;
}

.xw-subheading {
    color: var(--xw-primary-font, #ffffff);
    opacity: 0.7;
}

.xw-section-heading {
    color: var(--xw-primary-font, #ffffff);
    font-weight: 600;
    border-bottom: 2px solid var(--xw-nav-bg, #0f3460);
    padding-bottom: 0.5rem;
}

/* Section eyebrow / kicker — a small uppercase label above a heading (#3763). Accent-coloured against
   the light section backgrounds it usually sits on; the hero/CTA bands override it below. Colour comes
   from the theme accent token, never hard-coded. Empty eyebrows are not rendered. */
.xw-eyebrow {
    display: block;
    margin-bottom: 0.5rem;
    color: var(--xw-nav-bg, #0f3460);
    font-size: 0.8rem;
    font-weight: 600;
    letter-spacing: 0.18em;
    text-transform: uppercase;
}

/* On the hero and CTA the eyebrow sits on the accent band or a photo, so it follows that band's light
   text colour (matching the heading) rather than the accent colour. */
.xw-hero .xw-eyebrow,
.xw-cta .xw-eyebrow {
    color: var(--xw-nav-font, #ffffff);
    opacity: 0.85;
}

.xw-muted-text {
    color: var(--xw-primary-font, #ffffff);
    opacity: 0.5;
    font-size: 1.1rem;
}

/* Breadcrumbs */
.xw-breadcrumb {
    background-color: transparent;
    padding: 0.5rem 0;
}

.xw-breadcrumb .breadcrumb-item + .breadcrumb-item::before {
    color: var(--xw-primary-font, #ffffff);
    opacity: 0.5;
}

.xw-breadcrumb .breadcrumb-item.active {
    color: var(--xw-primary-font, #ffffff);
    opacity: 0.7;
}

.xw-breadcrumb-link {
    color: var(--xw-nav-bg, #0f3460);
    text-decoration: none;
}

.xw-breadcrumb-link:hover {
    text-decoration: underline;
}

/* Footer — carries no intrinsic top margin: vertical spacing is section-owned via the style envelope
   (a section's "Margin below" sets the gap before the footer), so a full-bleed final section can sit
   flush against it without any position-dependent rule. */
.xw-footer {
    background-color: var(--xw-nav-bg, #0f3460);
    color: var(--xw-nav-font, #ffffff);
    padding: 2rem 0 1rem;
}

.xw-footer-heading {
    color: var(--xw-nav-font, #ffffff);
    font-weight: 600;
    margin-bottom: 0.75rem;
}

.xw-footer-link {
    color: var(--xw-nav-font, #ffffff);
    opacity: 0.8;
    text-decoration: none;
}

.xw-footer-link:hover {
    opacity: 1;
    text-decoration: underline;
    color: var(--xw-nav-font, #ffffff);
}

/* Footer category links */
.xw-footer-categories {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    gap: 0.5rem;
    padding-bottom: 1rem;
    border-bottom: 1px solid rgba(255, 255, 255, 0.2);
    margin-bottom: 1rem;
}

.xw-footer-category-link {
    background-color: rgba(255, 255, 255, 0.15);
    color: var(--xw-nav-font, #ffffff);
    border-radius: 1rem;
    padding: 0.25rem 0.85rem;
    font-size: 0.85rem;
    text-decoration: none;
    transition: background-color 0.2s;
}

.xw-footer-category-link:hover,
.xw-footer-category-link:focus-visible {
    background-color: rgba(255, 255, 255, 0.3);
    color: var(--xw-nav-font, #ffffff);
    outline: 2px solid #ffffff;
    outline-offset: 2px;
}

.xw-footer-divider {
    border-color: rgba(255, 255, 255, 0.2);
}

.xw-social-links {
    display: flex;
    gap: 1rem;
}

.xw-social-link {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 36px;
    height: 36px;
    border-radius: 50%;
    background-color: rgba(255, 255, 255, 0.15);
    color: var(--xw-nav-font, #ffffff);
    text-decoration: none;
    transition: background-color 0.2s;
}

.xw-social-link:hover {
    background-color: rgba(255, 255, 255, 0.3);
    color: var(--xw-nav-font, #ffffff);
}

/* Service detail */
.xw-service-image {
    border: 1px solid rgba(255, 255, 255, 0.1);
}

.xw-service-description {
    color: var(--xw-primary-font, #ffffff);
    opacity: 0.9;
    line-height: 1.7;
}

/* Buttons.
   The --xw-btn-* variables are set only by a Look (Layer B): 'outline' makes --xw-btn-bg transparent
   with the nav colour as text/border; 'pill' sets --xw-btn-radius to a full round. When no Look is
   active every variable is unset and the fallbacks below render exactly today's solid nav button. */
.xw-btn-primary {
    background-color: var(--xw-btn-bg, var(--xw-nav-bg, #0f3460));
    border-color: var(--xw-btn-border, var(--xw-nav-bg, #0f3460));
    color: var(--xw-btn-fg, var(--xw-nav-font, #ffffff));
    border-radius: var(--xw-btn-radius, var(--xw-radius, 0.375rem));
}

/* Hover always fills solid with the nav colours. For a solid button this matches its resting fill
   (just a slight fade); for an outline button it fills in from the transparent resting state. */
.xw-btn-primary:hover {
    background-color: var(--xw-nav-bg, #0f3460);
    border-color: var(--xw-nav-bg, #0f3460);
    color: var(--xw-nav-font, #ffffff);
    opacity: 0.92;
}

.xw-btn-primary:disabled {
    opacity: 0.5;
}

/* The corner-radius facet must also reach Bootstrap-based buttons (e.g. the Hero/CTA .btn.btn-lg
   buttons), whose corners Bootstrap applies via --bs-btn-border-radius — so the site's radius token
   was otherwise ignored for them. Resolve the same token chain as .xw-btn-primary above, falling back
   to Bootstrap's own per-size default (--bs-btn-border-radius) when no theme radius is set, so
   un-themed sites keep Bootstrap's defaults unchanged. site.css loads after Bootstrap, so this wins. */
.btn {
    border-radius: var(--xw-btn-radius, var(--xw-radius, var(--bs-btn-border-radius)));
}

/* Tables */
.xw-table {
    color: var(--xw-primary-font, #ffffff);
    --bs-table-bg: transparent;
    --bs-table-color: var(--xw-primary-font, #ffffff);
}

.xw-table thead th {
    border-bottom-color: rgba(255, 255, 255, 0.2);
    font-size: 0.85rem;
    text-transform: uppercase;
    letter-spacing: 0.03em;
    opacity: 0.7;
}

.xw-table td {
    border-bottom-color: rgba(255, 255, 255, 0.05);
}

/* Timetable navigation */
.xw-timetable-nav .nav-link {
    color: var(--xw-primary-font, #ffffff);
    opacity: 0.7;
    border-color: transparent;
}

.xw-timetable-nav .nav-link:hover {
    opacity: 1;
    border-color: rgba(255, 255, 255, 0.2);
}

.xw-timetable-nav .nav-link.active {
    background-color: var(--xw-nav-bg, #0f3460);
    color: var(--xw-nav-font, #ffffff);
    border-color: var(--xw-nav-bg, #0f3460);
    opacity: 1;
}

/* Day navigation */
.xw-timetable-day-nav .btn {
    min-width: 50px;
}

.xw-timetable-day-btn {
    color: var(--xw-primary-font, #ffffff);
}

/* Timetable rows */
.xw-timetable-row {
    cursor: pointer;
    transition: background-color 0.15s;
}

.xw-timetable-row:hover {
    background-color: rgba(255, 255, 255, 0.05);
}

.xw-timetable-toggle {
    transition: transform 0.2s;
    opacity: 0.5;
}

[aria-expanded="true"] .xw-timetable-toggle {
    transform: rotate(180deg);
}

/* Detail row */
.xw-timetable-detail td {
    border: none;
}

/* Alert row */
.xw-timetable-alert td {
    border: none;
    padding-top: 0;
}

/* Date header in schedule mode */
.xw-timetable-date-header td {
    background-color: rgba(255, 255, 255, 0.03);
    border-bottom-color: rgba(255, 255, 255, 0.15);
    padding-top: 0.75rem;
}

/* Grid view */
.xw-timetable-grid {
    border-color: rgba(255, 255, 255, 0.1);
}

.xw-timetable-grid td,
.xw-timetable-grid th {
    border-color: rgba(255, 255, 255, 0.1);
}

.xw-timetable-grid-header {
    font-size: 0.8rem;
    min-width: 100px;
}

.xw-timetable-grid-today {
    background-color: rgba(255, 255, 255, 0.05);
}

.xw-timetable-grid-cell {
    vertical-align: top;
    min-height: 50px;
}

.xw-timetable-grid-card {
    background-color: var(--xw-secondary-bg, #16213e);
    border-radius: 4px;
    padding: 4px 6px;
    font-size: 0.8rem;
}

.xw-timetable-grid-badge {
    font-size: 0.65rem;
}

/* Pagination theme overrides */
.page-link {
    background-color: var(--xw-secondary-bg, #16213e);
    border-color: rgba(255, 255, 255, 0.15);
    color: var(--xw-primary-font, #ffffff);
}

.page-link:hover {
    background-color: var(--xw-nav-bg, #0f3460);
    border-color: var(--xw-nav-bg, #0f3460);
    color: var(--xw-nav-font, #ffffff);
}

.page-item.active .page-link {
    background-color: var(--xw-nav-bg, #0f3460);
    border-color: var(--xw-nav-bg, #0f3460);
}

.page-item.disabled .page-link {
    background-color: var(--xw-secondary-bg, #16213e);
    border-color: rgba(255, 255, 255, 0.1);
    color: var(--xw-primary-font, #ffffff);
    opacity: 0.4;
}

/* Member Portal */
.xw-portal-card {
    background-color: var(--xw-secondary-bg, #16213e);
    border: 1px solid rgba(255, 255, 255, 0.1);
    border-radius: 0.5rem;
    overflow: hidden;
}

.xw-portal-card-header {
    background-color: var(--xw-nav-bg, #0f3460);
    color: var(--xw-nav-font, #ffffff);
    padding: 0.75rem 1rem;
    font-weight: 600;
    font-size: 0.95rem;
}

.xw-portal-card-body {
    color: var(--xw-secondary-font, #e0e0e0);
}

.xw-portal-balance {
    font-size: 1.5rem;
    font-weight: 700;
    color: var(--xw-primary-font, #ffffff);
}

.xw-portal-empty {
    color: var(--xw-secondary-font, #e0e0e0);
    opacity: 0.6;
    font-style: italic;
    margin-bottom: 0;
}

.xw-portal-list-item {
    padding: 0.5rem 0;
    border-bottom: 1px solid rgba(255, 255, 255, 0.05);
    color: var(--xw-secondary-font, #e0e0e0);
}

.xw-portal-list-item:last-child {
    border-bottom: none;
}

a.xw-portal-list-item:hover {
    background-color: rgba(255, 255, 255, 0.05);
    color: var(--xw-secondary-font, #e0e0e0);
}

.xw-portal-link {
    color: var(--xw-primary-font, #ffffff);
    opacity: 0.7;
    text-decoration: none;
}

.xw-portal-link:hover {
    opacity: 1;
    color: var(--xw-primary-font, #ffffff);
    text-decoration: underline;
}

/* FullCalendar — card header title */
.xw-calendar-title {
    font-size: 1.1rem;
    font-weight: 600;
}

/* FullCalendar — dark theme overrides */
.fc {
    --fc-border-color: rgba(255, 255, 255, 0.1);
    --fc-page-bg-color: transparent;
    --fc-neutral-bg-color: rgba(255, 255, 255, 0.03);
    --fc-today-bg-color: rgba(255, 255, 255, 0.08);
    --fc-event-bg-color: var(--xw-nav-bg, #0f3460);
    --fc-event-border-color: var(--xw-nav-bg, #0f3460);
    --fc-event-text-color: var(--xw-nav-font, #ffffff);
    --fc-list-event-hover-bg-color: rgba(255, 255, 255, 0.08);
    --fc-non-business-color: rgba(0, 0, 0, 0.15);
    --fc-now-indicator-color: #e74c3c;
    color: var(--xw-primary-font, #ffffff);
}

/* Column headers and day numbers */
.fc .fc-col-header-cell-cushion,
.fc .fc-daygrid-day-number,
.fc .fc-timegrid-slot-label-cushion,
.fc .fc-timegrid-axis-cushion {
    color: var(--xw-primary-font, #ffffff);
}

.fc .fc-col-header-cell-cushion {
    font-weight: 600;
    font-size: 0.85rem;
    text-transform: uppercase;
    letter-spacing: 0.03em;
    opacity: 0.8;
}

.fc .fc-daygrid-day-number {
    opacity: 0.6;
    padding: 4px 8px;
}

.fc .fc-day-today .fc-daygrid-day-number {
    opacity: 1;
    font-weight: 700;
}

/* Toolbar buttons — match old calendar's solid button style */
.fc .fc-button {
    background-color: var(--xw-nav-bg, #0f3460);
    border-color: var(--xw-nav-bg, #0f3460);
    color: var(--xw-nav-font, #ffffff);
    font-size: 0.85rem;
    font-weight: 500;
    text-transform: capitalize;
}

.fc .fc-button:hover,
.fc .fc-button:not(:disabled):hover {
    background-color: var(--xw-nav-bg, #0f3460);
    border-color: var(--xw-nav-bg, #0f3460);
    color: var(--xw-nav-font, #ffffff);
    filter: brightness(1.2);
}

.fc .fc-button-active,
.fc .fc-button:active,
.fc .fc-button:not(:disabled).fc-button-active,
.fc .fc-button:not(:disabled):active {
    background-color: var(--xw-nav-bg, #0f3460) !important;
    border-color: var(--xw-nav-bg, #0f3460) !important;
    color: var(--xw-nav-font, #ffffff) !important;
    filter: brightness(1.35);
}

.fc .fc-button:disabled {
    background-color: var(--xw-nav-bg, #0f3460);
    border-color: var(--xw-nav-bg, #0f3460);
    opacity: 0.5;
}

.fc .fc-button-group {
    margin-bottom: 0;
}

/* Events — cursor and interaction */
.fc .fc-event {
    cursor: pointer;
    border-radius: 3px;
}

.fc .fc-event:hover {
    filter: brightness(1.15);
}

.fc .fc-event-main-frame {
    flex-direction: column;
}

/* List view */
.fc .fc-list {
    border-color: rgba(255, 255, 255, 0.1);
}

.fc .fc-list-day-cushion {
    background-color: var(--xw-secondary-bg, #16213e);
    color: var(--xw-primary-font, #ffffff);
    font-weight: 600;
}

.fc .fc-list-event {
    cursor: pointer;
}

.fc .fc-list-event td {
    border-color: rgba(255, 255, 255, 0.05);
}

.fc .fc-list-event-title a {
    color: var(--xw-primary-font, #ffffff);
}

.fc .fc-list-event-title a:hover {
    text-decoration: none;
}

.fc .fc-list-empty-cushion {
    color: var(--xw-primary-font, #ffffff);
    opacity: 0.5;
}

/* Event status classes */
.fc .xw-event-confirmed {
    --fc-event-bg-color: #198754;
    --fc-event-border-color: #198754;
}

.fc .xw-event-scheduled {
    --fc-event-bg-color: var(--xw-nav-bg, #0f3460);
    --fc-event-border-color: var(--xw-nav-bg, #0f3460);
}

.fc .xw-event-cancelled {
    --fc-event-bg-color: #6c757d;
    --fc-event-border-color: #6c757d;
    opacity: 0.5;
    text-decoration: line-through;
}

.fc .xw-event-completed {
    --fc-event-bg-color: #6c757d;
    --fc-event-border-color: #6c757d;
    opacity: 0.6;
}

.fc .xw-event-noshow {
    --fc-event-bg-color: #dc3545;
    --fc-event-border-color: #dc3545;
    opacity: 0.6;
}

/* More link — centered and bold like the old calendar */
.fc .fc-daygrid-more-link {
    display: block;
    text-align: center;
    margin-top: 3px;
    font-weight: 500;
    color: var(--xw-primary-font, #ffffff);
    opacity: 0.7;
}

.fc .fc-daygrid-more-link:hover {
    opacity: 1;
}

/* Popover (day overflow) */
.fc .fc-popover {
    background-color: var(--xw-secondary-bg, #16213e);
    border-color: rgba(255, 255, 255, 0.15);
    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
}

.fc .fc-popover-header {
    background-color: var(--xw-nav-bg, #0f3460);
    color: var(--xw-nav-font, #ffffff);
    font-weight: 600;
}

/* Links inside calendar inherit colour */
#calendar a {
    color: inherit;
    text-decoration: inherit;
}

/* Responsive toolbar */
@media (max-width: 767.98px) {
    .fc .fc-toolbar {
        flex-direction: column;
        gap: 0.5rem;
    }

    .fc .fc-toolbar-chunk {
        display: flex;
        justify-content: center;
    }

    .fc .fc-button {
        font-size: 0.75rem;
        padding: 0.25rem 0.5rem;
    }

    .xw-calendar-title {
        font-size: 0.95rem;
    }
}

/* =========================================================================
   Guided "Create Your Stay" booking wizard (#2954)
   ========================================================================= */

.xw-price {
    color: var(--xw-secondary-font, #e0e0e0);
    font-weight: 700;
}

.xw-wizard-eyebrow {
    text-transform: uppercase;
    letter-spacing: 0.18em;
    font-size: 0.8rem;
    font-weight: 600;
    opacity: 0.7;
    margin-bottom: 0.5rem;
}

/* Stepper */
.xw-wizard-stepper {
    gap: 0.5rem;
}

.xw-wizard-step {
    position: relative;
}

.xw-wizard-step-marker {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 2.25rem;
    height: 2.25rem;
    border-radius: 50%;
    border: 2px solid rgba(255, 255, 255, 0.25);
    font-weight: 600;
    margin-bottom: 0.4rem;
}

.xw-wizard-step-label {
    display: block;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    font-size: 0.72rem;
    opacity: 0.7;
}

.xw-wizard-step.is-current .xw-wizard-step-marker,
.xw-wizard-step.is-complete .xw-wizard-step-marker {
    background-color: var(--xw-nav-bg, #0f3460);
    border-color: var(--xw-nav-bg, #0f3460);
    color: var(--xw-nav-font, #ffffff);
}

.xw-wizard-step.is-current .xw-wizard-step-label {
    opacity: 1;
    font-weight: 700;
}

/* Completed steps link back to that step */
.xw-wizard-step-link {
    display: block;
    text-decoration: none;
    color: inherit;
    cursor: pointer;
}

.xw-wizard-step.is-clickable .xw-wizard-step-link:hover .xw-wizard-step-label,
.xw-wizard-step.is-clickable .xw-wizard-step-link:focus-visible .xw-wizard-step-label {
    opacity: 1;
    text-decoration: underline;
}

.xw-wizard-step.is-clickable .xw-wizard-step-link:hover .xw-wizard-step-marker,
.xw-wizard-step.is-clickable .xw-wizard-step-link:focus-visible .xw-wizard-step-marker {
    box-shadow: 0 0 0 2px var(--xw-nav-font, #ffffff);
}

/* Selection rail */
.xw-wizard-rail {
    position: sticky;
    top: 1rem;
}

.xw-wizard-rail-group {
    margin-bottom: 1rem;
}

.xw-wizard-rail-group-title {
    text-transform: uppercase;
    letter-spacing: 0.08em;
    font-size: 0.72rem;
    font-weight: 600;
    opacity: 0.6;
    margin-bottom: 0.4rem;
}

.xw-wizard-rail-line {
    padding: 0.35rem 0;
    border-bottom: 1px solid rgba(255, 255, 255, 0.06);
}

.xw-wizard-rail-line:last-child {
    border-bottom: none;
}

.xw-wizard-rail-title {
    color: var(--xw-secondary-font, #e0e0e0);
}

.xw-wizard-rail-detail {
    margin-top: 0.1rem;
}

.xw-wizard-rail-remove {
    color: var(--xw-secondary-font, #e0e0e0);
    opacity: 0.6;
    vertical-align: baseline;
}

.xw-wizard-rail-remove:hover {
    opacity: 1;
    color: #e74c3c;
}

.xw-wizard-rail-price {
    color: var(--xw-secondary-font, #e0e0e0);
}

/* Scheduling panel */
.xw-wizard-scheduler-day {
    padding: 0.5rem 0;
    border-top: 1px solid rgba(255, 255, 255, 0.06);
}

.xw-wizard-scheduler-day:first-of-type {
    border-top: none;
}

.xw-wizard-scheduler-day-title {
    font-weight: 600;
    font-size: 0.85rem;
    opacity: 0.85;
    margin-bottom: 0.4rem;
}

/* Highlighted available time / session chips */
.xw-wizard-slot {
    border: 1px solid var(--xw-nav-bg, #0f3460);
    background-color: rgba(255, 255, 255, 0.04);
    color: var(--xw-secondary-font, #e0e0e0);
}

.xw-wizard-slot:hover:not(:disabled) {
    background-color: var(--xw-nav-bg, #0f3460);
    color: var(--xw-nav-font, #ffffff);
}

.xw-wizard-slot:disabled {
    opacity: 0.45;
    border-style: dashed;
}

/* Selected room highlight */
.xw-wizard-selected {
    border-color: var(--xw-nav-bg, #0f3460);
    box-shadow: 0 0 0 2px var(--xw-nav-bg, #0f3460);
}

/* Per-guest assignment badge (#2957 follow-on) */
.xw-wizard-guest-badge {
    display: inline-block;
    margin-left: 0.4rem;
    padding: 0.05rem 0.5rem;
    border-radius: 1rem;
    font-size: 0.72rem;
    line-height: 1.4;
    background-color: var(--xw-nav-bg, #0f3460);
    color: var(--xw-nav-font, #ffffff);
    white-space: nowrap;
    vertical-align: middle;
}

/* =========================================================================
   Drag-and-drop itinerary board (#2957 follow-on)
   ========================================================================= */

.xw-board-ribbon {
    background-color: var(--xw-nav-bg, #0f3460);
    border-radius: 0.4rem;
    padding: 0.5rem 0.85rem;
    margin-bottom: 0.75rem;
    color: var(--xw-nav-font, #ffffff);
}

.xw-board-scroll {
    overflow-x: auto;
    overflow-y: hidden;
    scroll-behavior: smooth;
    -webkit-overflow-scrolling: touch;
    padding-bottom: 0.5rem;
}

.xw-board {
    display: flex;
    align-items: flex-start;
    gap: 0;
    min-width: min-content;
}

.xw-board-col { flex: 0 0 auto; }

.xw-board-axis { width: 58px; position: sticky; left: 0; z-index: 3; background-color: var(--xw-secondary-bg, #16213e); }
.xw-board-axis-canvas { position: relative; }
.xw-board-axis-label {
    position: absolute;
    right: 8px;
    transform: translateY(-0.6em);
    font-size: 0.7rem;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    opacity: 0.55;
}

.xw-board-day { width: 210px; border-left: 1px solid rgba(255, 255, 255, 0.08); }

.xw-board-head {
    height: 44px;
    display: flex;
    align-items: center;
    gap: 0.4rem;
    padding: 0 0.6rem;
    font-weight: 600;
    font-size: 0.85rem;
    position: sticky;
    top: 0;
    background-color: var(--xw-secondary-bg, #16213e);
    border-bottom: 1px solid rgba(255, 255, 255, 0.1);
    z-index: 2;
    white-space: nowrap;
}

.xw-board-pill {
    font-size: 0.62rem;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    padding: 0.05rem 0.4rem;
    border-radius: 1rem;
    background-color: var(--xw-nav-bg, #0f3460);
    color: var(--xw-nav-font, #ffffff);
    opacity: 0.85;
}

.xw-board-canvas { position: relative; background-color: rgba(0, 0, 0, 0.12); }

.xw-board-line {
    position: absolute;
    left: 0;
    right: 0;
    border-top: 1px solid rgba(255, 255, 255, 0.05);
    pointer-events: none;
}

/* Appointment cards */
.xw-board-card {
    position: absolute;
    left: 4px;
    right: 4px;
    box-sizing: border-box;
    padding: 0.2rem 0.4rem;
    border-radius: 0.35rem;
    background-color: rgba(255, 255, 255, 0.08);
    border: 1px solid rgba(255, 255, 255, 0.28);
    border-left: 3px solid var(--xw-g, var(--xw-nav-bg, #0f3460));
    overflow: hidden;
    font-size: 0.72rem;
    transition: transform 0.12s ease, box-shadow 0.12s ease;
    z-index: 1;
}

.xw-board-card.is-draggable {
    cursor: grab;
    touch-action: none;
}

.xw-board-card.is-lifted {
    cursor: grabbing;
    transform: scale(1.03);
    box-shadow: 0 10px 24px rgba(0, 0, 0, 0.45);
    opacity: 0.95;
    z-index: 5;
}

.xw-board-card.is-saving { opacity: 0.6; }

.xw-board-card.is-fixed {
    border-left-style: dashed;
    border-left-color: rgba(255, 255, 255, 0.35);
    background-color: rgba(255, 255, 255, 0.03);
}

.xw-board-card-title {
    font-weight: 600;
    color: var(--xw-secondary-font, #e0e0e0);
    line-height: 1.15;
    padding-right: 14px;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.xw-board-lock { position: absolute; top: 0.35rem; right: 0.4rem; font-size: 0.65rem; opacity: 0.5; }
.xw-board-change {
    position: absolute;
    top: 0.3rem;
    right: 0.35rem;
    font-size: 0.7rem;
    color: var(--xw-secondary-font, #e0e0e0);
    opacity: 0.55;
}
.xw-board-change:hover { opacity: 1; color: var(--xw-nav-font, #ffffff); }

/* Per-guest accent — an inheritable custom property used by cards, lanes and the legend */
.xw-guest-1 { --xw-g: #4ea1d3; }
.xw-guest-2 { --xw-g: #c98bdb; }
.xw-guest-3 { --xw-g: #7bc47f; }
.xw-guest-4 { --xw-g: #e0a458; }
.xw-guest-5 { --xw-g: #e07a7a; }
.xw-guest-6 { --xw-g: #5bc8c2; }

/* Per-guest lanes within each day + the legend */
.xw-board-lines { position: absolute; inset: 0; z-index: 0; pointer-events: none; }
.xw-board-lanes { position: absolute; inset: 0; display: flex; z-index: 1; }
.xw-board-lane {
    position: relative;
    flex: 1 1 0;
    min-width: 0;
    border-left: 1px solid rgba(255, 255, 255, 0.05);
    border-top: 2px solid var(--xw-g, transparent);
}
.xw-board-lane:first-child { border-left: none; }

.xw-board-legend { display: flex; flex-wrap: wrap; align-items: center; gap: 0.85rem; margin-bottom: 0.6rem; }
.xw-board-legend-item { display: inline-flex; align-items: center; gap: 0.35rem; font-size: 0.8rem; }
.xw-board-legend-dot { width: 0.7rem; height: 0.7rem; border-radius: 50%; background: var(--xw-g, #888); }

/* Landing pads — the valid times that light up on pickup */
.xw-board--dragging .xw-board-card:not(.is-lifted) { opacity: 0.4; }

.xw-slot-pad {
    position: absolute;
    left: 4px;
    right: 4px;
    border-radius: 0.4rem;
    border: 1px dashed var(--xw-nav-font, #ffffff);
    background-color: rgba(120, 200, 220, 0.12);
    box-shadow: 0 0 0 2px var(--xw-nav-bg, #0f3460);
    display: flex;
    align-items: flex-start;
    justify-content: flex-end;
    padding: 2px 5px;
    z-index: 4;
    animation: xw-pad-pulse 1.5s ease-in-out infinite;
}

.xw-slot-pad-time {
    font-size: 0.62rem;
    opacity: 0.8;
    text-transform: uppercase;
    letter-spacing: 0.03em;
}

.xw-slot-pad.is-target {
    background-color: rgba(120, 200, 220, 0.3);
    box-shadow: 0 0 0 3px var(--xw-nav-font, #ffffff), 0 6px 18px rgba(0, 0, 0, 0.4);
    animation: none;
}

@keyframes xw-pad-pulse {
    0%, 100% { box-shadow: 0 0 0 2px var(--xw-nav-bg, #0f3460); }
    50% { box-shadow: 0 0 0 3px var(--xw-nav-font, #ffffff); }
}

@media (prefers-reduced-motion: reduce) {
    .xw-slot-pad { animation: none; }
    .xw-board-card { transition: none; }
}

/* ==========================================================================
   Page-builder content blocks (#3681)
   Config-driven marketing blocks; all colours come from the theme variables.
   ========================================================================== */

/* Hero / CTA actions — one or two buttons laid out in a row, wrapping on small screens. Centred to
   match the centred hero/CTA content. */
.xw-hero-actions {
    display: flex;
    flex-wrap: wrap;
    gap: 0.75rem;
    align-items: center;
    justify-content: center;
}

/* Hero / CTA buttons sit on a photo or the accent band, never a plain surface, so they need an
   explicit high-contrast treatment rather than the theme's default button. Both derive their label
   from a *guaranteed* colour pair (nav-bg + nav-font — the same pairing the nav bar proves legible),
   never a self-inverted one, so the label can't wash out (the old .xw-hero-btn used --xw-nav-font as
   its own background, which rendered white-on-white when the accent font was light). The primary is a
   solid accent button; the secondary an outline that tracks the heading colour, so it reads wherever
   the hero heading reads. The nav-font border delineates the primary even on the accent band, where
   its accent fill matches the band. */
.xw-hero-btn {
    background-color: var(--xw-nav-bg, #0f3460);
    color: var(--xw-nav-font, #ffffff);
    border: 2px solid var(--xw-nav-font, #ffffff);
    font-weight: 600;
}

.xw-hero-btn:hover,
.xw-hero-btn:focus-visible {
    background-color: var(--xw-nav-font, #ffffff);
    color: var(--xw-nav-bg, #0f3460);
    border-color: var(--xw-nav-font, #ffffff);
}

.xw-hero-btn-outline {
    background-color: transparent;
    color: var(--xw-nav-font, #ffffff);
    border: 2px solid var(--xw-nav-font, #ffffff);
    font-weight: 600;
}

.xw-hero-btn-outline:hover,
.xw-hero-btn-outline:focus-visible {
    background-color: var(--xw-nav-font, #ffffff);
    color: var(--xw-nav-bg, #0f3460);
    border-color: var(--xw-nav-font, #ffffff);
}

/* Rich text */
.xw-richtext-body {
    color: var(--xw-primary-font, #ffffff);
    opacity: 0.9;
    line-height: 1.7;
}

.xw-richtext-body a {
    color: var(--xw-nav-font, #ffffff);
    text-decoration: underline;
}

/* Alignment authored in the page builder's rich-text editor. The editor works in inline text-align,
   which the write-side sanitiser strips; it is converted to these classes on save so the choice
   survives and stays the theme's to style (#4174). Not scoped to .xw-richtext-body — any block's
   rich-text field can carry them.
   xh- rather than this file's usual xw-: the conversion is app-neutral and the same classes are
   expected to be styled by any app that renders sanitised rich text, not just XenWeb. */
.xh-align-left {
    text-align: left;
}

.xh-align-center {
    text-align: center;
}

.xh-align-right {
    text-align: right;
}

.xh-align-justify {
    text-align: justify;
}

/* Curated content styles for the page builder's rich text (#4175) — the small themed vocabulary that
   makes prose read as designed, in place of opening up CSS. Each is an allow-listed tag the theme owns,
   so a rebrand carries the styling with it.

   .xw-callout is a class, so like the alignment classes above it is unscoped and works wherever it
   lands. The other two are bare element selectors and MUST stay scoped to .xw-richtext-body: unscoped,
   `hr` would restyle every `<hr class="my-4">` in the site and `blockquote` would hit the testimonial
   quotes. The Rich Text block is currently the only block with a rich-text field — a second one has to
   be added to these two selectors, or its prose silently loses both styles. */
/* The accent uses currentColor, not a brand token, and that is deliberate: no single token survives
   both themes. --xw-nav-font is white, which vanishes on a light Look's callout surface; --xw-nav-bg
   is the dark brand colour, which vanishes on the default dark one. currentColor is whatever the
   theme already paired with this surface, so it contrasts by construction — the same reasoning as
   .xw-divider below. */
.xw-callout {
    background-color: var(--xw-secondary-bg, #16213e);
    color: var(--xw-primary-font, #ffffff);
    border-left: 3px solid currentColor;
    border-radius: var(--xw-radius, 0.5rem);
    padding: 1rem 1.25rem;
    margin: 1.5rem 0;
}

/* The editor inserts a paragraph inside the callout, whose own bottom margin would otherwise show as
   uneven padding. */
.xw-callout > :last-child {
    margin-bottom: 0;
}

/* Pull quote. There is deliberately no dedicated tool or class: the Format dropdown already emits a
   plain <blockquote>, and on a marketing page a quote and a pull quote are the same device. */
.xw-richtext-body blockquote {
    border-left: 3px solid currentColor;
    margin: 1.75rem 0;
    padding: 0.25rem 0 0.25rem 1.25rem;
    font-size: 1.25rem;
    line-height: 1.5;
    font-style: italic;
}

/* Divider. Deliberately matches the Spacer block's line (.xw-divider) so the two read as one device —
   the difference is prose spacing rather than block spacing. */
.xw-richtext-body hr {
    width: 100%;
    border: none;
    border-top: 1px solid currentColor;
    opacity: 0.2;
    margin: 2rem 0;
}

/* Testimonials */
.xw-testimonial {
    background-color: var(--xw-secondary-bg, #16213e);
    border: 1px solid rgba(255, 255, 255, 0.1);
    border-radius: 0.5rem;
    padding: 1.5rem;
    margin: 0;
}

.xw-testimonial-icon {
    color: var(--xw-nav-bg, #0f3460);
    font-size: 1.5rem;
    opacity: 0.6;
    margin-bottom: 0.5rem;
}

.xw-testimonial-quote {
    color: var(--xw-secondary-font, #e0e0e0);
    font-style: italic;
    line-height: 1.6;
    margin-bottom: 1rem;
}

.xw-testimonial-author-name {
    display: block;
    color: var(--xw-secondary-font, #e0e0e0);
    font-weight: 600;
}

.xw-testimonial-author-detail {
    display: block;
    color: var(--xw-secondary-font, #e0e0e0);
    opacity: 0.7;
    font-size: 0.9rem;
}

/* Gallery */
.xw-gallery-img {
    width: 100%;
    aspect-ratio: 4 / 3;
    object-fit: cover;
    border-radius: 0.5rem;
    border: 1px solid rgba(255, 255, 255, 0.1);
}

.xw-gallery-caption {
    color: var(--xw-primary-font, #ffffff);
    opacity: 0.7;
    font-size: 0.85rem;
    margin-top: 0.35rem;
    text-align: center;
}

/* Text + image */
.xw-text-image-img {
    width: 100%;
    height: auto;
    border-radius: 0.5rem;
    border: 1px solid rgba(255, 255, 255, 0.1);
}

.xw-text-image-body {
    color: var(--xw-primary-font, #ffffff);
    opacity: 0.9;
    line-height: 1.7;
}

/* FAQ — theme Bootstrap's accordion via its CSS variables */
.xw-faq-accordion {
    --bs-accordion-bg: var(--xw-secondary-bg, #16213e);
    --bs-accordion-color: var(--xw-secondary-font, #e0e0e0);
    --bs-accordion-border-color: rgba(255, 255, 255, 0.1);
    --bs-accordion-btn-color: var(--xw-secondary-font, #e0e0e0);
    --bs-accordion-btn-bg: var(--xw-secondary-bg, #16213e);
    --bs-accordion-active-color: var(--xw-nav-font, #ffffff);
    --bs-accordion-active-bg: var(--xw-nav-bg, #0f3460);
    --bs-accordion-btn-focus-border-color: rgba(255, 255, 255, 0.2);
    --bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(255, 255, 255, 0.1);
    --bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23e0e0e0'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");
    --bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23ffffff'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");
}

.xw-faq-question {
    font-weight: 600;
}

/* Hours / location */
.xw-hours-location-address {
    color: var(--xw-primary-font, #ffffff);
    opacity: 0.9;
}

.xw-hours-location-link {
    color: var(--xw-primary-font, #ffffff);
    text-decoration: none;
}

.xw-hours-location-link:hover {
    color: var(--xw-primary-font, #ffffff);
    text-decoration: underline;
}

.xw-hours-table th,
.xw-hours-table td {
    border-bottom-color: rgba(255, 255, 255, 0.05);
}

.xw-hours-day {
    font-weight: 600;
    color: var(--xw-primary-font, #ffffff);
}

.xw-hours-value {
    text-align: right;
    color: var(--xw-primary-font, #ffffff);
    opacity: 0.85;
}

.xw-hours-location-map {
    border-radius: 0.5rem;
    overflow: hidden;
    border: 1px solid rgba(255, 255, 255, 0.1);
}

/* Call to action */
.xw-cta {
    background-color: var(--xw-nav-bg, #0f3460);
    padding: 3rem 0;
}

.xw-cta-heading {
    color: var(--xw-nav-font, #ffffff);
    font-weight: 700;
    margin-bottom: 0.5rem;
}

.xw-cta-subheading {
    color: var(--xw-nav-font, #ffffff);
    opacity: 0.85;
    margin-bottom: 0;
}

/* ==========================================================================
   Layout / marketing primitives (#3748, Layer C)
   Self-contained blocks; every colour comes from the theme variables and every
   size/variant from a validated token, so nothing here is untrusted input.
   ========================================================================== */

/* Spacer / Divider — vertical whitespace (a spacing-scale token) with an optional rule. */
.xw-spacer {
    display: flex;
    flex-direction: column;
    justify-content: center;
}

.xw-spacer-sm { min-height: 1rem; }
.xw-spacer-md { min-height: 2rem; }
.xw-spacer-lg { min-height: 4rem; }
.xw-spacer-xl { min-height: 6rem; }

.xw-divider {
    width: 100%;
    border: none;
    border-top: 1px solid currentColor;
    margin: 0;
    opacity: 0.2;
}

.xw-divider-dashed { border-top-style: dashed; }
.xw-divider-dots { border-top-style: dotted; border-top-width: 2px; }

/* Feature Grid — an N-up grid of icon + title + text features. */
.xw-feature-grid-subheading {
    color: var(--xw-primary-font, #ffffff);
    opacity: 0.75;
}

.xw-feature {
    padding: 1.5rem 1rem;
}

.xw-feature-icon {
    color: var(--xw-nav-bg, #0f3460);
    font-size: 2.25rem;
    margin-bottom: 0.85rem;
}

.xw-feature-title {
    color: var(--xw-primary-font, #ffffff);
    font-weight: 600;
    font-size: 1.15rem;
    margin-bottom: 0.5rem;
}

.xw-feature-text {
    color: var(--xw-primary-font, #ffffff);
    opacity: 0.8;
    line-height: 1.6;
    margin-bottom: 0;
}

/* Marketing Cards (#3766) — a config-authored N-up card grid: image, badge, tag pills, title, text,
   price and a button. Reuses the shared .xw-card surface (theme-correct background/border/radius/shadow
   + hover lift) and adds the marketing-specific media, badge, tags, price and link treatments. */
.xw-cards-subheading {
    color: var(--xw-primary-font, #ffffff);
    opacity: 0.75;
}

.xw-marketing-card {
    /* Clip the image to the card's rounded top corners. */
    overflow: hidden;
}

.xw-marketing-card-media {
    position: relative;
    aspect-ratio: 3 / 2;
    overflow: hidden;
}

.xw-marketing-card-img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
}

/* Corner badge on the image (e.g. "5–7 nights") — the accent band, always legible against its font pair. */
.xw-marketing-card-badge {
    position: absolute;
    top: 0.75rem;
    left: 0.75rem;
    background-color: var(--xw-nav-bg, #0f3460);
    color: var(--xw-nav-font, #ffffff);
    font-size: 0.7rem;
    font-weight: 600;
    letter-spacing: 0.1em;
    text-transform: uppercase;
    padding: 0.25rem 0.6rem;
    border-radius: 0.25rem;
}

/* When a card has no image, the badge sits inline at the top of the body instead of over a photo. */
.xw-marketing-card-badge-inline {
    position: static;
    align-self: flex-start;
    margin-bottom: 0.75rem;
}

.xw-marketing-card-body {
    padding: 1.25rem;
    flex: 1 1 auto;
}

/* Tag pills (e.g. Detox · Weight loss · Energy) — small, subtle, uppercase. */
.xw-card-tags {
    display: flex;
    flex-wrap: wrap;
    gap: 0.4rem;
    margin-bottom: 0.6rem;
}

.xw-card-tag {
    font-size: 0.68rem;
    font-weight: 600;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--xw-nav-bg, #0f3460);
    border: 1px solid var(--xw-nav-bg, #0f3460);
    border-radius: 1rem;
    padding: 0.1rem 0.55rem;
    opacity: 0.85;
}

.xw-marketing-card-title {
    font-size: 1.15rem;
    margin-bottom: 0.5rem;
}

.xw-marketing-card-text {
    line-height: 1.6;
    margin-bottom: 0.75rem;
}

.xw-marketing-card-price {
    color: var(--xw-nav-bg, #0f3460);
    font-weight: 700;
    margin-bottom: 0.75rem;
}

/* "Explore" style link — an accent text link with a trailing arrow that nudges on hover. */
.xw-marketing-card-link {
    color: var(--xw-nav-bg, #0f3460);
    font-weight: 600;
    text-decoration: none;
    align-self: flex-start;
}

.xw-marketing-card-link .fa-solid {
    margin-left: 0.35rem;
    transition: transform 0.2s;
}

.xw-marketing-card-link:hover .fa-solid,
.xw-marketing-card-link:focus-visible .fa-solid {
    transform: translateX(0.2rem);
}

/* Stats Band — big number + label, laid out as equal-width columns. A stats band is designed to sit
   on a coloured section background (its primary use), so its text inherits the section wrapper's
   contrast colour rather than a theme-fixed one — readable on a light page or a dark accent band alike.
   The heading override keeps the shared rule's layout but drops its fixed colour/accent underline. */
.xw-stats .xw-section-heading {
    color: inherit;
    border-bottom-color: currentColor;
}

.xw-stat-value {
    color: inherit;
    font-weight: 700;
    font-size: 2.5rem;
    line-height: 1.1;
}

.xw-stat-label {
    color: inherit;
    opacity: 0.75;
    font-size: 0.95rem;
    margin-top: 0.25rem;
}

/* Logo Strip — a centred, wrapping row of partner logos. */
.xw-logo-strip-heading {
    color: var(--xw-primary-font, #ffffff);
    opacity: 0.7;
    font-size: 1rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.05em;
}

.xw-logo-strip-items {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: center;
    gap: 2.5rem;
}

.xw-logo-strip-img {
    /* Fixed slot reserves space so the strip doesn't reflow as logos load;
       scale-down (not contain) avoids upscaling small logos. */
    display: block;
    width: 160px;
    height: 60px;
    object-fit: scale-down;
    opacity: 0.85;
    transition: opacity 0.2s;
}

.xw-logo-strip-link:hover .xw-logo-strip-img,
.xw-logo-strip-img:hover {
    opacity: 1;
}

/* Banner — a slim, bordered announcement strip. No fill of its own, so a section
   background from the style envelope shows through as the banner's accent. */
.xw-banner {
    padding: 0.85rem 0;
    border-top: 1px solid rgba(255, 255, 255, 0.12);
    border-bottom: 1px solid rgba(255, 255, 255, 0.12);
}

.xw-banner-inner {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: center;
    gap: 0.75rem 1.25rem;
}

.xw-banner-message {
    display: inline-flex;
    align-items: center;
    gap: 0.6rem;
}

/* Banner text/icon inherit the section wrapper's colour so they contrast on whatever background the
   style envelope provides (a banner has no fill of its own — the band colour is the accent). */
.xw-banner-icon {
    color: inherit;
    opacity: 0.85;
}

.xw-banner-text {
    color: inherit;
    font-weight: 500;
}

.xw-banner-btn {
    flex-shrink: 0;
}

/* ============================================================
   Per-section style envelope (#3746)
   ------------------------------------------------------------
   A shared wrapper (.xw-section) sits around every page-builder
   block. It is INERT by default — extra classes are added only
   for explicit operator choices, so existing pages are unchanged.
   Every value is a token, never raw CSS; the only inline style is
   a re-validated hex background colour. Backgrounds are full-bleed
   bands; the block's own inner .container keeps content aligned.
   ============================================================ */
.xw-section {
    /* Inert wrapper — a hook for the per-section style envelope. */
}

/* Backgrounds — full-bleed bands using the site theme tokens. */
.xw-sec-bg-primary {
    background-color: var(--xw-primary-bg, #1a1a2e);
    color: var(--xw-primary-font, #ffffff);
}

.xw-sec-bg-secondary {
    background-color: var(--xw-secondary-bg, #16213e);
    color: var(--xw-secondary-font, #e0e0e0);
}

.xw-sec-bg-nav {
    background-color: var(--xw-nav-bg, #0f3460);
    color: var(--xw-nav-font, #ffffff);
}

.xw-sec-bg-muted {
    background-color: #f5f5f7;
    color: #1a1a1a;
}

/* Text-colour overrides (e.g. over a custom background). */
.xw-sec-text-light,
.xw-sec-text-light :is(h1, h2, h3, h4, h5, h6, p, li, span, a) {
    color: #ffffff;
}

.xw-sec-text-dark,
.xw-sec-text-dark :is(h1, h2, h3, h4, h5, h6, p, li, span, a) {
    color: #1a1a1a;
}

/* Extra space above / below — a spacing scale, not raw pixels. */
.xw-sec-pt-sm { padding-top: 1rem; }
.xw-sec-pt-md { padding-top: 2rem; }
.xw-sec-pt-lg { padding-top: 4rem; }
.xw-sec-pt-xl { padding-top: 6rem; }
.xw-sec-pb-sm { padding-bottom: 1rem; }
.xw-sec-pb-md { padding-bottom: 2rem; }
.xw-sec-pb-lg { padding-bottom: 4rem; }
.xw-sec-pb-xl { padding-bottom: 6rem; }

/* Outer margins above / below — same spacing scale. Distinct from padding: this is what sets the gap
   between sections and the gap before the (margin-less) footer. */
.xw-sec-mt-sm { margin-top: 1rem; }
.xw-sec-mt-md { margin-top: 2rem; }
.xw-sec-mt-lg { margin-top: 4rem; }
.xw-sec-mt-xl { margin-top: 6rem; }
.xw-sec-mb-sm { margin-bottom: 1rem; }
.xw-sec-mb-md { margin-bottom: 2rem; }
.xw-sec-mb-lg { margin-bottom: 4rem; }
.xw-sec-mb-xl { margin-bottom: 6rem; }

/* Content width — overrides the block's inner Bootstrap .container.
   width:100% is kept by .container, so this stays responsive on small screens. */
.xw-sec-w-narrow .container { max-width: 720px; }
.xw-sec-w-wide .container { max-width: 1320px; }
.xw-sec-w-full .container { max-width: 100%; }

/* Content alignment. */
.xw-sec-align-center,
.xw-sec-align-center .container {
    text-align: center;
}

/* Section height — tall/screen give the section a minimum height and vertically centre its content.
   The section stretches its inner block (the hero/CTA/etc. root element) to fill, so a full-bleed
   photo band covers the whole height and its content is centred within it. Opt-in via the "Section
   height" appearance control — nothing here fires unless the operator sets it, so a photo band keeps
   its natural, padding-driven height by default. */
.xw-sec-h-tall,
.xw-sec-h-screen {
    display: flex;
    flex-direction: column;
}

.xw-sec-h-tall { min-height: 70vh; }
.xw-sec-h-screen { min-height: 100vh; }

.xw-sec-h-tall > *,
.xw-sec-h-screen > * {
    flex: 1 1 auto;
    display: flex;
    flex-direction: column;
    justify-content: center;
}

/* ============================================================
   Theme "Looks" — expanded typography tokens (#3747, Layer B)
   ------------------------------------------------------------
   A Look bundles a font pairing, corner radius, shadow depth and
   button style (see WebThemeLooks). Radius, shadow, the body font
   and the button variables are consumed inline above through var()
   fallbacks, so they stay inert until a Look sets them. The heading
   rules below need the .xw-has-look body marker: heading font-family
   is safe to set globally (it falls back to inherit = the body font,
   which is today's behaviour), but heading weight/scale/letter-spacing
   have no single inert fallback, so they apply only when a Look is on.
   ============================================================ */

/* Heading font pairing — inert without a Look (inherit resolves to the body font). Subheadings are
   deliberately excluded so they keep the body font, pairing against the heading face. */
h1, h2, h3, h4, h5, h6,
.xw-heading, .xw-section-heading, .xw-hero-heading,
.xw-card-title, .xw-category-banner-title {
    font-family: var(--xw-heading-font, inherit);
}

/* Heading weight and tracking — scoped to an active Look. */
.xw-has-look h1, .xw-has-look h2, .xw-has-look h3,
.xw-has-look .xw-heading, .xw-has-look .xw-section-heading,
.xw-has-look .xw-hero-heading, .xw-has-look .xw-card-title {
    font-weight: var(--xw-heading-weight, 600);
    letter-spacing: var(--xw-heading-spacing, normal);
}

/* Type scale — multiplies the heading sizes so a Look can run its headings larger. Restates the
   Bootstrap defaults (scoped to a Look) so the size hierarchy is preserved; scale 1 is a no-op. */
.xw-has-look h1 { font-size: calc(2.5rem * var(--xw-heading-scale, 1)); }
.xw-has-look h2 { font-size: calc(2rem * var(--xw-heading-scale, 1)); }
.xw-has-look h3 { font-size: calc(1.75rem * var(--xw-heading-scale, 1)); }
.xw-has-look .xw-hero-heading { font-size: calc(2.25rem * var(--xw-heading-scale, 1)); }

/* ==========================================================================
   Interactive blocks (#3749, Layer E)
   Carousel + Testimonials slider (Glide), Gallery lightbox (GLightbox) and the
   per-section scroll-reveal. All colours come from the theme tokens; every
   effect is progressive enhancement — nothing here is required to see content.
   ========================================================================== */

/* Gallery — the image is wrapped in a lightbox link; keep it a block and hint interactivity. */
.xw-gallery-link {
    display: block;
    cursor: pointer;
    text-decoration: none;
}

.xw-gallery-link:hover .xw-gallery-img {
    opacity: 0.9;
}

/* Carousel (Glide). */
.xw-carousel-glide {
    position: relative;
}

.xw-carousel-slide {
    position: relative;
}

.xw-carousel-img {
    width: 100%;
    aspect-ratio: 16 / 9;
    object-fit: cover;
    display: block;
    border-radius: var(--xw-card-radius, 0.5rem);
}

.xw-carousel-caption {
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    padding: 1rem 1.25rem;
    color: #ffffff;
    font-weight: 500;
    background: linear-gradient(to top, rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0));
    border-radius: 0 0 var(--xw-card-radius, 0.5rem) var(--xw-card-radius, 0.5rem);
}

/* Testimonials slider — equal-height cards inside the Glide track. */
.xw-testimonials-glide .glide__slides {
    align-items: stretch;
}

.xw-testimonials-glide .glide__slide {
    height: auto;
    display: flex;
}

.xw-testimonials-glide .glide__slide > .xw-testimonial {
    width: 100%;
}

/* Glide controls — themed to the site palette (overrides the vendored theme's defaults). */
.xw-glide .glide__arrow {
    background: var(--xw-nav-bg, #0f3460);
    color: var(--xw-nav-font, #ffffff);
    border: none;
    border-radius: 50%;
    box-shadow: none;
    text-shadow: none;
    width: 2.75rem;
    height: 2.75rem;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    opacity: 0.9;
}

.xw-glide .glide__arrow:hover {
    border: none;
    opacity: 1;
}

.xw-carousel-bullets {
    position: static;
    transform: none;
    margin-top: 1rem;
    display: flex;
    justify-content: center;
    gap: 0.5rem;
}

.xw-glide .glide__bullet {
    background: var(--xw-primary-font, #333333);
    box-shadow: none;
    opacity: 0.3;
}

.xw-glide .glide__bullet:hover,
.xw-glide .glide__bullet:focus,
.xw-glide .glide__bullet--active {
    background: var(--xw-primary-font, #333333);
    border: none;
    opacity: 0.85;
}

/* Scroll-reveal (per-section "Animate in"). The hidden start-state applies ONLY once the client
   script adds `xw-reveal-ready` AND the visitor hasn't asked for reduced motion — so a page with
   JavaScript off (or reduced motion on) shows every section immediately, never blank. */
@media (prefers-reduced-motion: no-preference) {
    .xw-reveal-ready .xw-reveal {
        opacity: 0;
        transition: opacity 0.6s ease, transform 0.6s ease;
        will-change: opacity, transform;
    }

    .xw-reveal-ready .xw-reveal-fade-up {
        transform: translateY(2rem);
    }

    .xw-reveal-ready .xw-reveal-zoom {
        transform: scale(0.94);
    }

    .xw-reveal-ready .xw-reveal.xw-revealed {
        opacity: 1;
        transform: none;
    }
}

/* ------------------------------------------------------------------
   Layout container — Columns (#3751)
   A block that nests other blocks into side-by-side columns. Each nested block renders its own
   <section class="xw-block"><div class="container">…, which inside a Bootstrap column must fill the
   column rather than behave like a page-width, centred container — so neutralise the inner container's
   fixed width and horizontal gutters. Only containers *inside the row* are affected; the columns
   block's own outer container is untouched.
   ------------------------------------------------------------------ */
.xw-columns > .container > .row > [class*="col"] {
    display: flex;
    flex-direction: column;
}

.xw-columns > .container > .row .container {
    width: 100%;
    max-width: 100%;
    padding-left: 0;
    padding-right: 0;
}

/* Trim the nested blocks' vertical rhythm so a column reads as one tidy stack, not a series of
   full-page sections with heavy padding. */
.xw-columns > .container > .row .xw-block > .container {
    padding-top: 0.75rem;
    padding-bottom: 0.75rem;
}

/* ------------------------------------------------------------------
   Stock-image attribution (#3838)
   An in-context credit caption overlaid on the corner of a stock image whose supplier licence requires
   one (e.g. Unsplash), plus the site-wide supplier credit in the footer (e.g. Pexels). The wrapper
   gives <img>-based blocks a positioning context; hero/CTA bands and card/carousel media are already
   positioned, so they need no wrapper.
   ------------------------------------------------------------------ */
.xw-image-credit-wrap {
    position: relative;
}

.xw-image-credit {
    position: absolute;
    right: 0.5rem;
    bottom: 0.5rem;
    z-index: 2;
    max-width: calc(100% - 1rem);
    padding: 0.15rem 0.5rem;
    border-radius: 0.35rem;
    background-color: rgba(0, 0, 0, 0.55);
    color: #ffffff;
    font-size: 0.72rem;
    line-height: 1.35;
    text-align: right;
}

.xw-image-credit-link {
    color: #ffffff;
    text-decoration: underline;
}

.xw-image-credit-link:hover,
.xw-image-credit-link:focus-visible {
    color: #ffffff;
    opacity: 0.85;
}

/* The copyright + image-credit strip. It renders on every page below whatever footer is in play — the
   built-in one or a template's Footer block — so it carries the footer's own colours to read as one
   band with it. The border replaces the divider that used to sit inside the footer, and is drawn only
   when a footer actually precedes it (a template need not have one). */
.xw-credits-strip {
    background-color: var(--xw-nav-bg, #0f3460);
    color: var(--xw-nav-font, #ffffff);
    padding: 1rem 0;
}

.xw-footer + .xw-credits-strip > .container {
    border-top: 1px solid rgba(255, 255, 255, 0.2);
    padding-top: 1rem;
}

/* Site-wide supplier credit line(s) in the footer, above the copyright. */
.xw-footer-credits {
    margin-bottom: 0.75rem;
}

.xw-footer-credit {
    display: block;
    color: var(--xw-secondary-font, #b0b0b0);
    opacity: 0.85;
}

/* A subtle, always-present link to the standalone /credits page, beside the copyright line. */
.xw-footer-credits-link {
    color: var(--xw-secondary-font, #b0b0b0);
    opacity: 0.85;
}

/* ------------------------------------------------------------------
   Standalone image-credits page (/credits) — the site-wide list of the
   stock-image suppliers and photographers the site attributes (#3838).
   ------------------------------------------------------------------ */
.xw-credits {
    max-width: 48rem;
    padding-top: 2rem;
    padding-bottom: 3rem;
}

.xw-credits-title {
    margin-bottom: 1rem;
}

.xw-credits-intro {
    margin-bottom: 2rem;
}

.xw-credits-empty {
    color: var(--xw-secondary-font, #b0b0b0);
}

.xw-credits-supplier {
    margin-bottom: 2rem;
}

.xw-credits-supplier-name {
    font-size: 1.25rem;
    margin-bottom: 0.5rem;
}

.xw-credits-photographers {
    list-style: none;
    padding-left: 0;
    margin-bottom: 0;
    display: flex;
    flex-wrap: wrap;
    gap: 0.35rem 1rem;
}

.xw-credits-photographer {
    color: var(--xw-secondary-font, #b0b0b0);
}

/* Supplier and photographer links mirror the site's body-content link style
   (var(--xw-nav-font), as .xw-richtext-body a does) so the credits page stays
   on-brand and readable on the themed background rather than falling back to the
   browser's default anchor blue. */
.xw-credits-link {
    color: var(--xw-nav-font, #ffffff);
    text-decoration: underline;
}

.xw-credits-link:hover,
.xw-credits-link:focus-visible {
    color: var(--xw-nav-font, #ffffff);
    opacity: 0.85;
}

/* ==========================================================================
   Page templates
   ========================================================================== */

/* The Page placeholder, shown only when a template is previewed on its own — composing a page
   replaces it with that page's content, so a visitor never sees this. */
.xw-page-placeholder {
    padding: 3rem 0;
    border: 2px dashed currentColor;
    border-radius: 0.5rem;
    opacity: 0.45;
}

.xw-page-placeholder-text {
    margin: 0;
    text-align: center;
    font-style: italic;
}
