/*
 Theme Name:   Nooré (Swissresort Child)
 Theme URI:    https://noorestayphuket.com
 Description:  Nooré Phuket. Swissresort child theme carrying the v3 skin — v1's approved structure in v2's rounded surface treatment.
 Author:       Jittika S.
 Template:     swissresort
 Version:      1.9.18
 Text Domain:  swissresort-child
*/

/* ==========================================================================
   Nooré v3 skin
   --------------------------------------------------------------------------
   The client approved v1 (Swissresort home-7) for STRUCTURE and v2 for TONE
   ("มนๆ น่ารัก" — soft, rounded). Both prototypes share an identical palette,
   so this file changes surface treatment only: radius, shadow, hairlines.

   Colours and fonts are NOT set here — they come from the Customizer
   (Theme Color / Typography). Duplicating them in CSS would create two
   sources of truth and break the client's ability to tweak.

   Parent context worth knowing:
     - template.css already uses 16px as its house radius (25 rules), so the
       move to v2's 18px is a nudge, not a rebuild.
     - The parent has NO card shadows — only UI chrome (dropdowns, sticky
       header). v2's soft card shadow is therefore a genuine addition.
     - The parent DOES use custom properties, heavily: inc/custom-styles.php
       prints a :root block from the Customizer values
       (--swissresort-theme-color and friends, 384 uses of that one alone).
       Reference those vars rather than hardcoding hex, so the client's
       Customizer edits keep flowing through.
     - The parent's default heading font is Cormorant Garamond — which is
       exactly what v1 used, confirming v1 was the theme at its defaults.
     - These overrides win on source order, not !important.
       See functions.php priority 200.

   Cache note: functions.php versions this file by filemtime(), so edits bust
   the browser and LiteSpeed cache automatically. Don't revert that to the
   theme header version.
   ========================================================================== */

/* Page ground.
   The pages sat on pure white, which fought the warm timber-and-plaster
   photography. Sand is the brandbook's neutral. Measured first: on these pages
   ONLY <body> paints a background - no section or container paints white over
   it - so one rule is enough and nothing needs !important.

   Deliberately NOT the brandbook's #FFF2EB "Cream": that value is already doing
   a job as the interactive fill (calendar hover, in-range nights, arrow hover).
   Using it as the page ground would make those states invisible. #F8F5F0 keeps
   them legible and reads sandier. White stays for things that must lift off the
   page: room cards, the date panel, the menu drawer. */
body {
	background-color: #F8F5F0;
}

:root {
	--noore-r: 18px;                                /* v2 --r */
	--noore-r-sm: 10px;                             /* nested elements inside a card */
	--noore-shadow: 0 14px 40px rgba(30, 30, 30, .10);  /* v2 --shadow */
	--noore-line: rgba(30, 30, 30, .10);            /* v2 --line */

	/* The site's long-arrow control, lifted verbatim from .read-icon on the
	   journal cards. Held as a mask so any element can wear it in its own
	   colour via background-color: currentColor. */
	--noore-arrow-long: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='50' height='30' viewBox='0 0 50 30' fill='none'%3E%3Cpath d='M35.8 28.5539C43.3451 28.5539 49.4616 22.4374 49.4616 14.8923C49.4616 7.34726 43.3451 1.23078 35.8 1.23078C28.255 1.23078 22.1385 7.34726 22.1385 14.8923C22.1385 22.4374 28.255 28.5539 35.8 28.5539Z' stroke='%23000'/%3E%3Cpath d='M33.4808 10.6654L32.9985 11.2646L37.2931 14.7239H0.341553V15.4931H37.28L33.0008 18.8877L33.4785 19.49L39 15.1108L33.4808 10.6654Z' fill='%23000'/%3E%3C/svg%3E");
}

/* Palette comes from the Customizer via inc/custom-styles.php. Do not restate
   hex values here — the client can edit those, and a second copy would drift.
   Available: --swissresort-theme-color (#B46841), --swissresort-second-color
   (#DDA380), --swissresort-text-color, --swissresort-heading-color,
   --swissresort-theme-hover-color (#84411E), plus the two font vars. */

/* --------------------------------------------------------------------------
   1. Room / tour cards
   The demo's home-7 uses the tour-grid family. Covering the variants means
   the skin survives if a different grid is swapped in during layout work.
   -------------------------------------------------------------------------- */

.tour-item-style,
.tour-grid-v4,
.tour-grid-v5,
.tour-grid-v6,
.tour-grid-v7,
.tour-grid-v8,
.tour-grid-v9 {
	border-radius: var(--noore-r);
	box-shadow: var(--noore-shadow);
	overflow: hidden;
	background: #fff;
}

.tour-grid-v4 .item-image,
.tour-item-style .item-image,
.tour-item-style .tour-image {
	border-radius: var(--noore-r);
	overflow: hidden;
}

/* Image sits flush inside an already-rounded card — don't double-round. */
.tour-grid-v5 .item-image,
.tour-grid-v6 .item-image,
.tour-grid-v7 .item-image {
	border-radius: 0;
}

/* --------------------------------------------------------------------------
   2. Blog cards — "Offers & News" on home-7
   -------------------------------------------------------------------------- */

.post-layout .top-image,
.related-posts .top-image {
	border-radius: var(--noore-r);
	overflow: hidden;
}

.layout-posts-list .post {
	border-radius: var(--noore-r);
	box-shadow: var(--noore-shadow);
	background: #fff;
	overflow: hidden;
}

/* --------------------------------------------------------------------------
   3. Gallery
   The old 4-column mosaic that lived here was replaced by the horizontal
   scroller further down this file. Its rules were actively fighting the new
   layout - .elementor-widget-image-gallery .gallery-item carried
   width:100% and height:100%, which pinned every tile to one width and made
   the staggered heights resolve backwards.
   -------------------------------------------------------------------------- */

.view-more-gallery {
	border-radius: 999px;
}

/* --------------------------------------------------------------------------
   4. Facility / feature panels and banners
   -------------------------------------------------------------------------- */

.item-features-inner.style2,
.banners-item.style3,
.banners-item.style5,
.testimonials-item2,
.widget-team .team-image {
	border-radius: var(--noore-r);
}

.banners-item.style5 .inner {
	border-radius: var(--noore-r-sm);
}

.singles_item .icon {
	border-radius: var(--noore-r-sm);
}

/* --------------------------------------------------------------------------
   5. Hairlines
   v2 softens every divider to a 10% ink line rather than the parent's greys.
   -------------------------------------------------------------------------- */

.tour-item-style,
.item-features-inner.style2,
.testimonials-item2 {
	border-color: var(--noore-line);
}

/* --------------------------------------------------------------------------
   6. Actions stay pills
   v1 and v2 both use 999px for CTAs. The client called out v1's CTA
   specifically, so this must not soften into the surrounding surfaces.
   -------------------------------------------------------------------------- */

.btn,
.btn-readmore,
.elementor-button {
	border-radius: 999px;
}

/* --------------------------------------------------------------------------
   7. Glassmorphic booking bar
   The BA Book Everything search form sits over the hero image, so it can be
   frosted glass rather than a solid slab. Scoped to .babe-search-form so it
   never touches the search widget on inner pages with solid backgrounds.

   Structure (verified against the live markup, not guessed):
     form.babe-search-form > .input-group > .search-date / .input_select_wrapper
     .input_select_title       — the "CHECK IN" micro-label
     .input_select_input_value — the "Add date" value
     button.btn-search         — the GO control

   NOTE: the container carries an Elementor gradient background
   (data-settings background_background:gradient). Elementor's per-page CSS
   loads after this file, so that gradient must be cleared in the widget panel
   — Style > Background > Normal > None — or none of this is visible.
   -------------------------------------------------------------------------- */

body #search_form.babe-search-form.babe-search-form.babe-search-form {
	background-color: rgba(255, 255, 255, .14) !important;
	background-image: none !important;
	-webkit-backdrop-filter: blur(8px);
	backdrop-filter: blur(8px);
	border: 1px solid rgba(255, 255, 255, .18) !important;
	border-radius: 999px !important;
	box-shadow: 0 8px 32px rgba(30, 30, 30, .18);
	padding: 6px 6px 6px 4px !important;
	/* NO overflow:hidden here. It kept the glass pill's corners clean, but the
	   GUESTS picker and the date panels are position:absolute children of this
	   form — clipping the form made the guests dropdown impossible to open,
	   which reads as "the guests field will not accept input". Every child is
	   transparent, so the rounded corners survive without it. */
}

/* No backdrop-filter (older Firefox): fall back to a heavier tint so the
   text keeps its contrast instead of sitting on near-transparent white. */
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
	.babe-search-form {
		background: rgba(30, 30, 30, .55);
	}
}

.babe-search-form .input-group {
	align-items: center;
	gap: 0;
}

.babe-search-form .search-date,
.babe-search-form .input_select_wrapper {
	position: relative;
	padding: 10px clamp(14px, 1.6vw, 26px);
	background: transparent;
	border: 0;
}
/* Value — "Add date" */
.babe-search-form .input_select_input,
.babe-search-form .input_select_input_value,
.babe-search-form input[type="text"].booking_date {
	font-size: 14px;
	font-weight: 400;
	color: #fff;
	background: transparent;
	border: 0;
	padding: 0;
	box-shadow: none;
}
.babe-search-form input::placeholder {
	color: rgba(255, 255, 255, .75);
}

/* Guests value picks up the sand accent, as in the reference */
.babe-search-form .input_select_title_value {
	color: var(--swissresort-second-color, #DDA380);
	font-size: 14px;
}

/* GO button — GEOMETRY ONLY.
   Colour AND typography are deliberately absent so the Elementor panel keeps
   control (Style > Button). Important subtlety: dropping !important is not
   enough to hand control back — this selector is (1,3,1) and Elementor's is
   (0,4,0), so it wins on specificity regardless. The declarations have to be
   removed entirely.
   Only the circle survives: 56x56 with a 50% radius and zero padding, because
   Elementor's padding controls would otherwise stretch it into a pill. */
body #search_form .btn-search.btn-search.btn-search,
body #search_form button[name="submit"] {
	width: 56px !important;
	height: 56px !important;
	min-width: 56px !important;
	padding: 0 !important;
	border-radius: 50% !important;
	border: 0;
}
.babe-search-form .btn-search:hover,
.babe-search-form button[name="submit"]:hover {
	transform: scale(1.04);
}
.babe-search-form .btn-search:focus-visible,
.babe-search-form button[name="submit"]:focus-visible {
	outline: 2px solid #fff;
	outline-offset: 3px;
}

/* Booking bar field labels.
   The plugin renders NO label: .input_select_title belongs to the hidden
   time-picker (its parent .input_select_field is display:none), so the rule
   that used to style it was dead. Generate the label instead.

   CSS content is decorative to assistive tech — the accessible name comes
   from aria-label set in functions.php. Both are needed. */

/* Vertical alignment across the three fields.
   The dates render their value in an <input> (fixed 26px line-height); Guests
   renders a <span> that inherits a different one. Two stacks of unequal height
   means centring them puts labels and values on different baselines.

   Fix: give every label and every value the SAME fixed metrics, so all three
   stacks are identical by construction rather than by coincidence. */

body #search_form .search_date_wrapper_date_from::before,
body #search_form .search_date_wrapper_date_to::before,
body #search_form .search_guests_field::before {
	height: 13px;
	line-height: 13px;
	margin-bottom: 5px;
}

body #search_form .search-date input.search_date,
body #search_form .search_guests_title_value,
body #search_form .search_guests_field .add_ids_title {
	height: 20px;
	line-height: 20px;
	display: block;
	text-align: center;
}

/* Guests holds inline nodes; make its box behave like the date inputs. */
body #search_form .search_guests_field .add_ids_title {
	width: 100%;
}
body #search_form .search_guests_title_value {
	display: inline-block;
	vertical-align: top;
}

/* Field proportions.
   The theme sets `#search_form .input-group > div { padding-right:1.875rem;
   margin-right:1.875rem }` — 30px on the RIGHT only. Measured computed padding
   was `0px 30px 0px 0px`, which shoves every value left inside its own box and
   is why the centring looked wrong even with text-align:center.

   Sizing: a date is ~10 characters ("28/08/2026"), guests is 1-2 ("0",
   "2 adults"), so equal thirds made the guests box read empty. Dates take the
   slack; guests is capped. */

body #search_form .input-group > div.search-date,
body #search_form .input-group > div.search_guests_field {
	padding: 0 12px !important;
	margin-right: 0 !important;
}

body #search_form .input-group > div.search-date {
	flex: 1 1 150px;
}

body #search_form .input-group > div.search_guests_field {
	flex: 0 1 116px;
}

/* The input must fill the field so (a) its centred text actually centres and
   (b) tapping anywhere in the 48px box opens the picker — measured: a click on
   the label strip was hitting the wrapper, not the input. */
/* Final 4px: the date value is an <input> (block box) while Guests' is an
   inline-block sitting on a text baseline. Making BOTH wrappers a 20px flex
   box that centres its child removes the baseline from the equation. */
body #search_form .search-date .add_ids_title,
body #search_form .search_guests_field .add_ids_title {
	display: flex !important;
	align-items: center;
	justify-content: center;
	height: 20px;
	line-height: 1;
	padding: 0 !important;
	margin: 0 !important;
}

body #search_form .search-date .add_ids_title,
body #search_form .search-date input.search_date {
	display: block;
	width: 100% !important;
	text-align: center !important;
}

/* Both fields must use the SAME layout mode — and it has to be FLEX.
   Measured across two attempts:
     dates=block, guests=flex  -> values at 17 vs 23  (6px out)
     both=block                -> values at 34 vs 54  (20px out; the guests
                                  value escapes below its own 20px wrapper)
     both=flex                 -> both centre their stack identically
   Guests has extra nested markup that block layout does not contain, so flex
   with justify-content:center is what makes the two stacks agree. */
body #search_form .input-group > div.search-date,
body #search_form .input-group > div.search_guests_field {
	display: flex !important;
	flex-direction: column !important;
	justify-content: center !important;
	min-height: 48px;
	padding: 0 12px !important;
	margin-right: 0 !important;
}

body #search_form .search_date_wrapper_date_from::before,
body #search_form .search_date_wrapper_date_to::before,
body #search_form .search_guests_field::before {
	display: block;
	font-size: 11px;             /* 9.5px @ 60% was unreadable over a photo */
	letter-spacing: .18em;
	text-transform: uppercase;
	color: rgba(255, 255, 255, .75);
	margin-bottom: 4px;
	text-align: center;
	line-height: 1;
	pointer-events: none;
}
body #search_form .search_date_wrapper_date_from::before { content: "Check in"; }
body #search_form .search_date_wrapper_date_to::before   { content: "Check out"; }
body #search_form .search_guests_field::before           { content: "Guests"; }

/* The plugin prints "Guests :" inline; ::before now supplies that label, so the
   plugin's own label has to go.

   BUT IT MUST NOT BE display:none. This element carries the click handler that
   OPENS THE GUESTS PANEL — the handler is bound to .search_guests_title, not to
   the field. Hiding it gave it a 0×0 box, so there was nothing to click and the
   guests field could never be opened at all. That is what "the guests field
   will not accept input" actually was.

   So: keep it in the layout and stretch it over the WHOLE field, with its text
   hidden. The label still comes from ::before, and now anywhere in the field is
   a valid click target instead of one small word. */
body #search_form .search_guests_title.field-title {
	position: absolute;
	inset: 0;
	display: block;
	margin: 0;
	padding: 0;
	font-size: 0;
	line-height: 0;
	color: transparent;
	cursor: pointer;
	z-index: 3;
}

/* Hover + active field — COLOUR ONLY.
   An earlier version lifted the field background, which painted a second
   frosted panel inside the glass bar. The bar is already glass; a nested
   surface reads as a bug. Only the value changes colour.

   Keyboard users still get a visible focus ring, but it is bound to
   :focus-visible on the input itself, so a mouse click does not draw it. */

body #search_form .input-group > div:hover [type="text"],
body #search_form .input-group > div:hover .search_guests_title_value,
body #search_form .input-group > div:focus-within [type="text"],
body #search_form .input-group > div:focus-within .search_guests_title_value {
	color: var(--swissresort-second-color, #DDA380) !important;
}

body #search_form .input-group > div [type="text"]:focus-visible {
	outline: 1px solid var(--swissresort-second-color, #DDA380);
	outline-offset: 4px;
	border-radius: 4px;
}

/* Label stays quiet in both states — only the value takes the accent. */
body #search_form .input-group > div:hover::before,
body #search_form .input-group > div:focus-within::before {
	color: rgba(255, 255, 255, .75);
}

/* Touch targets: phone link and the off-canvas CLOSE control */
body .elementor-element-a9d9aea a {
	display: inline-flex;
	align-items: center;
	min-height: 44px;
}
.vertical-menu-container-wrapper .close-menu,
.vertical-menu-container-wrapper [class*="close"] a,
.vertical-menu-container-wrapper a[class*="close"] {
	min-height: 44px;
	display: inline-flex;
	align-items: center;
}

/* Date + guest values: match the BOOK YOUR STAY button (measured 15px/500)
   and centre them in their own field box.

   The theme sets `#search_form .input-group > div [type="text"]` with
   font-size:0.9375rem !important, so this needs equal specificity plus
   !important — and the child loads after template.css, so it wins the tie. */

body #search_form .input-group > div [type="text"],
body #search_form input.booking_date,
body #search_form .input_select_input,
body #search_form .input_select_input_value {
	font-size: 15px !important;
	font-weight: 500;
	text-align: center !important;
	width: 100% !important;
}

body #search_form .input-group > div.search-date,
body #search_form .input-group > div.search_guests_field,
body #search_form .input-group > div.search-date .add_ids_title,
body #search_form .input-group > div.search_guests_field .add_ids_title {
	text-align: center;
	justify-content: center;
}

body #search_form .input_select_title_value {
	font-size: 15px;
	font-weight: 500;
}

/* Dropdown panels are NOT glass — they need to be readable */
.babe-search-form .input_select_list {
	background: #fff;
	border-radius: 16px;
	border: 1px solid var(--noore-line);
	box-shadow: var(--noore-shadow);
	color: var(--swissresort-text-color, #1E1E1E);
	overflow: hidden;
}

@media (max-width: 991px) {
	.babe-search-form {
		border-radius: 24px;
		padding: 10px;
	}
	.babe-search-form .search-date,
	.babe-search-form .input_select_wrapper {
		padding: 10px 16px;
	}
	.babe-search-form .btn-search,
	.babe-search-form button[name="submit"] {
		width: 100%;
		height: 52px;
		min-width: 0;
		border-radius: 999px;
	}
}

/* --------------------------------------------------------------------------
   8. Hero carousel — scrim and arrows
   The header (white wordmark, glass booking bar) sits over the hero carousel.
   Bright frames — pool, white render walls — leave it unreadable.

   A top-weighted gradient does the work rather than a flat dim: the header
   band gets enough darkness to hold white text, while the lower two-thirds of
   the photograph stays close to full brightness. A uniform overlay would make
   the renders look muddy for no legibility gain.

   Requires the CSS class `noore-hero-carousel` on the Elementor widget, or
   matches the hero by its element ID, so room and gallery carousels are
   untouched.
   -------------------------------------------------------------------------- */

.elementor-element-effb8e1,
.noore-hero-carousel {
	position: relative;
}

.elementor-element-effb8e1::after,
.noore-hero-carousel::after {
	content: "";
	position: absolute;
	inset: 0;
	z-index: 2;
	pointer-events: none;   /* arrows and dots stay clickable */
	background: linear-gradient(
		to bottom,
		rgba(30, 30, 30, .58) 0%,
		rgba(30, 30, 30, .34) 18%,
		rgba(30, 30, 30, .10) 42%,
		rgba(30, 30, 30, .04) 70%,
		rgba(30, 30, 30, .22) 100%
	);
}

/* A touch of overall depth so bright frames don't blow out the wordmark.
   Keep this subtle — the renders are the product. */
.elementor-element-effb8e1 .swiper-slide img,
.noore-hero-carousel .swiper-slide img {
	filter: brightness(.92) saturate(1.02);
}

/* Arrows — glass, matching the booking bar. The theme ships these as ~130px
   solid terracotta discs, which read as a button you must press rather than a
   quiet navigation affordance. */
.elementor-element-effb8e1 .elementor-swiper-button,
.noore-hero-carousel .elementor-swiper-button {
	/* Quiet ink glass. Structure from v1's .arrow, but tinted with the brand
	   darks (#1E1E1E base, #2A2A2A on hover) instead of a colour pop, so the
	   control shimmers against the photograph rather than announcing itself.
	   The hairline is what reads as "glass"; the fill stays low-contrast. */
	z-index: 3;
	width: 66px;
	height: 66px;
	display: grid;
	place-items: center;
	border-radius: 999px;
	border: 1px solid rgba(255, 255, 255, .12);
	background: rgba(30, 30, 30, .38);
	-webkit-backdrop-filter: blur(8px) saturate(120%);
	backdrop-filter: blur(8px) saturate(120%);
	color: rgba(255, 255, 255, .92);
	font-size: 22px;
	top: 50%;
	transform: translateY(-50%);
	transition: background .25s ease, border-color .25s ease;
}

.elementor-element-effb8e1 .elementor-swiper-button:hover,
.noore-hero-carousel .elementor-swiper-button:hover {
	/* Re-declare the centring transform. The base sets translateY(-50%); any
	   hover rule that touches `transform` (an earlier version of this file set
	   scale here) REPLACES it, and the arrow drops by half its height. Pinning
	   it makes that failure impossible. */
	transform: translateY(-50%) !important;
	background: rgba(42, 42, 42, .66);
	border-color: rgba(255, 255, 255, .22);
	color: #fff;
}

.elementor-element-effb8e1 .elementor-swiper-button:focus-visible,
.noore-hero-carousel .elementor-swiper-button:focus-visible {
	outline: 2px solid #fff;
	outline-offset: 3px;
}

/* Edge offsets: v1's clamp, so they tuck in on narrow viewports */
.elementor-element-effb8e1 .elementor-swiper-button-prev,
.noore-hero-carousel .elementor-swiper-button-prev { left: clamp(12px, 2.5vw, 44px); }
.elementor-element-effb8e1 .elementor-swiper-button-next,
.noore-hero-carousel .elementor-swiper-button-next { right: clamp(12px, 2.5vw, 44px); }

/* Pagination dots — v1's treatment: the active dot is a sand PILL 26px wide,
   inactive are 8px circles at 45% white. The width change is what makes the
   position legible at a glance without adding a counter. */
.elementor-element-effb8e1 .swiper-pagination-bullet,
.noore-hero-carousel .swiper-pagination-bullet {
	z-index: 3;
	width: 8px;
	height: 8px;
	border-radius: 999px;
	background: rgba(255, 255, 255, .45);
	opacity: 1;
	transition: width .3s ease, background .3s ease;
}

.elementor-element-effb8e1 .swiper-pagination-bullet-active,
.noore-hero-carousel .swiper-pagination-bullet-active {
	width: 26px;
	background: var(--swissresort-second-color, #DDA380);
}

@media (max-width: 991px) {
	.elementor-element-effb8e1::after,
	.noore-hero-carousel::after {
		background: linear-gradient(
			to bottom,
			rgba(30, 30, 30, .62) 0%,
			rgba(30, 30, 30, .40) 30%,
			rgba(30, 30, 30, .12) 60%,
			rgba(30, 30, 30, .26) 100%
		);
	}
}

@media (max-width: 767px) {
	.elementor-element-effb8e1 .elementor-swiper-button,
	.noore-hero-carousel .elementor-swiper-button {
		width: 48px;
		height: 48px;
		font-size: 18px;
		transform: translateY(-50%);
	}
	.elementor-element-effb8e1 .elementor-swiper-button-prev,
	.noore-hero-carousel .elementor-swiper-button-prev { left: 12px; }
	.elementor-element-effb8e1 .elementor-swiper-button-next,
	.noore-hero-carousel .elementor-swiper-button-next { right: 12px; }
}

/* --------------------------------------------------------------------------
   9. Swissresort's dark green -> Nooré ink

   The parent hardcodes #122223 (a dark teal-green) in 22 rules across
   template.css. It is NOT wired to the Customizer, so setting Theme Colors
   never touches it — that is why the green survived the brand pass.

   Overridden here to #1E1E1E, the brandbook ink already used for Text and
   Heading colours. Only user-facing surfaces are listed; the 404 page, the
   my-account screens and CMB admin forms are left alone deliberately.

   The Elementor hero container carries its own #122223 from post-28.css at
   specificity (0,3,0); the ID selector below beats it without !important.
   -------------------------------------------------------------------------- */

.header-mobile,
.megamenu .dropdown-menu,
.tour-grid-v5,
.tour-grid-v6,
.tours-vetical,
.setting-account .user-account,
.cal-cell .cal-cell-date {
	background-color: #1E1E1E;
}

/* .over-dark is the off-canvas BACKDROP, not a surface — it is position:fixed
   across the whole viewport at z-index 6. It was in the list above, which made
   it fully opaque ink, so opening the menu blacked out the entire page and the
   470px panel read as a full-screen takeover.
   A scrim should dim what is behind it, not replace it. */
.over-dark {
	background-color: rgba(30, 30, 30, .55) !important;
	-webkit-backdrop-filter: blur(2px);
	backdrop-filter: blur(2px);
}

.tour-item-style .direction:hover,
.image-carousel-theme .swiper .elementor-swiper-button:hover {
	background: #1E1E1E;
}

.tour-grid-v6 .tour-content {
	background: linear-gradient(180deg, rgba(30, 30, 30, 0) 0%, rgba(30, 30, 30, .85) 100%);
}

.widget-discover .slick-list:before {
	background: linear-gradient(180deg, #1E1E1E 0%, rgba(30, 30, 30, 0) 100%);
}
.widget-discover .slick-list:after {
	background: linear-gradient(0deg, #1E1E1E 0%, rgba(30, 30, 30, 0) 100%);
}

/* Date range picker.
   The booking plugin ships Dan Grossman's daterangepicker. Restyled to v1's
   .datepick spec — 6px radius, deep soft shadow, display-face month labels,
   struck-through disabled days, cream range fill, terracotta selection.
   Note: the widget runs in auto-apply mode, so .drp-buttons is hidden; the
   button rules below only take effect if auto-apply is turned off in
   BA Book Everything's search-form settings. */

.daterangepicker {
	border: 0;
	border-radius: 16px;
	box-shadow: 0 26px 60px rgba(30, 30, 30, .18);
	padding: 24px 26px 18px;
	font-family: var(--swissresort-main-font, inherit);
}
.daterangepicker:before,
.daterangepicker:after { display: none; }

/* Clear the booking bar.
   daterangepicker positions itself with an inline `top` calculated from the
   input, which left the panel overlapping the bar by 10px. The margin is
   skipped on .drop-up, where the panel opens ABOVE the field and the same
   margin would shove it back into the bar. */
.daterangepicker:not(.drop-up) {
	margin-top: 30px;
}

.daterangepicker .drp-calendar { width: 300px; max-width: 300px; padding: 0; }

/* Do NOT use table-layout:fixed here.
   Fixed layout takes its column widths from the FIRST row, and that row is
   `prev | month (colspan 5) | next` — three cells. The browser then builds a
   3-column grid and the 7 weekday columns collapse into each other.
   Auto layout plus an explicit, equal size on every 7-column cell gives a
   correct grid and square cells for the circles. */
.daterangepicker .calendar-table table {
	table-layout: auto;
	width: auto;
	border-collapse: separate;
	border-spacing: 0;
}
.daterangepicker .drp-calendar.left { padding-right: 17px; }
.daterangepicker .drp-calendar.right { padding-left: 17px; }

/* Calendar header row — month label and both arrows on one baseline.
   These are table cells, so vertical-align (not flex) is what aligns them.
   The month previously carried padding-bottom:14px, which pushed it off the
   arrows' centre line. Arrows are square so their hover circle is concentric. */
.daterangepicker thead tr:first-child th {
	vertical-align: middle;
	height: 40px;
	padding: 0 !important;   /* padding here inflated the arrow cells to 40x59 */
}

/* The gap that padding used to provide now sits on the weekday row, so the
   header row's height is driven by the 40px arrows and they stay square. */
.daterangepicker thead tr:last-child th {
	padding-top: 14px;
}

.daterangepicker th.month {
	font-family: var(--swissresort-heading-font, serif);
	/* 18px because Aboreto is CAPS-ONLY: every glyph sits at cap-height, so it
	   reads roughly a third larger than the mock's mixed-case serif at the same
	   px value. This is the optical match, not the numeric one. */
	font-size: 17px;
	font-weight: 400;
	letter-spacing: .04em;
	color: var(--swissresort-text-color, #1E1E1E);
	line-height: 1;
}

.daterangepicker th.prev,
.daterangepicker th.next {
	width: 40px;
	min-width: 40px;
	height: 40px;
	line-height: 0;
	font-size: 20px;
	text-align: center;
	color: var(--swissresort-text-color, #1E1E1E);
	border-radius: 50%;
}
/* The chevron is a CSS-border square <span>, inline-block on the text
   baseline. That baseline strut added descender space: the header row grew to
   42px, so the 40px hover circle rendered as an ELLIPSE and the right month
   sat a pixel below the left one — and the glyph itself sat 3px low.
   line-height:0 above removes the strut; vertical-align centres the span.
   Do NOT use display:block here: the span would stretch to the cell width and
   its -45deg rotation would draw a long diagonal line instead of a chevron. */
.daterangepicker th.prev span,
.daterangepicker th.next span {
	vertical-align: middle;
}

.daterangepicker th.prev:hover,
.daterangepicker th.next:hover {
	background: #FFF2EB;
	color: var(--swissresort-theme-color, #B46841);
}

/* Weekday row */
.daterangepicker thead tr:last-child th {
	font-size: 10px;
	font-weight: 500;
	letter-spacing: .06em;
	text-transform: uppercase;
	color: rgba(30, 30, 30, .45);
	width: 40px;
	min-width: 40px;
	max-width: 40px;
	padding: 0 0 6px;
	text-align: center;
}

/* Days */
/* Day cells are square boxes at a fixed 40px so the selection tile is a true
   square. Selection is a ROUNDED SQUARE, matching the mock — this supersedes
   the earlier circular treatment. */
.daterangepicker td {
	font-size: 13px;
	width: 40px;
	min-width: 40px;
	max-width: 40px;
	height: 40px;
	padding: 0;
	line-height: 40px;
	text-align: center;
	border-radius: 6px;
	color: var(--swissresort-text-color, #1E1E1E);
}
.daterangepicker td.available:hover {
	background: #FFF2EB;
	color: var(--swissresort-theme-color, #B46841);
	border-radius: 6px;
}
.daterangepicker td.off,
.daterangepicker td.disabled {
	color: rgba(30, 30, 30, .28);
	text-decoration: none;
	background: transparent;
}
.daterangepicker td.in-range {
	background: #FFF2EB;
	border-radius: 0;
	color: var(--swissresort-text-color, #1E1E1E);
}
/* Selected day — a circle */
.daterangepicker td.active,
.daterangepicker td.active:hover,
.daterangepicker td.start-date,
.daterangepicker td.end-date {
	background: var(--swissresort-theme-color, #B46841);
	color: #fff;
	border-radius: 6px;
}

/* The nights between stay a flat cream bar, so the two circular endpoints
   read as the selection and the span reads as connective tissue. */
.daterangepicker td.in-range:not(.start-date):not(.end-date) {
	border-radius: 0;
}
.daterangepicker td.start-date.in-range { border-radius: 6px 0 0 6px; }
.daterangepicker td.end-date.in-range { border-radius: 0 6px 6px 0; }
.daterangepicker td.start-date.end-date { border-radius: 6px; }

/* Disabled days stay VISIBLE and struck through, as in the mock.
   Do NOT hide td.off: this plugin marks past dates of the CURRENT month with
   .off as well as previous-month days, so hiding it blanked 1-22 August and
   left three empty rows. Measured: {"t":"1","cls":"off.disabled"}. */

/* Footer — daterangepicker ships .drp-buttons in the DOM but hides it under
   autoApply. The Apply/Cancel handlers are bound regardless, so revealing it
   restores the mock's footer without touching the plugin. */
.daterangepicker .drp-buttons {
	display: flex !important;
	align-items: center;
	justify-content: flex-start;
	gap: 12px;
	flex-wrap: wrap;
	border-top: 1px solid rgba(30, 30, 30, .12);
	margin-top: 18px;
	padding: 16px 0 0;
}

/* Pair the two actions on the right, hint text alone on the left.
   space-between spread all three footer children evenly and stranded CANCEL in
   the middle; an auto margin on the first button pushes the pair across
   together, so they read as one action group. */
.daterangepicker .drp-buttons .cancelBtn,
.daterangepicker .drp-buttons .btn-default {
	margin-left: auto;
}
.daterangepicker .drp-buttons .cancelBtn ~ .applyBtn {
	margin-left: 0;
}

.daterangepicker .noore-nights,
.daterangepicker .drp-selected {
	font-size: 12px;
	color: rgba(30, 30, 30, .6);
}
/* Equal footprint for both actions: APPLY is a shorter word than CANCEL, so
   the shared padding left the primary button visibly smaller. min-width sets a
   floor, the text centres in it, and either can still grow if the label does. */
.daterangepicker .drp-buttons .btn {
	font-size: 10.5px;
	letter-spacing: .14em;
	text-transform: uppercase;
	font-weight: 600;
	padding: 12px 26px;
	border-radius: 999px;
	min-width: 120px;
	text-align: center;
	line-height: 1.2;
	/* Transparent border on BOTH, so the filled APPLY is exactly as tall as
	   CANCEL's 1px outline. It belongs here and not on .applyBtn: the parent's
	   `.daterangepicker .drp-buttons .btn { border: 0 }` is (0,3,0) and beats a
	   plain `.daterangepicker .applyBtn` (0,2,0). Same specificity, loaded
	   later, wins without !important. */
	border: 1px solid transparent;
}
/* CANCEL — the theme's .btn-default paints this red (a danger style).
   Override to the mock's quiet outline pill; it is a secondary action. */
.daterangepicker .drp-buttons .cancelBtn,
.daterangepicker .drp-buttons .btn-default {
	background: transparent !important;
	background-color: transparent !important;
	border: 1px solid rgba(30, 30, 30, .28) !important;
	color: var(--swissresort-text-color, #1E1E1E) !important;
}
.daterangepicker .drp-buttons .cancelBtn:hover,
.daterangepicker .drp-buttons .btn-default:hover {
	border-color: var(--swissresort-text-color, #1E1E1E) !important;
	background: transparent !important;
	color: var(--swissresort-text-color, #1E1E1E) !important;
}

/* Cells JS has identified as belonging to a neighbouring month. Kept in flow
   so the week columns stay aligned — only the number disappears. */
.daterangepicker td.noore-outside {
	color: transparent !important;
	text-decoration: none !important;
	pointer-events: none;
}
.daterangepicker .applyBtn {
	background: var(--swissresort-theme-color, #B46841);
	color: #fff;
}
.daterangepicker .applyBtn:hover { background: var(--swissresort-theme-hover-color, #84411E); }

@media (max-width: 767px) {
	.daterangepicker { padding: 18px; }
	.daterangepicker .drp-calendar.left,
	.daterangepicker .drp-calendar.right { padding: 0; }
}

/* Header: stop the CTA and phone wrapping.
   Measured live — "BOOK YOUR STAY" was rendering 180x62 across FOUR lines, and
   the phone 149x56 across three, because both widgets sit in fixed-width
   Elementor containers. Nowrap plus auto width lets them size to their text.
   The min-width:0 on the flex parent is what actually allows the container to
   grow instead of squeezing its children. */

.elementor-element-2750bab .elementor-button {
	white-space: nowrap;
}
.elementor-element-2750bab,
.elementor-element-2750bab > .elementor-widget-container {
	width: auto !important;
	max-width: none !important;
}

.elementor-element-a9d9aea,
.elementor-element-a9d9aea > .elementor-widget-container,
.elementor-element-a9d9aea .elementor-icon-list-item,
.elementor-element-a9d9aea .elementor-icon-list-text,
.elementor-element-a9d9aea a {
	white-space: nowrap;
	width: auto !important;
	max-width: none !important;
}

.elementor-element-f1825ed {
	min-width: 0;
	flex-wrap: nowrap;
}

/* ==========================================================================
   .noore-glass — REUSABLE
   Put `noore-glass` in any Elementor widget's Advanced > CSS Classes field to
   give its button the frosted treatment. Works on Button widgets, and on a
   container's own background.

   !important is required, not preferred: Elementor writes per-widget rules at
   specificity (0,4,0) and its stylesheet loads after this file, so a plain
   class (0,1,0) never wins. This is the one place a utility earns it.
   ========================================================================== */

.noore-glass,
.noore-glass .elementor-button,
.noore-glass .btn,
a.noore-glass {
	background: rgba(255, 255, 255, .14) !important;
	background-color: rgba(255, 255, 255, .14) !important;
	background-image: none !important;
	-webkit-backdrop-filter: blur(8px);
	backdrop-filter: blur(8px);
	border: 1px solid rgba(255, 255, 255, .22) !important;
	color: #fff !important;
	border-radius: 999px !important;
	transition: background .25s ease, border-color .25s ease;
}

.noore-glass:hover,
.noore-glass .elementor-button:hover,
.noore-glass .btn:hover,
a.noore-glass:hover {
	background: rgba(255, 255, 255, .22) !important;
	background-color: rgba(255, 255, 255, .22) !important;
	border-color: rgba(255, 255, 255, .34) !important;
	color: #fff !important;
}

/* BOOK YOUR STAY — same treatment, applied by element id so it works without
   editing the widget. Add the class in Elementor if the id ever changes. */
.elementor-element-2750bab .elementor-button {
	background: rgba(255, 255, 255, .14) !important;
	background-color: rgba(255, 255, 255, .14) !important;
	background-image: none !important;
	-webkit-backdrop-filter: blur(8px);
	backdrop-filter: blur(8px);
	border: 1px solid rgba(255, 255, 255, .22) !important;
	color: #fff !important;
	border-radius: 999px !important;
	transition: background .25s ease, border-color .25s ease;
}
.elementor-element-2750bab .elementor-button:hover {
	background: rgba(255, 255, 255, .22) !important;
	border-color: rgba(255, 255, 255, .34) !important;
}

/* Off-canvas menu panel.
   The theme paints the whole 470px panel in --swissresort-second-color, so
   Nooré's sand accent becomes a flat wall of colour. Ink ground instead, with
   the warmth reduced to accents: terracotta on the active item, a hairline
   between rows. #2A2A2A is used for the one raised surface (the back button)
   so it separates from the ground without introducing another hue. */

.vertical-menu-container-wrapper {
	background: #1E1E1E;
}

.vertical-menu-container-wrapper .sliding-menu__panel-root > li + li {
	border-top: 1px solid rgba(255, 255, 255, .07);
}

/* Menu type uses the client's Elementor global palette:
   Sand #F8F5F0 at rest, Accent #DDA380 on hover. Note their "Sand" is a warm
   off-white, NOT the #DDA380 I had been calling sand — #DDA380 is "Accent". */
.vertical-menu-container-wrapper .sliding-menu__panel-root > li > .sliding-menu__nav,
.vertical-menu-container-wrapper .sliding-menu li a,
.vertical-menu-container-wrapper .sliding-menu li .sliding-menu__nav {
	color: #F8F5F0;
	transition: color .2s ease;
}

.vertical-menu-container-wrapper .sliding-menu__panel-root > li > .sliding-menu__nav:hover,
.vertical-menu-container-wrapper .sliding-menu li a:hover,
.vertical-menu-container-wrapper .sliding-menu li .sliding-menu__nav:hover,
.vertical-menu-container-wrapper .sliding-menu li.active > .sliding-menu__nav,
.vertical-menu-container-wrapper .sliding-menu li.current-menu-item > a {
	color: #DDA380 !important;
}

/* The menu CTA takes the same glass treatment as the header button. */
.vertical-menu-container-wrapper .elementor-button,
.vertical-menu-container-wrapper .btn {
	background: rgba(255, 255, 255, .14) !important;
	background-color: rgba(255, 255, 255, .14) !important;
	background-image: none !important;
	-webkit-backdrop-filter: blur(8px);
	backdrop-filter: blur(8px);
	border: 1px solid rgba(255, 255, 255, .22) !important;
	color: #F8F5F0 !important;
	border-radius: 999px !important;
	transition: background .25s ease, border-color .25s ease, color .25s ease;
}
.vertical-menu-container-wrapper .elementor-button:hover,
.vertical-menu-container-wrapper .btn:hover {
	background: rgba(255, 255, 255, .22) !important;
	border-color: rgba(255, 255, 255, .34) !important;
	color: #DDA380 !important;
}

/* Raised surface, not a second colour */
.navbar-offcanvas .sliding-menu li .sliding-menu__back {
	background: #2A2A2A;
	color: rgba(255, 255, 255, .88);
}

.vertical-menu-container-wrapper .content-bottom {
	color: rgba(255, 255, 255, .70);
}
.vertical-menu-container-wrapper .content-bottom i {
	color: var(--swissresort-second-color, #DDA380);
}

/* Hero container — Elementor's own background, beaten on ID specificity */
.elementor-28 .elementor-element.elementor-element-effb8e1:not(.x) {
	background-color: #1E1E1E !important;
	background-image: none !important;
}

/* --------------------------------------------------------------------------
   10. Media
   Cards get tighter on small screens so the radius doesn't dominate.
   -------------------------------------------------------------------------- */

@media (max-width: 767px) {
	:root {
		--noore-r: 14px;
	}
}

@media (prefers-reduced-motion: reduce) {
	* {
		animation-duration: .01ms !important;
		transition-duration: .01ms !important;
	}
}

/* --------------------------------------------------------------------------
   Facilities icons (Apus features box)
   --------------------------------------------------------------------------
   The demo shipped these tiles with SVGs HOTLINKED from demoapus1.com, which
   also carried explicit width="50" height="50" attributes. Swapping them for
   Font Awesome removes the dependency on the demo site staying online, but
   Elementor renders FA as <svg class="e-font-icon-svg"> with NO width/height
   and no intrinsic size — the rule that normally gives it 1em does not reach
   inside this theme's widget, so the icons computed to 0x0 and vanished.
   Size from the wrapper's font-size, and take the brand colour by inheritance
   (the demo SVGs used fill="currentColor"; FA's default is solid black).
   -------------------------------------------------------------------------- */
.item-features-inner .features-box-image .e-font-icon-svg {
	width: 1em;
	height: 1em;
	fill: currentColor;
	display: inline-block;
}

/* --------------------------------------------------------------------------
   FAQ accordion - cards on the sand ground
   --------------------------------------------------------------------------
   The accordion items ship transparent with no border, which was fine on white
   but left them floating shapelessly once the page ground became sand. Give
   each item the same white card treatment the room cards and date panel use,
   so white keeps meaning "this lifts off the page".

   The background needs !important: Elementor writes per-widget CSS into
   uploads/elementor/css/, which loads AFTER the child theme.
   -------------------------------------------------------------------------- */
.elementor-accordion .elementor-accordion-item {
	/* Glass, tuned for a LIGHT ground.
	   The booking bar's recipe (rgba(255,255,255,.10) over a photo) would be
	   invisible here: backdrop-filter refracts whatever sits behind the element,
	   and behind these cards is flat sand - blurring a flat colour returns the
	   same flat colour. So the translucency does the work and the blur only adds
	   a faint softening. Higher alpha than the booking bar for the same reason:
	   at .10 on sand the card would disappear entirely. */
	background: rgba(255, 255, 255, .45);
	-webkit-backdrop-filter: blur(14px) saturate(140%);
	backdrop-filter: blur(14px) saturate(140%);
	border: 1px solid rgba(255, 255, 255, .70);
	border-radius: 14px;
	overflow: hidden;
	margin-bottom: 12px;
	box-shadow: 0 8px 24px rgba(30, 30, 30, .06);
	transition: background .2s ease, box-shadow .2s ease, border-color .2s ease;
}

/* Safari <9 / Firefox with backdrop-filter disabled: translucency alone leaves
   the card too weak against sand, so fall back to a solid surface. */
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
	.elementor-accordion .elementor-accordion-item {
		background: rgba(255, 255, 255, .88);
	}
}
.elementor-accordion .elementor-accordion-item:hover {
	background: rgba(255, 255, 255, .60);
	border-color: rgba(255, 255, 255, .90);
	box-shadow: 0 12px 30px rgba(30, 30, 30, .09);
}
.elementor-accordion .elementor-tab-title {
	background: transparent !important;
	background-color: transparent !important;
	padding: 22px 26px !important;
	border: 0 !important;
}
.elementor-accordion .elementor-tab-content {
	background: transparent !important;
	padding: 0 26px 24px !important;
	border: 0 !important;
}
/* The theme wraps answer copy in .mb-4, which double-counts the card padding. */
.elementor-accordion .elementor-tab-content .mb-4 {
	margin-bottom: 0;
}

@media (max-width: 767px) {
	.elementor-accordion .elementor-tab-title { padding: 18px 18px !important; }
	.elementor-accordion .elementor-tab-content { padding: 0 18px 18px !important; }
}

/* --------------------------------------------------------------------------
   Entrance animations must never hide content
   --------------------------------------------------------------------------
   Elementor hides animated elements with .elementor-invisible (opacity:0) and
   removes the class when a jQuery Waypoint fires. On this theme the waypoint
   never fires: <body> computes overflow-y:auto with an explicit height, so
   Waypoints picks BODY as its scroll context - but the document actually
   scrolls on <html>, so body.scrollTop stays 0 forever and nothing triggers.

   Measured on /about-facilities/: 14 elements still carried .elementor-invisible
   after scrolling the whole page, and the counter widgets sat at 0.

   Progressive enhancement, not decoration: if the trigger is unreliable the
   content must still be readable. If the scroll context is ever fixed, the
   animations resume and this rule is harmless.
   -------------------------------------------------------------------------- */
.elementor-invisible {
	opacity: 1 !important;
	animation: none !important;
	visibility: visible !important;
}

/* --------------------------------------------------------------------------
   [noore_faqs] - self-contained accordion chrome
   --------------------------------------------------------------------------
   Elementor prints the accordion widget's base CSS only when an accordion
   WIDGET is on the page. The FAQs page now renders from the `faq` post type via
   shortcode, so that stylesheet is no longer enqueued and its rules vanished:
   the icon stopped floating right, lost its 1.5em box, and - worst - the closed
   (+) and opened (minus) glyphs both displayed at once, because the rule that
   hides one of them lived in that same file.

   These are the handful of rules the markup actually depends on, scoped to
   .noore-faqs so they can never collide with a real Elementor accordion.
   -------------------------------------------------------------------------- */
.noore-faqs .elementor-tab-title {
	cursor: pointer;
	outline: none;
}
.noore-faqs .elementor-accordion-title {
	text-decoration: none;
	color: inherit;
}
.noore-faqs .elementor-accordion-icon {
	display: inline-block;
	width: 1.5em;
	float: right;
	text-align: right;
}
.noore-faqs .elementor-accordion-icon svg {
	width: 1em;
	height: 1em;
	fill: currentColor;
}
.noore-faqs .elementor-accordion-icon .elementor-accordion-icon-closed { display: block; }
.noore-faqs .elementor-accordion-icon .elementor-accordion-icon-opened { display: none; }
.noore-faqs .elementor-tab-title.elementor-active .elementor-accordion-icon-closed { display: none; }
.noore-faqs .elementor-tab-title.elementor-active .elementor-accordion-icon-opened { display: block; }

/* Keyboard users must be able to see which question has focus. */
.noore-faqs .elementor-tab-title:focus-visible {
	outline: 2px solid var(--swissresort-theme-color, #B46841);
	outline-offset: -2px;
}

/* --------------------------------------------------------------------------
   FAQ +/- glyph - drawn in CSS, not SVG
   --------------------------------------------------------------------------
   The shortcode emits Elementor's stock accordion SVGs: a plus built from two
   filled rectangles with square corners, in near-black. Hard 90-degree corners
   and full-contrast black read as sharp against a sand ground and a serif
   display face.

   The corners cannot be rounded from CSS - they are baked into the SVG path -
   so the glyph is hidden and redrawn with two pseudo-element bars: 1.5px, fully
   rounded ends, in a muted terracotta that matches the links and the active
   card border. Doing it here rather than in the SVG keeps the change in CSS,
   which deploys through the theme editor; functions.php would need a File
   Manager upload.
   -------------------------------------------------------------------------- */
.noore-faqs .elementor-accordion-icon-closed svg,
.noore-faqs .elementor-accordion-icon-opened svg {
	display: none;
}
.noore-faqs .elementor-accordion-icon-closed,
.noore-faqs .elementor-accordion-icon-opened {
	position: relative;
	width: 15px;
	height: 15px;
	margin-left: auto;
}
.noore-faqs .elementor-accordion-icon-closed::before,
.noore-faqs .elementor-accordion-icon-closed::after,
.noore-faqs .elementor-accordion-icon-opened::before {
	content: "";
	position: absolute;
	background: rgba(30, 30, 30, .8);
	border-radius: 999px;
	transition: background .2s ease;
}
.noore-faqs .elementor-accordion-icon-closed::before,
.noore-faqs .elementor-accordion-icon-opened::before {
	left: 0;
	top: 50%;
	width: 15px;
	height: 2px;
	transform: translateY(-50%);
}
/* the upright stroke exists only on the closed (+) state */
.noore-faqs .elementor-accordion-icon-closed::after {
	top: 0;
	left: 50%;
	width: 2px;
	height: 15px;
	transform: translateX(-50%);
}
.noore-faqs .elementor-accordion-item:hover .elementor-accordion-icon-closed::before,
.noore-faqs .elementor-accordion-item:hover .elementor-accordion-icon-closed::after,
.noore-faqs .elementor-accordion-item:hover .elementor-accordion-icon-opened::before {
	background: var(--swissresort-text-color, #1E1E1E);
}

/* --------------------------------------------------------------------------
   Header 1 "Call Us" - match the homepage's glass pill
   --------------------------------------------------------------------------
   Home's header (its own template) paints this button as glass:
   rgba(255,255,255,.14) + blur(8px) + a 22% white hairline, white label.
   Header 1 (template 2325, used on every inner page) shipped it as a SOLID
   59% white pill with near-black text and no blur - a heavy grey blob against
   the dark header bar, and visibly not the same component.

   Safe to take white text everywhere this header appears: measured on all inner
   pages, the header always sits on a dark ground - a dark hero image (Rooms,
   Gallery, FAQs, About, Location) or a near-black bar (Privacy, Terms).

   Specificity note: the widget's own background lives in a stylesheet this
   context cannot read, and a plain .apus-header chain with !important LOST to
   it - colour and radius applied while background and border did not. Doubling
   the class and prefixing html body wins it outright.
   -------------------------------------------------------------------------- */
html body .apus-header .elementor-element-5dca7b6 .elementor-button.elementor-button {
	background-color: rgba(255, 255, 255, .14) !important;
	background-image: none !important;
	-webkit-backdrop-filter: blur(8px);
	backdrop-filter: blur(8px);
	border: 1px solid rgba(255, 255, 255, .22) !important;
	border-radius: 999px !important;
	color: #fff !important;
	transition: background-color .2s ease, border-color .2s ease;
}
html body .apus-header .elementor-element-5dca7b6 .elementor-button i,
html body .apus-header .elementor-element-5dca7b6 .elementor-button svg,
html body .apus-header .elementor-element-5dca7b6 .elementor-button .elementor-button-text {
	color: #fff !important;
	fill: #fff !important;
}
html body .apus-header .elementor-element-5dca7b6 .elementor-button.elementor-button:hover {
	background-color: rgba(255, 255, 255, .24) !important;
	border-color: rgba(255, 255, 255, .38) !important;
}

/* --------------------------------------------------------------------------
   Hero height cap - sitewide
   --------------------------------------------------------------------------
   Heroes were pushing the first real content below the fold, from two
   unrelated causes, both measured on an 800px viewport:

   1. HOME - the hero is an Elementor image carousel with no height set, so it
      took the source image's aspect ratio: a 1600x1067 render came out 1021px
      tall, 253px past the fold. object-fit was `fill`, so the image dictated
      the box instead of the box cropping the image.

   2. INNER PAGES - the page-title band carries 390px of hardcoded padding top
      AND bottom (Swiss Resort's demo values). 110px of title inside 780px of
      padding = 952px.

   One token drives both. The cap is viewport-relative so it adapts, with a
   floor so a short window cannot crush it. Tuned so the next section peeks
   above the fold - that sliver is what tells a visitor there is more below.
   -------------------------------------------------------------------------- */
:root {
	--noore-hero-max: clamp(420px, 78vh, 760px);
	/* The home carousel is set independently of the inner-page band so the two
	   can be tuned separately. min() rather than a bare 680px: on a window
	   shorter than ~773px tall a fixed 680 would swallow the whole viewport,
	   so it yields to 88vh there. On a normal screen it resolves to exactly
	   680px. */
	--noore-hero-carousel: min(680px, 88vh);
}

/* 1. Home carousel */
.elementor-image-carousel-wrapper .swiper-slide,
.elementor-image-carousel-wrapper .swiper-slide-inner {
	height: var(--noore-hero-carousel) !important;
}
.elementor-image-carousel-wrapper .swiper-slide-image {
	width: 100% !important;
	height: 100% !important;
	object-fit: cover;
	object-position: center;
}

/* 2. Inner-page title band.
   :has() targets the container holding the page title without hard-coding the
   seven per-page Elementor element ids, which would break the moment a page is
   rebuilt. Padding rather than height, because the band is padding-driven.

   .e-con-full, NOT .e-con: the title sits inside TWO nested containers, an
   outer .e-con-box wrapping an inner .e-con-full. Matching .e-con hit both and
   the padding stacked - 192px twice gave 940px, worse than intended. Only the
   inner one carries the demo padding, so only it should be capped.
   (:has() cannot be nested inside :has(), so excluding the outer that way is
   invalid CSS and silently drops the whole rule.) */
/* CORRECTION. The rule above used to cap only .e-con-full, on the assumption
   that just one container carried the demo padding. Measured on /gallery/:
   BOTH the outer section and the inner container match, so the cap was applied
   twice and stacked - 192px x 4 = 768px of padding around 110px of title,
   giving an 878px hero on an 800px viewport. Taller than the screen.

   Fixed by capping any container holding the title, then explicitly zeroing
   the padding on containers nested inside it, so only one cap can ever apply.
   :has() cannot be nested, which is why this is two rules. */
.elementor-element.e-con:has(.post-page-title) {
	padding-top: clamp(80px, 18vh, 160px) !important;
	padding-bottom: clamp(80px, 18vh, 160px) !important;
}
.elementor-element.e-con:has(.post-page-title) .elementor-element.e-con {
	padding-top: 0 !important;
	padding-bottom: 0 !important;
}

@media (max-width: 767px) {
	:root {
		--noore-hero-max: clamp(360px, 62vh, 520px);
		--noore-hero-carousel: clamp(360px, 62vh, 520px);
	}
	.elementor-element.e-con:has(.post-page-title) {
		padding-top: clamp(60px, 12vh, 100px) !important;
		padding-bottom: clamp(60px, 12vh, 100px) !important;
	}
}
/* ==========================================================================
   Footer — glass pill hover, replacing the theme's underline
   --------------------------------------------------------------------------
   Swissresort's template.css does this:

       .widget-nav-menu li:hover > a,
       .widget-nav-menu li.active > a { text-decoration: underline; }

   so both hover AND the current-page item get an underline. The underline is
   the only thing being removed here; the accent colour on the active item
   stays, because it is the only current-page indicator the footer has.

   Padding, radius and a TRANSPARENT border are set at rest so the pill only
   changes colour on hover. If the padding appeared on hover the whole row
   would reflow and the links would jump sideways.

   The li margin drops from 30px to 4px because the new 16px of padding on each
   side now supplies the gap (4 + 16 + 16 = 36px, against the old 30px). The
   matching 4px bottom margin is for narrow viewports, where the row wraps onto
   three lines with a 0px gap between them - without it the pills would touch.

   Note on the blur: the footer ground is a flat dark colour, so backdrop-filter
   has almost nothing to blur - the translucent white tint is doing the visible
   work. It is kept so this matches the booking bar and Call Us button, which
   sit over photography and genuinely need it.
   ========================================================================== */

.apus-footer .widget-nav-menu .menu li > a {
	display: inline-block;
	padding: 8px 16px;
	border-radius: 999px;
	border: 1px solid transparent;
	background-color: transparent;
	text-decoration: none;
	transition: background-color .28s ease, border-color .28s ease, color .28s ease;
}

.apus-footer .widget-nav-menu.st_line .menu li {
	margin: 0 4px 4px 0;
}
.apus-footer .widget-nav-menu.st_line .menu li:last-child {
	margin-right: 0;
}

.apus-footer .widget-nav-menu .menu li:hover > a,
.apus-footer .widget-nav-menu .menu li > a:focus-visible {
	background-color: rgba(255, 255, 255, .14);
	-webkit-backdrop-filter: blur(8px);
	backdrop-filter: blur(8px);
	border-color: rgba(255, 255, 255, .22);
	text-decoration: none;
	color: #fff;
}

/* The current page keeps the accent colour but loses the underline. */
.apus-footer .widget-nav-menu .menu li.active > a,
.apus-footer .widget-nav-menu .menu li.current-menu-item > a,
.apus-footer .widget-nav-menu .menu li.current-cat > a,
.apus-footer .widget-nav-menu .menu li.current-cat-parent > a {
	text-decoration: none;
}

/* --------------------------------------------------------------------------
   Footer contact circles (mail / phone) — glass fill on hover
   --------------------------------------------------------------------------
   These are Elementor icon-box widgets in .elementor-view-framed +
   .elementor-shape-circle, so the ring at rest is theirs and is left alone.

   Elementor's per-widget CSS in uploads/elementor/css/post-2278.css already
   sets border-color:#FFFFFF on hover at higher specificity than a plain child
   theme selector can reach, hence !important. Pure white was too hard an edge
   next to the site's other glass, so it is pulled back to .35.
   -------------------------------------------------------------------------- */

.apus-footer .elementor-widget-icon-box .elementor-icon {
	transition: background-color .28s ease, border-color .28s ease,
	            color .28s ease, fill .28s ease;
}

.apus-footer .elementor-widget-icon-box .elementor-icon:hover,
.apus-footer .elementor-widget-icon-box .elementor-icon-box-icon:hover .elementor-icon {
	background-color: rgba(255, 255, 255, .14) !important;
	-webkit-backdrop-filter: blur(8px);
	backdrop-filter: blur(8px);
	border-color: rgba(255, 255, 255, .35) !important;
}


/* ==========================================================================
   Location & Contact — panel background now lives in Elementor
   --------------------------------------------------------------------------
   The wood plate and its dark overlay were pinned here for a while because
   Elementor's save kept reverting them. That has since stopped reverting, so
   the background was moved onto section 34fc6f0 as a normal Background +
   Background Overlay, and the !important rule that used to sit here was
   removed — it was overriding the widget and making the Elementor control
   look broken.

   Change the panel background in Elementor now: Contact page -> select the
   outer Container -> Style -> Background / Background Overlay.
   ========================================================================== */

/* ==========================================================================
   Contact form submit — the label was invisible
   --------------------------------------------------------------------------
   The theme painted both the fill and the text of .wpcf7-submit the same
   #B46841, so "SEND YOUR MESSAGE" rendered terracotta on terracotta at a 1:1
   contrast ratio — the button read as an empty bar.

   The fill stays terracotta, which is what makes the button carry on the sand
   ground; only the label changes, to white.
   ========================================================================== */

.wpcf7 input.wpcf7-submit,
.wpcf7 input.wpcf7-submit:hover,
.wpcf7 input.wpcf7-submit:focus {
	color: #ffffff !important;
}

/* Same bug, second place: the Book Now button on every room page painted its
   label #B46841 on a #B46841 fill. Found in the site-wide pass. This one is
   the actual booking action, so the button read as a blank terracotta slab at
   the end of the booking form. */
#booking_form button,
#booking_form .btn,
.babe-book-btn,
.babe-booking-form button[type="submit"] {
	color: #ffffff !important;
}
/* ==========================================================================
   Gallery — horizontal scroll, staggered heights
   --------------------------------------------------------------------------
   Rebuilds the stock Elementor image-gallery grid into a full-bleed
   horizontal run: large plates at varied heights, sitting at different
   vertical offsets, with a lot of air between them.

   Done entirely in CSS against the PUBLISHED markup, deliberately. Post 5519
   has an unsaved Elementor draft containing four Swiss Resort demo images
   (h71-h74). Opening that document to add a widget risks publishing the draft
   and wiping the twelve real photos, so the layout is imposed from the
   stylesheet and the document is left untouched.

   Rhythm repeats every four tiles: full-height landscape aligned top, a
   shorter square dropped to the bottom, a mid landscape centred, then a
   portrait back at the top. The uneven heights plus the three different
   alignments are what stop it reading as a filmstrip.

   Aspect-ratio does the width: each tile is given a height and a ratio, so
   width follows and the source images (all 3:2 renders) crop predictably.
   ========================================================================== */

.noore-gal .elementor-image-gallery .gallery {
	/* One column width for every tile; only the HEIGHT changes. Measured off
	   the Aman reference: tiles all ~370px wide in a ~2000px viewport (18.5vw)
	   with ~68px between them (3.4vw). */
	--noore-gal-u: clamp(190px, 18.5vw, 380px);
	--noore-gal-gap: clamp(22px, 3.4vw, 70px);
	--noore-gal-inset: clamp(16px, 6vw, 130px);

	display: flex !important;
	flex-wrap: nowrap !important;
	align-items: center;
	gap: var(--noore-gal-gap);

	width: 100%;
	padding: 8px var(--noore-gal-inset);

	overflow-x: auto;
	overflow-y: hidden;
	overscroll-behavior-x: contain;
	scroll-behavior: auto; /* the loop wrap is a jump - must not animate */
	cursor: grab;
	-webkit-overflow-scrolling: touch;

	scrollbar-width: none;
	-ms-overflow-style: none;
}
.noore-gal .elementor-image-gallery .gallery::-webkit-scrollbar { display: none; }

/* Full bleed WITHOUT 100vw. The first attempt used width:100vw with a
   negative margin, which is 100vw wide while the document is only 100vw minus
   the vertical scrollbar - that gave the page a 7px horizontal scroll.
   overflow-x:clip on body did not help either: when html is overflow:visible
   the body value propagates up to the viewport, so body itself stays visible
   and nothing gets clipped.

   Widening the boxed inner container instead means the gallery is simply 100%
   of a full-width parent. No viewport units, so no scrollbar arithmetic to get
   wrong. Where :has() is unsupported the gallery just stays boxed - it still
   scrolls, it is only less wide. */
.e-con-inner:has(> .elementor-widget-image-gallery.noore-gal) {
	max-width: none !important;
	padding-left: 0 !important;
	padding-right: 0 !important;
}

/* Kill the float/percentage-width grid the WP gallery markup ships with. */
.noore-gal .elementor-image-gallery .gallery .gallery-item {
	flex: 0 0 auto !important;
	float: none !important;
	width: auto !important;
	max-width: none !important;
	margin: 0 !important;
	width: var(--noore-gal-u) !important;
	height: calc(var(--noore-gal-u) * .62);
	overflow: hidden;
}

.noore-gal .elementor-image-gallery .gallery .gallery-item .gallery-icon,
.noore-gal .elementor-image-gallery .gallery .gallery-item a {
	display: block;
	height: 100%;
	margin: 0;
}

.noore-gal .elementor-image-gallery .gallery .gallery-item img {
	width: 100% !important;
	height: 100% !important;
	object-fit: cover;
	display: block;
	border: 0 !important;
	transition: transform 1.2s cubic-bezier(.16,.62,.24,1);
}
.noore-gal .elementor-image-gallery .gallery .gallery-item:hover img { transform: scale(1.03); }

/* The rhythm is HEIGHT ONLY.

   Measured off the Aman gallery: every tile is the same width and they are all
   centred on one horizontal axis. Only the heights differ, 0.62x to 1.32x.

   Sized by CLASS, not :nth-child. The loop clones a whole set of tiles either
   side of the real one, which shifts every child index - index-based rules
   scrambled the heights the moment the clones landed. The script stamps
   .noore-t-s / -m / -l once and the clones carry it with them. */
.noore-gal .elementor-image-gallery .gallery .gallery-item.noore-t-s {
	height: calc(var(--noore-gal-u) * .62) !important;
}
.noore-gal .elementor-image-gallery .gallery .gallery-item.noore-t-m {
	height: var(--noore-gal-u) !important;
}
.noore-gal .elementor-image-gallery .gallery .gallery-item.noore-t-l {
	height: calc(var(--noore-gal-u) * 1.32) !important;
}

/* Size variants. Type these into Elementor -> Advanced -> CSS Classes on any
   Image Gallery widget:

     noore-gal            horizontal run, constant width, one centre axis
     noore-gal--loop      infinite loop (needs the script)
     noore-gal--home      +10% plates, tighter gap  - the homepage strip
     noore-gal--page      +20% plates, tighter gap  - the gallery page
     noore-gal--arrows    left / right arrows (needs the script)

   Base is clamp(190px, 18.5vw, 380px); the variants are that x1.10 and x1.20.
   Gap drops to roughly half, which pulls the run together instead of leaving
   the plates floating. */
.noore-gal--home .elementor-image-gallery .gallery {
	--noore-gal-u: clamp(209px, 20.4vw, 418px);
	--noore-gal-gap: clamp(12px, 1.8vw, 34px);
}
.noore-gal--page .elementor-image-gallery .gallery {
	--noore-gal-u: clamp(228px, 22.2vw, 456px);
	--noore-gal-gap: clamp(12px, 1.8vw, 34px);
}

/* Arrows - injected by the script, styled here. Round, matching the control
   language used everywhere else on the site. */
.noore-gal--arrows .elementor-image-gallery { position: relative; }
.noore-gal-arrow {
	position: absolute;
	top: 50%;
	transform: translateY(-50%);
	z-index: 3;
	width: 52px;
	height: 52px;
	border-radius: 999px;
	border: 0;
	background: rgba(255, 255, 255, .20);
	-webkit-backdrop-filter: blur(14px) saturate(120%);
	backdrop-filter: blur(14px) saturate(120%);
	/* No border, so a soft shadow separates it from the photo instead of a
	   hard edge. */
	box-shadow: 0 2px 14px rgba(30, 30, 30, .14);
	color: #ffffff;
	display: flex;
	align-items: center;
	justify-content: center;
	cursor: pointer;
	padding: 0;
	transition: background-color .28s ease, box-shadow .28s ease, opacity .28s ease;
}
.noore-gal-arrow:hover { background: rgba(255, 255, 255, .34); box-shadow: 0 3px 18px rgba(30, 30, 30, .20); }
.noore-gal-arrow:focus-visible { outline: 2px solid #B46841; outline-offset: 3px; }
.noore-gal-arrow--prev { left: clamp(8px, 1.4vw, 26px); }
.noore-gal-arrow--next { right: clamp(8px, 1.4vw, 26px); }
/* Drawn, not an icon font - nothing else here loads one. */
/* The chevron is two borders meeting at a corner, which is a hard point by
   default. Rounding the top-right corner rounds that apex, and 2px at 80% ink
   matches the softened arrows on the date picker. */
.noore-gal-arrow::before {
	content: "";
	width: 10px;
	height: 10px;
	border-top: 2px solid currentColor;
	border-right: 2px solid currentColor;
	border-top-right-radius: 3px;
}
.noore-gal-arrow--next::before { transform: translateX(-2px) rotate(45deg); }
.noore-gal-arrow--prev::before { transform: translateX(2px) rotate(-135deg); }
@media (max-width: 767px) { .noore-gal-arrow { display: none; } }

/* Fallback for the moment before the script runs, and if it never does. */
.noore-gal .elementor-image-gallery .gallery .gallery-item:nth-child(4n+2) {
	height: calc(var(--noore-gal-u) * 1.32);
}
.noore-gal .elementor-image-gallery .gallery .gallery-item:nth-child(4n+4) {
	height: var(--noore-gal-u);
}

.noore-gal .elementor-image-gallery .gallery.is-grabbing {
	cursor: grabbing;
}
.noore-gal .elementor-image-gallery .gallery.is-grabbing img { pointer-events: none; }

/* The min-height that used to sit here was a bug: it read
   var(--noore-gal-u) on .elementor-image-gallery, but that variable is
   declared on .gallery - its CHILD - and CSS variables only inherit
   downwards. So it always fell back to 380px and reserved 525.6px against
   436px of real content: 90px of dead space under every gallery.

   It is not needed at all. Every tile is centred on one axis now, so the flex
   track already sizes itself to the tallest tile. */

.noore-gal .elementor-image-gallery .gallery .gallery-caption { display: none; }
.noore-gal .elementor-image-gallery .gallery br { display: none; }

@media (max-width: 767px) {
	/* Measured at a 390px phone, 46vw gave 179px-wide plates - the short ones
	   came out 179x111, too small to show a room, and three fitted on screen
	   at once which reads as a contact sheet rather than a gallery. 62vw puts
	   it at roughly 242x150 short and 242x319 tall, about 1.6 plates in view. */
	.noore-gal .elementor-image-gallery .gallery {
		--noore-gal-u: clamp(200px, 62vw, 320px);
		--noore-gal-gap: 14px;
		--noore-gal-inset: 14px;
	}

	/* Dots are the only carousel control left on a phone - the arrows are
	   hidden - so the tap target has to be reachable even though the painted
	   dot stays 8px. */
	.slick-dots li,
	.swiper-pagination .swiper-pagination-bullet {
		min-width: 24px;
		min-height: 24px;
	}
	.slick-dots li button {
		margin: 8px auto;
	}
}

@media (prefers-reduced-motion: reduce) {
	.noore-gal .elementor-image-gallery .gallery { scroll-behavior: auto; }
	.noore-gal .elementor-image-gallery .gallery .gallery-item img { transition: none; }
	.noore-gal .elementor-image-gallery .gallery .gallery-item:hover img { transform: none; }
}


/* ==========================================================================
   Post card titles — near-black, not terracotta
   --------------------------------------------------------------------------
   h4.entry-title already computes to #1E1E1E, but the <a> inside it does not
   inherit that: bootstrap.css sets a plain `a { color: var(--swissresort-link-
   color) }`, which is #b46841. So every card title rendered terracotta while
   its own heading colour said otherwise.

   Only the title changes. The category label and READ MORE stay terracotta,
   which keeps the two-tone and stops the card reading as one block of orange.
   ========================================================================== */

.entry-title a,
h4.entry-title a {
	color: var(--swissresort-heading-color, #1E1E1E);
	transition: color .28s ease;
}

/* Still has to behave like a link. */
.entry-title a:hover,
.entry-title a:focus,
h4.entry-title a:hover,
h4.entry-title a:focus {
	color: #B46841;
}


/* ==========================================================================
   Carousel dots — one treatment across both slider libraries
   --------------------------------------------------------------------------
   The theme runs TWO carousel systems and they had drifted apart completely:

     Slick  (Rooms & Suites, post cards)  10x10  inactive rgba(18,34,35,.2)
                                                 active   #122223
     Swiper (Elementor hero carousel)      5x5   inactive rgba(255,255,255,.45)
                                                 active   #DDA380

   Twice the size and a different active colour. #122223 is also the old demo
   dark green, no longer in the palette at all.

   One rule now: 8px dots, warm grey #9A9D9F at 45% when inactive, brand
   terracotta #B46841 when active. That pair reads on the sand ground AND over
   photography, so the same two-tone holds everywhere. */

.slick-dots li button,
.swiper-pagination .swiper-pagination-bullet,
.elementor-pagination .swiper-pagination-bullet {
	width: 8px !important;
	height: 8px !important;
	border-radius: 999px !important;
	background-color: rgba(154, 157, 159, .45) !important;
	border: 0 !important;
	opacity: 1 !important;
	transition: background-color .28s ease, transform .28s ease;
}

.slick-dots li.slick-active button,
.swiper-pagination .swiper-pagination-bullet-active,
.elementor-pagination .swiper-pagination-bullet-active {
	background-color: #B46841 !important;
	transform: scale(1.15);
}

.slick-dots li button:hover,
.swiper-pagination .swiper-pagination-bullet:hover {
	background-color: rgba(180, 104, 65, .55) !important;
}

/* Slick draws its dot with a text glyph inside the button; it has to go or it
   prints on top of the background colour. */
.slick-dots li button::before {
	display: none !important;
}


/* ==========================================================================
   Room pages — stop the gallery slider dragging the page sideways
   --------------------------------------------------------------------------
   Found in a site-wide pass: every /book/<room>/ page scrolled horizontally by
   about 11,700px. The slick track measures 16,660px and its .slick-list was
   computing overflow:visible, so the whole filmstrip - including the cloned
   slides - counted toward document width.

   slick.css does declare .slick-list { overflow: hidden }, and it is the only
   rule matching the element with no inline override, yet it still resolved to
   visible. Rather than chase that, the value is pinned where it is needed.

   Scoped to .tour-detail-gallery on purpose: this was the only place the
   overflow appeared (home, rooms, gallery, about, faqs and contact all
   measured 0), and .widget-discover paints :before/:after over its own
   slick-list, so a blanket rule risks clipping those.

   Pre-existing theme behaviour, not caused by the child theme. */

.tour-detail-gallery .slick-list,
.tour-single-gallery .slick-list {
	overflow: hidden !important;
}


/* ==========================================================================
   Post cards — READ MORE, and the hover underline on titles
   --------------------------------------------------------------------------
   READ MORE on the cards is .btn-readmore, computing #B46841. Matching the
   title, which is already near-black, so the card reads as ink with the
   category label as the only terracotta accent. The arrow keeps the accent.

   The underline: template.css has

       .entry-title a:hover { text-decoration: underline; }

   with no text-decoration-thickness, so it resolves to `auto` and the browser
   scales the rule off the font. At a 30px title that lands very heavy, and
   heavier again zoomed or on a large screen. Replaced with a hairline clear
   of the descenders. */

.btn-readmore {
	color: var(--swissresort-heading-color, #1E1E1E);
	transition: color .28s ease;
}
.btn-readmore:hover,
.btn-readmore:focus {
	color: #B46841;
}

/* The arrow inherits. Its SVG paths are stroke="currentColor" and
   fill="currentColor", so colouring the svg was what kept it terracotta while
   the label went black - the whole control now reads as one colour. */

/* --------------------------------------------------------------------------
   Hover underlines, everywhere
   --------------------------------------------------------------------------
   The theme underlines links on hover without ever setting a thickness, so it
   resolves to `auto` and the browser scales the rule off the font size. On
   body copy that is invisible; on a 30px post title or a 44px room-card title
   it draws a slab across the words.

   Set globally rather than per selector - post titles, room cards, footer nav
   and anything added later all inherit one hairline. Only thickness and offset
   are set, so each underline keeps its own currentColor and stays readable on
   both the sand ground and over photography.
   -------------------------------------------------------------------------- */
a:hover,
a:focus,
.entry-title a:hover,
.entry-title a:focus,
.tour-item-style .title:hover,
.tour-item-style .title:focus,
.tour-item-style .title:hover a,
.tour-item-style .title:focus a {
	text-decoration-thickness: 1px !important;
	text-underline-offset: 6px !important;
}

/* Two reasons the first attempt missed the room cards.
   1. The theme hangs the hover on the HEADING, not the link:
        .tour-item-style .title:hover { text-decoration: underline; }
      so a rule written against a:hover was never in play.
   2. `text-decoration` is a shorthand, and it resets text-decoration-thickness
      back to `auto` wherever it appears. Any thickness declared at lower
      specificity therefore loses, which is why !important is here.
   At a 40px card title, `auto` is the slab. */


/* ==========================================================================
   Room card "BOOK NOW" disc — white glass
   --------------------------------------------------------------------------
   Was rgba(18, 34, 35, .5): #122223, the Swiss Resort demo dark green. Over
   warm wood at 50% it threw a green cast across the disc.

   Now the same white glass used for the header Call Us button, the booking
   bar and the footer nav pills, so every translucent control on the site is
   one material. */

.tour-item-style .direction,
.item-image .direction {
	background-color: rgba(255, 255, 255, .14);
	-webkit-backdrop-filter: blur(8px);
	backdrop-filter: blur(8px);
	border: 1px solid rgba(255, 255, 255, .22);
	color: #ffffff;
	/* NOT a transition shorthand here. The theme sets `transition: all 0.3s
	   ease-in-out` on this element, and the disc sits at scale(0)/opacity:0
	   until the card is hovered - that `all` is what animates it open.
	   Overriding the shorthand with a colour-only list killed the expand.
	   Only the colours are declared now; the theme transition stands. */
}

.tour-item-style:hover .direction,
.item-image:hover .direction {
	background-color: rgba(255, 255, 255, .22);
	border-color: rgba(255, 255, 255, .34);
}


/* ==========================================================================
   Blog archive hero — give it the background the Elementor heroes have
   --------------------------------------------------------------------------
   Every other inner page builds its hero in Elementor, so the background image
   and dark overlay live on the container. /blog/ cannot: it is the posts index,
   WordPress never renders that page content, and Elementor refuses to open post
   6540 at all - it redirects to the posts list. The hero there is emitted by the
   theme archive template instead.

   Result was a white title and white breadcrumb on the sand ground: present,
   correct, and almost invisible. Same image and overlay as the Gallery hero,
   applied by body class so it cannot leak onto a normal page.

   The header is made transparent here too, so Blog matches Gallery/About/
   Contact. It cannot come from page settings: Apus reads those from the
   current post ID, and the posts index has no singular post, so
   apus_page_header_transparent on page 6540 is never consulted and the body
   never gets the header_transparent class.

   Rather than invent a replacement, the rules below are the theme's own
   header_transparent rules from css/template.css (lines 2535, 2544, 2548)
   re-scoped to body.blog. Nothing new, so the header behaves exactly as it
   does on every other page - including the sticky state, which is excluded by
   the same :not(.fix-header) / :not(.sticky-header) guards the theme uses.
   The hero paints its own background image, so it reads correctly once the bar
   stops taking up flow space above it. */

body.blog .apus-header {
	background: transparent;
	position: absolute;
	top: 0;
	left: 0;
	width: 100%;
	z-index: 7;
}

body.blog:not(.fix-header) .main-sticky-header:not(.sticky-header) > .elementor-element:not(.no-transparent),
body.blog:not(.fix-header) .no_keep_header .elementor-element:not(.no-transparent) {
	background: transparent !important;
}

/* On the transparent pages the theme's own JS pushes #apus-header down by the
   height of the admin bar. That JS is gated on the header_transparent body
   class, which this page never gets - so without these two rules the logged-in
   wordmark sits underneath the admin bar and is clipped. The values are WP's
   admin bar heights, the same two the theme uses. Logged-out visitors are
   unaffected: no admin bar, so top stays 0. */
@media screen and (min-width: 783px) {
	body.admin-bar.blog #apus-header {
		top: 32px;
	}
}

@media screen and (max-width: 782px) {
	body.admin-bar.blog #apus-header {
		top: 46px;
	}
}

body.blog .e-con:has(.post-page-title) {
	background-image:
		linear-gradient(rgba(30, 30, 30, .42), rgba(30, 30, 30, .42)),
		url("https://noorestayphuket.com/wp-content/uploads/2024/01/Noore-Phuket-BR6.1.png");
	background-size: cover;
	background-position: center center;
	background-repeat: no-repeat;
}

/* Only the OUTERMOST container paints. Two nested containers both hold the
   title, so both matched :has() and each painted its own cover-sized copy at a
   different height - the image appeared in offset bands with visible seams.
   :has() cannot be nested, so the inner one is cleared explicitly instead.
   Same trap as the hero padding fix further up this file. */
body.blog .e-con:has(.post-page-title) .e-con,
body.blog .e-con:has(.post-page-title) .apus-breadscrumb {
	background-image: none;
}


/* Hero title, matched to the eight Elementor pages.

   Measured 30 Aug 2026: Blog rendered its title at 92px where About, Contact,
   Privacy and Booking all render 56px. Those pages draw the title from an
   Elementor breadcrumb widget which carries its own sizing
   (.elementor-36 ... .bread-title = 56 / 40 / 30). Blog has no such widget
   rule, so it fell through to the parent's own .bread-title ladder in
   css/template.css - 26px, 40px at 768, 92px at 1200.

   The three values below are that Elementor ladder copied field-for-field, not
   a new scale. The breakpoints are Elementor's (max-width), not the parent's
   (min-width), so the two ladders line up step for step. Below 768 this also
   closes a second, smaller gap: the parent gives 26px where the Elementor
   pages give 30px.

   body.blog .post-page-title .bread-title is (0,3,1) against the parent's
   (0,1,0), so it wins on specificity and needs no !important. */
body.blog .post-page-title .bread-title {
	font-size: 56px;
}

@media (max-width: 1024px) {
	body.blog .post-page-title .bread-title { font-size: 40px; }
}

@media (max-width: 767px) {
	body.blog .post-page-title .bread-title { font-size: 30px; }
}


/* ==========================================================================
   Blog archive — grid instead of a single stacked column
   --------------------------------------------------------------------------
   The archive prints each post as a full-width row inside .col-xl-12, so twelve
   posts meant twelve screens of scrolling with one 928px card at a time. There
   is no sidebar on this layout, so the whole width is available.

   Grid rather than flex so rows self-align: card heights vary with title
   length, and grid keeps images and excerpts on a common baseline without a
   fixed height cropping the text. */

/* The grid goes on .row, NOT on .col-xl-12. Each post has its own .col-xl-12
   wrapper, so targeting the wrapper made nine separate grids each holding one
   card - every card squeezed into its first column at 286px and stacked. .row
   is the shared parent of all nine.

   TWO columns, not three (client, 30 Aug 2026). At three the cards ran 284px
   wide and the renders were too small to read. */
body.blog .row:has(.post-layout) {
	display: grid !important;
	grid-template-columns: repeat(2, 1fr);
	gap: clamp(20px, 2.4vw, 40px);
	align-items: start;
	margin-left: 0;
	margin-right: 0;
}

body.blog .row:has(.post-layout) > [class*="col-"] {
	width: 100% !important;
	max-width: none !important;
	flex: none !important;
	padding-left: 0 !important;
	padding-right: 0 !important;
}

body.blog .post-layout {
	width: 100% !important;
	max-width: none !important;
	margin: 0 !important;
	float: none !important;
}

body.blog .post-layout .entry-title {
	font-size: clamp(18px, 1.5vw, 24px);
	line-height: 1.3;
}

body.blog .post-layout img {
	width: 100%;
	height: auto;
	display: block;
}

/* No 1024px step any more: it set two columns, which is now the base value, so
   the rule could never fire. One column on phones is the only break left. */
@media (max-width: 767px) {
	body.blog .row:has(.post-layout) {
		grid-template-columns: 1fr;
	}
}


/* ==========================================================================
   Search results - hero, matched to the Elementor pages
   --------------------------------------------------------------------------
   Search is the one screen that cannot use the Elementor hero the eight inner
   pages share. It is not a singular post, so the content of page 6302 is never
   rendered and its page settings are never read. What it does render is the
   theme hero, #apus-breadscrumb - which is fine, because it emits the same
   .bread-title heading and the same .breadcrumb list that the Elementor
   widgets do. Only the container is unstyled, so that is all this dresses.

   Values are copied off /gallery/, measured rather than guessed: 56px Aboreto
   in #F8F5F0, the same exterior-15 plate under the same .42 wash, and the same
   clamp() padding as the hero cap so it stays in proportion on every viewport.

   Category, date and 404 archives render no hero block at all. They cannot be
   reached from CSS - there is no element to style - so they are left alone.
   ========================================================================== */

body.search #apus-breadscrumb {
	background-image:
		linear-gradient(rgba(30, 30, 30, .42), rgba(30, 30, 30, .42)),
		url("https://noorestayphuket.com/wp-content/uploads/2026/08/noore-exterior-15.jpg");
	background-size: cover;
	background-position: center center;
	background-repeat: no-repeat;
	padding-top: clamp(80px, 18vh, 160px);
	padding-bottom: clamp(80px, 18vh, 160px);
	text-align: center;
}

body.search #apus-breadscrumb .bread-title {
	font-family: "Aboreto", serif;
	font-size: 56px;
	font-weight: 400;
	color: #F8F5F0;
	margin: 0;
}

body.search #apus-breadscrumb .breadcrumb {
	display: flex;
	justify-content: center;
	background: transparent;
	margin-bottom: 14px;
	padding: 0;
}

body.search #apus-breadscrumb .breadcrumb,
body.search #apus-breadscrumb .breadcrumb a,
body.search #apus-breadscrumb .breadcrumb .active {
	color: #ffffff;
	font-size: 17px;
}

/* Same transparent-header treatment as Blog, and for the same reason: the
   header_transparent body class is only set for singular posts. */
body.search .apus-header {
	background: transparent;
	position: absolute;
	top: 0;
	left: 0;
	width: 100%;
	z-index: 7;
}

body.search:not(.fix-header) .main-sticky-header:not(.sticky-header) > .elementor-element:not(.no-transparent),
body.search:not(.fix-header) .no_keep_header .elementor-element:not(.no-transparent) {
	background: transparent !important;
}

@media screen and (min-width: 783px) {
	body.admin-bar.search #apus-header { top: 32px; }
}

@media screen and (max-width: 782px) {
	body.admin-bar.search #apus-header { top: 46px; }
}

/* A search string can be long; 56px would overrun a phone. */
@media (max-width: 767px) {
	body.search #apus-breadscrumb .bread-title { font-size: clamp(28px, 8vw, 40px); }
}


/* Search results - the same two-up grid the archive gets.

   Search prints its results through .layout-posts-list, a plain block, so
   twelve results meant twelve full-width 1043px cards stacked down the page -
   the exact problem the archive grid above solves. It never inherited that fix
   because the fix is scoped body.blog.

   Different hook, though: Search has no .row wrapper. The articles are direct
   children of .layout-posts-list, so the grid goes straight on it. gap and
   align-items are the archive's values so both screens share one rhythm.
   Search keeps its sidebar, so the column runs 1043px and two cards land at
   roughly 500px each. */
body.search .layout-posts-list {
	display: grid;
	grid-template-columns: repeat(2, 1fr);
	gap: clamp(20px, 2.4vw, 40px);
	align-items: start;
}

@media (max-width: 767px) {
	body.search .layout-posts-list {
		grid-template-columns: 1fr;
	}
}


/* ==========================================================================
   Search inputs - pill, on both of them
   --------------------------------------------------------------------------
   There are TWO search widgets on this site and they share no markup:
   Blog's sidebar renders the Apus widget (.widget-search > .apus-search) and
   Search renders a Gutenberg block (.wp-block-search). Both shipped square -
   border-radius 0 on a 1px #E9E9E9 box - against a site whose controls are
   pills. Both get the same 999px here.

   The colour on the button is a BUG FIX, not a restyle: the block button
   painted #B46841 text on a #B46841 background, so the word "Search" was
   invisible. #fff is the same label colour .applyBtn already uses on the same
   terracotta.

   Scoped to the widget classes rather than body.blog / body.search so the
   treatment holds wherever either widget is placed - same reasoning as
   .noore-glass.

   Both block selectors carry the .wp-block-search ancestor deliberately. The
   parent writes .wp-block-search .wp-block-search__input (0,2,0) and
   .wp-block-search .wp-block-search__button, so a bare .wp-block-search__input
   (0,1,0) loses however late it loads - measured, first attempt did nothing.
   Matching the parent's specificity and loading after it wins with no
   !important. The Apus selector is already (0,2,0) and needed no change.
   ========================================================================== */

.widget-search .apus-search,
.wp-block-search .wp-block-search__input {
	border-radius: 999px;
	padding-left: 22px;
}

/* The parent paints this label var(--swissresort-link-color) - the same
   terracotta as its own background, so the word "Search" was invisible. */
.wp-block-search .wp-block-search__button {
	border-radius: 999px;
	color: #fff;
}


/* ==========================================================================
   Blog card excerpt, sidebar thumbs, tag pills
   --------------------------------------------------------------------------
   Three asks off the two-up archive, 30 Aug 2026.
   ========================================================================== */

/* Excerpt: SHORTER, not smaller.

   A previous pass dropped this to 14px; the client reverted that - the type
   size is right, there is simply too much of it. So the size stays at the
   theme's 16px/29.6px and the block is cut to two lines instead, with the
   browser adding its own ellipsis. (Three was tried first and was still too
   much copy - client, 30 Aug 2026.)

   line-clamp is the CSS half of this. The real fix is fewer WORDS out of the
   query, which is an excerpt-length filter in functions.php - that file cannot
   be saved through the Theme File Editor here, so it is a separate job. Until
   then this trims what is shown without touching the markup.

   -webkit-box is not legacy cruft: line-clamp still requires the old flexbox
   display and -webkit-box-orient in every shipping engine.

   The display has to be split across the two Bootstrap breakpoints, and this is
   why: the theme prints the excerpt TWICE, once as .description.d-none.d-xl-block
   and once as .description.d-block.d-xl-none, and lets Bootstrap show whichever
   suits the viewport. Bootstrap's display utilities all carry !important, so
   the clamp needs !important to beat them - but a blanket
   `display:-webkit-box !important` on .description also overrides the
   `display:none` on the copy that is meant to be hidden, and BOTH excerpts
   render. Measured: the mobile copy appeared under the clamped one.

   So the clamp properties sit on both copies (inert unless the box is
   -webkit-box) and only the display is switched, per breakpoint, on whichever
   copy Bootstrap is showing there. 1200px is Bootstrap's xl edge. */
body.blog .post-layout .description {
	-webkit-line-clamp: 2;
	line-clamp: 2;
	-webkit-box-orient: vertical;
	overflow: hidden;
}

@media (min-width: 1200px) {
	body.blog .post-layout .description.d-xl-block {
		display: -webkit-box !important;
	}
}

@media (max-width: 1199.98px) {
	body.blog .post-layout .description.d-xl-none {
		display: -webkit-box !important;
	}
}

/* Latest Post thumbs shipped square against a page of rounded cards. The
   parent already clips them at .posts-list .image (90x90, overflow hidden), so
   only the radius is missing. --noore-r-sm is the token this file already
   reserves for elements nested inside a card - reused, not re-invented. The
   img is rounded too: the wrapper's clip alone leaves square corners in
   browsers that paint the image above an overflow boundary. */
.widget_apus_recent_post .image {
	border-radius: var(--noore-r-sm);
	overflow: hidden;
}

.widget_apus_recent_post .image img {
	border-radius: var(--noore-r-sm);
}

/* Popular Tags: pill shape always, WHITE ONLY ON HOVER.

   Client, 30 Aug 2026: white is the hover state, not the resting one. An
   earlier pass painted every tag white at rest and that was wrong. The resting
   fill is therefore left to the parent (#F8F5F0) and only the label colour is
   set here - black, so a tag reads as text on the page rather than as a link.
   White arrives on hover and is the whole highlight; nothing else moves.

   .wp-block-tag-cloud .tag-cloud-link is (0,2,0) against the parent's
   .wp-block-tag-cloud a (0,1,1) - specificity, not !important, again. */
.wp-block-tag-cloud .tag-cloud-link,
.entry-tags-list .tag-cloud-link,
.tagcloud .tag-cloud-link {
	border-radius: 999px;
	color: var(--swissresort-text-color, #1E1E1E);
	transition: background .25s ease, color .25s ease;
}

.wp-block-tag-cloud .tag-cloud-link:hover,
.wp-block-tag-cloud .tag-cloud-link:focus-visible,
.entry-tags-list .tag-cloud-link:hover,
.tagcloud .tag-cloud-link:hover {
	background: #fff;
	color: var(--swissresort-text-color, #1E1E1E);
}


/* --------------------------------------------------------------------------
   11. HOME — "Rooms & Suites" card, restyled to the noore-v1 mockup

   Scoped to .elementor-element-a8ed070, the apus_element_booking_tours widget
   on Home (28). /rooms/ is moving to Grid 6, so nothing in here may touch a
   bare .tour-item-style or the two pages will fight over the same rules.

   "Grid 1" is not a variant class. The theme ships .tour-grid-v2 … v12 but no
   .tour-grid-v1 — Item Style 1 renders as the base .tour-item-style, which is
   already the live markup. So this is a restyle, not a template switch, and
   the widget own settings are untouched.

   Reference: staging.jittika.com/noore-v1 — .slide .meta / .price / .specs.
   Its :root tokens are the brand ones already in use here:
       ink #1E1E1E   terracotta #B46841   sand #DDA380   cream #FFF2EB

   FONT: the mockup sets the room title in Cormorant Garamond. That is the
   Swiss Resort *default* heading face, not a Nooré decision — see the header
   note at line 32 — and the site loads only Montserrat:300|Aboreto:400. The
   user chose to keep Aboreto, so only the colour, scale and case come across
   from the mockup, not the family.

   COLOUR SWAP: live has a terracotta title and an ink price. The mockup has it
   the other way round — ink title, terracotta price. Following the mockup.
   -------------------------------------------------------------------------- */

/* The content plate. Mockup uses --cream behind the meta block, not white.

   PADDING: none. The mockup .slide .meta carries 44px of horizontal inset,
   but that is 4.5% of its 980px stage; on a 350px grid cell it is 25% of the
   card and it broke everything. Measured at 1510px with the inset applied:
   the title overflowed its flex item by 70px (SUPERIOR ROOM painting over the
   price) and the spec row wrapped to two lines. Sweeping the value down, only
   8px or less cleared both. So the card keeps the theme own geometry —
   .tour-item-style .tour-content ships padding-top: 20px and no horizontal
   padding, which is why the copy sits flush with the image edge above it.

   Do not re-introduce a horizontal inset here while this is a 3-up grid. */
.elementor-element-a8ed070 .tour-item-style .tour-content {
	background: transparent;
	padding: 30px clamp(20px, 3vw, 44px) 24px;
}

/* TITLE SCALE — deliberately NOT taken from the mockup.

   The mockup sets .slide h3 to clamp(26px, 3.4vw, 42px), but its stage is a
   single 980px-wide slide. Here the same widget is a 3-up grid and each card
   is 350px, of which the nowrap price claims ~150px. At 42px "SUPERIOR ROOM"
   overflowed its shrunken flex item and painted straight over the price —
   the title and price CANNOT share a row at this column width.

   So the title keeps the theme own size and only takes the mockup colour.
   The mockup scale comes back if/when this section becomes the centre
   stage, where there is room for it. Do not re-add a font-size here while
   the widget is still a 3-up grid.

   The row also keeps the theme align-items:center; baseline alignment only
   earns its keep when the two sizes are far apart, which they no longer are. */
.elementor-element-a8ed070 .tour-item-style .title,
.elementor-element-a8ed070 .tour-item-style .title a {
	color: #1E1E1E;
	font-size: clamp(26px, 3.4vw, 42px);
	font-weight: 400;
	line-height: 1.15;
}

.elementor-element-a8ed070 .tour-item-style .tour_info_price,
.elementor-element-a8ed070 .tour-item-style .tour_info_price_new,
.elementor-element-a8ed070 .tour-item-style .tour_info_price .currency_amount,
.elementor-element-a8ed070 .tour-item-style .tour_info_price .currency_symbol {
	color: #B46841;
	font-size: 17px;
	font-weight: 500;
	letter-spacing: .06em;
	text-transform: uppercase;
	white-space: nowrap;
}

/* The spec row.
   Live renders four .item-detail-room, each an icon + label, wrapping into a
   2x2 block at 17px. The mockup runs them as ONE line of 11.5px small caps
   with a 4px sand dot between — no icons.

   The theme already ships this shape as .info-detail-room.st_circle, but that
   variant is a PHP template choice we cannot reach from CSS, and its dot is
   8px at opacity .1 against currentcolor. Rebuilt here to the mockup 4px
   solid sand instead of trying to borrow it. */
.elementor-element-a8ed070 .tour-item-style .info-detail-room {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 14px;
	margin-top: 14px;
	font-size: 11.5px;
	letter-spacing: .16em;
	text-transform: uppercase;
	color: rgba(30, 30, 30, .55);
}

.elementor-element-a8ed070 .tour-item-style .info-detail-room .item-detail-room {
	margin: 0;
	font-size: inherit;
	letter-spacing: inherit;
	color: inherit;
}

/* The flaticons are the 2x2 block whole visual language. The mockup has no
   icons at all, so they go — but the <i> also carries the theme 10px right
   margin, which would otherwise survive as a gap before each label. */
.elementor-element-a8ed070 .tour-item-style .info-detail-room .item-detail-room i {
	display: none;
}

.elementor-element-a8ed070 .tour-item-style .info-detail-room .item-detail-room + .item-detail-room::before {
	content: '';
	flex: 0 0 auto;
	width: 4px;
	height: 4px;
	border-radius: 999px;
	background: #DDA380;
	margin-right: 14px;
}


/* --------------------------------------------------------------------------
   12. HOME — "Rooms & Suites" as the noore-v1 centre stage

   The mockup rooms section is one large slide with a cropped, half-faded
   neighbour either side, glass arrows and dot pagination. Section 11 restyled
   the card; this makes the section that shape.

   HOW IT IS WIRED — read this before changing anything:

   The widget is now layout_type=carousel, limit=7, columns=3, show_nav=yes.
   Slick centre mode is NOT reachable from the widget own settings. The
   theme initSlick reads: if ( $(this).data('centermode') ) config.centerMode
   = true, and the only widget option that emits that attribute is Carousel
   Version "v1" — whose PHP template is MISSING in this build. Selecting v1
   makes the whole widget render nothing (the homepage lost 37KB and all seven
   cards). Do not select it.

   So the attribute is set instead by a tiny inline script in an Elementor
   html widget (id noorstg1) placed immediately AFTER the tours widget in
   container f939560. It runs at parse time, before the theme DOM-ready
   init, and stamps data-centermode="true" plus .noore-stage on the carousel.
   If the stage ever flattens to three equal cards, that widget is the first
   thing to check.

   Values are the mockup own .peek / .slide / .arrow / .thumbs rules.
   -------------------------------------------------------------------------- */

/* Flanking slides: cropped shorter, half faded, image only. */
.elementor-element-a8ed070 .noore-stage .slick-slide .image-wrapper img {
	height: clamp(200px, 27vw, 380px);
	width: 100%;
	object-fit: cover;
}

/* The fade goes on the IMAGE, not on .tour-item-style.

   Two reasons. First, it is what the mockup does — .peek img { opacity:.5 },
   the card copy is never faded. Second, and the reason this is written down:
   opacity on .tour-item-style CANNOT BE OVERRIDDEN here. Measured on the live
   page, a later rule at higher specificity did nothing, and neither did
   opacity: 1 !important; it stayed pinned at .5 with no CSS animation on
   the element (animationName: none). Whatever holds it, an override does not
   win — so the first version of this block faded the centre card title,
   price and specs to 50% as well. Fade the img and the problem disappears. */
.elementor-element-a8ed070 .noore-stage .slick-slide .image-wrapper img {
	opacity: .5;
	transition: opacity .35s ease-in-out;
}

.elementor-element-a8ed070 .noore-stage .slick-slide:not(.slick-center) .tour-content {
	display: none;
}

/* The stage itself. */
.elementor-element-a8ed070 .noore-stage .slick-slide.slick-center .image-wrapper img {
	height: clamp(260px, 34vw, 480px);
	opacity: 1;
}

/* Arrows: none. The mockup has them, but the user asked for dot navigation
   only, so show_nav is off on the widget AND arrows:false is passed to slick
   by the inline script. Both, deliberately — the widget setting stops the
   markup being emitted, the slick option stops slick re-adding it. The
   styling that used to live here has been deleted rather than left dead. */

/* Dots — mockup uses a terracotta 26px pill for the active one. The theme
   ships 10px circles in #122223 with a rotated square ring on .slick-active;
   the ring is switched off so the pill reads cleanly. */
/* Dots sit closer to the card. The theme ships .slick-carousel .slick-dots
   { padding: 1.875rem 0 0 } = 30px; halved to 15px on the client request.
   That is one of the three parts of the ~104px gap under BOOK NOW — the other
   two are the card own 24px padding-bottom and, the big one, roughly 50px of
   slick equal-height slack, since slick sizes every slide to the tallest card. */
.elementor-element-a8ed070 .noore-stage .slick-dots {
	padding-top: 15px;
}

.elementor-element-a8ed070 .noore-stage .slick-dots li {
	border-color: transparent !important;
	padding: 0;
	margin: 0 4.5px;
}

.elementor-element-a8ed070 .noore-stage .slick-dots li::before {
	display: none;
}

/* !important is deliberate here, not reflex. Elementor per-page sheet
   post-28.css carries the kit globals at
   .elementor-28 .elementor-element.elementor-element-a8ed070 .slick-carousel
   .slick-dots li button — six classes, and it loads after the child theme.
   It paints every idle dot with --e-global-color-primary (the terracotta) and
   the active one with --e-global-color-accent, which is the exact inverse of
   the mockup. Nothing short of !important reaches it. */
.elementor-element-a8ed070 .noore-stage .slick-dots li button {
	width: 8px !important;
	height: 8px !important;
	border-radius: 999px !important;
	background: rgba(30, 30, 30, .22) !important;
}

.elementor-element-a8ed070 .noore-stage .slick-dots li.slick-active button {
	width: 26px !important;
	background: #B46841 !important;
}


/* --------------------------------------------------------------------------
   13. Bootstrap red -> Nooré burnt umber

   The parent hardcodes #dc3545 — Bootstrap "danger" red — in 37 rules across
   template.css. Like #122223 in section 9, it is NOT wired to the Customizer,
   so no Theme Colors edit reaches it. It is most visible on the off-canvas
   menu, where "X CLOSE" sat in pillar-box red above an ink panel and read as
   an error state rather than a control.

   Replaced site-wide with #6E260E, burnt umber.

   Scope note: only #dc3545 is remapped. The other reds in the parent are left
   alone deliberately — #bd081c is Pinterest brand colour, #cf2e2e is a
   WordPress block-palette entry, and the rest sit on components this build
   does not use. "Any red" means the theme red, not a third party's.

   Selectors are mirrored from the parent one-for-one, so this survives a
   parent update: if a rule moves, the override stops matching rather than
   painting the wrong element.
   -------------------------------------------------------------------------- */

/* color — 24 rules */
.select2-container--default.select2-container .select2-selection--single .select2-selection__clear,
.ajax-pagination .apus-loadmore-btn.hidden + .apus-allproducts,
.btn-outline.btn-danger,
.btn-inverse.btn-danger:hover,
.logged-in-wrapper .button,
.close-text,
.close-sidebar-btn:active, .close-sidebar-btn:hover,
.close-sidebar-btn,
.wrapper-top-cart > .dropdown-menu-right .widget_shopping_cart_heading > h3,
.megamenu .dropdown-menu .text-label.label-hot,
.mobile-vertical-menu .text-label.label-hot,
.close-action:hover, .close-action:focus,
.main-mobile-menu .text-label.label-hot,
.inner-dashboard aside.sidebar .close-sidebar-btn:hover, .inner-dashboard aside.sidebar .close-sidebar-btn:focus,
.entry-vote.vote-perfect .entry-vote-inner,
.form-theme #cancel-comment-reply-link, form.wpcf7-form #cancel-comment-reply-link, .comment-form #cancel-comment-reply-link,
.commentlist #cancel-comment-reply-link, .comment-list #cancel-comment-reply-link,
.commentlist .comment-edit-link, .comment-list .comment-edit-link,
.logged-in-as a + a,
.comment-reply-title #cancel-comment-reply-link,
.header-notice-wrapper .header-notice-dismiss-btn:hover, .header-notice-wrapper .header-notice-dismiss-btn:focus,
.contant-info .media:hover .fa,
.popupnewsletter-wrapper .close-dont-show:hover, .popupnewsletter-wrapper .close-dont-show:focus,
.form-login-register-inner .close-magnific-popup:hover, .form-login-register-inner .close-magnific-popup:focus {
	color: #6E260E;
}

/* background — 6 rules */
.apus-results .apus-results-reset,
.btn-outline.btn-danger:hover,
.megamenu > li > a > .text-label.label-hot,
.mm-menu .mm-listview > li > a .text-label.label-hot,
.post-layout .post-sticky,
.popupnewsletter-wrapper .apus-mfp-close {
	background: #6E260E;
}

/* background-color — 2 rules */
.wrapper-tab-account .close-advance-popup:hover, .wrapper-tab-account .close-advance-popup:focus,
.daterangepicker .cancelBtn {
	background-color: #6E260E;
}

/* border-color — 5 rules */
.btn-outline.btn-danger,
.btn-outline.btn-danger:hover,
.megamenu > li > a > .text-label.label-hot:before,
.mm-menu .mm-listview > li > a .text-label.label-hot:before,
.contant-info .media:hover .fa {
	border-color: #6E260E;
}


/* --------------------------------------------------------------------------
   14. Footer nav weight — pinned, so it stops depending on which fonts a
       page happens to load

   Symptom: the footer nav read as bold on Home and light on every other page.

   Cause, measured: the nav is set to font-weight: 600 by the FOOTER template
   itself (post-2278.css, .elementor-element-e5a7b2b .widget-content a), so the
   declaration is identical site-wide. What differs is the font. Elementor
   enqueues Google fonts per page, from the widgets that page contains:

       /home/   -> Roboto | Roboto Slab | Montserrat 100..900
       /about/  -> Roboto | Roboto Slab | Cormorant Garamond 100..900

   The theme itself only ever loads Montserrat:300. So on Home the full
   family is present and 600 resolves to a real SemiBold; everywhere else the
   only Montserrat face is 300 and 600 falls back to it. Home was rendering
   the CSS correctly — the other pages were accidentally light.

   Fix: pin the weight to 300, which is what the other pages already show and
   what the user asked Home to match. Pinning also removes the dependency on
   incidental font loading, so this cannot drift again when a widget is added
   or removed from a page.

   !important is required: post-2278.css is Elementor per-page sheet and
   loads after the child theme at (0,4,1).

   NOTE: the same split affects every Montserrat 500/600 element on Home
   versus the rest of the site — this rule only pins the footer nav, which is
   what was reported. If other elements look heavier on Home, this is why.
   -------------------------------------------------------------------------- */

.elementor-element-e5a7b2b .widget-content a {
	font-weight: 300 !important;
}

/* No card, no plate, no inset outline — the stage is a photo over the page.

   Three corrections, all from the same misreading on my part:

   1. THE CREAM PLATE WAS WRONG. The mockup sets .slide .meta { background:
      var(--cream) } — but it also sets body { background: var(--cream) }.
      Same colour. In the mockup the meta is flush with the page and reads as
      no box at all. Painting #FFF2EB onto this site, whose page is a different
      off-white, invented a pink card the mockup never had. Transparent now.

   2. NO CARD CHROME. Section 1 gives every .tour-item-style a white fill, a
      radius and a shadow. Under the stage that framed the copy in a floating
      card. Stripped here; the photo keeps its own corners because section 1
      rounds .item-image / .tour-image separately, so overflow: visible on
      the card does not square them off.

   3. THE WHITE INNER BORDER. The parent draws
      outline: 1px solid rgba(255,255,255,.2) at outline-offset: -20px on
      .image-wrapper, which is the hairline box floating inside every photo,
      plus a hover that pulls it to -15px. Both off.
   -------------------------------------------------------------------------- */

.elementor-element-a8ed070 .noore-stage .slick-slide .tour-item-style {
	background: transparent;
	box-shadow: none;
	overflow: visible;
}

.elementor-element-a8ed070 .noore-stage .image-wrapper,
.elementor-element-a8ed070 .noore-stage .image-wrapper:hover {
	outline: none;
}


/* --------------------------------------------------------------------------
   Stage arrows — the gallery glass disc, reused

   The client asked for arrows back, in the same material as the gallery page.
   These are the .noore-gal-arrow values copied field-for-field: 52px, 20% white
   fill, blur(14px) saturate(120%), and a soft shadow instead of a border so the
   disc separates from the photo without a hard edge. Chevron drawn from two
   borders with a rounded apex — nothing here loads an icon font.

   Markup comes from the inline script prevArrow / nextArrow templates, not
   from the theme: show_nav stays OFF on the widget so the theme never emits
   its own 80px outlined arrows, and slick builds these instead.

   POSITION. Horizontally on the seam between sliver and stage, as the mockup
   has them (its own arrows sit at +/-490px, half of the 980px slide). 516px =
   490 + 26, so the disc is centred on the seam rather than tangent to it. The
   max() floor keeps them inside the viewport once the stage stops being
   980px wide, falling back to the gallery own inset.

   Vertically on the middle of the PHOTO, not the slide — the slide includes
   the copy underneath, so top: 50% would drop them level with the excerpt.
   clamp(130px,17vw,240px) is exactly half of the centre image
   clamp(260px,34vw,480px), so it tracks the image at every width.

   The explicit transition list is deliberate and matches .noore-gal-arrow. The
   theme puts transition: all 0.3s on .slick-arrow; nothing on these discs
   depends on all, so naming the three properties is safe here.
   -------------------------------------------------------------------------- */

.elementor-element-a8ed070 .noore-stage .slick-arrow {
	position: absolute;
	top: clamp(130px, 17vw, 240px);
	transform: translateY(-50%);
	z-index: 3;
	width: 52px;
	height: 52px;
	border-radius: 999px;
	border: 0;
	background: rgba(255, 255, 255, .20);
	-webkit-backdrop-filter: blur(14px) saturate(120%);
	backdrop-filter: blur(14px) saturate(120%);
	box-shadow: 0 2px 14px rgba(30, 30, 30, .14);
	color: #ffffff;
	display: flex;
	align-items: center;
	justify-content: center;
	cursor: pointer;
	padding: 0;
	font-size: 0;
	transition: background-color .28s ease, box-shadow .28s ease, opacity .28s ease;
}

/* !important, deliberately. Elementor per-page sheet carries the widget kit
   button colours at
   .elementor-28 .elementor-element.elementor-element-a8ed070 .slick-carousel
   .slick-arrow:hover { background: var(--e-global-color-1720889) } — five
   classes, loading after the child theme. It painted the disc SOLID on hover,
   which defeats the whole point of a glass control. The base state was never
   affected, only :hover and :focus, which is why it only showed on interaction.
   Same trap as the dots in section 12. */
.elementor-element-a8ed070 .noore-stage .slick-arrow:hover,
.elementor-element-a8ed070 .noore-stage .slick-arrow:focus {
	background: rgba(255, 255, 255, .34) !important;
	box-shadow: 0 3px 18px rgba(30, 30, 30, .20);
	color: #ffffff;
	border-color: transparent;
}

.elementor-element-a8ed070 .noore-stage .slick-arrow:focus-visible {
	outline: 2px solid #B46841;
	outline-offset: 3px;
}

.elementor-element-a8ed070 .noore-stage .slick-prev {
	left: max(clamp(8px, 1.4vw, 26px), calc(50% - 516px));
	right: auto;
}

.elementor-element-a8ed070 .noore-stage .slick-next {
	right: max(clamp(8px, 1.4vw, 26px), calc(50% - 516px));
	left: auto;
}

.elementor-element-a8ed070 .noore-stage .slick-arrow::before {
	content: "";
	width: 10px;
	height: 10px;
	border-top: 2px solid currentColor;
	border-right: 2px solid currentColor;
	border-top-right-radius: 3px;
	opacity: 1;
}

.elementor-element-a8ed070 .noore-stage .slick-next::before {
	transform: translateX(-2px) rotate(45deg);
}

.elementor-element-a8ed070 .noore-stage .slick-prev::before {
	transform: translateX(2px) rotate(-135deg);
}


/* --------------------------------------------------------------------------
   15. The last of the Swissresort green

   Section 9 remapped #122223 on the parent theme own surfaces, but two kinds
   of element were out of its reach and kept the demo green. Both found by
   sweeping every element COMPUTED colour for rgb(18, 34, 35) across all nine
   public pages — not by grepping stylesheets, which is what let them survive
   the first pass.

   1. ELEMENTOR BUTTON LABELS. Elementor writes the colour per widget into its
      per-page sheet, e.g.
      .elementor-28 .elementor-element.elementor-element-28fef90
       .elementor-button { color: rgb(18,34,35) }
      That is (0,3,0) and loads after the child theme, so !important is
      required. Seven buttons carry it site-wide; they are listed individually
      rather than blanket-styling .elementor-button because the header
      "Call Us" is legitimately #fff and a broad rule would black it out.

      Pinning here rather than fixing it in Elementor is deliberate — see the
      note in section 9 about colour settings silently reverting on save.

   2. THE PLAY-VIDEO DISC. .popup-video was simply not in section 9 list.
      It carried rgba(18,34,35,.5) — the exact value the room-card BOOK NOW
      disc had before it became white glass. Converted to the same material,
      so every translucent control on the site is one thing: the BOOK NOW disc,
      the carousel arrows, Call Us, the booking bar and the footer pills.

      NOT a transition shorthand, for the same reason as the BOOK NOW disc:
      the theme animates this control with transition: all, and replacing it
      with a colour-only list kills the animation. Colours only.
   -------------------------------------------------------------------------- */

.elementor-28 .elementor-element.elementor-element-28fef90 .elementor-button,
.elementor-28 .elementor-element.elementor-element-45df2f6 .elementor-button,
.elementor-28 .elementor-element.elementor-element-9d139d4 .elementor-button,
.elementor-28 .elementor-element.elementor-element-5e25d24 .elementor-button,
.elementor-36 .elementor-element.elementor-element-74dee2b .elementor-button,
.elementor-273 .elementor-element.elementor-element-e700f37 .elementor-button,
/* Added 30 Aug 2026 after a QA sweep of computed colours. A new "SEE ALL
   ROOMS" button was rolled out across Home, Blogs, Gallery and FAQs and it
   arrived carrying the theme default rgb(18,34,35) — the same demo green this
   list exists to kill. Three widget ids, not four: Home and Blogs share one.
   About, Terms, Privacy, Rooms, Contact and single posts were checked and are
   clean. */
.elementor-28 .elementor-element.elementor-element-34ee2c3 .elementor-button,
.elementor-273 .elementor-element.elementor-element-34ee2c3 .elementor-button,
.elementor-5519 .elementor-element.elementor-element-a86a2f9 .elementor-button,
.elementor-41 .elementor-element.elementor-element-e7e45d5 .elementor-button {
	color: #1E1E1E !important;
}

.popup-video {
	background-color: rgba(255, 255, 255, .14);
	-webkit-backdrop-filter: blur(8px);
	backdrop-filter: blur(8px);
	border: 1px solid rgba(255, 255, 255, .22);
	color: #ffffff;
}

.popup-video:hover,
.popup-video:focus {
	background-color: rgba(255, 255, 255, .22);
	border-color: rgba(255, 255, 255, .34);
	color: #ffffff;
}

/* Two more, found only after re-sweeping with PSEUDO-ELEMENTS included. The
   first pass read element backgrounds only, which is why the play disc came
   back "fixed" while still visibly two-tone.

   1. .popup-video::before is an 84px ring at z-index:-1 running
      animation: scaleicon 2s infinite — the pulse behind the disc. It was
      still rgba(18,34,35,.3), and because the disc above it is now translucent
      white, the green read straight through it. That is the two-tone. Given
      the same .14 white as the disc, so the pulse is literally the same
      material expanding outward rather than a second colour.

   2. .add-fix-top — the back-to-top control, on EVERY page — was
      rgba(18,34,35,.5). It is hidden until you scroll, so an element sweep
      that skips offsetParent === null never sees it. Worth remembering.

      This one goes to INK, not white glass, and the difference is deliberate:
      the play disc sits over photography, where white glass reads; the
      back-to-top sits over the cream page, where white glass would disappear.
      rgba(30,30,30,.5) is the exact ink equivalent of the .5 alpha it had. */

.popup-video::before {
	background-color: rgba(255, 255, 255, .14);
}


/* Play mark - hairline triangle, replacing the icon-font glyph.

   The theme prints <i class="flaticon-play"> and its Flaticon webfont draws
   that glyph (U+F10D) as a fat, round-cornered outline. Client rejected it,
   30 Aug 2026, and picked a 1.0 hairline from a side-by-side.

   Drawn as an SVG MASK rather than swapping in another font character, for two
   reasons: the stroke weight becomes a number we control instead of whatever
   the font shipped, and the corners are mitred rather than rounded - the round
   joins were most of what made the original look heavy. Masking with
   currentColor keeps the glyph's inherit-the-disc-colour behaviour, so hover
   and any later colour change still work with no extra rule.

   Scoped to .popup-video so the rest of the Flaticon set is untouched, and
   (0,2,0) against the parent's .flaticon-play::before (0,1,0) - specificity,
   no !important.

   margin-left is optical centring: a triangle's visual mass sits left of its
   bounding box, so it needs a nudge right to look centred inside a circle. */
/* Centring. The theme wraps the icon in <span class="popup-video-inner">, and
   that span is a text box: its line-height reserved a 41px line, so the mark
   sat in the TOP of the box and rode high in the disc. Measured. Making the
   wrapper and the <i> flex boxes with no leading puts the mark on the disc's
   real centre instead of on a text baseline. */
.popup-video .popup-video-inner,
.popup-video .flaticon-play {
	display: flex;
	align-items: center;
	justify-content: center;
	line-height: 0;
}

/* 26px box against a 26-unit viewBox, so stroke-width 1 renders as exactly ONE
   CSS pixel. The previous pass drew the same stroke into a 34px box off a
   30-unit viewBox, which scaled the line up to ~1.13px and read thicker than
   asked for. Smaller mark, true hairline. */
.popup-video .flaticon-play::before {
	content: "";
	display: block;
	width: 26px;
	height: 26px;
	margin-left: 2px;
	background-color: currentColor;
	-webkit-mask: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 26 26"><path d="M10 7.5 L20 13 L10 18.5 Z" fill="none" stroke="black" stroke-width="1" stroke-linejoin="miter"/></svg>') center / contain no-repeat;
	mask: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 26 26"><path d="M10 7.5 L20 13 L10 18.5 Z" fill="none" stroke="black" stroke-width="1" stroke-linejoin="miter"/></svg>') center / contain no-repeat;
}

.add-fix-top {
	background-color: rgba(30, 30, 30, .5);
}

/* The last one: the Contact "Location" panel.

   A full-width Elementor container (1531x570) holding KATHU, PHUKET / Location
   / the address, painted #122223 by post-38.css at
   .elementor-38 .elementor-element.elementor-element-34fc6f0
    :not(.elementor-motion-effects-element-type-background) — (0,4,0), after
   the child theme, so !important is required.

   Left until last on purpose: repainting a whole section background is a
   larger visual call than a control or a label, so it was put to the client
   separately rather than swept up with the rest. Approved 30 Aug 2026.

   This is a solid surface, so it takes the flat ink #1E1E1E — the same
   mapping section 9 applies to every other Swissresort dark surface. The
   translucent controls are the ones that became white glass; a background
   panel is not a control. */

/* ⚠️ DEAD as of the Contact rebuild (30 Aug 2026): container 34fc6f0 no longer
   exists — Contact was rebuilt as the split-plate layout in section 17 and the
   whole page is ink now, so the panel it repainted is gone. Kept rather than
   deleted because the reasoning above still documents the #122223 → #1E1E1E
   mapping; delete the rule itself whenever this file is next tidied. */
.elementor-38 .elementor-element.elementor-element-34fc6f0:not(.elementor-motion-effects-element-type-background) {
	background-color: #1E1E1E !important;
}


/* ==========================================================================
   17. THE SPLIT-PLATE LAYOUT — Contact (38) and About (36)
   --------------------------------------------------------------------------
   Mock B, approved 30 Aug 2026. The page is a two-column split: a sticky
   photographic plate on the left that changes as you scroll, and a scrolling
   column on the right carrying intro / direct lines / enquiry / finding us.

   EVERY rule here is scoped to :is(.elementor-36, .elementor-38) — Contact and
   About share this system. That is not tidiness, it is the
   only way these values survive: Elementor's own style settings silently
   revert on save on this install, so colour and type have to live in CSS.
   Content stays in real Elementor widgets so it is all editable in the editor
   — this file only dresses it.

   The palette is the brand inverted: ink ground, cream type, terracotta for
   labels and the one solid control. Same four colours as everywhere else.
   ========================================================================== */

:is(.elementor-36, .elementor-38) {
	--c-ink: #1E1E1E;
	--c-cream: #FFF2EB;
	--c-line: rgba(255, 242, 235, .14);
	--c-muted: rgba(255, 242, 235, .55);
	background: var(--c-ink);
	color: var(--c-cream);
}

/* The page header is gone on this page, so the sticky plate can start at the
   very top of the viewport. */
:is(.elementor-36, .elementor-38) .noore-split {
	display: grid;
	grid-template-columns: 44% 56%;
	gap: 0;
}

/* ---- left: the plate -------------------------------------------------- */

:is(.elementor-36, .elementor-38) .noore-plate {
	position: sticky;
	top: 0;
	height: 100vh;
	overflow: hidden;
	background: #000;
	display: block;
}

/* Every photo is stacked in the same box. Only the one carrying .on is
   visible; the IntersectionObserver in the plate's HTML widget moves that
   class as you scroll. Opacity rather than display so the crossfade can run,
   and the slow scale is what stops a static photo feeling like a dead panel. */
:is(.elementor-36, .elementor-38) .noore-plate-img {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	opacity: 0;
	transition: opacity 1.1s ease, transform 6s ease;
	transform: scale(1.06);
	pointer-events: none;
}
:is(.elementor-36, .elementor-38) .noore-plate-img.on {
	opacity: 1;
	transform: scale(1);
}
:is(.elementor-36, .elementor-38) .noore-plate-img .elementor-widget-container,
:is(.elementor-36, .elementor-38) .noore-plate-img figure,
:is(.elementor-36, .elementor-38) .noore-plate-img img {
	width: 100%;
	height: 100%;
	margin: 0;
}
:is(.elementor-36, .elementor-38) .noore-plate-img img {
	object-fit: cover;
	display: block;
}

/* A wash over the photograph so cream captions stay legible on any of the
   four, including the bright exterior. */
:is(.elementor-36, .elementor-38) .noore-plate::after {
	content: "";
	position: absolute;
	inset: 0;
	z-index: 1;
	pointer-events: none;
	background: linear-gradient(180deg, rgba(23, 23, 23, .55) 0%, rgba(23, 23, 23, .15) 40%, rgba(23, 23, 23, .8) 100%);
}

:is(.elementor-36, .elementor-38) .noore-cap {
	position: absolute;
	left: 34px;
	bottom: 34px;
	z-index: 2;
	margin: 0;
	opacity: 0;
	transition: opacity .6s ease;
}
:is(.elementor-36, .elementor-38) .noore-cap.on { opacity: 1; }
:is(.elementor-36, .elementor-38) .noore-cap .elementor-heading-title {
	font-family: var(--swissresort-main-font, sans-serif);
	font-size: 11px;
	letter-spacing: .2em;
	text-transform: uppercase;
	font-weight: 500;
	color: var(--c-muted);
}

/* The script-only widget must not occupy space. */
:is(.elementor-36, .elementor-38) .noore-plate-js { display: none; }

/* Fallback: until the plate script has run — and permanently if it never does,
   because a blocked or deferred script would otherwise leave a black panel —
   the first photograph shows. The script adds .noore-plate-ready as its first
   act, which hands control over to the .on class. */
:is(.elementor-36, .elementor-38) .noore-plate:not(.noore-plate-ready) .noore-plate-1,
:is(.elementor-36, .elementor-38) .noore-plate:not(.noore-plate-ready) .noore-cap-1 {
	opacity: 1;
	transform: none;
}

/* ---- right: the column ------------------------------------------------ */

/* The right-hand column is SAND, not ink (client, 30 Aug 2026). Sand on this
   project is #F8F5F0 — the brandbook's warm off-white, per the note in section
   6; it is NOT #DDA380, which is Accent.

   The three variables below are ROLES, not literal colours: --c-cream is the
   foreground, --c-muted the secondary text, --c-line the hairline. Redefining
   the three here flips every rule in this section from cream-on-ink to
   ink-on-sand without touching them individually. The plate keeps the original
   values because it sits outside this column.

   Four things do not follow from the variables and are corrected below: the
   date picker icon, the select drop-down list, the ghost button whose hover
   swapped two values that are now both ink, and the .noore-ln-v link hover,
   which was pinned to #fff and vanished on sand. */
:is(.elementor-36, .elementor-38) .noore-col {
	--c-cream: #1E1E1E;
	--c-muted: rgba(30, 30, 30, .58);
	--c-line: rgba(30, 30, 30, .12);
	background: #F8F5F0;
	color: #1E1E1E;
	padding: 0 clamp(40px, 6vw, 96px);
	display: block;
}

:is(.elementor-36, .elementor-38) .noore-blk {
	padding: 96px 0;
	border-bottom: 1px solid var(--c-line);
	display: block;
}
:is(.elementor-36, .elementor-38) .noore-blk:last-child { border-bottom: 0; }

/* The first block is full height so the split reads as a whole screen on
   arrival rather than as a band with something underneath it. */
:is(.elementor-36, .elementor-38) .noore-intro {
	min-height: 100vh;
	display: flex;
	flex-direction: column;
	justify-content: center;
	padding-block: 120px;
}

:is(.elementor-36, .elementor-38) .noore-eyebrow .elementor-heading-title {
	font-family: var(--swissresort-main-font, sans-serif);
	font-size: 10.5px;
	letter-spacing: .24em;
	text-transform: uppercase;
	font-weight: 500;
	color: var(--swissresort-theme-color, #B46841);
}
/* Vertical rhythm. Three steps, used everywhere in this section so the four
   blocks scan identically:

     eyebrow -> title      16px   they are one unit, kept close deliberately
     title   -> content    48px   the breathing room between a heading and its
                                  body; Aboreto is caps-only with a tall cap
                                  height and almost no descender, so a heading
                                  with no bottom margin sits ON the next rule —
                                  which is exactly what it was doing
     row     -> row        26px   inside the hairline lists

   The h1 carries no bottom margin because the lede under it sets its own.

   Two things about HOW these are written, both required rather than stylistic:

   1. The property is margin-block-end, not margin-bottom. Elementor kills
      widget spacing inside containers with
      `.e-con .elementor-widget.elementor-widget { margin-block-end: 0 }` and a
      margin-bottom declaration loses to it on the cascade even at equal
      specificity.
   2. The selectors carry .elementor-widget so they reach (0,4,0) against that
      rule's (0,3,0). Measured: without it every gap below computed to 0px and
      the headings sat directly on the next hairline. */
:is(.elementor-36, .elementor-38) .noore-col .noore-eyebrow.elementor-widget { margin-block-end: 16px; }
:is(.elementor-36, .elementor-38) .noore-col .noore-h1.elementor-widget { margin-block-end: 0; }
:is(.elementor-36, .elementor-38) .noore-col .noore-h2.elementor-widget { margin-block-end: 48px; }

:is(.elementor-36, .elementor-38) .noore-h1 .elementor-heading-title {
	font-family: var(--swissresort-heading-font, serif);
	font-size: clamp(40px, 5.2vw, 72px);
	line-height: 1.12;
	color: var(--c-cream);
}
:is(.elementor-36, .elementor-38) .noore-h2 .elementor-heading-title {
	font-family: var(--swissresort-heading-font, serif);
	font-size: clamp(30px, 3.6vw, 46px);
	line-height: 1.12;
	color: var(--c-cream);
}
:is(.elementor-36, .elementor-38) .noore-lede {
	color: var(--c-muted);
	max-width: 46ch;
	margin-top: 30px;
	font-size: 16.5px;
	line-height: 1.8;
}

/* ---- direct lines: hairline rows, not cards --------------------------- */

:is(.elementor-36, .elementor-38) .noore-line {
	display: grid;
	grid-template-columns: 92px 1fr auto;
	align-items: baseline;
	gap: 20px;
	padding: 26px 0;
	border-top: 1px solid var(--c-line);
	transition: padding-left .35s ease;
}
:is(.elementor-36, .elementor-38) .noore-lines .noore-line:last-of-type { border-bottom: 1px solid var(--c-line); }
:is(.elementor-36, .elementor-38) .noore-line:hover { padding-left: 12px; }
:is(.elementor-36, .elementor-38) .noore-line > .elementor-widget { margin: 0; }

:is(.elementor-36, .elementor-38) .noore-ln-k .elementor-heading-title {
	font-family: var(--swissresort-main-font, sans-serif);
	font-size: 10.5px;
	letter-spacing: .2em;
	text-transform: uppercase;
	font-weight: 500;
	color: var(--swissresort-theme-color, #B46841);
}
:is(.elementor-36, .elementor-38) .noore-ln-v .elementor-heading-title,
:is(.elementor-36, .elementor-38) .noore-ln-v .elementor-heading-title a {
	font-family: var(--swissresort-heading-font, serif);
	font-size: clamp(18px, 2vw, 23px);
	color: var(--c-cream);
	text-decoration: none;
	transition: color .3s ease;
}
/* A FOURTH thing that did not follow from the variables, missed in the list
   above. #fff was correct while this column was cream-on-ink: hovering a value
   brightened it to pure white. The column is now ink-on-sand, so that same
   hover fades the number out to almost nothing against #F8F5F0 — the row reads
   as if it broke rather than as if it responded.
   Terracotta instead: it is already the accent on .noore-ln-k and on links
   site-wide, and unlike #fff it reads on BOTH grounds, so this rule no longer
   depends on which way round the column happens to be. */
:is(.elementor-36, .elementor-38) .noore-ln-v .elementor-heading-title a:hover {
	color: var(--swissresort-theme-color, #B46841);
}
:is(.elementor-36, .elementor-38) .noore-ln-m .elementor-heading-title {
	font-family: var(--swissresort-main-font, sans-serif);
	font-size: 11px;
	letter-spacing: .16em;
	text-transform: uppercase;
	color: var(--c-muted);
	white-space: nowrap;
}

/* ---- About: the same devices, four small additions -------------------- */

/* The plate is never empty.
   The observer only lights a plate while a block owns the viewport centre, so
   between two blocks — and at the very bottom, where the last block never wins
   the band before the footer arrives — nothing carries .on and the plate falls
   through to its own black. Measured at the foot of this page: all five images
   at opacity 0.
   So noore-plate-1 is the base layer, always painted, always at the back; the
   other four fade in over it. A crossfade now passes through a photograph
   instead of through black, and the plate has no empty state.
   Applied to Contact too — the bug was always there, just never noticed. */
:is(.elementor-36, .elementor-38) .noore-plate-1 {
	opacity: 1;
	z-index: 0;
}
:is(.elementor-36, .elementor-38) .noore-plate-img:not(.noore-plate-1) { z-index: 1; }


/* Contact's rows are key / value / meta on a 92px first column, because every
   row there has a label ("WHATSAPP", "PHONE"). About's Around NOORE rows have
   no key — only a place and a drive time — so an empty 92px column would open
   a gap on the left that lines up with nothing. Two columns instead; the row
   keeps the hairline, the padding and the hover shift unchanged. */
/* Each destination term carries an "Icon image" (wp-admin -> Destinations ->
   edit term). Those icons are reused here, so the row is icon / place / time.
   Contact's 92px first column held a text label; this one holds a 22px glyph,
   so it is sized to content rather than fixed. */
:is(.elementor-36, .elementor-38) .noore-lines-2col .noore-line {
	grid-template-columns: auto 1fr auto;
	gap: 18px;
}

/* The theme's icons are a mixed bag: three are filled #122223 (the Swissresort
   green), three are plain black, and several carry white knockout detail.
   They are deliberately NOT recoloured — at 22px the green is indistinguishable
   from ink, and a brightness(0) filter would flatten the white knockouts and
   turn the more detailed glyphs into blobs. */
:is(.elementor-36, .elementor-38) .noore-ln-i {
	width: 22px;
	align-self: center;
}
:is(.elementor-36, .elementor-38) .noore-ln-i img {
	width: 22px;
	height: 22px;
	display: block;
	object-fit: contain;
}

/* These rows are deliberately NOT links. The destination archives were dropped
   rather than built (no Elementor Pro, and the taxonomy template renders an
   empty page), so the list is a static reference table.
   .noore-line's hover shift is an affordance for the linked rows on Contact —
   on a row that does nothing it promises a click that never happens, so it is
   switched off here. Restore it if these ever become links again. */
:is(.elementor-36, .elementor-38) .noore-lines-2col .noore-line:hover {
	padding-left: 0;
}

/* Facility labels: a wrapped row of small caps, not a list and not chips.
   Rendered from ONE text-editor widget, so the spans are styled directly
   rather than through .elementor-heading-title like the .noore-ln-* trio. */
:is(.elementor-36, .elementor-38) .noore-tags .elementor-widget-container p {
	display: flex;
	flex-wrap: wrap;
	gap: 14px 30px;
	margin: 34px 0 0;
}
:is(.elementor-36, .elementor-38) .noore-tags .noore-ln-m {
	font-family: var(--swissresort-main-font, sans-serif);
	font-size: 11px;
	letter-spacing: .16em;
	text-transform: uppercase;
	color: var(--c-muted);
}

/* The closing action. The site-wide .elementor-button is a filled ink pill;
   on the sand column that reads as a heavy blot at the end of a page built
   entirely from hairlines, so this one is outlined and fills on hover. */
/* !important: the button was copied from the old page's CTA, so it carries that
   widget's own colours in post-36.css at (0,2,0) with an id selector's weight.
   Stripping the settings would work until Elementor reverts them on the next
   save — the trap already documented at the head of this section — so the
   colours are forced here instead. */
:is(.elementor-36, .elementor-38) .noore-btn .elementor-button {
	background: transparent !important;
	color: var(--c-cream) !important;
	/* NOT --c-line: that role is the 12% hairline between blocks, and at that
	   weight the button stops reading as something you can press. 28% is the
	   lightest outline that still holds its shape against the sand column. */
	border: 1px solid rgba(30, 30, 30, .28) !important;
	padding: 20px 30px;
	font-size: 11px;
	letter-spacing: .2em;
}
:is(.elementor-36, .elementor-38) .noore-btn .elementor-button:hover {
	background: var(--c-cream) !important;
	color: #F8F5F0 !important;
	border-color: var(--c-cream) !important;
}

/* ---- enquiry: Contact Form 7, dressed from here ----------------------- */

/* The plugin's markup is untouched; only its controls are restyled. Underline
   fields rather than boxes — a white box on an ink ground would read as four
   holes punched in the page, which is exactly what the old design did. */
:is(.elementor-36, .elementor-38) .wpcf7-form-control-wrap { display: block; }

:is(.elementor-36, .elementor-38) .wpcf7 input[type="text"],
:is(.elementor-36, .elementor-38) .wpcf7 input[type="email"],
:is(.elementor-36, .elementor-38) .wpcf7 input[type="tel"],
:is(.elementor-36, .elementor-38) .wpcf7 input[type="date"],
:is(.elementor-36, .elementor-38) .wpcf7 select,
:is(.elementor-36, .elementor-38) .wpcf7 textarea {
	font-family: var(--swissresort-main-font, sans-serif);
	font-weight: 300;
	font-size: 16px;
	color: var(--c-cream);
	background: transparent;
	border: 0;
	border-bottom: 1px solid var(--c-line);
	border-radius: 0;
	padding: 10px 0;
	width: 100%;
	transition: border-color .3s ease;
}
/* CF7 prints rows="10" on the textarea, which rendered a ~300px void under a
   set of one-line fields. Height (not just min-height) overrides the rows
   attribute; it stays user-resizable. */
:is(.elementor-36, .elementor-38) .wpcf7 textarea {
	height: 112px;
	min-height: 92px;
	resize: vertical;
}
:is(.elementor-36, .elementor-38) .wpcf7 select option { background: #F8F5F0; color: #1E1E1E; }
:is(.elementor-36, .elementor-38) .wpcf7 input:focus,
:is(.elementor-36, .elementor-38) .wpcf7 select:focus,
:is(.elementor-36, .elementor-38) .wpcf7 textarea:focus {
	outline: none;
	border-bottom-color: var(--swissresort-theme-color, #B46841);
}
:is(.elementor-36, .elementor-38) .wpcf7 input::placeholder,
:is(.elementor-36, .elementor-38) .wpcf7 textarea::placeholder { color: rgba(255, 242, 235, .3); }

/* The picker icon ships dark-on-light, which is now correct — it was inverted
   while the column was ink. */
:is(.elementor-36, .elementor-38) .wpcf7 input[type="date"]::-webkit-calendar-picker-indicator {
	opacity: .45;
	cursor: pointer;
}

:is(.elementor-36, .elementor-38) .wpcf7 label {
	display: block;
	font-family: var(--swissresort-main-font, sans-serif);
	font-size: 10.5px;
	letter-spacing: .2em;
	text-transform: uppercase;
	color: var(--c-muted);
	margin-bottom: 9px;
}

:is(.elementor-36, .elementor-38) .wpcf7 .noore-row {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: 30px 26px;
}

/* ---- the two actions, matched to the homepage ------------------------- */

/* Measured off /home/ (widgets 45df2f6 and 9d139d4): background #F9DABA,
   50px radius, 20px 30px padding, 15px / weight 400 / no extra tracking.
   Elementor writes those buttons' colour as #122223 — the Swissresort green —
   and §15 pins them to ink; the ink is repeated here so this rule stands on its
   own rather than depending on that override reaching a different page.

   The homepage buttons have NO hover state: Elementor emits a :hover that
   re-declares the same colour. Copying that literally is what produced the
   report — the enquiry button appeared to do nothing, and its old hover went
   further and turned the label white on sand, which read as the button
   breaking. So the rest state matches the homepage exactly and the hover
   inverts the button's OWN two colours: ink ground, peach label. No third
   colour is introduced, and there is no state in which the label can vanish. */
:is(.elementor-36, .elementor-38) .wpcf7 input[type="submit"],
:is(.elementor-36, .elementor-38) .noore-find .elementor-button {
	font-family: var(--swissresort-main-font, sans-serif);
	font-size: 15px;
	letter-spacing: normal;
	text-transform: uppercase;
	/* !important: the theme's own .elementor-button sets 500, which beat this on
	   the Get Directions widget but not on the form's input — the two actions
	   were rendering at different weights. */
	font-weight: 400 !important;
	background: #F9DABA !important;
	color: #1E1E1E !important;
	border: 0 !important;
	border-radius: 50px !important;
	padding: 20px 30px !important;
	width: auto;
	cursor: pointer;
	transition: background .3s ease, color .3s ease;
}
:is(.elementor-36, .elementor-38) .wpcf7 input[type="submit"]:hover,
:is(.elementor-36, .elementor-38) .noore-find .elementor-button:hover {
	background: #1E1E1E !important;
	color: #F9DABA !important;
}

/* ---- finding us ------------------------------------------------------- */

/* The address sits between the title and the distances list, so it needs air
   on both sides rather than being pinned under the heading. */
:is(.elementor-36, .elementor-38) .noore-find .elementor-widget-text-editor.elementor-widget {
	color: var(--c-muted);
	line-height: 1.9;
	margin-block-start: 0;
	margin-block-end: 40px;
}

:is(.elementor-36, .elementor-38) .noore-leg {
	display: grid;
	grid-template-columns: 1fr auto;
	gap: 14px;
	padding: 12px 0;
	border-bottom: 1px solid var(--c-line);
	max-width: 420px;
}

/* The button is the end of the block, so it gets a full step away from the
   last distance row rather than sitting tight under the hairline. */
:is(.elementor-36, .elementor-38) .noore-find .elementor-widget-button {
	margin-top: 44px;
}
:is(.elementor-36, .elementor-38) .noore-leg > .elementor-widget { margin: 0; }
:is(.elementor-36, .elementor-38) .noore-leg-k .elementor-heading-title,
:is(.elementor-36, .elementor-38) .noore-leg-v .elementor-heading-title {
	font-family: var(--swissresort-main-font, sans-serif);
	font-size: 14.5px;
	font-weight: 300;
	color: var(--c-muted);
}
/* The three unknown distances are marked, not guessed. */
:is(.elementor-36, .elementor-38) .noore-tbc .elementor-heading-title {
	color: var(--swissresort-theme-color, #B46841);
	font-style: italic;
}

/* !important is required here, not preferred: Elementor prints its own
   per-widget rules for 064bf3d into uploads/elementor/css/post-38.css at
   (0,4,0), and that file loads AFTER this one. The button also had to be
   pulled out of section 12's ink-colour list further up — that list assumed a
   cream ground, and this button now sits on ink. */


/* ---- the Elementor map embed ------------------------------------------ */

/* Elementor's Google Maps widget is a keyless iframe, which is why it works
   where the branded JS map does not: no API key, so no referrer to authorise.
   The trade is that the iframe's contents cannot be styled — noore-map-style
   .json does not apply to it — so the brand fit has to be done from outside
   with a filter over the whole frame.

   Straight grayscale, NO sepia. The first attempt warmed the map with
   sepia(.18) to tie it to the sand ground; the client's verdict was "this is bad
   color make it black or white". Warming a map full of grey-brown roads and
   beige land just muddies it — the result read as dirty rather than warm. Pure
   monochrome is cleaner and lets the sand around it do the warming instead.
   The contrast/brightness trims stop it going heavy against #F8F5F0.
   Set here and NOT in the widget's own CSS Filters panel, because style
   settings on this install silently revert on save. */
:is(.elementor-36, .elementor-38) .noore-map-embed {
	margin-top: 34px;
}
:is(.elementor-36, .elementor-38) .noore-map-embed .elementor-custom-embed,
:is(.elementor-36, .elementor-38) .noore-map-embed iframe {
	border-radius: var(--noore-r);
	display: block;
}
:is(.elementor-36, .elementor-38) .noore-map-embed iframe {
	/* the widget sets the height on the wrapper, not the frame; without this the
	   iframe keeps its intrinsic height and leaves a grey band underneath. */
	height: 100%;
	width: 100%;
	filter: grayscale(1) contrast(1.02) brightness(1.03);
}

/* The branded map keeps its own radius here; it is a light object on an ink
   page, so it needs the corner treatment more than it did on cream. */
:is(.elementor-36, .elementor-38) .noore-map {
	border-radius: var(--noore-r);
	overflow: hidden;
	margin-top: 34px;
}

/* ---- stacked ---------------------------------------------------------- */

@media (max-width: 940px) {
	:is(.elementor-36, .elementor-38) .noore-split { grid-template-columns: 1fr; }
	:is(.elementor-36, .elementor-38) .noore-plate { position: relative; height: 56vh; }
	:is(.elementor-36, .elementor-38) .noore-intro { min-height: auto; padding-block: 70px; }
	:is(.elementor-36, .elementor-38) .noore-blk { padding: 64px 0; }
	:is(.elementor-36, .elementor-38) .wpcf7 .noore-row { grid-template-columns: 1fr; }
	:is(.elementor-36, .elementor-38) .noore-line { grid-template-columns: 1fr auto; }
	:is(.elementor-36, .elementor-38) .noore-ln-k { grid-column: 1 / -1; }
}

@media (prefers-reduced-motion: reduce) {
	:is(.elementor-36, .elementor-38) .noore-plate-img,
	:is(.elementor-36, .elementor-38) .noore-cap,
	:is(.elementor-36, .elementor-38) .noore-line { transition: none; }
}

/* --------------------------------------------------------------------------
   Rooms — solid header, matching Contact

   The Rooms page lost its full-bleed photo hero (client: "skip normal header
   and use same header as contact page ... just get ppl to the right rooms").
   Without a dark image behind it the transparent header rendered white MENU,
   white wordmark PNG and white Call Us on cream — effectively invisible.

   The correct state is simply Contact's: Contact is the ONLY page without the
   header_transparent body class, which is why its header sits on its own dark
   band. Setting apus_page_header_transparent to "no" on page 2982 is the
   proper fix, but that meta SILENTLY REVERTS on save here — same failure as
   the Elementor colour settings in section 9 — so it is pinned in CSS
   instead, the same way body.blog and body.search are.

   #1E1E1E is not invented: it is what Contact's header container (8ad6bc1)
   actually computes to, measured live. Its own rule is
   background-color: var(--e-global-color-f7a62d7), which the theme's
   transparent mode overrides; this restores it for this page only.

   This is the exact inverse of the body.blog / body.search rules above, so
   keep the selector shape in sync if the theme ever changes it. */

/* About (36) joins Rooms here for the same reason: its full-bleed photo hero is
   gone, replaced by the section 17 split, whose top-left is the black plate and
   top-right the sand column. A transparent header over that renders white MENU,
   a white wordmark PNG and white Call Us against sand — unreadable on the right
   half. Contact does not carry header_transparent at all, which is precisely
   why its header sits on a dark band; this reproduces that. */
body.page-id-2982:not(.fix-header) .main-sticky-header:not(.sticky-header) > .elementor-element:not(.no-transparent),
body.page-id-2982:not(.fix-header) .no_keep_header .elementor-element:not(.no-transparent),
body.page-id-36:not(.fix-header) .main-sticky-header:not(.sticky-header) > .elementor-element:not(.no-transparent),
body.page-id-36:not(.fix-header) .no_keep_header .elementor-element:not(.no-transparent) {
	background-color: #1E1E1E !important;
}


/* ==========================================================================
   18. BLOG SINGLE (template 80) — post header
   --------------------------------------------------------------------------
   Three faults on every post header, all in the apus_element_blog_single_header
   widget. Fixed here rather than in Elementor because the widget exposes no
   toggle for the byline and because colour settings revert on save (section 9).
   ========================================================================== */

/* 1. THE BYLINE WAS PUBLISHING AN EMAIL ADDRESS.
   The author line printed the WordPress account name, which on this install is
   jittikasa@gmail.com — a real inbox, in public, on every post, on a page
   search engines read. Hidden rather than restyled: a sixteen-room hotel's
   posts do not need a byline, and the fix should not depend on someone
   remembering to change a display name. */
.elementor-80 .top-detail-info .author {
	display: none;
}

/* 2. THE LAST OF THE DEMO GREEN.
   rgba(18, 34, 35, .7) — Swissresort's #122223 at 70% — on the header wash.
   Section 15 swept this colour by reading computed styles across the nine
   PUBLIC PAGES; a single post is not one of them, so this instance was never
   seen. Same alpha, ink instead of green. */
.elementor-80 .header-info-blog {
	background-color: rgba(30, 30, 30, .7) !important;
}

/* 3. FEATURED IMAGE WAS CONTAINED, NOT COVERED.
   The image sat at its natural width (875px) inside a 1552px band, centred by
   .text-center, with the wash showing through on both sides like letterboxing.

   The image and the wash (.header-info-blog) are SIBLINGS, and the wash is the
   one that carries the title, so it is the one that sets the band height.
   Giving the image its own fixed height therefore does not work — a first
   attempt at clamp(420px, 56vh, 660px) made it 448px against a 656px wash and
   left a grey strip under the photo. Instead the image is lifted out of flow
   and pinned to the container, so it fills whatever height the title needs, at
   any viewport, with no number to keep in sync. */
/* The band height goes on the WIDGET, not on .elementor-widget-container.
   Elementor ships `.e-con > .elementor-widget > .elementor-widget-container
   { height: 100% }` and that sheet loads after this one, so a height set on the
   container is overwritten — measured: it computed to 0px on a post whose
   parent container had no height of its own, collapsing the whole band to
   nothing. Setting the widget height lets Elementor's 100% resolve against it
   instead of fighting it. */
.elementor-80 .elementor-widget-apus_element_blog_single_header {
	/* 560px floor - client, 30 Aug 2026. 62vh measured 531px on a 857px
	   viewport, which was under the ask. */
	height: clamp(560px, 62vh, 700px);
}

.elementor-80 .elementor-widget-apus_element_blog_single_header .elementor-widget-container {
	position: relative;
	height: 100%;
	overflow: hidden;
}

/* position needs !important on both layers: the markup carries Bootstrap's
   .position-relative utility class, and every Bootstrap position utility ships
   !important. Measured — without it both layers stayed relative, ignored the
   496px container and overflowed to 1164px, and overflow:hidden sliced the
   title in half. */
/* SCOPE. These two rules were written .elementor-80 .entry-thumb, which is the
   whole single-post template, not the hero. Related Posts cards use the same
   class (figure.entry-thumb inside .top-image), so every related thumbnail was
   pinned position:absolute too - its .top-image parent collapsed to height 0
   and the three cards rendered with no photo at all. Measured 30 Aug 2026:
   top-image h=0, figure pos=absolute, img natural 0x0 (never fetched).
   .header-info-blog is the theme's own scope for the hero and matches exactly
   one element on the page. */
.elementor-80 .header-info-blog .entry-thumb {
	position: absolute !important;
	inset: 0;
	height: auto;
}

.elementor-80 .header-info-blog .entry-thumb img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	object-position: center;
	display: block;
}

/* The wash is pinned over the image rather than left in flow. It ships
   min-height:600px AND stretches to its parent, which is how a first attempt
   produced a 1274px band — one and a half screens for a post header. Pinning
   both layers and giving the CONTAINER the height makes the band a number we
   control instead of one the theme derives. The wash is already
   display:flex / align-items:center, so the title stays centred at any height. */
.elementor-80 .header-info-blog {
	position: absolute !important;
	inset: 0;
	z-index: 1;
	min-height: 0 !important;
	margin: 0 !important;
	/* The header is transparent and sits over this band. Once the band came
	   down to ~500px the centred meta line rose under the wordmark; this is
	   the header height, so the content centres in the space BELOW it. */
	padding-top: 90px;
}


/* ==========================================================================
   19. ROOM SINGLE (template 2610 — all seven rooms)
   --------------------------------------------------------------------------
   Every room now shares this one template. Four faults, all measured on
   /book/garden-room/ 30 Aug 2026.
   ========================================================================== */

/* 1. GROUND. <body> is already sand; container 72e33a9 painted #fff straight
   over it, so the room pages were the only white screens on the site. */
.elementor-2610 .elementor-element-72e33a9 {
	background-color: #F8F5F0 !important;
}

/* 2. GALLERY ARROWS. They carried rgba(18,34,35,.51) — the Swissresort demo
   green that section 15 swept everywhere else — on a flat 50px disc. Rebuilt
   as the white-glass disc from the Gallery page, values copied field for field
   from .noore-gal-arrow so the two galleries read as one system. The theme own
   long-arrow SVG is kept (it already matches the READ MORE arrow) and simply
   scaled down inside the disc. !important on the background because the theme
   sets it at higher specificity. */
.elementor-2610 .slick-arrow {
	width: 52px;
	height: 52px;
	border-radius: 999px;
	border: 0;
	background: rgba(255, 255, 255, .20) !important;
	-webkit-backdrop-filter: blur(14px) saturate(120%);
	backdrop-filter: blur(14px) saturate(120%);
	box-shadow: 0 2px 14px rgba(30, 30, 30, .14);
	color: #ffffff;
	display: flex;
	align-items: center;
	justify-content: center;
	transition: background-color .28s ease, box-shadow .28s ease;
}

.elementor-2610 .slick-arrow:hover {
	background: rgba(255, 255, 255, .34) !important;
	box-shadow: 0 3px 18px rgba(30, 30, 30, .20);
}

.elementor-2610 .slick-arrow:focus-visible {
	outline: 2px solid var(--swissresort-theme-color, #B46841);
	outline-offset: 3px;
}

.elementor-2610 .slick-arrow svg {
	width: 22px;
	height: auto;
}

/* 3. PHOTO CORNERS. The room gallery was the only square-cornered imagery on
   the site. --noore-r is the same 18px the /rooms/ cards and the blog cards
   use. overflow on the clipping wrapper, radius on both so the corners hold
   whichever element ends up painting. */
.elementor-2610 .tour-detail-gallery .slick-list,
.elementor-2610 .tour-detail-gallery .p-popup-image {
	border-radius: var(--noore-r);
	overflow: hidden;
}

.elementor-2610 .tour-detail-gallery img {
	border-radius: var(--noore-r);
}

/* 4. BOOKING FORM CARD. Once the ground went sand this was a square white box
   with a hard 1px border — the only object of its kind left. Given the house
   card treatment instead. */
.elementor-2610 .tour-booking-form {
	border-radius: var(--noore-r);
	border: 0;
	box-shadow: var(--noore-shadow);
}

/* The Similar Rooms block: the plugin own related widget rendered nothing on
   any room, so it was replaced with the same booking-tours widget /rooms/
   uses, plus two ordinary heading widgets so the wording stays editable. */
.elementor-2610 .noore-room-eyebrow .elementor-heading-title {
	font-family: var(--swissresort-main-font, sans-serif);
	font-size: 10.5px;
	letter-spacing: .24em;
	text-transform: uppercase;
	font-weight: 500;
	color: var(--swissresort-theme-color, #B46841);
}

.elementor-2610 .noore-room-eyebrow.elementor-widget {
	margin-block-end: 16px;
}

.elementor-2610 .noore-room-h2 .elementor-heading-title {
	font-family: var(--swissresort-heading-font, serif);
	font-size: clamp(28px, 3.2vw, 42px);
	line-height: 1.12;
}

.elementor-2610 .noore-room-h2.elementor-widget {
	margin-block-end: 40px;
}

/* The Similar Rooms band had NO vertical padding at all: the eyebrow started on
   the exact pixel the sand ground ended, and the cards ran straight into the
   footer. 96px is the block rhythm used elsewhere on the site, easing to 64px
   on small screens.

   It also shipped white while the rest of the room page is sand, which split
   the page into two grounds for no reason. Same sand as the body. */
.elementor-2610 .elementor-element-c0b5a9e {
	background-color: #F8F5F0 !important;
	padding-block: clamp(64px, 8vw, 96px);
}


/* Two rooms shipped an invisible header.

   Superior Room and Deluxe Suite carry body.header_transparent; the other five
   do not. A transparent header paints its own bar away and leaves white text,
   which works over a dark hero photo — but on these pages the area behind the
   header is the sand page ground, so MENU, the wordmark and Call Us were white
   on near-white and effectively gone.

   The flag is per-room post meta left over from when these two used their own
   templates (2602 and 2562). It is not in Display Settings, not in Layout Type
   Settings, and rooms cannot be opened in Elementor — so there is no admin
   screen that exposes it. Undone here instead: position and bar restored to
   exactly what the five correct rooms compute (relative, inner bar #1E1E1E).

   Scoped to single-to_book so it cannot touch Blog or Search, which use the
   transparent header deliberately (sections 10 and 11). */
.single-to_book.header_transparent .apus-header {
	position: relative;
	top: 0;
}

.single-to_book.header_transparent:not(.fix-header) .main-sticky-header:not(.sticky-header) > .elementor-element:not(.no-transparent),
.single-to_book.header_transparent:not(.fix-header) .no_keep_header .elementor-element:not(.no-transparent) {
	background-color: #1E1E1E !important;
}


/* The availability calendar.

   As shipped it read as broken rather than plain: seven white tabs with a
   6px TOP-ONLY radius sat above a white month bar, both floating on the sand
   ground with nothing tying them together; the weekday labels were navy
   rgb(0,24,65) and the dates a blue-grey rgb(198,198,210), neither of which is
   in the palette; every date sat in a 119x60 cell as a 50px circle, so the
   month sprawled; and the available-day marker was a heavy black filled disc.

   Rebuilt as one white card on the sand, with the same 6px rounded-square date
   cells the booking date-picker uses, so the two calendars on this site match. */
.elementor-2610 .tour-page-calendar {
	background: #ffffff;
	border-radius: var(--noore-r);
	box-shadow: var(--noore-shadow);
	padding: 26px 26px 18px;
}

/* Month bar: was a white block of its own. Now a quiet header inside the card,
   month in the display face, chevrons in terracotta. */
.elementor-2610 .cal-month-bar {
	background: transparent !important;
	padding: 0 0 16px;
	margin-bottom: 8px;
	border-bottom: 1px solid var(--noore-line);
	font-family: var(--swissresort-heading-font, serif);
	font-size: 20px;
	color: #1E1E1E;
}

.elementor-2610 .cal-month-prev,
.elementor-2610 .cal-month-next,
.elementor-2610 .cal-month-bar .fas {
	color: var(--swissresort-theme-color, #B46841);
}

/* Weekday row: the seven white tabs are the single worst part of the default.
   Flattened to a label row in the house small-caps. */
.elementor-2610 .cal-week-name {
	background: transparent !important;
	border-radius: 0 !important;
	/* The plugin gives each label a 1px WHITE border. It was invisible while the
	   calendar sat on a white card; on the sand it drew seven empty boxes. */
	border: 0 !important;
	color: rgba(30, 30, 30, .5) !important;
	font-family: var(--swissresort-main-font, sans-serif);
	font-size: 10.5px;
	letter-spacing: .16em;
	text-transform: uppercase;
	font-weight: 500;
}

/* Date cells: 6px rounded squares, matching the booking date-picker. */
.elementor-2610 .cal-cell-date {
	width: 40px !important;
	height: 40px !important;
	line-height: 40px !important;
	border-radius: 6px !important;
	font-family: var(--swissresort-main-font, sans-serif);
	font-size: 14px;
	color: rgba(30, 30, 30, .70);
}

/* Unavailable days stay visible but recede. */
.elementor-2610 .cal-cell-disabled .cal-cell-date,
.elementor-2610 .cal-cell-empty .cal-cell-date {
	color: rgba(30, 30, 30, .26);
}

/* Available days: cream ground and ink type, not a black stamp. */
.elementor-2610 .cal-cell-active .cal-cell-date {
	background-color: #FFF2EB !important;
	color: #1E1E1E !important;
}

.elementor-2610 .cal-cell-active .cal-cell-date:hover {
	background-color: rgba(180, 104, 65, .18) !important;
	color: #1E1E1E !important;
}

/* SELECTED dates. This was a real fault: the cream fill above carries
   !important, so it beat the plugin's own selected state and a date the guest
   had just clicked looked exactly like one they hadn't — cream on cream, no
   feedback at all. Solid terracotta now, so the chosen stay reads at a glance.
   Hover was dropped to an 18% tint in the same colour so the two never collide:
   tint = "you could pick this", solid = "you have picked this". */
.elementor-2610 .cal-cell-selected {
	background-color: transparent !important;
}

.elementor-2610 .cal-cell-selected .cal-cell-date,
.elementor-2610 .cal-cell-selected .cal-cell-date:hover {
	background-color: var(--swissresort-theme-color, #B46841) !important;
	color: #ffffff !important;
}


/* The calendar lives in the right column, BELOW the booking form (template 2610,
   30 Aug 2026). The form is what a guest came to use; the calendar is the thing
   they consult, so it follows rather than leads.

   It is also no longer a card. Two white cards stacked in one narrow column read
   as two competing panels; now the form is the single card and the calendar is
   open type on the sand under it, flush to the same left edge. Everything the
   white ground was doing — the rounding, the shadow, the inset padding — comes
   off here, overriding the card rule further up rather than editing it, so the
   reasoning for each state stays where it was written. */
.elementor-2610 .tour-page-calendar {
	background: transparent;
	box-shadow: none;
	border-radius: 0;
	padding: 0;
	margin-top: 34px;
	margin-bottom: 0;
	scroll-margin-top: 120px;
}

/* Jump target for the CHECK RATE PER DATE link beside the price. The id sits on
   the Elementor widget wrapper, so the offset has to clear the fixed header from
   there, not from the calendar inside it. */
.elementor-2610 #room-calendar {
	scroll-margin-top: 120px;
}

/* Bootstrap 5's reboot ships

       @media (prefers-reduced-motion: no-preference) { :root { scroll-behavior: smooth } }

   and it has been quietly breaking every in-page anchor on this site. Elementor
   preventDefaults an anchor click and animates the scroll itself with jQuery;
   CSS smooth scrolling fights that frame by frame — jQuery sets scrollTop, the
   browser re-animates back toward where it was — and the measured result is the
   click doing nothing whatsoever. Verified by toggling Bootstrap off: the same
   click scrolls 1157px.

   Turned off on the room pages only, which is where the CHECK RATE PER DATE
   link lives. Elementor's own animation IS the smooth scroll, so nothing is
   lost. The same rule is still breaking anchors on the rest of the site; making
   it global is a one-line change whenever that is wanted. */
html:has(body.single-to_book) {
	scroll-behavior: auto;
}

/* The booking form widget carries Bootstrap's .sticky-top (position: sticky,
   top: 0). That was harmless while the form was the only thing in this column —
   it followed you down the long left-hand column with nothing beneath it to hit.

   Now that the calendar sits BELOW the form, sticky makes the form slide down
   over the calendar and cover it completely: measured at 1557px of scroll, the
   form occupied 1338-2266 while the calendar sat at 1189-1630, painted over.

   Sticking the pair together is not an option either — form plus calendar is
   ~1370px, taller than the viewport, so the calendar would never come to rest
   anywhere you could read it. So the column scrolls normally. The form is at the
   top of the column where a guest lands anyway, and BOOK NOW is still reachable
   from the room card grid. */
.elementor-2610 .elementor-element-57f8db7.sticky-top {
	position: static !important;   /* Bootstrap declares .sticky-top !important */
}


/* --------------------------------------------------------------------------
   BOOK YOUR ROOM — form type, 5% down and slightly tighter

   The form shipped at the theme's reading sizes, 16px and 17px, which is body
   copy scale for what is really a control panel: labels, amounts and toggles.
   Everything steps down 5% and picks up a touch of negative tracking, enough to
   read as interface rather than prose without becoming small print.

   Tracking is set once on the container. letter-spacing inherits as a resolved
   px value, so a single em declaration does not compound down the tree the way
   a percentage font-size would. The heading is exempted — it is the display
   face and its own spacing is already drawn. */
.elementor-2610 .tour-booking-form {
	letter-spacing: -.01em;
}

.elementor-2610 .tour-booking-form .widget-title {
	letter-spacing: normal;
}

/* The theme's 17px tier -> 16.15px */
.elementor-2610 .tour-booking-form :is(.booking_form_input_label,
                                        .list_service_prices,
                                        .service_price_line,
                                        h4),
.elementor-2610 .tour-booking-form .booking-guests-block > div {
	font-size: 16.15px;
}

/* The theme's 16px tier -> 15.2px */
.elementor-2610 .tour-booking-form :is(.booking-form-block,
                                        .booking_form_step_num,
                                        .booking_date,
                                        .list_service,
                                        .list_service_title,
                                        .item_info_price,
                                        .booking_form_error_label,
                                        .submit_group) {
	font-size: 15.2px;
}

/* The add-ons and the mandatory fees. These are the optional extras and the
   small print of the booking, not its headline, and they arrived at reading
   size in full terracotta — five rows of accent colour shouting louder than
   the room name above them. Terracotta is the site's accent and it is spent
   on one thing per view; here that is the BOOK NOW button and the selected
   date, not a list of tick boxes.

   Dropped to 13.5px and ink throughout. The descendant star is deliberate:
   the theme colours the 'Add' label, the <h4> service name and the currency
   spans separately, each at its own specificity, so setting them one by one
   would be five rules that drift apart. Every value is absolute px, so
   nothing compounds down the tree. */
.elementor-2610 .tour-booking-form .list_service,
.elementor-2610 .tour-booking-form .list_service * {
	font-size: 13.5px;
	color: #1E1E1E;
}

/* The tick boxes. 20px squares with a hard 1px terracotta outline read as
   form controls from a different, heavier site; at that size five of them
   stacked are the loudest thing in the panel. 15px with a 3px corner, and the
   outline only carries full strength once it is actually ticked — the theme
   fills the box terracotta on :checked, so the unticked state can afford to be
   quiet. The border colour is set on :not(:checked) so it cannot leak into the
   checked state and flatten it. */
.elementor-2610 .tour-booking-form input[type="checkbox"] {
	width: 15px;
	height: 15px;
	min-width: 15px;
	flex: 0 0 15px;
	border-width: 1px;
	border-radius: 3px;
}

.elementor-2610 .tour-booking-form input[type="checkbox"]:not(:checked) {
	border-color: rgba(180, 104, 65, .45);
}

/* The service description popup, .view-list-details. Same browser-default
   panel as the rate tooltip on the calendar had — white, hard 1px #aaa border,
   square corners, 5px of padding — and worse, max-height 150px with
   overflow: SCROLL, which parks a permanent grey scrollbar down the side of
   four lines of copy and clips the last one mid-sentence.

   Given the house card, the height raised so short copy never scrolls at all,
   and overflow set to auto so the bar only appears when it is genuinely
   needed. Width is pinned rather than 100%: the plugin opens this to the LEFT
   of the row (right: 100%), so at 100% of a 327px row it hung out over the
   photography at whatever width the column happened to be. */
.elementor-2610 .tour-booking-form .view-list-details {
	width: 250px;
	max-width: 250px;
	margin-right: 12px;
	max-height: 240px;
	overflow-y: auto;
	padding: 14px 16px;
	background: #ffffff;
	border: 0;
	border-radius: var(--noore-r-sm);
	box-shadow: 0 14px 40px rgba(30, 30, 30, .18);
	z-index: 20;
}

.elementor-2610 .tour-booking-form .view-list-details,
.elementor-2610 .tour-booking-form .view-list-details p,
.elementor-2610 .tour-booking-form .view-list-details * {
	font-size: 12.5px;
	line-height: 1.65;
	color: rgba(30, 30, 30, .78);
}

.elementor-2610 .tour-booking-form .view-list-details p {
	margin: 0;
}

/* A hairline scrollbar for the long descriptions, instead of the OS slab. */
.elementor-2610 .tour-booking-form .view-list-details::-webkit-scrollbar {
	width: 3px;
}
.elementor-2610 .tour-booking-form .view-list-details::-webkit-scrollbar-thumb {
	background: rgba(30, 30, 30, .2);
	border-radius: 3px;
}
.elementor-2610 .tour-booking-form .view-list-details::-webkit-scrollbar-track {
	background: transparent;
}

/* The popup is supposed to explain the add-on. On the Airport Transfer row it
   was instead rendering THE ROOM: its slideshow, its item code, its price
   block, its availability calendar and its custom sections — headings measured
   as 'Calendar & Prices', 'What’s included in this suite?' and 'Room Rules',
   22,425 characters of it, against roughly 120 for every other service. That
   is why a photograph of the bedroom appeared inside a tooltip about a car.

   It is a plugin quirk, not content anyone entered: BABE emits the booking
   object's own detail block once, and it lands inside the first service row.
   Nothing is deleted — the room still renders it properly further down the
   page — it is simply not shown a second time in here.

   Allowlist rather than a list of things to hide, so a service added later
   cannot drag some new block in with it. If a description ever needs a list or
   a heading of its own, widen the :not() to include it. */
.elementor-2610 .tour-booking-form .view-list-details > *:not(p) {
	/* !important: unitegallery declares display on .ug-gallery-wrapper itself,
	   so the slideshow survived a plain rule. Verified by measurement. */
	display: none !important;
}

/* The From / To fields. 130x50 boxes with square corners and a hard #E9E9E9
   outline, holding a date — eight characters. They were the largest objects in
   the panel and the emptiest. Brought down to the scale of what they hold, and
   given the 6px corner the date cells use, so field and picker agree. */
.elementor-2610 .tour-booking-form .booking_date,
.elementor-2610 .tour-booking-form input.booking_date.hasDatepicker {
	/* width and border take !important because the theme sizes and outlines
	   every .booking_date at a specificity this cannot reach; height, radius
	   and font-size landed without it. */
	width: 116px !important;
	min-width: 116px !important;   /* the theme floors this at 130px */
	height: 38px;
	padding: 0 12px;
	border: 1px solid rgba(30, 30, 30, .14) !important;
	border-radius: 6px;
	font-size: 13.5px;
	color: #1E1E1E;
	background: #ffffff;
	transition: border-color .2s ease;
}

.elementor-2610 .tour-booking-form .booking_date:focus {
	border-color: var(--swissresort-theme-color, #B46841);
	outline: none;
	box-shadow: none;
}

/* Mandatory fees on its own line.

   .booking-fees-block is a wrapping flex row holding two children: the label
   (140px) and the group of fee lines (187px). In a 327px column those add up
   to 327 exactly, so once the type came down 5% they stopped wrapping and
   collided into 'Mandatory fees Service Charge 10% VAT 7.7%' on one line.

   Rather than chase the widths, each child is given a full row of its own.
   The fee group keeps its own space-between, so Service Charge stays left and
   VAT right across the full width, which is how it read before. */
/* Mandatory fees are not shown on the room page any more (client decision,
   30 Aug 2026). They belong at checkout, where the guest is looking at a total
   rather than browsing a room, and four extra lines of small print above the
   add-ons was the least useful thing in the panel.

   IMPORTANT, and the reason this is CSS and not a plugin setting: the fees are
   still CHARGED. Unticking Service Charge or VAT on the room in BA Book
   Everything would remove them from the booking itself, not just from view.
   This only stops them being displayed here, so the amount a guest pays is
   unchanged — which also means checkout is now the FIRST place they see them,
   and that needs confirming on the first test booking.

   The wrapping rules this replaces are kept in history rather than deleted:
   if the block is ever shown again it will need them back, because the label
   and the fee group total exactly the column width and collide without. */
.elementor-2610 .tour-booking-form .booking-fees-block {
	display: none;
}

/* ONE separator colour on the room page.

   Audited every hairline on /book/<room>/ and found four greys doing the same
   job, none of them a brand value:

     #DDDDDD              3x  the spacer widgets between the left-column sections
     #E9E9E9              5x  .tour-detail-section, and the form's field rows
     #CCCCCC              4x  the add-on rows in the booking form
     rgba(30,30,30,.10)   1x  the calendar month bar — the only correct one

   All of them are now --noore-line, the token the rest of the site already
   uses, at 1px solid. The spacer widgets keep drawing their rule as a
   background rather than a border, since that is how Elementor builds them,
   but the colour and the 1px height now match the borders exactly.

   Not touched: the .booking_date field outlines at rgba(30,30,30,.14). Those
   are the edge of an input, not a separator, and are meant to read slightly
   stronger. */
.elementor-2610 .elementor-widget-spacer .elementor-widget-container {
	background-color: var(--noore-line) !important;
}

.elementor-2610 .tour-detail-section,
.elementor-2610 .tour-booking-form .booking-form-block,
.elementor-2610 .tour-booking-form .list_service {
	border-bottom-color: var(--noore-line) !important;
	border-bottom-width: 1px;
	border-bottom-style: solid;
}



/* Each add-on on one line.

   Same wrapping-flex problem as the fees block, one row down. Measured in a
   327px column: Airport Transfer's title is 225px and its price group 99px,
   which is 324 — inside the row, but the margins between them tip it over and
   the price drops to a second line. Late Check-out (158 + 34) never did.

   So the title is allowed to flex into whatever space is left while the price
   group holds its natural size and refuses to break, rather than pinning any
   width — a longer service name added later shrinks the title instead of
   wrapping the row. min-width: 0 is the part that actually permits a flex item
   to shrink below its content; without it flex: 1 1 auto still will not. */
/* The row must be nowrap FIRST. With flex-wrap: wrap a browser drops the
   second item onto a new line before it will shrink the first, so allowing the
   title to shrink achieved nothing on its own — measured: the title took the
   full 327px and the price still sat below it. .view-list-details is absolutely
   positioned and out of flow, so nowrap cannot strand it. */
.elementor-2610 .tour-booking-form .list_service {
	flex-wrap: nowrap;
}

.elementor-2610 .tour-booking-form .list_service_title {
	flex: 0 1 auto;
	min-width: 0;
	/* Airport Transfer is the tight one: its title wants 225px and the row can
	   spare 223. nowrap lets those 2px overflow into the 5px gap rather than
	   folding the service name onto a second line — 3px of clearance remains.
	   A name much longer than "Airport Transfer (one way)" would run into the
	   price instead of wrapping, so keep new service names to roughly that
	   length or this needs revisiting. */
	white-space: nowrap;
}

.elementor-2610 .tour-booking-form .list_service_prices {
	flex: 0 0 auto;
	white-space: nowrap;
	/* The 5px stays. It is the only thing separating "Service Charge" from
	   "10%" on the fees rows, where the two sit side by side; removing it
	   printed "Service Charge10%". */
	margin-left: 5px;
}


/* --------------------------------------------------------------------------
   The From / To date picker

   This is NOT the picker on the home page booking bar. That one is Dan
   Grossman's daterangepicker, restyled further up. The room form uses jQuery
   UI's own datepicker, which arrives wearing the stock Smoothness theme:
   Arial, a #E9E9E9 gradient header, #F6F6F6 cells boxed in #C5C5C5, 3px
   corners, no shadow. Measured, not guessed.

   Redrawn to the same specification as the home page panel — display-face
   month, 10px small-caps weekday row, 6px rounded-square cells, cream hover,
   terracotta selection — so the site has one date picker language and not two.
   The panel itself is glass rather than white: it opens over the booking card
   and the room photography, and the frosted ground is the same device as the
   booking bar on the home page.

   #ui-datepicker-div is appended to <body>, not inside the template, so this
   cannot be scoped with .elementor-2610 and keys off the body class instead.
   The same picker also appears in the checkout flow, still in Smoothness; that
   is a separate scope and a separate decision.
   -------------------------------------------------------------------------- */

body.single-to_book #ui-datepicker-div {
	width: 306px;
	padding: 18px 18px 12px;
	border: 1px solid rgba(255, 255, 255, .55);
	border-radius: var(--noore-r);
	background: rgba(255, 255, 255, .70);
	-webkit-backdrop-filter: blur(20px) saturate(135%);
	backdrop-filter: blur(20px) saturate(135%);
	box-shadow: 0 26px 60px rgba(30, 30, 30, .18);
	font-family: var(--swissresort-main-font, sans-serif);
	font-size: 13px;
}

/* Without backdrop-filter the panel would be 70% transparent over a calendar,
   i.e. unreadable. Fall back to near-opaque. */
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
	body.single-to_book #ui-datepicker-div {
		background: rgba(255, 255, 255, .95);
	}
}

/* Header: the stock grey bar becomes a plain caption line. */
body.single-to_book #ui-datepicker-div .ui-datepicker-header {
	background: transparent;
	border: 0;
	border-radius: 0;
	padding: 0 0 12px;
	position: relative;
}

body.single-to_book #ui-datepicker-div .ui-datepicker-title {
	font-family: var(--swissresort-heading-font, serif);
	font-size: 17px;
	font-weight: 400;
	letter-spacing: .04em;
	text-transform: uppercase;
	color: #1E1E1E;
	line-height: 32px;
	margin: 0 34px;
}

/* Arrows. jQuery UI draws these as sprite tiles from a background image; the
   sprite is switched off and the chevron redrawn from two borders, so it takes
   currentColor and matches the calendar below the form. */
body.single-to_book #ui-datepicker-div .ui-datepicker-prev,
body.single-to_book #ui-datepicker-div .ui-datepicker-next {
	top: 0;
	width: 32px;
	height: 32px;
	border: 0;
	border-radius: 50%;
	background: transparent;
	cursor: pointer;
	color: var(--swissresort-theme-color, #B46841);
	transition: background-color .2s ease;
}
body.single-to_book #ui-datepicker-div .ui-datepicker-prev { left: 0; }
body.single-to_book #ui-datepicker-div .ui-datepicker-next { right: 0; }

body.single-to_book #ui-datepicker-div .ui-datepicker-prev:hover,
body.single-to_book #ui-datepicker-div .ui-datepicker-next:hover {
	background: #FFF2EB;
}

body.single-to_book #ui-datepicker-div .ui-datepicker-header .ui-icon {
	background-image: none;
	text-indent: -9999px;
	overflow: hidden;
	width: 100%;
	height: 100%;
	margin: 0;
	top: 0;
	left: 0;
}

body.single-to_book #ui-datepicker-div .ui-datepicker-prev::before,
body.single-to_book #ui-datepicker-div .ui-datepicker-next::before {
	content: "";
	position: absolute;
	top: 50%;
	left: 50%;
	width: 7px;
	height: 7px;
	border-right: 1.5px solid currentColor;
	border-bottom: 1.5px solid currentColor;
}
body.single-to_book #ui-datepicker-div .ui-datepicker-prev::before {
	transform: translate(-40%, -50%) rotate(135deg);
}
body.single-to_book #ui-datepicker-div .ui-datepicker-next::before {
	transform: translate(-60%, -50%) rotate(-45deg);
}

/* A month with no earlier month available: dimmed, not hidden, so the header
   keeps its symmetry. */
body.single-to_book #ui-datepicker-div .ui-datepicker-prev.ui-state-disabled,
body.single-to_book #ui-datepicker-div .ui-datepicker-next.ui-state-disabled {
	opacity: .25;
	cursor: default;
	background: transparent;
}

body.single-to_book #ui-datepicker-div table {
	border-collapse: separate;
	border-spacing: 2px;
	width: 100%;
	margin: 0;
	font-size: 13px;
	/* The theme's generic table rule draws a 1px #E9E9E9 box around every table
	   on the site. Inside a glass panel that reads as a frame drawn around the
	   grid for no reason. The cells already have their own shape. */
	border: 0;
}

/* Weekday row — the house small-caps label, same as the calendar below. */
body.single-to_book #ui-datepicker-div th {
	padding: 4px 0 8px;
	border: 0;
	font-size: 10px;
	font-weight: 500;
	letter-spacing: .06em;
	text-transform: uppercase;
	color: rgba(30, 30, 30, .45);
}

body.single-to_book #ui-datepicker-div td {
	padding: 0;
	border: 0;
}

/* Cells: 6px rounded squares, the same shape the availability calendar and the
   home page picker both use. */
body.single-to_book #ui-datepicker-div td a,
body.single-to_book #ui-datepicker-div td span {
	display: block;
	width: 36px;
	height: 34px;
	line-height: 34px;
	padding: 0;
	border: 0;
	border-radius: 6px;
	background: transparent;
	text-align: center;
	font-size: 13px;
	font-weight: 400;
	color: rgba(30, 30, 30, .82);
	transition: background-color .18s ease, color .18s ease;
}

body.single-to_book #ui-datepicker-div td a:hover {
	background: #FFF2EB;
	color: var(--swissresort-theme-color, #B46841);
}

/* Today, and the day actually chosen. Terracotta is reserved for the choice —
   today is only outlined, so the two never read as the same thing. */
body.single-to_book #ui-datepicker-div td.ui-datepicker-today a {
	box-shadow: inset 0 0 0 1px rgba(180, 104, 65, .45);
	color: var(--swissresort-theme-color, #B46841);
}

body.single-to_book #ui-datepicker-div td a.ui-state-active,
body.single-to_book #ui-datepicker-div td.ui-datepicker-current-day a {
	background: var(--swissresort-theme-color, #B46841);
	color: #ffffff;
	box-shadow: none;
}

/* Unavailable days recede but stay legible. jQuery UI ships opacity .35 on
   .ui-state-disabled, which greys the number to the point of disappearing on
   a translucent ground. */
body.single-to_book #ui-datepicker-div .ui-state-disabled {
	opacity: 1;
}
body.single-to_book #ui-datepicker-div td.ui-state-disabled span,
body.single-to_book #ui-datepicker-div td.ui-datepicker-unselectable span {
	color: rgba(30, 30, 30, .26);
}


/* --------------------------------------------------------------------------
   CHECK RATE PER DATE — the anchor beside the nightly price

   The price alone left the guest to work out that a calendar existed further
   down the column. This is the signpost, and it reuses the site's existing
   long-arrow control rather than inventing a second one: same 50×30 artwork as
   .btn-readmore on the journal cards, same Montserrat 16px, same ink-to-
   terracotta hover.

   The arrow is a mask rather than inline SVG. That keeps currentColor working
   (so one colour rule drives label and arrow together) and, more importantly,
   leaves the Elementor field holding nothing but words — the client can rewrite
   the label without stepping on markup. The two paths are lifted verbatim from
   .read-icon: the ring is stroked, the arrow filled, which is exactly what an
   alpha mask needs.
   -------------------------------------------------------------------------- */

.elementor-2610 .noore-price-row {
	align-items: center;
}

.elementor-2610 .noore-rate-anchor .elementor-heading-title a,
.elementor-2610 .noore-rate-anchor .elementor-heading-title {
	display: inline-flex;
	align-items: center;
	font-family: var(--swissresort-main-font, sans-serif);
	font-size: 16px;
	font-weight: 400;
	letter-spacing: normal;
	line-height: 1;
	color: #1E1E1E;
	transition: color .28s ease;
}

.elementor-2610 .noore-rate-anchor .elementor-heading-title a:hover,
.elementor-2610 .noore-rate-anchor .elementor-heading-title a:focus-visible {
	color: #B46841;
}

.elementor-2610 .noore-rate-anchor .elementor-heading-title a::before {
	content: "";
	flex: 0 0 auto;
	width: 50px;
	height: 30px;
	margin-right: 10px;
	background-color: currentColor;
	-webkit-mask-image: var(--noore-arrow-long);
	mask-image: var(--noore-arrow-long);
	-webkit-mask-repeat: no-repeat;
	mask-repeat: no-repeat;
	-webkit-mask-position: center;
	mask-position: center;
}

/* Below 600px the price and the anchor stop sharing a line, and the long arrow
   is most of that width, so it steps back to the 30px stub. */
@media (max-width: 600px) {
	.elementor-2610 .noore-rate-anchor .elementor-heading-title a::before {
		width: 30px;
		margin-right: 8px;
	}
}

/* Source order is week-names, month-bar, dates — so the plugin renders MON..SUN
   ABOVE the month name, which reads as a stray label row. Re-ordered with flex
   so the card runs month bar, weekday labels, dates, like every other calendar. */
/* Only the ACTIVE month: the plugin ships 24 month blocks and hides all but one
   with display:none on .cal-month-block, so setting display:flex there un-hid
   every month. Scoped to .cal-month-active, which the plugin moves as you page. */
.elementor-2610 .cal-month-block.cal-month-active {
	display: flex;
	flex-direction: column;
}

.elementor-2610 .cal-month-block > .cal-month-bar  { order: 1; }
.elementor-2610 .cal-month-block > .cal-week-names { order: 2; margin-top: 14px; }
.elementor-2610 .cal-month-block > .cal-dates-block { order: 3; }

/* The rate tooltip. It shipped as a white box with a hard 1px #aaa border,
   square corners and 5px of padding — a browser-default panel sitting on a
   rounded card. Given the house card treatment instead. */
.elementor-2610 .view-rate-details {
	background: #ffffff;
	border: 0 !important;
	border-radius: var(--noore-r-sm);
	box-shadow: 0 10px 30px rgba(30, 30, 30, .16);
	padding: 14px 16px;
	min-width: 190px;
}

.elementor-2610 .view-rate-details .rate_details_label {
	font-family: var(--swissresort-main-font, sans-serif);
	font-size: 10.5px;
	letter-spacing: .16em;
	text-transform: uppercase;
	font-weight: 500;
	color: rgba(30, 30, 30, .55);
	text-decoration: none;
}

.elementor-2610 .view-rate-details .rate_price_general,
.elementor-2610 .view-rate-details .rate_min_max {
	font-family: var(--swissresort-main-font, sans-serif);
	font-size: 14px;
	color: #1E1E1E;
	margin-top: 4px;
}

/* The theme underlines the label inside the tooltip; nothing else on the site
   underlines. */
.elementor-2610 .view-rate-details a,
.elementor-2610 .view-rate-details u {
	text-decoration: none !important;
}


/* --------------------------------------------------------------------------
   BOOKING FLOW — no sidebar

   ALL SEVEN pages BABE creates, not the three that are obvious from the menu:
     6357 /booking/                        the parent
     6351 /booking/checkout/               ** the real payment step **
     6352 /booking/confirmation/
     6353 /booking/my-account/
     6354 /booking/services/
     6355 /booking/admin-confirmation/
     6356 /booking/customer-confirmation/

   6351 is the one that matters and the easiest to miss: submitting a room's
   Book Now goes straight to /booking/checkout/, NOT to /booking/. Every one of
   the seven was rendering the sidebar.

   These three pages are BA Book Everything's checkout steps. Their WordPress
   content is EMPTY by design — BABE injects each step at runtime — which is why
   they look blank when opened directly with no booking in session. That is
   correct behaviour, not something to "fix".

   All three already have apus_page_layout = "Main Content Only", and the
   sidebar renders anyway: another Apus page setting that does not stick on this
   install. So it is turned off here instead.

   Why it has to go, beyond the setting: this is a checkout. The sidebar was a
   search box plus Recent Posts still listing the Swissresort DEMO articles
   ("Diamond Manor Apartment in the New York"), shown to a guest halfway through
   paying. Every item in it is an exit from the flow.
   -------------------------------------------------------------------------- */

body:is(.page-id-6351, .page-id-6352, .page-id-6353,
        .page-id-6354, .page-id-6355, .page-id-6356, .page-id-6357) .sidebar-wrapper {
	display: none;
}
/* Bootstrap grid: the column is col-lg-9, so widening it needs the same
   breakpoint the theme uses, and flex-basis as well as max-width. */
@media (min-width: 992px) {
	body:is(.page-id-6351, .page-id-6352, .page-id-6353,
	        .page-id-6354, .page-id-6355, .page-id-6356, .page-id-6357) .main-page.col-lg-9 {
		flex: 0 0 100%;
		max-width: 100%;
	}
}


/* --------------------------------------------------------------------------
   BOOKING FLOW — checkout, dressed to match the site
   /booking/checkout/ (6351) and its siblings

   BABE ships checkout as boxed white inputs with a floating notch label in
   terracotta. That belongs to the plugin, not to NOORE: Contact's fields are
   underlines on sand, and the whole site's actions are the peach pill measured
   off /home/. This section only re-dresses what BABE renders — no element is
   moved, hidden or renamed, because this is the path guests pay through.

   ONE REAL BUG FIXED HERE: "Complete My Order" shipped as terracotta text on a
   terracotta background — computed #B46841 on #B46841, i.e. an invisible label
   on the button that completes the booking. It is now the site's peach pill.
   -------------------------------------------------------------------------- */

/* ---- fields: underlines, not boxes ------------------------------------ */

/* !important throughout this section. BABE's own stylesheet declares these
   with !important AND is served cross-origin through the CDN, so its rules are
   invisible to document.styleSheets — a first pass without !important looked
   correct in the file, was served correctly, matched the body class, and still
   lost silently. Do not remove these; they are load-bearing. */

/* The label is absolutely positioned with a white background to punch a notch
   in the input's border. With no border to notch it just floats over the text,
   so it is returned to the flow as a quiet small-caps caption. */
body:is(.page-id-6351, .page-id-6352, .page-id-6353,
        .page-id-6355, .page-id-6356, .page-id-6357) .checkout_form_input_label {
	position: static !important;
	display: block !important;
	background: transparent !important;
	padding: 0 0 6px !important;
	font-size: 11px !important;
	letter-spacing: .16em !important;
	text-transform: uppercase !important;
	color: rgba(30, 30, 30, .58) !important;
}
body:is(.page-id-6351, .page-id-6352, .page-id-6353,
        .page-id-6355, .page-id-6356, .page-id-6357) .checkout_input_field {
	background: transparent !important;
	border: 0 !important;
	border-bottom: 1px solid rgba(30, 30, 30, .18) !important;
	border-radius: 0 !important;
	padding: 10px 0 !important;
	font-size: 16px !important;
	font-weight: 300 !important;
	color: #1E1E1E !important;
	width: 100% !important;
	transition: border-color .3s ease;
}
body:is(.page-id-6351, .page-id-6352, .page-id-6353,
        .page-id-6355, .page-id-6356, .page-id-6357) .checkout_input_field:focus {
	border-bottom-color: var(--swissresort-theme-color, #B46841) !important;
	outline: none !important;
	box-shadow: none !important;
}
body:is(.page-id-6351, .page-id-6352, .page-id-6353,
        .page-id-6355, .page-id-6356, .page-id-6357) .checkout-form-block { margin-bottom: 26px !important; }

/* ---- the order summary ------------------------------------------------- */

body:is(.page-id-6351, .page-id-6352) .table_order_items_details { width: 100%; border-collapse: collapse; }
body:is(.page-id-6351, .page-id-6352) .table_order_items_details td {
	border-color: rgba(30, 30, 30, .12) !important;
	/* 18px here plus BABE's own 31px line-height made every total row 71px tall
	   and the summary ~860px — the page scrolled for ages over six numbers. */
	padding-block: 8px !important;
	line-height: 1.5 !important;
}

/* The room thumbnail ships square; everything else on the site that is a
   photo on sand carries the house radius. */
body:is(.page-id-6351, .page-id-6352) .table_order_items_details img {
	border-radius: var(--noore-r) !important;
	display: block !important;
}

/* The totals cells ship with a solid WHITE fill, which cuts a hard rectangle
   out of the sand column — the one panel on the page that does not sit on the
   background. Transparent, and the hairlines do the separating. */
body:is(.page-id-6351, .page-id-6352) .order_items_row_total,
body:is(.page-id-6351, .page-id-6352) .order_items_row_total_amount,
body:is(.page-id-6351, .page-id-6352) .table_order_items_details tr,
body:is(.page-id-6351, .page-id-6352) .table_order_items_details tbody,
body:is(.page-id-6351, .page-id-6352) .table_order_items_details td {
	/* BOTH halves carry the white: the label cell is .order_items_row_total and
	   the figure cell is .order_items_row_total_amount. Clearing only the first
	   leaves a white strip down the numbers column. */
	background: transparent !important;
}
body:is(.page-id-6351, .page-id-6352) .order_items_row_total_label,
body:is(.page-id-6351, .page-id-6352) .order_items_row_total_value {
	line-height: 1.5 !important;
}

/* The amount panel was 114px of mostly nothing, and its radio was the browser
   default blue — the only blue on the site. */
body:is(.page-id-6351, .page-id-6352) .amount_group {
	padding: 20px 24px !important;
	border-color: rgba(30, 30, 30, .12) !important;
	border-radius: var(--noore-r) !important;
	background: transparent !important;
}
body:is(.page-id-6351, .page-id-6352) input[type="radio"],
body:is(.page-id-6351, .page-id-6352) input[type="checkbox"] {
	accent-color: var(--swissresort-theme-color, #B46841);
}

/* ---- section headings and totals --------------------------------------- */

body:is(.page-id-6351, .page-id-6352) .site-main h2,
body:is(.page-id-6351, .page-id-6352) .site-main h3 {
	font-family: var(--swissresort-heading-font, serif) !important;
	font-size: clamp(22px, 2.4vw, 28px) !important;
	color: #1E1E1E !important;
}
body:is(.page-id-6351, .page-id-6352) .checkout_form_pay_total {
	font-family: var(--swissresort-heading-font, serif) !important;
	font-size: clamp(22px, 2.4vw, 28px) !important;
	color: #1E1E1E !important;
}
body:is(.page-id-6351, .page-id-6352) .checkout_form_amount_label {
	font-size: 11px !important;
	letter-spacing: .16em !important;
	text-transform: uppercase !important;
	color: rgba(30, 30, 30, .58) !important;
}

/* The site's button standard, measured off /home/.
   This also fixes a real bug: the button shipped as terracotta text on a
   terracotta background — #B46841 on #B46841 — an invisible label on the
   control that completes the booking. */
body:is(.page-id-6351, .page-id-6352) .submit_group button,
body:is(.page-id-6351, .page-id-6352) .checkout_form_submit_btn,
body:is(.page-id-6351, .page-id-6352) .submit_group .btn {
	background: #F9DABA !important;
	color: #1E1E1E !important;
	border: 0 !important;
	border-radius: 50px !important;
	padding: 20px 30px !important;
	font-size: 15px !important;
	font-weight: 400 !important;
	letter-spacing: normal !important;
	transition: background .3s ease, color .3s ease;
}
body:is(.page-id-6351, .page-id-6352) .submit_group button:hover,
body:is(.page-id-6351, .page-id-6352) .checkout_form_submit_btn:hover,
body:is(.page-id-6351, .page-id-6352) .submit_group .btn:hover {
	background: #1E1E1E !important;
	color: #F9DABA !important;
}

/* ---- payment tab + terms panel ----------------------------------------- */

body.page-id-6351 .payment_titles_group > * {
	font-size: 11px !important;
	letter-spacing: .16em !important;
	text-transform: uppercase !important;
	color: rgba(30, 30, 30, .58) !important;
}
body.page-id-6351 .checkout_form_terms_details {
	border: 1px solid rgba(30, 30, 30, .12) !important;
	border-radius: var(--noore-r) !important;
	padding: 18px 22px !important;
	font-size: 14px !important;
	line-height: 1.7 !important;
	color: rgba(30, 30, 30, .72) !important;
	background: rgba(30, 30, 30, .02) !important;
}

/* The terms panel renders the whole Terms PAGE, so it arrives with that page's
   breadcrumb ("Home / Page") and its page title on top of the actual terms.
   Those are page furniture, not terms — hidden so the panel opens on the
   first real clause. The panel is also given room to breathe; 105px showed
   about two lines. */
body.page-id-6351 .checkout_form_terms_details > ol,
body.page-id-6351 .checkout_form_terms_details > h3:first-of-type,
body.page-id-6351 .checkout_form_terms_details .breadcrumb,
body.page-id-6351 .checkout_form_terms_details .breadcrumbs {
	display: none !important;
}
body.page-id-6351 .checkout_form_terms_details {
	max-height: 190px !important;
}
body.page-id-6351 .checkout_form_terms_details h2 {
	font-size: 15px !important;
	letter-spacing: .1em !important;
	text-transform: uppercase !important;
	margin-top: 18px !important;
}

/* terms panel: strip the page furniture — marker, do not remove */

/* The one payment method is a bare span; give it the same small-caps treatment
   as the other labels so it does not read as a stray box. */
body.page-id-6351 .payment_method_title {
	display: inline-block !important;
	background: transparent !important;
	border: 0 !important;
	border-bottom: 1px solid rgba(30, 30, 30, .28) !important;
	padding: 0 0 8px !important;
	color: #1E1E1E !important;
}
body.page-id-6351 .payment_fields_group {
	border: 0 !important;
	background: transparent !important;
}
body.page-id-6351 .checkout_form_terms_check {
	margin-bottom: 14px !important;
}


/* ---- currency: THB as a word, not the baht glyph ----------------------- */

/* The ฿ glyph is missing from Aboreto, so it fell back to a heavy sans and sat
   next to the figure looking bolder and misaligned — it read as a rendering
   fault rather than a currency mark. BABE offers no custom symbol (THB's only
   option is the glyph), but it does wrap it: <span class="currency_symbol">.
   So the span is hidden and the wrapper carries a "THB" label instead, set in
   the body font, smaller and muted so it reads as a unit rather than competing
   with the number.

   SCOPED TO THE BOOKING PAGES ON PURPOSE. .currency_symbol is site-wide, and a
   room page renders it 1,594 times — that is the availability calendar, one
   price per day. Prepending "THB" to every cell there would be unreadable.
   The booking pages have no calendar, so this scope is the safe one.
   Room cards on /home/ and /rooms/ still show the glyph. */
body:is(.page-id-6351, .page-id-6352, .page-id-6353,
        .page-id-6355, .page-id-6356, .page-id-6357) .currency_symbol {
	display: none !important;
}
body:is(.page-id-6351, .page-id-6352, .page-id-6353,
        .page-id-6355, .page-id-6356, .page-id-6357) .currency_amount::before {
	content: "THB ";
	font-family: var(--swissresort-main-font, sans-serif);
	font-size: .6em;
	font-weight: 400;
	letter-spacing: .1em;
	color: rgba(30, 30, 30, .55);
	margin-right: .35em;
	vertical-align: .12em;
}


/* ==========================================================================
   21. BLOG SINGLE - hero tint, title size, Related Posts arrows
   --------------------------------------------------------------------------
   Three faults measured on the single-post template (80), 30 Aug 2026. The
   missing Related Posts thumbnails were a fourth; that fix is a scope
   correction in section 18 rather than a new rule.
   ========================================================================== */

/* 1. THE GREEN. Section 15 swept the Swissresort demo green (#122223) off the
   site, but it survived here because it is painted by a PSEUDO-ELEMENT, which
   an element-by-element sweep does not see:

     .header-info-blog .entry-thumb:before {
       background: linear-gradient(180deg,
         rgba(18,34,35,.9) 0%, rgba(18,34,35,.4) 23.85%,
         rgba(18,34,35,.4) 64.9%, rgba(18,34,35,.9) 100%); }

   That is a full-height four-stop wash over the featured image, and it is what
   gives the hero its olive cast - the flat rgba(30,30,30,.7) this file already
   puts on .header-info-blog sits ON TOP of it, so the two mix rather than one
   replacing the other.

   The gradient is kept, only the hue is swapped. The shape is doing real work:
   the heavy stops at 0% and 100% are what hold the wordmark at the top and the
   title against a bright photo. Dropping it to none would have been a design
   change, not a colour fix. #1E1E1E is the neutral dark already used by the
   wash directly above it, so the two layers now agree.

   Specificity: theme writes (0,2,0), this is (0,3,0) and loads later. */
.elementor-80 .header-info-blog .entry-thumb::before {
	background: linear-gradient(180deg,
		rgba(30, 30, 30, .9) 0%,
		rgba(30, 30, 30, .4) 23.85%,
		rgba(30, 30, 30, .4) 64.9%,
		rgba(30, 30, 30, .9) 100%);
}

/* 2. TITLE - 54px, client, 30 Aug 2026. Was 92px.

   Only the desktop step is replaced. The theme ramps .detail-title 30px to
   50px at 768 to 92px at 1200; 92px is the only one above the ask, and the two
   below it are already at or under 54px, so overriding the base would have
   PUSHED MOBILE UP from 30px to 54px. The media query is therefore matched to
   the theme's own 1200px edge rather than set globally.

   line-height comes down with it: the theme's 1.2 was tuned for 92px and left
   a visible gap between the three lines of a long title at 54px. */
@media (min-width: 1200px) {
	.elementor-80 .header-info-blog .detail-title {
		font-size: 54px;
		line-height: 1.15;
	}
}

/* 3. RELATED POSTS ARROWS - they were sitting ON the cards.

   The theme parks them at left -15px and right -15px against .slick-carousel,
   which is 1300px wide inside a 1270px column - so a 50px disc landed 15px
   left of the column edge while the first card's text starts 8px inside it.
   Measured: the left disc overlapped the word "YEAR" in the first card title.

   Pushing them further out (left -70px) was the smaller change but it does
   not survive narrow viewports - the carousel already starts 112px from the
   viewport edge, so the discs go off-canvas before the tablet breakpoint.
   Moving them into the heading row instead is collision-proof at every width
   and puts them in the empty space to the right of "Related Posts".

   -89px is derived, not eyeballed: the offset parent is .slick-carousel, the
   h3 is 48px tall with a 40px margin-bottom, so the heading centre sits
   88 minus 24, ie 64px, above the carousel top, and the 50px disc own top is
   a further 25px up. The theme translateY(-25px) has to go with it or the
   discs land 25px high. */
.elementor-80 .blog-single-related .title-related {
	/* Reserve the corner so a long heading cannot run under the discs. */
	padding-right: 130px;
}

@media (min-width: 768px) {
	.elementor-80 .blog-single-related .slick-arrow {
		top: -89px;
		transform: none;
	}

	.elementor-80 .blog-single-related .slick-prev {
		left: auto;
		right: 62px;
	}

	.elementor-80 .blog-single-related .slick-next {
		left: auto;
		right: 0;
	}
}

/* Below 768px the carousel is one card wide and slick own drag is enabled
   (.slick-list carries .draggable), so the discs are redundant there - and at
   375px two 50px discs plus a 40px heading do not share a line. Swipe only. */
@media (max-width: 767.98px) {
	.elementor-80 .blog-single-related .slick-arrow {
		display: none;
	}

	.elementor-80 .blog-single-related .title-related {
		padding-right: 0;
	}
}

/* 4. ARROW STYLE - the house glass disc, not the theme's outlined one.

   The theme ships these as a 50px disc: solid #fff, 1px solid #B46841 border,
   terracotta glyph. That is the only hard-outlined control left on the page.
   Replaced with .noore-gal-arrow, copied field for field the same way
   .elementor-2610 .slick-arrow was, so all three carousels read as one system.

   TWO DELIBERATE DEPARTURES FROM .noore-gal-arrow, both because this is the
   first glass arrow on a FLAT GROUND rather than over a photo:

   1. The glyph keeps the theme's terracotta. .noore-gal-arrow paints its
      chevron #fff, which works over a photo and would be invisible here - the
      discs sit on the sand ground. Only the disc was the complaint, so the ink
      is left alone.
   2. The shadow does more work. Over a photo the 20% white fill is what
      separates the disc from its background; on sand the fill is nearly the
      same value as the ground, so the disc is read almost entirely from its
      shadow. Same values, different job.

   !important on the background because the theme sets it at higher
   specificity, same as on 2610. The SVG is the theme's own long arrow, which
   already matches the READ MORE glyph, so it is kept and only sized. */
.elementor-80 .blog-single-related .slick-arrow {
	width: 52px;
	height: 52px;
	border-radius: 999px;
	border: 0;
	background: rgba(255, 255, 255, .20) !important;
	-webkit-backdrop-filter: blur(14px) saturate(120%);
	backdrop-filter: blur(14px) saturate(120%);
	box-shadow: 0 2px 14px rgba(30, 30, 30, .14);
	color: var(--swissresort-theme-color, #B46841);
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 0;
	transition: background-color .28s ease, box-shadow .28s ease;
}

.elementor-80 .blog-single-related .slick-arrow:hover {
	background: rgba(255, 255, 255, .34) !important;
	box-shadow: 0 3px 18px rgba(30, 30, 30, .20);
}

.elementor-80 .blog-single-related .slick-arrow:focus-visible {
	outline: 2px solid var(--swissresort-theme-color, #B46841);
	outline-offset: 3px;
}

.elementor-80 .blog-single-related .slick-arrow svg {
	width: 22px;
	height: auto;
}

/* The label is a real text node the theme leaves in the button for screen
   readers. Kept in the accessibility tree, out of the box. */
.elementor-80 .blog-single-related .slick-arrow .textnav {
	position: absolute;
	width: 1px;
	height: 1px;
	overflow: hidden;
	clip: rect(0 0 0 0);
	white-space: nowrap;
}

/* --------------------------------------------------------------------------
   SEARCH RESULTS — cards matched to the /rooms/ grid

   /rooms/ uses the theme's tour-grid-v6 widget: full-bleed photo, room name set
   over it in Aboreto caps, no card furniture. The search results page is a
   different renderer — BA Book Everything's own shortcode
   (.babe_all_items_item) — shipping a white bordered card, an orange price and
   a mid-sentence truncated excerpt. It cannot be swapped for the theme widget,
   because only the plugin's listing knows which rooms are free for the searched
   dates. So the plugin's markup is re-dressed to match.
   Scoped to .block_search_res_grid so no other listing is touched.
   -------------------------------------------------------------------------- */
.block_search_res_grid .babe_all_items_item_inner {
	position: relative;
	background: transparent !important;
	border: 0 !important;
	box-shadow: none !important;
	border-radius: var(--noore-r);
	overflow: hidden;
}
.block_search_res_grid .item_img { margin: 0; }
.block_search_res_grid .item_img a { display: block; }
.block_search_res_grid .item_img img {
	width: 100%;
	/* /rooms/ does NOT crop to a fixed height: its card height follows the
	   photo's own 450:500 ratio, so a 403px card is 448px tall. A clamped
	   height made these cards 429x420 — a different SHAPE at the same width,
	   which is what stopped the two grids reading as one design. */
	aspect-ratio: 450 / 500;
	height: auto;
	object-fit: cover;
	display: block;
	transition: transform .7s ease;
}
.block_search_res_grid .babe_all_items_item_inner:hover .item_img img { transform: scale(1.04); }
/* the outer item keeps a white card and 20px of padding — that is the frame
   still visible around each photo. */
/* NOTE: block_search_res_grid is a SECOND CLASS ON THE CARD, not a wrapper.
   Written as a descendant selector this matched nothing, which is why the white
   card frame survived the first attempt. */
.babe_all_items_item.block_search_res_grid {
	background: transparent !important;
	border: 0 !important;
	/* Bootstrap column parity with /rooms/.
	   /rooms/ lays its cards out with `.col-xl-4 col-md-6 col-12` — a third of
	   a 1300px row, 15px of padding each side, and `margin: 0 0 50px` on the
	   card itself. BABE instead sets `width: 33%` with no padding and lets the
	   container's `space-between` scatter the leftover 1% into 7px gaps. That
	   alone made these cards 26px too wide, pushed them 15px outside the site's
	   content column, and left them nearly touching. */
	width: 33.3333% !important;
	padding: 0 15px !important;
	box-sizing: border-box;
	margin-bottom: 50px;
}
/* `space-between` is what produced the ragged 7px gutters — with exact thirds
   plus padding there is no slack left to distribute. */
.babe_shortcode_block_inner .babe_all_items_item.block_search_res_grid,
.babe_shortcode_block_content { justify-content: flex-start !important; }

/* Mirror BOOTSTRAP's breakpoints, not BABE's. `col-xl-4 col-md-6 col-12` flips
   at 1200 and 768; babe-style.css flips at 991 and 599, so at 1100px wide
   /rooms/ shows two columns and the results showed three. !important because
   the plugin's own media rules are equally specific and load first. */
@media (max-width: 1199px) {
	.babe_all_items_item.block_search_res_grid { width: 50% !important; }
}
@media (max-width: 767px) {
	.babe_all_items_item.block_search_res_grid { width: 100% !important; }
}

/* the theme sets .item_text to display:flex, which puts the title and the price
   on ONE row — the price then collides with the end of the room name. Stack. */
.block_search_res_grid .item_text {
	flex-direction: column !important;
	align-items: flex-start !important;
	gap: 6px;
	position: absolute;
	left: 0; right: 0; bottom: 0;
	/* both measured off /rooms/ .tour-content */
	padding: 40px 20px 20px;
	background: linear-gradient(180deg, rgba(30, 30, 30, 0) 0%, rgba(30, 30, 30, .85) 100%);
	border: 0 !important;
}
/* The theme sizes this in template.css as `.tour-item-style .title`: 28px,
   stepping to 40px at min-width 1200. Mirror those two values exactly — my own
   clamp topped out at 27px, so the results title was two-thirds the size of the
   identical room's title on /rooms/.
   No letter-spacing and no text-transform: Aboreto is an all-caps face, so the
   name reads as caps on both pages without either. */
.block_search_res_grid .item_title,
.block_search_res_grid .item_title a {
	font-family: var(--swissresort-heading-font, serif) !important;
	font-size: 28px !important;
	line-height: 1.2 !important;
	text-transform: none;
	letter-spacing: normal;
	color: #fff !important;
	margin: 0;
}
@media (min-width: 1200px) {
	.block_search_res_grid .item_title,
	.block_search_res_grid .item_title a { font-size: 40px !important; }
}
.block_search_res_grid .item_info_price { display: flex; align-items: baseline; gap: 8px; margin: 0; }
.block_search_res_grid .item_info_price label {
	font-size: 11px; letter-spacing: .16em; text-transform: uppercase;
	color: rgba(255,255,255,.62); margin: 0;
}
.block_search_res_grid .item_info_price_new,
.block_search_res_grid .item_info_price_new .currency_amount {
	font-family: var(--swissresort-main-font, sans-serif);
	font-size: 16px; font-weight: 400; color: #fff !important;
}
/* The ฿ glyph is missing from the heading face and falls back to a heavier
   sans, so it sat next to the figure looking clipped. Force the body font on
   the symbol specifically — /rooms/ shows the same glyph, so it stays a symbol
   here rather than the word THB used on the booking pages. */
.block_search_res_grid .currency_symbol {
	font-family: var(--swissresort-main-font, sans-serif) !important;
	font-weight: 400;
	margin-right: 2px;
}

/* the excerpt arrives truncated mid-sentence; /rooms/ shows no prose either */
.block_search_res_grid .item_description { display: none; }
.block_search_res_grid select, .babe_shortcode_block select {
	border: 1px solid rgba(30,30,30,.18);
	border-radius: 999px;
	padding: 10px 18px;
	background: transparent;
	font-size: 13px;
	color: #1E1E1E;
}

/* ---- search results: the sort control --------------------------------- */

/* BABE's Title / Price / Rating / Availability control shipped as a plugin
   default — white fill, 16px radius, #E9E9E9 border, terracotta value text —
   which is not a material used anywhere else on this site. It gets the same
   treatment as the rule above, which was written for it but never applied:
   that rule targets `select`, and this control is a div with a text input and
   a <ul>, not a native select.

   SCOPED TO .babe_search_results_filters ON PURPOSE. `.input_select_field` and
   `.input_select_input` are the SAME class names the homepage booking bar uses.
   A bare selector here would restyle the search bar on /home/. */
.babe_search_results_filters .input_select_input {
	border: 1px solid rgba(30, 30, 30, .18) !important;
	border-radius: 999px !important;
	background: transparent !important;
	padding: 10px 18px !important;
	font-size: 13px !important;
	color: #1E1E1E !important;
	height: auto !important;
}
.babe_search_results_filters .input_select_input:focus {
	outline: none !important;
	border-color: rgba(30, 30, 30, .38) !important;
	box-shadow: none !important;
}
/* the open list: the calendar and guests panel material, so all three
   drop-downs on the site are one object */
.babe_search_results_filters .input_select_list {
	border: 0 !important;
	border-radius: 16px !important;
	box-shadow: 0 26px 60px rgba(30, 30, 30, .18) !important;
	padding: 8px 0 !important;
	overflow: hidden;
}
.babe_search_results_filters .input_select_list .term_item {
	padding: 9px 18px !important;
	font-size: 13px;
	color: #1E1E1E;
}
.babe_search_results_filters .input_select_list .term_item:hover,
.babe_search_results_filters .input_select_list .term_item_selected {
	background: rgba(30, 30, 30, .05) !important;
	color: #1E1E1E !important;
}
.babe_search_results_filters .input_select_sort i {
	color: rgba(30, 30, 30, .55);
	font-size: 16px;
}
/* The plugin insets the filters row by 20px while the card columns are inset by
   15px, so the control's right edge sat 5px short of the last card's. */
.babe_shortcode_babe_listing_filters {
	padding-left: 15px !important;
	padding-right: 15px !important;
}

/* --------------------------------------------------------------------------
   GUESTS picker — never been visible until now, so never styled

   The form had overflow:hidden (see the search-bar section above), so this
   panel was clipped out of existence and the field looked like it simply would
   not accept input. With the clip gone, three faults were visible immediately:

     1. it opened UPWARDS, off the top of the bar (top: -104px)
     2. the + and − icons were terracotta ON terracotta — invisible
     3. Apply was near-white text on a transparent background — invisible

   All three are below.
   -------------------------------------------------------------------------- */

/* Matched to the date calendar, measured off it: 16px radius, NO border,
   0 26px 60px rgba(30,30,30,.18), and 24px 26px 18px of padding. The old 6px
   padding is what put the text hard against the edge. */
.babe-search-form .search_guests_select_wrapper {
	top: calc(100% + 14px) !important;
	bottom: auto !important;
	border: 0 !important;
	border-radius: 16px !important;
	box-shadow: 0 26px 60px rgba(30, 30, 30, .18) !important;
	padding: 24px 26px 18px !important;
	min-width: 260px;
}

/* the counters */
.babe-search-form .search_guests_plus,
.babe-search-form .search_guests_minus {
	background: transparent !important;
	border: 1px solid rgba(30, 30, 30, .28) !important;
	color: #1E1E1E !important;
	border-radius: 999px !important;
	transition: background .25s ease, color .25s ease, border-color .25s ease;
}
.babe-search-form .search_guests_plus i,
.babe-search-form .search_guests_minus i {
	color: inherit !important;
	font-size: 11px;
	line-height: 1;
}
.babe-search-form .search_guests_plus:hover,
.babe-search-form .search_guests_minus:hover {
	background: #1E1E1E !important;
	border-color: #1E1E1E !important;
	color: #F9DABA !important;
}

/* the count and its label */
.babe-search-form .select_guests_value {
	font-family: var(--swissresort-heading-font, serif);
	font-size: 18px;
	color: #1E1E1E;
}
.babe-search-form .select_guests_title {
	font-size: 13px;
	color: rgba(30, 30, 30, .70);
}

/* Apply — sized to match the CALENDAR's Apply exactly, which is the reference
   for this bar. Measured off the live daterangepicker footer:
   120 x 39, padding 12px 26px, 10.5px / 600 / 1.47px tracking, 999px radius.

   The plugin gives this button `w-100`, which stretched it to the full 208px
   width of the panel and made it twice the calendar button's height — that is
   the mismatch. width:auto undoes `w-100`; min-width holds it at the
   calendar's 120px so the two are identical side by side.

   Fill and hover use the same tokens as the calendar's Apply (terracotta,
   darkening on hover) so the two buttons are indistinguishable.

   The right-alignment that puts it where the calendar's Apply sits lives with
   the rest of the .search_guests_apply block further down, not here. */
.babe-search-form .search_apply_btn {
	background: var(--swissresort-theme-color, #B46841) !important;
	color: #fff !important;
	border: 1px solid transparent !important;
	border-radius: 999px !important;
	font-size: 10.5px !important;
	font-weight: 600 !important;
	letter-spacing: 1.47px !important;
	line-height: 1.2 !important;
	text-transform: uppercase !important;
	padding: 12px 26px !important;
	width: auto !important;
	min-width: 120px !important;
}
.babe-search-form .search_apply_btn:hover {
	background: var(--swissresort-theme-hover-color, #84411E) !important;
	color: #fff !important;
}


/* --------------------------------------------------------------------------
   CHECKOUT — separators, same treatment as the room page
   (kept at the END of the file on purpose — see note below)

   Measured on a live checkout with a booking in session, since these pages
   render nothing at all when opened cold:

     rgba(30,30,30,.12)  10x  .order_item_row_* — the order summary rows
     rgba(30,30,30,.18)   5x  .checkout_input_field — the field underlines

   Two values again, and neither matches the room page. The order rows become
   --noore-line like every other divider on the site. The field underlines drop
   to .14, which is what the From / To fields on the room page use — slightly
   stronger than a divider on purpose, because it is the edge of something you
   type into, not a rule between sections.

   Static, as asked: no transition on any of them, so a separator never fades
   or shifts on hover or focus. The focus state moves the colour in one step.

   WHY THIS LIVES LAST: the checkout section further up already declares these
   borders with !important. Equal specificity plus !important is decided by
   source order, so placed anywhere above it this block simply lost — verified
   by measurement, the selector matched and the colour still computed .12.
   Anything added after this point will override it in turn.
   -------------------------------------------------------------------------- */

body:is(.page-id-6351, .page-id-6352, .page-id-6353,
        .page-id-6355, .page-id-6356, .page-id-6357) :is(.order_item_row_image,
                                                          .order_item_row_details,
                                                          .order_item_row_price,
                                                          .order_item_row,
                                                          .table_order_items_details td,
                                                          .table_order_items_details th,
                                                          .amount_group,
                                                          .checkout_form_terms_details) {
	border-color: var(--noore-line) !important;
	transition: none !important;
}

body:is(.page-id-6351, .page-id-6352, .page-id-6353,
        .page-id-6355, .page-id-6356, .page-id-6357) .checkout_input_field {
	border-bottom-color: rgba(30, 30, 30, .14) !important;
	transition: none !important;
}

body:is(.page-id-6351, .page-id-6352, .page-id-6353,
        .page-id-6355, .page-id-6356, .page-id-6357) .checkout_input_field:focus {
	border-bottom-color: var(--swissresort-theme-color, #B46841) !important;
}

/* ---- guests rows — room to breathe, and no browser focus ring ---------- */

/* The rows had no height and no separation, so the three counters sat on top of
   each other against the panel edge. Hairline between them is the same
   rgba(30,30,30,.12) used everywhere else on the site. */
.babe-search-form .input_select_field_guests {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 18px;
	padding: 14px 0;
}
/* Rule BETWEEN rows only. Using border-bottom + :last-of-type left a line under
   the final row that doubled up with the APPLY divider — :last-of-type did not
   match because the plugin puts a hidden input after the rows. A sibling
   selector cannot produce a trailing line at all. */
.babe-search-form .input_select_field_guests + .input_select_field_guests {
	border-top: 1px solid rgba(30, 30, 30, .12);
}

/* APPLY was welded to the last row. Right-aligned to sit where the calendar's
   own Apply sits — the button itself is sized to match up in the block above. */
.babe-search-form .search_guests_apply {
	margin-top: 16px;
	padding-top: 16px;
	border-top: 1px solid rgba(30, 30, 30, .12);
	text-align: right !important;
}

/* The blue rounded rectangle around GUESTS is the browser's own focus ring on
   the control inside the field. Every other field in this bar suppresses it and
   lets the hover/active colour carry focus instead. */
.babe-search-form .search_guests_field:focus,
.babe-search-form .search_guests_field *:focus,
.babe-search-form .search_guests_title:focus,
.babe-search-form .select_guests_input_value:focus {
	outline: none !important;
	box-shadow: none !important;
}

/* The plugin prints the row as "0  Adult  +  −": the count is stranded on the
   far left and the buttons read backwards. Every stepper anyone has ever used
   puts the count BETWEEN the two buttons, so the row is reordered to
   "Adult   −  0  +". The row is a flex container now, so this is pure `order`
   and the plugin's own markup and handlers are untouched.

   The count gets a fixed 28px box, centred: without it the − and + shift
   sideways the moment the number goes from 0 to 10. */
.babe-search-form .select_guests_title  { order: 1; margin-right: auto; }
.babe-search-form .search_guests_minus  { order: 2; }
.babe-search-form .select_guests_value  {
	order: 3;
	min-width: 28px;
	text-align: center;
	margin: 0 4px;
}
.babe-search-form .search_guests_plus   { order: 4; margin-left: 0; }

/* NOORE takes adults and children only — no "Youth" band.

   The plugin ships three age bands as terms in its "ages" taxonomy:
   Adult (17), Youth (34), Child (20). Each row carries data-name="guests[ID]",
   so Youth can be hidden precisely.

   Hidden rather than deleted ON PURPOSE: the term is referenced by the booking
   objects and their pricing, so removing it risks the rate data. Its hidden
   input still posts guests[34]=0, which is inert.
   To remove it for real: wp-admin -> Booking -> Ages -> delete "Youth", then
   this rule can go. */
.babe-search-form .input_select_field_guests[data-name="guests[34]"] {
	display: none !important;
}

/* ---- search results: the grafted /rooms/ furniture --------------------- */

/* A script on the results page copies each room's real price pill, BOOK NOW
   reveal and spec row out of /rooms/ and grafts them onto the plugin's card,
   reusing the theme's own class names. These rules place them. */

.block_search_res_grid .item_img { position: relative; }

/* price pill, top-left, outlined — as on /rooms/ */
.block_search_res_grid .tour_info_price_new {
	/* Every value measured off /rooms/: a plain 8px outlined box at 20/20, no
	   fill and no blur. It had been built as a frosted 999px capsule at 13px,
	   which is a different object entirely. */
	position: absolute;
	top: 20px;
	left: 20px;
	z-index: 3;
	display: inline-flex;
	align-items: center;
	gap: 4px;
	padding: 6px 10px;
	border: 1px solid #fff;
	border-radius: 8px;
	background: transparent;
	-webkit-backdrop-filter: none;
	backdrop-filter: none;
	color: #fff;
	font-family: var(--swissresort-main-font, sans-serif);
	font-size: 16px;
	line-height: 1.85;
	letter-spacing: normal;
	white-space: nowrap;
}
.block_search_res_grid .tour_info_price_new .currency_amount,
.block_search_res_grid .tour_info_price_new .currency_symbol { color: #fff !important; }

/* BOOK NOW — hidden until hover, exactly like /rooms/ */
.block_search_res_grid .direction {
	position: absolute;
	top: 50%;
	left: 50%;
	transform: translate(-50%, -50%) scale(.86);
	z-index: 3;
	/* 130px, 16px/500, no tracking — measured off /rooms/ under a real hover.
	   The base .14/.22 pair and the hovered .22/.34 pair are the theme's own
	   translucent-control material, shared with the header and footer pills. */
	width: 130px;
	height: 130px;
	border-radius: 50%;
	background: rgba(255, 255, 255, .14);
	-webkit-backdrop-filter: blur(8px);
	backdrop-filter: blur(8px);
	border: 1px solid rgba(255, 255, 255, .22);
	color: #fff;
	font-size: 16px;
	font-weight: 500;
	letter-spacing: normal;
	opacity: 0;
	transition: opacity .35s ease, transform .35s ease;
	pointer-events: none;
}
.block_search_res_grid .babe_all_items_item_inner:hover .direction {
	opacity: 1;
	transform: translate(-50%, -50%) scale(1);
	background: rgba(255, 255, 255, .22);
	border-color: rgba(255, 255, 255, .34);
}

/* spec row under the room name — /rooms/ spaces these with a 30px right margin
   on each item and lets them wrap, rather than a gap on a nowrap row. Copying
   the margins means the columns line up between the two pages. */
.block_search_res_grid .info-detail-room {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	margin: 15px 0 0;
}
.block_search_res_grid .item-detail-room {
	display: inline-flex;
	align-items: center;
	gap: 7px;
	margin: 0 30px 5px 0;
	color: #fff;
	font-size: 15px;
}
.block_search_res_grid .item-detail-room .icon i { font-size: 16px; color: #fff; }
.block_search_res_grid .item-detail-room .info { white-space: nowrap; }

/* --------------------------------------------------------------------------
   34. PRICE DISCLAIMER - REMOVED 5 Sep 2026

   The "+ 10% service charge and 7% VAT" note used to hang off every price on
   the site - room page headline, /rooms/ and Home cards, Similar Rooms and the
   search results. Removed on instruction: the fees are to be shown at CHECKOUT
   ONLY, in the total breakdown, not appended to every displayed rate.

   Do not reinstate it here. If a rate needs qualifying, it belongs in the
   checkout breakdown.
   -------------------------------------------------------------------------- */

/* --------------------------------------------------------------------------
   35. HOMEPAGE - PHONE LAYOUT (<=767px)
   5 Sep 2026. First mobile pass on Home; measured in a 390x844 same-origin
   iframe, not eyeballed.

   THE FAULT. The header (2482) is position:absolute over the hero and stacks
   to 553px on a phone, while the hero image is only 487px. The booking bar sat
   at 221-455 and the hero text block (00d0da4, itself absolute at top:300px -
   a desktop value that never adapts) sat at 300-509. They overlapped by 155px:
   the glass bar was printed straight over "STAY WITH US, FEEL AT HOME".
   The bar was also strangled to 208px of a 373px viewport by 45px of side
   padding on 635a321 plus a flex:0 1 auto column that would not stretch.

   THE FIX, agreed with the client: on phones the bar comes OFF the photo and
   sits below it as a normal card. fc5daa0 goes absolute at top:494px - just
   under the 533px image bottom - which also drops it out of the header's flow,
   so the header collapses to logo + Call Us and stops covering the hero text.
   b9b62c7 (the next section) takes a 225px top margin to make room, because the
   header is absolute and contributes nothing to page flow.

   Off the photo the glass has nothing to sit on, so the panel gets a real white
   surface and the white type becomes ink. The field labels are ::before
   pseudo-elements, not real elements - that is why they need their own rule.

   THE GO BUTTON. The block at line ~515 already tries to make it a full-width
   52px pill at <=991px, and has never once worked: the geometry rule at line
   ~265 is (1,3,1) WITH !important and beats it outright. Matching that exact
   selector here is the only thing that lands. Do not "simplify" it.

   Anything appended after this section will override it - see the note above
   section 33 about source order deciding equal-specificity !important.
   -------------------------------------------------------------------------- */

@media (max-width: 767px) {

	/* 1. Reclaim the width. 45px each side of a 390px screen was 24% of it. */
	.elementor-2482 .elementor-element-635a321 {
		padding-left: 16px !important;
		padding-right: 16px !important;
	}
	.elementor-2482 .elementor-element-52c3328 {
		flex: 1 1 100% !important;
		width: 100% !important;
		max-width: 100% !important;
	}

	/* 2. Bar off the photo, parked under it. */
	.elementor-2482 .elementor-element-fc5daa0 {
		position: absolute !important;
		left: 0 !important;
		right: 0 !important;
		/* Track the hero token instead of a magic number: the image is
		   --noore-hero-carousel tall and starts level with 635a321, so its
		   bottom IS that value. A fixed 494px was measured in a 790px-tall
		   iframe and clipped the image by 26px on a real 844px phone. */
		top: calc(var(--noore-hero-carousel, 520px) + 16px) !important;
		width: auto !important;
		padding: 0 16px !important;
	}
	.elementor-28 .elementor-element-b9b62c7 {
		margin-top: 225px !important;
	}

	/* 3. Two dates across, guests and GO full width. */
	form.babe-search-form .input-group {
		display: flex !important;
		flex-wrap: wrap !important;
		gap: 6px;
	}
	form.babe-search-form .input-group > .search-date {
		flex: 1 1 calc(50% - 3px) !important;
		width: auto !important;
	}
	form.babe-search-form .input-group > .search_guests_field,
	form.babe-search-form .input-group > .submit {
		flex: 1 1 100% !important;
		width: 100% !important;
	}
	form.babe-search-form .input-group > .submit { margin: 0 !important; }

	/* 4. Cream surface treatment - the glass is now over page, not photo. */
	form.babe-search-form {
		background: #FFFFFF !important;
		border: 1px solid var(--noore-line, rgba(30, 30, 30, .12)) !important;
		border-radius: var(--noore-r, 18px) !important;
		box-shadow: var(--noore-shadow, 0 10px 30px rgba(30, 30, 30, .08)) !important;
		backdrop-filter: none !important;
		padding: 12px !important;
	}
	form.babe-search-form .search-date,
	form.babe-search-form .search_guests_field {
		background: #F8F5F0 !important;
		border-radius: var(--noore-r-sm, 10px) !important;
	}
	form.babe-search-form .search_date,
	form.babe-search-form .add_ids_title,
	form.babe-search-form .search_guests_title,
	form.babe-search-form .search_guests_field { color: #1E1E1E !important; }

	/* Labels are ::before, not elements. */
	form.babe-search-form .search-date::before,
	form.babe-search-form .search_guests_field::before,
	form.babe-search-form .search_guests_title::before { color: rgba(30, 30, 30, .62) !important; }

	/* 5. GO - must match the (1,3,1) selector at ~265 to win. See note above. */
	body #search_form .btn-search.btn-search.btn-search,
	body #search_form button[name="submit"] {
		width: 100% !important;
		min-width: 0 !important;
		height: 52px !important;
		border-radius: 999px !important;
	}
}


/* --------------------------------------------------------------------------
   36. SEARCH RESULTS - the price is a FROM price, so say so
   5 Sep 2026

   THE PROBLEM, and it was ours. Search 20-22 Dec (peak) and the card advertised
   "B1,300 / NIGHT" while the room page and checkout charge B2,200 for those
   dates. Price bait on a live booking system.

   BABE's own element is honest - .item_info_price renders "from B1,300" - but
   it is HIDDEN by section 24, and the visible pill is the one OUR search-results
   widget grafts on from /rooms/. The graft restated a "from" price as a flat
   nightly rate. BABE has no per-date price on the card and no setting to add
   one; its booking_calculate endpoint needs a serialized booking form that the
   search page does not have.

   So the honest minimum: put "from" back. B1,300 genuinely is the lowest rate
   for that room, so "from B1,300 / night" is true for every search.

   THIS IS NOT DATE-ACCURATE. A guest searching peak dates still sees the low
   season figure and only meets B2,200 on the room page. The real fix is for the
   graft widget to ask BABE for the searched-date rate - that widget is Elementor
   HTML on page 6302 and cannot be edited while the >16KB POST block (see the
   handover checklist) stops Elementor saving.

   Scoped to .block_search_res_grid ONLY. /rooms/ and the Home carousel have no
   dates in play, so they are left alone deliberately.
   -------------------------------------------------------------------------- */

.block_search_res_grid .tour_info_price_new::before {
	content: "from ";
	font-size: .72em;
	font-weight: 400;
	letter-spacing: .04em;
	text-transform: uppercase;
	opacity: .8;
}


/* --------------------------------------------------------------------------
   37. CALENDAR TOOLTIP - price only, no internal rate labels
   5 Sep 2026

   The availability calendar IS date-accurate: every .cal-cell carries the real
   rate for that date in .cal-cell-pricefrom, and hovering opens .view-rate-details.
   Measured on Cozy Room: 450 cells, B1,000 / B1,500 / B1,800 falling exactly on
   the low, high and peak windows.

   But that panel also printed the RATE TITLE - "Low season", "High season",
   "Peak season" - which are the names WE gave the rate rows so the admin list
   is readable. They are internal vocabulary. A guest wants the price, not our
   pricing model, and knowing a date is "low season" invites them to go hunting
   for a cheaper one.

   Hidden, not renamed: renaming the rates would make the room editor's rate list
   unreadable, and those titles are the only thing distinguishing the seven rows.
   "General price:" goes too - it is BABE's wording, meaningless to a guest.
   The tooltip now reads simply "B1,000 / night".

   Scoped to .elementor-2610 #room-calendar so the ADMIN rate list, which uses
   the same .view-rate-details markup, is untouched.
   -------------------------------------------------------------------------- */

.elementor-2610 #room-calendar .view-rate-details .view-rate-details-item > h4 {
	display: none !important;
}

.elementor-2610 #room-calendar .view-rate-details .rate_details_label {
	display: none !important;
}


/* --------------------------------------------------------------------------
   38. SEARCH RESULTS - dated price replaces the "from" price
   5 Sep 2026

   The widget on page 6302 asks BABE for the real total for the searched dates
   and rewrites the pill as "B4,237 - 2 nights", tagging it .noore-dated-price.
   When that happens the "from " prefix from section 36 becomes wrong - it is no
   longer a from price, it is THE price - so it comes off.

   Undated searches never get the class and keep "from B1,300 / NIGHT".
   -------------------------------------------------------------------------- */

.block_search_res_grid .tour_info_price_new.noore-dated-price::before {
	content: none !important;
}


/* --------------------------------------------------------------------------
   39. SINGLE ROOM - guests stepper, matched to the homepage booking bar
   5 Sep 2026

   BABE renders the room page's guest count as its own dropdown widget - a
   readonly text input, a <ul> of options and a chevron - while the homepage
   search bar renders a - 0 + stepper. Same question, same brand, two controls.

   A dropdown cannot be restyled into a stepper, so section 39 of functions.php
   builds the two buttons and the count inside the plugin's own
   .input_select_wrapper. The dropdown's parts are hidden here rather than
   removed: the plugin reads the input's value to price the stay and rewrites
   the <ul> to re-cap the row when another row changes.

   Every number below is measured off the live homepage row so the two match:
   30px circles, 1px rgba(30,30,30,.28), 11px glyph, heading face at 18px in a
   28px box, 14px of row height, hairline rgba(30,30,30,.12) between rows.
   -------------------------------------------------------------------------- */

#booking-guests-result .select_guests_block {
	margin-bottom: 0;
}

/* Between rows only - a room with Adult and Child bands gets one rule, not a
   trailing line under the last row. */
#booking-guests-result .select_guests_block + .select_guests_block {
	border-top: 1px solid rgba(30, 30, 30, .12);
}

/* The row itself. The age name, when there is one, is pushed left and the
   stepper sits right, under the block's own "Guests:" label. A room with a
   single unnamed band has no name to show and the stepper simply sits right. */
#booking-guests-result .input_select_title {
	display: flex;
	align-items: center;
	justify-content: flex-end;
	gap: 18px;
	padding: 7px 0;
	cursor: default;
}

#booking-guests-result .input_select_title_value {
	margin-right: auto;
	font-size: 13px;
	color: rgba(30, 30, 30, .70);
}

#booking-guests-result .input_select_wrapper {
	display: flex;
	align-items: center;
	gap: 4px;
}

/* Hidden, not removed - see the section note. */
#booking-guests-result .input_select_input,
#booking-guests-result .input_select_list,
#booking-guests-result .input_select_wrapper > i.fas {
	display: none !important;
}

/* The colour carries !important because section 30's BOOK NOW rule,
   `#booking_form button, .btn, ... { color: #fff !important }`, paints every
   button in this card white - which rendered the glyphs white on white and
   left two empty circles. The glyph inherits, so the button is the only place
   the colour has to win. */
#booking-guests-result .noore-guests-btn {
	flex: 0 0 30px;
	width: 30px;
	height: 30px;
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 0;
	background: transparent;
	border: 1px solid rgba(30, 30, 30, .28);
	border-radius: 999px;
	color: #1E1E1E !important;
	cursor: pointer;
	transition: background .25s ease, color .25s ease, border-color .25s ease,
	            opacity .25s ease;
}

#booking-guests-result .noore-guests-btn i {
	font-size: 11px;
	line-height: 1;
	color: inherit !important;
}

#booking-guests-result .noore-guests-btn:hover:not(:disabled) {
	background: #1E1E1E;
	border-color: #1E1E1E;
	color: #F9DABA !important;
}

/* At the floor or the ceiling. Dimmed rather than hidden so the row does not
   change width as the count moves. */
#booking-guests-result .noore-guests-btn:disabled {
	opacity: .35;
	cursor: default;
}

#booking-guests-result .noore-guests-btn:focus {
	outline: none;
	box-shadow: none;
}

/* Fixed box, or the buttons shift sideways when the count reaches 10. */
#booking-guests-result .noore-guests-value {
	font-family: var(--swissresort-heading-font, serif);
	font-size: 18px;
	color: #1E1E1E;
	min-width: 28px;
	text-align: center;
	margin: 0 4px;
}


/* --------------------------------------------------------------------------
   40. HEADER LOGO ON PHONES - it was overlapping the page title
   5 Sep 2026

   THE FAULT. The header logo had no width at phone widths, so the image fell
   back to filling its container: 345 x 105 on a 390px screen. That is LARGER
   than the desktop logo, which is an explicit 243 x 74. The header is
   position:absolute over the breadcrumb hero, so the oversized wordmark landed
   straight on top of the page title - measured 41px of overlap on /gallery/,
   /faqs/, /blogs/ and /terms-and-conditions/, i.e. every page using
   .bread-title. On /gallery/ the NOORE wordmark sat across the word GALLERY.

   Desktop is 243px wide on a 1470px viewport, about 16.5% of it. 156px on a
   390px phone keeps that proportion, reads clearly, and frees ~58px of height
   which clears the 41px collision with room to spare.

   height:auto is required - the intrinsic 2560x778 attributes would otherwise
   hold the old aspect ratio and reintroduce the height.
   -------------------------------------------------------------------------- */

@media (max-width: 767px) {
	.logo .logo-main img {
		width: 156px;
		height: auto;
	}
}


/* --------------------------------------------------------------------------
   41. BREADCRUMB HERO ON PHONES - clear the stacked header
   5 Sep 2026

   Section 40 fixed the logo, which exposed a second collision underneath it.

   THE FAULT. The header (elementor-2325) is a flex row on desktop but STACKS
   on a phone: MENU 46..104, logo 104..182, Call Us 182..236. That makes it
   191px tall, and it is position:absolute over the hero, so the Call Us pill
   came down on top of the page title - measured 182..236 against a title at
   183..219 on /gallery/ and /faqs/, identical geometry on both.

   THE FIX. Push the hero's content group below the header rather than
   restructuring the header, which is shared with pages that have no hero and
   whose mobile layout is already tuned (section 35).

   Anchored on .apus-breadscrumb because the Elementor container IDs differ
   per page - /gallery/ nests the title one level shallower than /faqs/ - but
   the theme's breadcrumb class and the crumb/title order are identical on all
   of them. The crumb leads the flow, so padding it moves the title too.

   PADDING, not margin: a top margin here can collapse into the widget wrapper
   and move nothing.

   64px measured: title goes 183..219 -> 247..283, clearing the header's 236 by
   11px, and the group ends at 313 inside a hero that runs to 346. The crumb
   text (L133..R242) never meets the Call Us pill (L247) horizontally, so it is
   free to sit alongside it.

   Applies to /gallery/, /faqs/, /blogs/, /terms-and-conditions/,
   /privacy-policy/ and / - every page carrying this hero. Home, Rooms, About,
   Contact and the room pages have no .apus-breadscrumb and are untouched.
   -------------------------------------------------------------------------- */

@media (max-width: 767px) {
	.apus-breadscrumb {
		padding-top: 64px;
	}
}


/* --------------------------------------------------------------------------
   42. CONTACT + BLOGS ON PHONES - tap targets
   5 Sep 2026

   Both pages already sized correctly at 390px: no horizontal overflow, form
   fields 295x51 at 16px (16px matters - anything smaller makes iOS zoom the
   page on focus), the map 295x480, blog cards 345 wide with 345x261 images.
   Sections 40 and 41 had already cleared the hero collisions.

   What was actually wrong was touch: the things you tap were laid out at
   desktop text sizes.

   CONTACT - the three contact actions were 21px tall. On the one page whose
   entire job is "get in touch", the phone, WhatsApp and email links were
   half the ~44px a finger needs. They are Elementor heading widgets, so the
   anchor is display:inline and vertical padding on an inline box does not
   reserve layout height - hence inline-block.

   BLOGS - .btn-readmore is inline-flex at 162x30.

   Scoped to these two pages by request. The same 21px links exist in the
   FOOTER sitewide and were left alone - that is a separate call.

   The small category tags on the blog cards ("Phuket Guide", 20px) were also
   left: they are inline text inside a sentence-like meta row, and padding
   them out would break that rhythm for a secondary link.
   -------------------------------------------------------------------------- */

@media (max-width: 767px) {
	.elementor-38 .elementor-heading-title a[href^="tel:"],
	.elementor-38 .elementor-heading-title a[href^="mailto:"],
	.elementor-38 .elementor-heading-title a[href*="wa.me"] {
		display: inline-block;
		padding-top: 14px;
		padding-bottom: 14px;
	}

	.btn-readmore {
		padding-top: 8px;
		padding-bottom: 8px;
	}
}


/* --------------------------------------------------------------------------
   43. LOCATION PAGE (/location/, page 7260)
   5 Sep 2026

   New page holding the client's AROUND NOORE distances and the three area
   write-ups. Built with stock Elementor widgets so it stays editable; only the
   distance list needs real CSS, because Elementor has no two-column
   "place ..... time" row and a table would not reflow on a phone.

   The list is a plain <ul> inside a text editor widget. Flex rows, hairline
   between them, time right-aligned. On a phone the place name is allowed to
   wrap while the time stays pinned right, so the column never collapses.

   Colours are the established tokens - --c-line for hairlines, --noore-r for
   radius - so this inherits any future palette change instead of pinning its
   own values.
   -------------------------------------------------------------------------- */

.noore-around {
	list-style: none;
	margin: 0 auto;
	padding: 0;
	max-width: 620px;
}

.noore-around li {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: 18px;
	padding: 15px 2px;
	border-bottom: 1px solid var(--c-line, rgba(30, 30, 30, .12));
}

.noore-around li:first-child { border-top: 1px solid var(--c-line, rgba(30, 30, 30, .12)); }

.noore-around-place { flex: 1 1 auto; }

/* Never let the time wrap onto its own line - that is what makes a list like
   this read as broken on a narrow screen. */
.noore-around-time {
	flex: 0 0 auto;
	white-space: nowrap;
	opacity: .72;
	font-variant-numeric: tabular-nums;
}

.noore-around-note {
	max-width: 620px;
	margin: 18px auto 0;
	font-size: 13px;
	line-height: 1.5;
	opacity: .66;
}

/* The three area write-ups.

   NOTE: Elementor takes custom classes on a CONTAINER under a different key
   than on a widget, so the .noore-area / .noore-areas classes set at build
   time never rendered. Rather than re-nest the containers, these hang off the
   heading widget class, which did land, and off the page id. Both are stable.

   A hairline above each area reads better here than a bordered card anyway -
   the page is one continuous read, not a set of tiles. */
.noore-area-title {
	padding-top: 34px;
	border-top: 1px solid var(--c-line, rgba(30, 30, 30, .12));
}

/* Elementor containers on this page run the full boxed width, which put the
   body copy on ~1430px lines - unreadable. Everything except the map is
   pulled back to a measure; the map keeps its width. */
/* Page width is NOT set here on purpose.

   It was, with !important, and that was a mistake: Elementor applies its own
   width controls through the same generic rule
   (.elementor.elementor .e-con > .elementor-widget), so an !important rule
   here outranks anything set in the editor - the page would look right but
   silently refuse to be edited.

   The measure now lives on the containers themselves, in Elementor:
   Container > Layout > Content Width = Boxed, 860px on the three text
   sections and 1100px on the map. Change it in the editor, not here. */

.noore-area-lead { font-weight: 600; margin-bottom: .4em; }

.noore-area-more { margin-top: 1em; margin-bottom: 0; }
.noore-area-more a { text-decoration: none; border-bottom: 1px solid currentColor; }

@media (max-width: 767px) {
	.noore-around li { padding: 13px 0; }
	.noore-around-note { padding: 0 4px; }

	/* Same 44px floor as section 42 - this button was 177x39. */
	.noore-loc-cta .elementor-button {
		min-height: 46px;
		display: inline-flex;
		align-items: center;
	}
}


/* --------------------------------------------------------------------------
   40. TRANSFER pages - strip the room furniture
   5 Sep 2026

   Transfers are quoted by hand: the guest sends a date and their flight, the
   hotel replies with a price. The booking rule is in "Request for price and
   details" mode and the objects carry no rate at all.

   The single-object template is the ROOM template, so two pieces of it are
   wrong here: the price widget renders a bare B0 with no rate to read, and a
   "Room amenities" heading sits over an empty section.

   Keyed on post IDs rather than a body class. A body class added per CATEGORY
   would be better - a third transfer object would inherit it automatically -
   but that needs a functions.php filter, and functions.php can only be
   deployed through Hostinger File Manager (the theme-editor POST is rejected
   by the WAF because the file contains inline JS). ADD THE NEW ID HERE if a
   third transfer object is ever created, or it will show B0.
   -------------------------------------------------------------------------- */

body.postid-7258 .elementor-element-13107cd,
body.postid-7262 .elementor-element-13107cd,
body.postid-7258 .tour_info_price_new,
body.postid-7262 .tour_info_price_new {
	display: none !important;
}

/* "Room amenities" heading and the spacer above it. */
body.postid-7258 .elementor-element-b44ea8e,
body.postid-7262 .elementor-element-b44ea8e,
body.postid-7258 .elementor-element-3dd6875,
body.postid-7262 .elementor-element-3dd6875 {
	display: none !important;
}

/* The room-specs row ("4 GUESTS") and the "EXPLORE / SIMILAR ROOMS" block, which
   lists bedrooms at the foot of a car-transfer page. Hiding container 7b15cfb
   takes the eyebrow, the heading and the cards in one rule.
   Same post-ID caveat as above: ADD THE NEW ID for any third transfer object. */
body.postid-7258 .elementor-element-cb52774,
body.postid-7262 .elementor-element-cb52774,
body.postid-7258 .elementor-element-7b15cfb,
body.postid-7262 .elementor-element-7b15cfb {
	display: none !important;
}

/* --------------------------------------------------------------------------
   Location (7260)

   The page was built with a complete class vocabulary — .noore-loc-title,
   .noore-around, .noore-area-title and the rest — and then shipped with no
   rules for any of them. It rendered as a default <ul> with default headings
   on the sand ground, which is the whole of the "looks plain" complaint.

   Nothing new is invented here. This is the About/Contact system (eyebrow,
   hairline rows, ghost link, grayscale map) reused on a third page, with the
   same three tokens re-declared for ink-on-sand exactly as .noore-col does.
   Scoped to .elementor-7260 rather than added to the :is() lists above,
   because those also carry the split/plate/hero rules this page has no use for
   and which would fight its boxed containers.
   -------------------------------------------------------------------------- */

.elementor-7260 {
	--c-cream: #1E1E1E;                      /* the "value" ink, per .noore-col */
	--c-muted: rgba(30, 30, 30, .58);
	--c-line: rgba(30, 30, 30, .12);
}

/* ---- intro ------------------------------------------------------------ */

.elementor-7260 .noore-eyebrow .elementor-heading-title {
	font-family: var(--swissresort-main-font, sans-serif);
	font-size: 10.5px;
	letter-spacing: .24em;
	text-transform: uppercase;
	font-weight: 500;
	color: var(--swissresort-theme-color, #B46841);
}
.elementor-7260 .noore-loc-title .elementor-heading-title {
	font-family: var(--swissresort-heading-font, serif);
	font-size: clamp(34px, 4.6vw, 60px);
	line-height: 1.12;
	color: var(--c-cream);
	margin-top: 14px;
}
.elementor-7260 .noore-loc-intro {
	color: var(--c-muted);
	max-width: 62ch;
	margin-top: 26px;
	font-size: 16.5px;
	line-height: 1.8;
}
/* "One Stay. More of Phuket." is the lede's first line and carries the idea.
   It is one <p> among several, so it is lifted by position rather than by a
   class the editor would have to remember to apply. */
.elementor-7260 .noore-loc-intro p:first-child {
	font-family: var(--swissresort-heading-font, serif);
	font-size: clamp(20px, 2.3vw, 27px);
	line-height: 1.45;
	color: var(--c-cream);
	margin-bottom: 22px;
}

/* ---- section headings ------------------------------------------------- */

.elementor-7260 .noore-loc-h2 .elementor-heading-title {
	font-family: var(--swissresort-main-font, sans-serif);
	font-size: 10.5px;
	letter-spacing: .24em;
	text-transform: uppercase;
	font-weight: 500;
	color: var(--swissresort-theme-color, #B46841);
}

/* ---- AROUND NOORÉ: hairline rows, not a bulleted list ------------------ */

/* Rendered by [noore_destinations] from the Destinations taxonomy, so the
   markup is a plain <ul> from a text-editor widget rather than Elementor
   containers. Same visual result as About's .noore-line, reached with list
   resets instead of widget resets. */
.elementor-7260 .noore-around {
	list-style: none;
	margin: 30px 0 0;
	padding: 0;
}
/* The rule is lighter here than the --c-line (12%) that About and Contact use.
   Same value, but those rows sit in a padded column roughly half this width,
   and a hairline reads heavier the longer it runs — at this measure 12% became
   a drawn line rather than a division. 8% restores the weight the eye expects. */
.elementor-7260 .noore-around li {
	display: grid;
	grid-template-columns: 1fr auto;
	align-items: baseline;
	gap: 20px;
	padding: 22px 0;
	margin: 0;
	border-top: 1px solid rgba(30, 30, 30, .08);
	transition: padding-left .35s ease;
}
.elementor-7260 .noore-around li:last-child {
	border-bottom: 1px solid rgba(30, 30, 30, .08);
}
/* The rows are not links — the destination archives were dropped rather than
   built. About's hover shift is kept anyway: here it tracks the cursor down a
   ten-row table and helps the eye hold a line, which is a reading aid rather
   than a promise of a click. */
.elementor-7260 .noore-around li:hover {
	padding-left: 12px;
}
/* The place is now an <a> to Google Maps. It carries no underline and no link
   colour — the whole row is the target and the hover shift is the affordance,
   which is the treatment Contact's linked rows already use. Terracotta on
   hover, the site's one accent, matching .noore-ln-v a. */
.elementor-7260 .noore-around-place {
	font-family: var(--swissresort-heading-font, serif);
	font-size: clamp(17px, 1.9vw, 22px);
	line-height: 1.25;
	color: var(--c-cream);
	text-decoration: none;
	transition: color .3s ease;
}
.elementor-7260 .noore-around li:hover .noore-around-place,
.elementor-7260 .noore-around-place:focus-visible {
	color: var(--swissresort-theme-color, #B46841);
}
/* The anchor only wraps the words, so give the row itself the pointer and let
   the whole width feel live. */
.elementor-7260 .noore-around li:hover { cursor: pointer; }
.elementor-7260 .noore-around-place:focus-visible {
	outline: 2px solid var(--swissresort-theme-color, #B46841);
	outline-offset: 3px;
}
.elementor-7260 .noore-around-time {
	font-family: var(--swissresort-main-font, sans-serif);
	font-size: 11px;
	letter-spacing: .16em;
	text-transform: uppercase;
	color: var(--c-muted);
	white-space: nowrap;
}
.elementor-7260 .noore-around-note {
	margin-top: 18px;
	font-size: 12px;
	line-height: 1.7;
	color: var(--c-muted);
}

/* ---- the three areas -------------------------------------------------- */

.elementor-7260 .noore-area-title .elementor-heading-title {
	font-family: var(--swissresort-main-font, sans-serif);
	font-size: 10.5px;
	letter-spacing: .2em;
	text-transform: uppercase;
	font-weight: 500;
	color: var(--swissresort-theme-color, #B46841);
}
/* "Beach, Shopping, Dining & Nightlife." — the standfirst under each area
   name. Serif so the three blocks read as headings with a caption, not as
   three more paragraphs. */
.elementor-7260 .noore-area-lead {
	font-family: var(--swissresort-heading-font, serif);
	font-size: clamp(19px, 2.1vw, 25px);
	line-height: 1.35;
	color: var(--c-cream);
	margin-top: 12px;
}
.elementor-7260 .noore-area-lead + * {
	color: var(--c-muted);
	font-size: 15.5px;
	line-height: 1.8;
	margin-top: 14px;
	max-width: 58ch;
}
/* The quiet text link, borrowed from the site's ghost-link treatment: rule
   under the words only, terracotta on hover. Not a button — the button on this
   page is GET DIRECTIONS, and two solid controls would compete. */
.elementor-7260 .noore-area-more a {
	font-family: var(--swissresort-main-font, sans-serif);
	font-size: 11px;
	letter-spacing: .18em;
	text-transform: uppercase;
	color: var(--c-cream);
	text-decoration: none;
	border-bottom: 1px solid var(--c-line);
	padding-bottom: 6px;
	transition: color .3s ease, border-color .3s ease;
}
.elementor-7260 .noore-area-more a:hover {
	color: var(--swissresort-theme-color, #B46841);
	border-bottom-color: var(--swissresort-theme-color, #B46841);
}

/* ---- map -------------------------------------------------------------- */

/* Same treatment as Contact: rounded, and desaturated so the map reads as a
   figure on the page rather than as a bright Google rectangle. */
.elementor-7260 .noore-map-embed {
	margin-top: 34px;
}
.elementor-7260 .noore-map-embed .elementor-custom-embed,
.elementor-7260 .noore-map-embed iframe {
	border-radius: var(--noore-r);
	display: block;
}
.elementor-7260 .noore-map-embed iframe {
	height: 100%;
	width: 100%;
	filter: grayscale(1) contrast(1.02) brightness(1.03);
}

@media (max-width: 600px) {
	/* Two columns survive to 600px because the times are short. Below that the
	   longer names ("Kajonkiet International School") wrap to three lines
	   against a 30px time column, so the time drops under the place instead. */
	.elementor-7260 .noore-around li {
		grid-template-columns: 1fr;
		gap: 6px;
		padding: 18px 0;
	}
}

@media (prefers-reduced-motion: reduce) {
	.elementor-7260 .noore-around li { transition: none; }
}

/* --------------------------------------------------------------------------
   39b. Guests stepper — the +/- glyphs, and the Extra Bed quantity
   5 Sep 2026

   THE FAULT. Both glyphs rendered in the same place, nowhere near their own
   buttons: the minus sat 81px right of its circle (so the circle looked empty)
   and the plus 7px off centre inside its own.

   Measured cause: the theme positions the dropdown chevron with
   `position: absolute; right: 15px` on `i.fas` INSIDE .input_select_wrapper,
   as a descendant rule. Section 39 hides the chevron itself
   (`.input_select_wrapper > i.fas`, direct child) but the stepper's own icons
   are `i.fas` too, one level deeper inside each <button>. The buttons are
   position:static, so both icons resolved against .input_select_wrapper — the
   same containing block, hence the same coordinates — and parked where the
   chevron belongs. justify-content:center on the button never applied,
   because an absolutely positioned child is out of flow.

   THE FIX. Stop using the font for these two marks. The glyphs are now drawn
   on the button itself, so no inherited rule can move them and there is no
   dependency on Font Awesome loading at all. A 9x1px bar in currentColor
   inherits the hover and disabled states already defined in section 39, and
   1px matches the button's own 1px border rather than Font Awesome's 900
   weight, which read heavy against Aboreto.
   -------------------------------------------------------------------------- */

#booking-guests-result .noore-guests-btn > i.fas {
	display: none !important;
}

/* The containing block the bars resolve against — this alone is what the
   theme's chevron rule was missing. */
#booking-guests-result .noore-guests-btn {
	position: relative;
}

#booking-guests-result .noore-guests-btn::before,
#booking-guests-result .noore-guests-plus::after {
	content: "";
	position: absolute;
	top: 50%;
	left: 50%;
	width: 9px;
	height: 1px;
	background: currentColor;
	transform: translate(-50%, -50%);
}

/* The upright of the plus. */
#booking-guests-result .noore-guests-plus::after {
	transform: translate(-50%, -50%) rotate(90deg);
}

/* .35 was set when the glyph was an 11px Font Awesome mark and the button
   still read as present. A 1px bar at .35 on white disappears, which is what
   made the disabled minus look like an empty ring. */
#booking-guests-result .noore-guests-btn:disabled {
	opacity: .45;
}

/* ---- Extra Bed: no quantity control ----------------------------------- */

/* The select carries exactly one option, "1" — it is a dropdown that cannot be
   dropped. Hidden rather than removed: display:none still submits the field,
   and BABE reads booking_service_qty[6319][0] when pricing the stay, so the
   quantity keeps arriving as 1.
   Scoped to service 6319 (Extra Bed) by name, NOT to .service_quantity
   generally — Late Check-out (2706) is priced per person and its quantity is a
   real choice. */
.booking_services_inner .service_quantity:has(select[name^="booking_service_qty[6319]"]) {
	display: none;
}


/* --------------------------------------------------------------------------
   39c. Services row — the doubled rule, and the gap above it
   5 Sep 2026

   TWO RULES, 16px APART. Measured: .list_service draws a border-bottom at
   y221.9 and its parent .booking-form-block draws one at y237.9. The parent's
   is the one every other row in this form uses (both dates and guests all end
   on a .booking-form-block border), so that is the one that stays.
   .list_service's is removed only on the LAST service — with Early Check-in or
   Late Check-out switched on as well, the rule between two services is what
   keeps them apart, and deleting it outright would run them together.

   THE GAP. From the guests rule to the Extra Bed text measured 40px, against
   15px for every other row. Two causes, both inside the services block:
   an empty .booking_form_input_label (height 0, but still spending its
   margins) and 10px of padding-top on .list_service. Neither is doing visible
   work, so the row now starts where the other rows start.
   -------------------------------------------------------------------------- */

/* The label renders at zero height — BABE outputs it whether or not the block
   has a heading, and here it has none. */
.booking-services-block > .booking_form_input_label {
	display: none;
}

.booking-services-block .list_service {
	padding-top: 0;
}

.booking-services-block .booking_services_inner .list_service:last-child {
	border-bottom: 0;
}


/* --------------------------------------------------------------------------
   Location — AROUND NOORÉ list width
   5 Sep 2026

   The list was narrower than the column it sits in and pinned to its left
   edge, so it read as shunted left against a centred heading and a centred
   disclaimer directly above and below it. Measured off the rendered page: the
   rows ended well short of the intro paragraph's right edge while starting on
   its left edge, which is what made the block look off-axis rather than
   narrow.

   Filling the column fixes the alignment by definition — the rows now share
   their left and right edges with the paragraph above, so the whole section
   sits on one axis. max-width:none is there because the constraint being
   overridden comes from the text-editor widget, not from this file.
   -------------------------------------------------------------------------- */

.elementor-7260 .noore-around {
	width: 100%;
	max-width: none;
	margin-left: auto;
	margin-right: auto;
}


/* --------------------------------------------------------------------------
   Booking confirmation — page margin, and the status message
   5 Sep 2026

   BABE emits the confirmation as bare siblings with no wrapper, so the order
   number and the items table ran flush to both edges of the viewport and
   started immediately under the header. The mu-plugin now wraps the output in
   .noore-confirm via the plugin's own babe_confirm_content_html filter; this
   gives that wrapper the measure and the breathing room.

   THE MESSAGE BOX. The plugin ships status colours straight from the CSS
   named-colour list — payment_received is `border-color: forestgreen;
   background-color: aliceblue`, which is the green-edged pale blue box. Every
   status variant is neutralised here and replaced with the site's ink bar and
   cream type, so it reads as part of NOORÉ rather than as plugin chrome.
   -------------------------------------------------------------------------- */

.noore-confirm {
	max-width: 1080px;
	margin-inline: auto;
	padding: clamp(36px, 5vw, 72px) clamp(20px, 5vw, 48px) clamp(48px, 6vw, 80px);
}

/* The ink bar. Listed variant-by-variant because the plugin sets background
   and border on the status classes, not on the base class — styling only
   .babe_message_order would leave aliceblue winning on specificity. */
.noore-confirm .babe_message_order,
.noore-confirm .babe_message_order_confirm,
.noore-confirm .babe_message_order_change,
.noore-confirm .babe_message_order_reject,
.noore-confirm [class*="babe_message_order_status_"] {
	background-color: #1E1E1E;
	border: 0;
	border-radius: var(--noore-r);
	color: #FFF2EB;
	font-family: var(--swissresort-main-font, sans-serif);
	font-size: 14px;
	font-weight: 400;
	letter-spacing: .01em;
	line-height: 1.6;
	padding: 22px 28px;
	text-align: center;
	margin-bottom: clamp(28px, 4vw, 48px);
}

/* The order number sits directly under the bar and was doing nothing to earn
   its size. Small caps, tracked, muted — a label, not a heading. */
.noore-confirm > h4:first-of-type,
.noore-confirm h4 {
	font-family: var(--swissresort-main-font, sans-serif);
	font-size: 11px;
	letter-spacing: .18em;
	text-transform: uppercase;
	color: rgba(30, 30, 30, .58);
	margin: 0 0 18px;
}

@media (max-width: 600px) {
	.noore-confirm { padding-inline: 18px; }
}


/* --------------------------------------------------------------------------
   Coupon block — off the plugin's blue
   5 Sep 2026

   Stock BABE: .coupon-form-block-applied is #f3f3f3 with a 1px #1e73be border,
   the entry form is #eee with a grey underline, and both Apply and Remove are
   #1e73be buttons. That blue belongs to no part of this site.

   The applied notice becomes the same ink bar as the order status message —
   it is the same kind of thing, a confirmation of state, so it reads as one
   family. The entry form stays quiet: sand and a hairline, because it is a
   field to fill in, not an announcement.
   -------------------------------------------------------------------------- */

.coupon-form-block-applied {
	background-color: #1E1E1E;
	border: 0;
	border-radius: var(--noore-r);
	color: #FFF2EB;
	font-family: var(--swissresort-main-font, sans-serif);
	font-size: 14px;
	font-weight: 400;
	line-height: 1.6;
	padding: 18px 24px;
	margin-bottom: 18px;
}

.coupon-form-block-applied .coupon_form_input_label {
	color: #FFF2EB;
	font-size: 14px;
	font-weight: 400;
}

.coupon-form-block {
	background-color: #F8F5F0;
	border: 0;
	border-bottom: 1px solid var(--noore-line, rgba(30, 30, 30, .10));
	padding: 18px 0;
}

.coupon-form-block .coupon_form_input_label {
	font-family: var(--swissresort-main-font, sans-serif);
	font-size: 13px;
	font-weight: 400;
	color: rgba(30, 30, 30, .70);
}

/* Both coupon buttons: terracotta pill, matching the site's controls. Remove
   is the quieter of the two — it undoes rather than does — so it is an
   outline, not a fill. */
#coupon_form_submit,
#remove_coupon_form_submit {
	background-color: var(--swissresort-theme-color, #B46841);
	color: #FFF2EB;
	border: 1px solid var(--swissresort-theme-color, #B46841);
	border-radius: 999px;
	font-family: var(--swissresort-main-font, sans-serif);
	font-size: 11px;
	letter-spacing: .16em;
	text-transform: uppercase;
	padding: 11px 26px;
	transition: background-color .25s ease, color .25s ease;
}

#remove_coupon_form_submit {
	background-color: transparent;
	color: #FFF2EB;
	border-color: rgba(255, 242, 235, .45);
}

#coupon_form_submit:hover {
	background-color: var(--swissresort-theme-hover-color, #84411E);
	border-color: var(--swissresort-theme-hover-color, #84411E);
}

#remove_coupon_form_submit:hover {
	background-color: rgba(255, 242, 235, .12);
	border-color: #FFF2EB;
}


/* --------------------------------------------------------------------------
   Checkout — shortening, pass B (trims)
   6 Sep 2026 · see md/CHECKOUT-SHORTEN-PROPOSAL.md

   The page ran roughly two screens because every block is full width and
   stacked. This pass takes the safe half: spacing values only, nothing moved,
   hidden or renamed — it is the path guests pay through.

   Pass A (the two-column grid on #checkout_form_block) is NOT in here. It
   needs the DOM confirmed first, which cannot be done while the site is
   returning 403.

   Last in the file on purpose: the checkout section above declares these with
   !important, and equal specificity plus !important is settled by source
   order. Same reason the separator block sits where it does.
   -------------------------------------------------------------------------- */

/* Order #, Contact information and Payment Method are all <h2> inside
   #checkout_form_block. As section headings they were spending ~90px each. */
body:is(.page-id-6351, .page-id-6352, .page-id-6353,
        .page-id-6355, .page-id-6356, .page-id-6357) #checkout_form_block h2 {
	font-size: clamp(20px, 2.2vw, 26px) !important;
	line-height: 1.2 !important;
	margin: 44px 0 18px !important;
}

/* The first one is the order number — a reference, not a heading. Same
   treatment as the confirmation page, so the two pages agree. */
body:is(.page-id-6351, .page-id-6352, .page-id-6353,
        .page-id-6355, .page-id-6356, .page-id-6357) #checkout_form_block > h2:first-of-type {
	font-family: var(--swissresort-main-font, sans-serif) !important;
	font-size: 11px !important;
	letter-spacing: .18em !important;
	text-transform: uppercase !important;
	color: rgba(30, 30, 30, .58) !important;
	margin: 0 0 16px !important;
}

/* 26px between fields was set when the label was a floating notch and needed
   clearance. The label is in the flow now, so the gap can close. */
body:is(.page-id-6351, .page-id-6352, .page-id-6353,
        .page-id-6355, .page-id-6356, .page-id-6357) .checkout-form-block {
	margin-bottom: 16px !important;
}

/* Seven total rows at 8px block padding. At 5px the summary loses ~45px and
   still reads as a table rather than a list. */
body:is(.page-id-6351, .page-id-6352) .table_order_items_details td {
	padding-block: 5px !important;
}

/* One number in a tall panel. The number keeps its size; the box stops
   spending 40px above and below it. */
body:is(.page-id-6351, .page-id-6352, .page-id-6353,
        .page-id-6355, .page-id-6356, .page-id-6357) .amount_group {
	padding: 18px 22px !important;
	margin-block: 20px !important;
}

@media (max-width: 900px) {
	body:is(.page-id-6351, .page-id-6352, .page-id-6353,
	        .page-id-6355, .page-id-6356, .page-id-6357) #checkout_form_block h2 {
		margin-top: 32px !important;
	}
}

/* ==========================================================================
   44. BOOKED DATES IN THE ROOM CALENDAR - dark ink on dark ink
   5 Sep 2026

   A booked stay marks its first and last day .cal-cell-disabled-first /
   -last, and something upstream paints those cells rgb(30,30,30) while the
   number stays rgba(30,30,30,.7). Ink on ink: the cell rendered as a solid
   black square with no date in it.

   A taken date should recede, not shout. No fill, light grey number, same as
   the other unavailable days.
   ========================================================================== */
.cal-cell-disabled-first .cal-cell-date,
.cal-cell-disabled-last .cal-cell-date,
.elementor-2610 .cal-cell-disabled-first .cal-cell-date,
.elementor-2610 .cal-cell-disabled-last .cal-cell-date {
	background-color: transparent !important;
	background-image: none !important;
	color: rgba(30, 30, 30, .26) !important;
}

/* ==========================================================================
   45. STRIPE PAYMENT BADGE (checkout payment tab)
   Markup lives in BA Settings -> Payments -> Stripe -> Payment description,
   which is wp_kses_post-filtered by noore-stripe.php (>= 1.2.0), so plain
   HTML is allowed there. Text-only badge on purpose: no Stripe wordmark
   artwork is in the media library, and an approximated logo would be worse
   than none. Swap the first span for an <img> if the client supplies one.
   ========================================================================== */
.babe_payment_description .noore-stripe-badge,
.babe_payment_description .noore-stripe-cards,
.babe_payment_description .noore-stripe-note,
.noore-stripe-badge,
.noore-stripe-cards,
.noore-stripe-note {
	display: block;
}
.noore-stripe-badge {
	font-size: 15px;
	font-weight: 500;
	color: #1e1e1e;
	margin-bottom: 4px;
}
.noore-stripe-badge .noore-stripe-lock {
	margin-right: 6px;
}
.noore-stripe-cards {
	font-size: 13px;
	letter-spacing: .02em;
	color: rgba(30, 30, 30, .62);
	margin-bottom: 8px;
}
.noore-stripe-note {
	font-size: 13px;
	line-height: 1.55;
	color: rgba(30, 30, 30, .55);
	max-width: 46em;
}


/* --------------------------------------------------------------------------
   [noore_destinations_intro] — the three-row teaser, styled for ANY page
   6 Sep 2026

   The full list's rules are scoped to .elementor-7260 because they were
   written for the Location page. This shortcode is meant to be dropped
   elsewhere — About first — and on any other page those rules do not match,
   so it would render as a default bulleted <ul>: the same fault the Location
   page shipped with.

   These rules are therefore page-agnostic and inherit their colour rather
   than naming it, so the block reads correctly on the sand ground and on the
   ink column of About without a second variant.
   -------------------------------------------------------------------------- */

.noore-around-intro {
	list-style: none;
	margin: 26px 0 0;
	padding: 0;
}

.noore-around-intro li {
	display: grid;
	grid-template-columns: 1fr auto;
	align-items: baseline;
	gap: 20px;
	padding: 18px 0;
	margin: 0;
	border-top: 1px solid currentColor;
	border-top-color: color-mix(in srgb, currentColor 14%, transparent);
	transition: padding-left .35s ease;
}

.noore-around-intro li:last-child {
	border-bottom: 1px solid currentColor;
	border-bottom-color: color-mix(in srgb, currentColor 14%, transparent);
}

.noore-around-intro li:hover {
	padding-left: 12px;
}

.noore-around-intro .noore-around-place {
	font-family: var(--swissresort-heading-font, serif);
	font-size: clamp(16px, 1.7vw, 20px);
	line-height: 1.25;
	color: inherit;
	text-decoration: none;
	transition: color .3s ease;
}

.noore-around-intro li:hover .noore-around-place,
.noore-around-intro .noore-around-place:focus-visible {
	color: var(--swissresort-theme-color, #B46841);
}

.noore-around-intro .noore-around-place:focus-visible {
	outline: 2px solid var(--swissresort-theme-color, #B46841);
	outline-offset: 3px;
}

.noore-around-intro .noore-around-time {
	font-family: var(--swissresort-main-font, sans-serif);
	font-size: 11px;
	letter-spacing: .16em;
	text-transform: uppercase;
	color: inherit;
	opacity: .58;
	white-space: nowrap;
}

/* Fallback for anything without color-mix(): a fixed ink hairline. Correct on
   the sand ground, which is where this block goes first. */
@supports not (color: color-mix(in srgb, red 50%, transparent)) {
	.noore-around-intro li { border-top-color: rgba(30, 30, 30, .12); }
	.noore-around-intro li:last-child { border-bottom-color: rgba(30, 30, 30, .12); }
}

@media (max-width: 600px) {
	.noore-around-intro li {
		grid-template-columns: 1fr;
		gap: 6px;
		padding: 14px 0;
	}
}


/* --------------------------------------------------------------------------
   AROUND NOORÉ — undo the doubled hairline
   6 Sep 2026

   MY BUG. The stylesheet already carried a complete implementation of these
   rules, done bottom-first:

       .noore-around li             { border-bottom: 1px … }
       .noore-around li:first-child { border-top:    1px … }

   I then wrote a second, top-first implementation for the Location page
   without noticing, so every row carried a bottom border from one and a top
   border from the other. Between two rows those sit flush and render as a 2px
   rule — and at two different opacities, .12 over .08, which is why it looked
   slightly uneven as well as thick. The intro list inherited the same fault,
   since it also carries .noore-around.

   Unified on the ORIGINAL bottom-first implementation, which is the one that
   works on every page. Only the colour is changed here; the structure is left
   to the block above. Nothing new draws a top border except the first row.
   -------------------------------------------------------------------------- */

.elementor-7260 .noore-around li {
	border-top: 0;
	border-bottom-color: rgba(30, 30, 30, .08);
}

.elementor-7260 .noore-around li:first-child {
	border-top: 1px solid rgba(30, 30, 30, .08);
}

.elementor-7260 .noore-around li:last-child {
	border-bottom: 1px solid rgba(30, 30, 30, .08);
}

.noore-around-intro li {
	border-top: 0;
}

.noore-around-intro li:first-child {
	border-top: 1px solid currentColor;
	border-top-color: color-mix(in srgb, currentColor 14%, transparent);
}

.noore-around-intro li {
	border-bottom-color: color-mix(in srgb, currentColor 14%, transparent);
}

@supports not (color: color-mix(in srgb, red 50%, transparent)) {
	.noore-around-intro li:first-child { border-top-color: rgba(30, 30, 30, .12); }
	.noore-around-intro li { border-bottom-color: rgba(30, 30, 30, .12); }
}

/* --------------------------------------------------------------------------
   Footer logo — white, terracotta on hover (image swap)
   6 Sep 2026

   Replaces an earlier mask-based version. The mask silhouette was sized to
   .logo-main rather than to the image inside it, so it sat slightly off the
   letterforms — right colour, wrong position. A straight swap shows the real
   artwork instead of a reconstruction of it.

   The two files are the same wordmark: Logo NOORE-04 (white) and NOORE-01
   (terracotta) share identical content, 3369x796. Their export canvases did
   NOT match, so a naive swap jumped. Noore-Terracotta.png is NOORE-01
   re-canvased to NOORE-04's exact content offset — bboxes now agree within
   2px — so the mark holds still and only the colour changes.

   The terracotta sits behind as a background and the white <img> fades out
   over it: one paint, no reflow, and if the background 404s the white logo
   simply stays.
   -------------------------------------------------------------------------- */

.elementor-element-30085c0 .logo-main {
	display: inline-block;
	background-image: url("https://noorestayphuket.com/wp-content/uploads/2026/08/Noore-Terracotta.png");
	background-size: contain;
	background-repeat: no-repeat;
	background-position: center;
}

.elementor-element-30085c0 .logo-main img {
	transition: opacity .3s ease;
}

.elementor-element-30085c0 .logo a:hover .logo-main img,
.elementor-element-30085c0 .logo a:focus-visible .logo-main img {
	opacity: 0;
}

/* No hover on touch — never leave the white mark faded out. */
@media (hover: none) {
	.elementor-element-30085c0 .logo-main { background-image: none; }
	.elementor-element-30085c0 .logo a:hover .logo-main img { opacity: 1; }
}

@media (prefers-reduced-motion: reduce) {
	.elementor-element-30085c0 .logo-main img { transition: none; }
}


/* --------------------------------------------------------------------------
   Contact form — the response message, on brand
   6 Sep 2026

   Contact Form 7 ships a 2px coloured border per state, straight from its own
   stylesheet: sent #46b450 (the green box), failed/aborted #dc3232, spam
   #f56e28, invalid/unaccepted #ffb900, and #00a0d2 on the base class. None of
   those belong to NOORÉ.

   Same ink band as the booking confirmation's .babe_message_order, so a guest
   who enquires and a guest who books are told "that worked" in the same voice.

   Every state is listed explicitly: CF7 sets the colour on
   `.wpcf7 form.sent .wpcf7-response-output` (specificity 0,3,0), so styling
   the base class alone would lose to it.
   -------------------------------------------------------------------------- */

.wpcf7 .wpcf7-response-output,
.wpcf7 form.init .wpcf7-response-output,
.wpcf7 form.sent .wpcf7-response-output,
.wpcf7 form.failed .wpcf7-response-output,
.wpcf7 form.aborted .wpcf7-response-output,
.wpcf7 form.spam .wpcf7-response-output,
.wpcf7 form.invalid .wpcf7-response-output,
.wpcf7 form.unaccepted .wpcf7-response-output,
.wpcf7 form.payment-required .wpcf7-response-output {
	background-color: #1E1E1E;
	border: 0;
	border-radius: var(--noore-r);
	color: #FFF2EB;
	font-family: var(--swissresort-main-font, sans-serif);
	font-size: 14px;
	font-weight: 400;
	line-height: 1.6;
	letter-spacing: .01em;
	padding: 20px 28px;
	margin: 28px 0 0;
	text-align: center;
}

/* The field-level "this field is required" notes sit under each input and are
   a different thing — left as small terracotta text, not a band. */
.wpcf7 .wpcf7-not-valid-tip {
	color: var(--swissresort-theme-color, #B46841);
	font-family: var(--swissresort-main-font, sans-serif);
	font-size: 12px;
	letter-spacing: .02em;
	margin-top: 8px;
}

@media (max-width: 767px) {
	.wpcf7 .wpcf7-response-output {
		padding: 18px 20px;
		font-size: 13px;
	}
}

/* --------------------------------------------------------------------------
   Contact form — failure states as a burgundy band
   6 Sep 2026

   #560D0D, as chosen. Applied as the BAND rather than the type: measured
   against the ink band it is 1.16:1 as text — below the point where letters
   are distinguishable at all — and 13.13:1 as a background carrying the same
   cream the success band uses. Same colour, same intent, legible.

   Success stays ink; only failed, aborted, spam, invalid, unaccepted and
   payment-required turn burgundy, so the two outcomes are never confusable.
   -------------------------------------------------------------------------- */

.wpcf7 form.failed .wpcf7-response-output,
.wpcf7 form.aborted .wpcf7-response-output,
.wpcf7 form.spam .wpcf7-response-output,
.wpcf7 form.invalid .wpcf7-response-output,
.wpcf7 form.unaccepted .wpcf7-response-output,
.wpcf7 form.payment-required .wpcf7-response-output {
	background-color: #560D0D;
	color: #FFF2EB;
}


/* --------------------------------------------------------------------------
   Blog "Related Posts" — never a heading over nothing
   6 Sep 2026

   The theme widget echoes its <h3> before running the query and only guards
   with have_posts() afterwards, so an empty result leaves a bare heading. The
   mu-plugin now widens the match to category OR tag, which fixes today's case
   — but a future post with a unique tag AND a unique category would bring the
   empty heading back. This closes it for good.

   :has() is doing real work: it tests for rendered .item children, which only
   exist when the query returned something.
   -------------------------------------------------------------------------- */

.blog-single-related:not(:has(.item)) {
	display: none;
}


/* --------------------------------------------------------------------------
   Blog tables — scroll instead of clipping
   6 Sep 2026

   The airport-transport table has four columns and a min-content width wider
   than a phone, so the last column ("Best For") was cut off at the screen
   edge with no way to reach it. The cells were already wrapping to three
   lines and still did not fit — the table simply cannot compress further.

   No new markup needed: WordPress core already wraps block tables in
   <figure class="wp-block-table">, so the wrapper just needs to scroll.
   Making the FIGURE scroll rather than the table itself keeps the table a
   real table — display:block on <table> is the common shortcut and it breaks
   column sizing, which is what produced the cramped columns in the first place.
   -------------------------------------------------------------------------- */

.wp-block-table {
	overflow-x: auto;
	-webkit-overflow-scrolling: touch;
	max-width: 100%;
}

/* Without a floor the columns keep squeezing to fit and every cell wraps to
   three lines. Below this the table scrolls instead. */
.wp-block-table table {
	min-width: 520px;
}

/* A scroll region a guest cannot see is a scroll region they will not use.
   This is a hint, not a scrollbar: the right edge fades while there is more
   table to reach, and it sits outside the figure so it never covers a cell. */
@media (max-width: 767px) {
	.wp-block-table {
		position: relative;
		-webkit-mask-image: linear-gradient(to right, #000 calc(100% - 28px), transparent 100%);
		mask-image: linear-gradient(to right, #000 calc(100% - 28px), transparent 100%);
	}
}

/* --------------------------------------------------------------------------
   Footer menu — two rows on phones, with real tap targets
   6 Sep 2026

   Nine items wrapping freely fell 4 / 4 / 1 and orphaned TERMS. Flex wrap
   cannot be told "two rows"; grid can, so this is five explicit columns —
   5 across, then 4 — fixed by the template rather than by word widths.

   TAP TARGETS. The first pass sized the link to the text alone, about 13px
   tall against Apple's 44px minimum. The link is now a flex box with
   min-height:44px, so the target is the full cell height even though the
   type stays small. Padding is horizontal only; the height comes from
   min-height, which keeps the rows compact.

   THE NUMBERS ARE MEASURED, not guessed. Column text widths at 11px/.08em in
   Montserrat 300 are 44/56/47/64/58px. With 6px side padding and a 6px column
   gap the row is 353px — inside a 390px phone once container padding is
   allowed for, and comfortable at 430px. 8px padding would be 373px and
   overflow a 390px screen, which is why it is 6.

   Under 400px the type drops to 10px, taking the row to 329px, so the two-row
   layout survives down to the smallest common phones before the 3-column
   fallback takes over.
   -------------------------------------------------------------------------- */

@media (max-width: 767px) {
	.elementor-element-e5a7b2b #menu-footer,
	.elementor-element-e5a7b2b ul.menu {
		display: grid;
		grid-template-columns: repeat(5, auto);
		justify-content: center;
		align-items: stretch;
		gap: 2px 6px;
		margin: 0;
		padding: 0;
		list-style: none;
	}

	.elementor-element-e5a7b2b #menu-footer > li,
	.elementor-element-e5a7b2b ul.menu > li {
		margin: 0;
		padding: 0;
		white-space: nowrap;
		display: flex;
	}

	/* The tap target is this box, not the glyphs inside it. */
	.elementor-element-e5a7b2b #menu-footer > li > a,
	.elementor-element-e5a7b2b ul.menu > li > a {
		display: flex;
		align-items: center;
		justify-content: center;
		min-height: 44px;
		width: 100%;
		padding: 0 6px;
		font-size: 11px;
		letter-spacing: .08em;
		line-height: 1.2;
	}
}

/* Smaller phones: one step down in type keeps five columns and two rows. */
@media (max-width: 400px) {
	.elementor-element-e5a7b2b #menu-footer > li > a,
	.elementor-element-e5a7b2b ul.menu > li > a {
		font-size: 10px;
		letter-spacing: .06em;
		padding: 0 5px;
	}
}

/* Below this, five columns cannot hold 44px targets without shrinking the
   type past legibility. Three columns and three rows is the better trade. */
@media (max-width: 339px) {
	.elementor-element-e5a7b2b #menu-footer,
	.elementor-element-e5a7b2b ul.menu {
		grid-template-columns: repeat(3, auto);
		gap: 2px 8px;
	}
}


/* --------------------------------------------------------------------------
   Mobile menu drawer — ink, not Swissresort green
   6 Sep 2026

   Measured on the live drawer: #apus-mobile-menu computed to rgb(18,34,35) —
   #122223, the Swissresort demo green. It comes from the parent theme's
   template.css rule `.apus-offcanvas { background: #122223 }`, with no
   !important, and it is the ONLY element in the drawer carrying a background:
   every child is transparent over it, so one rule re-colours the whole panel.

   Set to #1E1E1E, the same ink as the header bar the drawer slides out from,
   so opening the menu no longer shifts the background colour under the
   wordmark.

   Scoped with the id as well as the class purely for headroom — the parent
   rule is class-only and the child sheet already loads after it, but Elementor
   post CSS loads later still and this puts the result beyond doubt.
   -------------------------------------------------------------------------- */

#apus-mobile-menu.apus-offcanvas,
.apus-offcanvas {
	background-color: #1E1E1E;
}


/* --------------------------------------------------------------------------
   46. ROOMS PANEL IN BOTH DRAWERS

   Tapping ROOMS used to just navigate to /rooms/. It looked like the megamenu
   profile was not working. It was: the theme's mobile walker already prints
   Elementor template 3786 inside the <li> as <div class="sub-menu">, so all
   four room links were sitting in the drawer's HTML the whole time — with
   nothing to open the panel and no styling on it.

   The mu-plugin adds the tap-to-expand and rewrites each row to
   <img> + <span class="nm">Name<span class="sz">13 m² · 2 guests</span></span>.
   This paints it.

   Everything is scoped to #mobile-menu-container. Template 3786 is a normal
   Elementor template and could be placed elsewhere later; none of this should
   follow it out of the drawer.

   SCOPE - the site has TWO drawers, and every rule below is written for both:
     #mobile-menu-container    under 992px  (headers/mobile/offcanvas-menu.php,
                               theme_location "primary")
     #vertical-menu-container  desktop      (the Elementor nav_bar widget)

   The desktop one is what a laptop visitor actually clicks. Its ROOMS item had
   no panel content at all - its megamenu profile does not resolve to a
   published apus_megamenu post - so the mu-plugin builds that panel itself.
   -------------------------------------------------------------------------- */

/* The panel itself. max-height rather than height so the rows can size
   themselves; 420px clears five 52px rows with room to spare, and animating
   max-height avoids the reflow-per-frame that animating height would cost. */
#mobile-menu-container li.has-submenu > .sub-menu,
#vertical-menu-container li.has-submenu > .sub-menu {
	max-height: 0;
	overflow: hidden;
	transition: max-height .28s ease;
}

#mobile-menu-container li.has-submenu.open > .sub-menu,
#vertical-menu-container li.has-submenu.open > .sub-menu {
	max-height: 420px;
}

/* Chevron on the ROOMS row. Drawn with borders rather than a font icon so it
   cannot be affected by the icon font loading late. */
#mobile-menu-container li.has-submenu > a,
#vertical-menu-container li.has-submenu > a {
	position: relative;
}

#mobile-menu-container li.has-submenu > a::after,
#vertical-menu-container li.has-submenu > a::after {
	content: "";
	position: absolute;
	right: 4px;
	top: 50%;
	width: 7px;
	height: 7px;
	border-right: 1.5px solid #DDA380;
	border-bottom: 1.5px solid #DDA380;
	transform: translateY(-70%) rotate(45deg);
	transform-origin: center;
	transition: transform .28s ease;
}

#mobile-menu-container li.has-submenu.open > a::after,
#vertical-menu-container li.has-submenu.open > a::after {
	transform: translateY(-30%) rotate(-135deg);
}

/* Flatten the Elementor container chrome. The template is a boxed container
   holding two full-width child containers, one per room-list menu; left alone
   they sit side by side and inherit the theme's section padding. Forcing them
   to block makes the two <ul>s read as one continuous list of four rooms. */
#mobile-menu-container .sub-menu .elementor,
#vertical-menu-container .sub-menu .elementor,
#mobile-menu-container .sub-menu .e-con,
#vertical-menu-container .sub-menu .e-con,
#mobile-menu-container .sub-menu .e-con-inner,
#vertical-menu-container .sub-menu .e-con-inner,
#mobile-menu-container .sub-menu .elementor-widget-container,
#vertical-menu-container .sub-menu .elementor-widget-container,
#mobile-menu-container .sub-menu .widget-nav-menu,
#vertical-menu-container .sub-menu .widget-nav-menu,
#mobile-menu-container .sub-menu .widget-content,
#vertical-menu-container .sub-menu .widget-content {
	display: block;
	width: 100%;
	max-width: none;
	margin: 0;
	padding: 0;
	--padding-block-start: 0;
	--padding-block-end: 0;
	--padding-inline-start: 0;
	--padding-inline-end: 0;
}

#mobile-menu-container .sub-menu ul.menu,
#vertical-menu-container .sub-menu ul.menu,
#mobile-menu-container .sub-menu ul,
#vertical-menu-container .sub-menu ul {
	list-style: none;
	margin: 0;
	padding: 0;
}

/* A hairline above the first row only, to separate the panel from the ROOMS
   label without drawing a box around it. */
#mobile-menu-container li.has-submenu > .sub-menu .dropdown-menu-inner,
#vertical-menu-container li.has-submenu > .sub-menu .dropdown-menu-inner {
	border-top: 1px solid rgba(255, 242, 235, .10);
	padding: 6px 0;
}

/* The rows. min-height 52 keeps the 44px tap-target floor set in section 42,
   with the thumbnail (40px) vertically centred inside it. */
#mobile-menu-container .sub-menu ul li > a,
#vertical-menu-container .sub-menu ul li > a {
	display: flex;
	align-items: center;
	gap: 14px;
	padding: 6px 4px 6px 16px;
	min-height: 52px;
	border: 0;
	text-transform: none;
	letter-spacing: 0;
}

/* No chevron on the room rows — only the parent toggles. */
#mobile-menu-container .sub-menu ul li > a::after,
#vertical-menu-container .sub-menu ul li > a::after {
	content: none;
}

#mobile-menu-container .sub-menu ul li > a img,
#vertical-menu-container .sub-menu ul li > a img {
	width: 52px;
	height: 40px;
	flex: 0 0 52px;
	object-fit: cover;
	border-radius: 8px;
	display: block;
}

#mobile-menu-container .sub-menu ul li > a .nm,
#vertical-menu-container .sub-menu ul li > a .nm {
	display: block;
	font-size: 13px;
	line-height: 1.3;
	color: #FFF2EB;
}

#mobile-menu-container .sub-menu ul li > a .sz,
#vertical-menu-container .sub-menu ul li > a .sz {
	display: block;
	margin-top: 3px;
	font-size: 10px;
	letter-spacing: .14em;
	text-transform: uppercase;
	color: rgba(255, 242, 235, .45);
}

/* A room with no featured image still gets a row of the same height and its
   name on the same left edge as the rest, rather than jumping to the margin. */
#mobile-menu-container .sub-menu ul li > a:not(:has(img)) .nm,
#vertical-menu-container .sub-menu ul li > a:not(:has(img)) .nm {
	padding-left: 66px;
}

/* "All Rooms" — the way back to /rooms/, which the parent tap no longer
   reaches. Set apart from the four rooms rather than looking like a fifth. */
#mobile-menu-container .sub-menu li.noore-all-rooms > a,
#vertical-menu-container .sub-menu li.noore-all-rooms > a {
	min-height: 44px;
	padding-left: 82px;
	margin-top: 2px;
	border-top: 1px solid rgba(255, 242, 235, .08);
}

#mobile-menu-container .sub-menu li.noore-all-rooms .nm,
#vertical-menu-container .sub-menu li.noore-all-rooms .nm {
	font-size: 11px;
	letter-spacing: .16em;
	text-transform: uppercase;
	color: #DDA380;
	padding-left: 0;
}

#mobile-menu-container .sub-menu li.noore-all-rooms > a::after,
#vertical-menu-container .sub-menu li.noore-all-rooms > a::after {
	content: "\2192";
	position: static;
	border: 0;
	transform: none;
	margin-left: 6px;
	color: #DDA380;
	width: auto;
	height: auto;
}


/* --------------------------------------------------------------------------
   46b. LET THE DESKTOP DRAWER GROW WHEN THE PANEL OPENS

   #vertical-menu-container is run through Sliding Menu (js/functions.js:71),
   which measures the menu once and writes an INLINE height onto the container
   (height: 410.6px) with overflow hidden, and absolutely positions its panel.
   Expanding ROOMS adds ~297px, so without this the four rooms push ABOUT /
   GALLERY / FAQs / CONTACT out of the clipped box and they vanish.

   Taking the root panel out of absolute flow lets the container size itself,
   which puts the address block back directly under the last menu item instead
   of on top of it. !important is required because the height Sliding Menu
   sets is inline.

   Only ROOMS has a panel in these menus, so no slide-to-subpanel animation is
   being given up here.
   -------------------------------------------------------------------------- */

#vertical-menu-container.sliding-menu {
	height: auto !important;
	overflow: visible !important;
}

#vertical-menu-container.sliding-menu > ul.sliding-menu__panel-root {
	position: static !important;
	left: auto !important;
	transition: none !important;
}
