/* Design system
   built on Bootstrap 5.3 primitives (grid, dropdown, offcanvas,
   accordion). This file supplies brand tokens and the custom
   components Bootstrap doesn't provide out of the box: property
   cards, the pill AI search bar, the mega-menu panel, and badges. */

:root {
  --brand: #003580;
  --brand-dark: #00265c;
  --brand-rgb: 0,53,128;
  --ink: #222222;
  --muted: #6b7280;
  --border: #e5e7eb;
  --surface: #ffffff;
  --bg: #ffffff;
  /* Subtle hover/loading-placeholder background and the light "active/
     selected" tint (2026-09-22, dark-mode work) — consolidated from what
     were ~18 separate hardcoded near-duplicate grays/blues scattered
     across this file, so both light AND dark now stay in sync from one
     definition each instead of needing every call site hand-tuned. */
  --surface-alt: #f4f4f6;
  --surface-tint: #eef3fa;
  --radius: 8px;
  /* Fallback only — includes/header.php/adm/_header.php/adm/index.php
     all echo render_site_font_head() right after this stylesheet loads,
     which overrides this same variable per the admin's font choice
     (adm/settings.php's Systém tab). This value only ever applies if
     that render call is somehow skipped. */
  --bs-body-font-family: 'Plus Jakarta Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
}

/* Booking.com/MegaBooking-style flat, business-like corners everywhere —
   overriding Bootstrap's .rounded-pill utility globally is far cheaper
   than touching every button/badge/input across ~20 PHP templates that
   use it inline, and keeps future markup consistent for free. */
.rounded-pill { border-radius: var(--radius) !important; }
.form-control, .form-select { border-radius: var(--radius); }

/* Sitewide 95% root scale (initially shipped at 90%, then relaxed to 95%
   per direct user follow-up) — comparing this site's own feel at 100%
   browser zoom against a sibling project (uctovnictvo.dataclick.sk) that
   read as more "natural"/compact at the same zoom. That reference turned
   out to still use a plain 16px root (confirmed live via computed
   styles, not guessed) — the difference is density, not a literal
   font-size trick — so this one root scale-down is the actual fix rather
   than a full type-scale rebuild: Bootstrap 5's own grid gutters,
   spacing utilities, and every rem-based font-size (h1-h6, .fs-*, form
   controls, badges...) all shrink together by the same amount, since
   they're all expressed in rem, while Bootstrap's own breakpoints are
   compiled to fixed px and stay unaffected — so the responsive layout
   itself doesn't shift, only how large everything reads. */
html { font-size: 95%; }

body {
  font-family: var(--bs-body-font-family);
  color: var(--ink);
  background: var(--bg);
}

a { color: inherit; }

/* Self-hosted flag SVGs (see h() sibling flag_icon() in functions.php) —
   Windows browsers render Unicode flag emoji as plain two-letter text,
   not an actual flag image, so an <img> is used instead everywhere a
   country/language/currency flag appears. */
.flag-icon {
  width: 1.15em;
  height: 0.86em;
  vertical-align: -0.1em;
  border-radius: 2px;
  box-shadow: 0 0 0 1px rgba(0,0,0,0.08);
  object-fit: cover;
}

/* ---------- Top bar ---------- */
.topbar {
  background: #1a1a1a;
  color: rgba(255,255,255,.85);
  font-size: 13px;
  min-height: 36px;
  display: flex;
  align-items: center;
  position: relative;
  z-index: 1031;
}
/* Bootstrap's .sticky-top (used by the main navbar below) sets
   z-index:1020, which otherwise renders on top of and hides the topbar's
   opened language-switcher dropdown. */
.topbar .dropdown-menu { z-index: 1035; }
.topbar__tagline { color: rgba(255,255,255,.7); }
.topbar__lang {
  background: transparent;
  border: none;
  color: rgba(255,255,255,.9);
  font-size: 13px;
  font-weight: 600;
  padding: .3rem .5rem;
}
.topbar__lang:hover, .topbar__lang:focus { color: #fff; }
.topbar__support {
  color: rgba(255,255,255,.85);
  text-decoration: none;
  font-weight: 500;
  transition: color .15s ease;
}
.topbar__support:hover { color: #fff; }

/* ---------- Header ---------- */
.site-header {
  background: var(--surface);
  border-bottom: 1px solid var(--border);
  padding-block: 1rem;
  transition: box-shadow .25s ease;
}
.site-header.scrolled {
  box-shadow: 0 4px 20px rgba(0,0,0,.06);
}

.brand-logo {
  font-weight: 700;
  font-size: 1.35rem;
  color: var(--ink) !important;
  letter-spacing: -0.02em;
  transition: opacity .15s ease;
}
.navbar-brand.brand-logo:hover { opacity: .85; }
.brand-eu {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 1.75em;
  height: 1.75em;
  margin: -.5em 0 -.5em .08em;
  vertical-align: .22em;
}
.brand-eu__stars {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  fill: #f7b500;
  pointer-events: none;
}
.brand-eu__text {
  position: relative;
  font-size: .56em;
  line-height: 1;
  letter-spacing: 0;
}

/* Menu text stays plain system Arial, regular weight — no custom font,
   no bold — independent of the site's branded Plus Jakarta Sans type. */
.navbar-nav .nav-link,
.dropdown-item,
.mega-list a,
.mega-panel h6,
.accordion-button,
.topbar__tagline,
.topbar__lang,
.topbar__support {
  font-family: Arial, Helvetica, sans-serif !important;
  font-weight: 400 !important;
}

.navbar-nav .nav-link {
  position: relative;
  color: var(--ink);
  padding: .5rem .9rem;
  border-radius: var(--radius);
  transition: background-color .18s ease, color .18s ease;
}
.navbar-nav .nav-link:hover,
.navbar-nav .nav-link:focus {
  background-color: var(--surface-alt);
}
/* A plain mouse click on a menu <a> still gives it lasting keyboard focus,
   which otherwise shows a native blue outline that stays visible until
   something else steals focus — not tied to the dropdown actually being
   open/closed, so it looks like a stray leftover highlight on a menu item
   the visitor already moved away from (2026-09-27 user report). Native
   :focus-visible alone doesn't reliably distinguish this for <a> elements
   here — confirmed live that Chromium still matches :focus-visible after a
   genuine mouse click on this exact element (role="button" doesn't change
   that for an anchor, unlike a real <button>) — so the outline is instead
   driven by a tiny real "was the last input a keyboard?" detector
   (main.js's html.using-keyboard toggle) rather than trusting the
   pseudo-class's own per-browser heuristic. Suppressed for a mouse click,
   shown for genuine keyboard Tab navigation, per WCAG 2.4.7. */
.navbar-nav .nav-link:focus {
  outline: none;
}
html.using-keyboard .navbar-nav .nav-link:focus {
  outline: 2px solid var(--brand);
  outline-offset: 2px;
}
.navbar-nav .dropdown-toggle::after {
  margin-left: .4rem;
  vertical-align: .1em;
  transition: transform .2s ease;
}
.navbar-nav .dropdown-toggle[aria-expanded="true"]::after {
  transform: rotate(180deg);
}

/* ---------- Elegant buttons (site-wide) ----------
   Every Bootstrap .btn gets the same refined treatment: a full pill
   shape, medium weight, a soft lift + tinted shadow on hover instead of
   a flat color swap, and no visible focus ring flash. Individual
   variants (outline-*, success, warning, danger, dark, link) only
   override color where Bootstrap's default would clash with this. */
.btn {
  border-radius: var(--radius);
  font-weight: 600;
  letter-spacing: .01em;
  transition: background-color .18s ease, border-color .18s ease, color .18s ease, transform .12s ease, box-shadow .18s ease;
}
.btn:hover { transform: translateY(-1px); }
.btn:active { transform: translateY(0); }
.btn:focus, .btn:focus-visible { box-shadow: 0 0 0 .2rem rgba(34,34,34,.12); }
.btn.btn-sm { font-weight: 600; }
.btn-link { text-decoration: none; font-weight: 600; }
.btn-link:hover { text-decoration: underline; transform: none; }

.btn-outline-secondary,
.btn-outline-dark {
  background: var(--surface);
}
.btn-outline-secondary:hover,
.btn-outline-dark:hover {
  box-shadow: 0 6px 16px rgba(0,0,0,.1);
}

.btn-success:hover { box-shadow: 0 6px 16px rgba(25,135,84,.28); }
.btn-warning:hover { box-shadow: 0 6px 16px rgba(255,193,7,.35); }
.btn-danger:hover { box-shadow: 0 6px 16px rgba(220,53,69,.28); }
.btn-dark:hover { box-shadow: 0 6px 16px rgba(0,0,0,.3); }

.btn-brand {
  background: var(--brand);
  color: #fff;
  border: none;
}
.btn-brand:hover,
.btn-brand:focus {
  background: var(--brand-dark);
  color: #fff;
  box-shadow: 0 6px 16px rgba(var(--brand-rgb),.28);
}

.lang-switch-btn, .user-chip {
  border: 1px solid var(--border);
  border-radius: var(--radius);
  font-weight: 600;
  font-size: .85rem;
  padding: .45rem .9rem;
  background: var(--surface);
  color: var(--ink);
  transition: background-color .18s ease, border-color .18s ease;
}
.lang-switch-btn:hover, .user-chip:hover { background: var(--surface-alt); border-color: #d1d5db; }

.dropdown-item {
  transition: background-color .15s ease, color .15s ease, padding-left .15s ease;
}
.dropdown-item:hover { padding-left: 1.1rem; }
.dropdown-item.active, .dropdown-item:active {
  background-color: var(--surface-tint);
  color: var(--brand);
}

.season-badge {
  background: var(--brand);
  border-radius: var(--radius);
  color: #fff;
  font-weight: 700;
  padding: .5rem .9rem;
  font-size: .8rem;
  display: inline-flex;
  align-items: center;
  animation: seasonPulse 2.6s ease-in-out infinite;
}
@keyframes seasonPulse {
  0%, 100% { box-shadow: 0 0 0 0 rgba(var(--brand-rgb),.35); }
  50% { box-shadow: 0 0 0 6px rgba(var(--brand-rgb),0); }
}

/* Animated dropdown / mega-menu panels (Bootstrap toggles .show; we
   keep the element always laid out but fade+slide it in/out so the
   menu feels alive instead of snapping open). */
.dropdown-menu {
  display: block !important;
  opacity: 0;
  visibility: hidden;
  transform: translateY(-8px) scale(.98);
  transition: opacity .18s ease, transform .18s ease, visibility .18s;
  pointer-events: none;
  transform-origin: top center;
}
.dropdown-menu.show {
  opacity: 1;
  visibility: visible;
  transform: translateY(0) scale(1);
  pointer-events: auto;
}

/* Destination country-tab switcher inside the mega-panel — panel
   footprint stays constant as more countries get listings; only the
   active country's regions/districts/cities render visible. Wraps to
   a second row (not horizontal scroll) if enough countries exist that
   they don't fit one line, so it degrades gracefully either way. */
.dest-tabs {
  display: flex;
  flex-wrap: wrap;
  gap: .4rem;
}
.dest-tab {
  display: inline-flex;
  align-items: center;
  gap: .4rem;
  border: 1px solid #e5e7eb;
  background: var(--surface);
  border-radius: 999px;
  padding: .35rem .85rem;
  font-size: .85rem;
  font-weight: 600;
  color: var(--ink);
  cursor: pointer;
  transition: background .15s ease, border-color .15s ease, color .15s ease;
}
.dest-tab:hover { border-color: var(--brand); color: var(--brand); }
.dest-tab.active { background: var(--brand); border-color: var(--brand); color: #fff; }
.dest-panel { display: none; }
.dest-panel.active { display: block; }

/* "Filtre" mega-panel (2026-09-20) — reuses .dest-tabs/.dest-tab/
   .dest-panel wholesale (same JS click handler in main.js already
   works generically off those classes, no JS changes needed) but each
   panel holds a wrapping chip grid instead of destination columns,
   since a group can have 8-14 flat tags with no sub-hierarchy to
   column-split. Wider than the default .mega-panel so ~14 chips per
   row don't force an awkwardly tall, narrow panel. */
.mega-panel--filters { min-width: 720px; max-width: 820px; }
.filter-tag-chips {
  display: flex;
  flex-wrap: wrap;
  gap: .5rem;
}
.filter-tag-chip {
  display: inline-block;
  border: 1px solid #e5e7eb;
  border-radius: 999px;
  padding: .4rem 1rem;
  font-size: .85rem;
  font-weight: 500;
  color: var(--ink);
  text-decoration: none;
  transition: background .15s ease, border-color .15s ease, color .15s ease;
}
.filter-tag-chip:hover { background: var(--brand); border-color: var(--brand); color: #fff; }

/* Mega-menu dropdown panel. Widened + nowrap so longer destination
   names (e.g. "Lednicko-valtický areál") never wrap onto a second
   line inside the col-6 country columns — found live: at the old
   480px min-width they did. */
.mega-panel {
  min-width: 640px;
}

/* Destination lists widened to show 16 per country (2026-09-21) — a
   single 16-row vertical list would make the panel oddly tall, so a
   section with more than 8 rows splits into 2 sub-columns (8+8) via
   CSS Grid with `max-content` column tracks: each sub-column sizes to
   its own widest row's real text width, so nothing ever wraps.
   Three approaches were tried and rejected live, in order: CSS
   multi-column (`column-count:2`) let a long row's own text overflow
   into the next column since its track width is an even split of the
   container, not sized to its own content; allowing `white-space:
   normal` to wrap instead avoided the overlap but produced visibly
   wrapped text; making the 3 sections themselves `flex-wrap`/auto-width
   (so the whole panel would grow to fit) instead made Chrome's
   shrink-to-fit sizing collapse the panel back to its bare min-width
   floor — a flex container with wrapping children doesn't reliably
   report its full preferred width to an ancestor computing shrink-to-
   fit — which then forced all 3 sections to stack vertically instead
   of sitting side by side, the opposite of what was asked for. Final
   fix: the panel is a normal fixed-width box again (like before this
   whole feature), sections never wrap (`flex-wrap: nowrap`), and if
   16-per-section content is ever wider than the panel, the sections
   row itself scrolls horizontally rather than wrapping or forcing the
   panel wider than the viewport. */
/* Centered horizontally on the page (2026-09-21, revised from an
   earlier flush-left-at-the-logo version) rather than anchored to its
   own toggle — still earns enough width to show 16 destinations per
   section without the horizontal scroll fallback kicking in, without
   needing to start right at the page's own left edge. `left: 50%` +
   `translateX(-50%)` centers it regardless of its own actual rendered
   width, so no JS measurement of the box itself is needed — only
   `top`/`max-width` still need computing against the real header
   height/viewport width (main.js), since those genuinely vary.
   `data-bs-display="static"` on the toggle (header.php) turns off
   Bootstrap's own Popper-driven positioning; `position`/`left`/
   `transform` are additionally set inline by main.js (not just here)
   since Bootstrap's `.dropdown-menu[data-bs-popper]` rule has higher
   specificity than a plain class and was silently overriding this
   class's own `position: fixed` — inline styles beat any CSS rule
   regardless of specificity, which is what actually makes it stick. */
.mega-panel--destinations {
  position: fixed;
  left: 50%;
  transform: translateX(-50%);
  top: 90px;
  min-width: 920px;
  max-width: min(96vw, 1300px);
}
.mega-dest-sections {
  align-items: flex-start;
  flex-wrap: nowrap;
  overflow-x: auto;
}
.mega-dest-section { flex: 0 0 auto; }
/* A default overlay scrollbar is invisible until actively scrolling —
   made permanently visible (thin, subtle) so a visitor actually
   notices there's more to see, instead of discovering it by accident. */
.mega-dest-sections { scrollbar-width: thin; }
.mega-dest-sections::-webkit-scrollbar { height: 6px; }
.mega-dest-sections::-webkit-scrollbar-track { background: transparent; }
.mega-dest-sections::-webkit-scrollbar-thumb { background: #d1d5db; border-radius: 999px; }
.mega-list--cols {
  display: grid;
  grid-template-columns: repeat(2, max-content);
  grid-template-rows: repeat(var(--mega-rows, 1), auto);
  grid-auto-flow: column;
  column-gap: 1.75rem;
}
.mega-list li { margin-bottom: .55rem; }
.mega-list a {
  text-decoration: none;
  color: var(--ink);
  font-weight: 500;
  font-size: .92rem;
  transition: color .15s ease, padding-left .15s ease;
  display: inline-block;
  white-space: nowrap;
}
.mega-list a:hover { color: var(--brand); padding-left: .25rem; }

/* "Zobraziť všetky..." link under each mega-panel section (2026-09-20) —
   deliberately always present, not conditionally shown only once the
   real list actually exceeds what's displayed, so the menu never needs
   touching again as regions/districts/cities keep getting real listings. */
.mega-list__see-all {
  display: inline-block;
  font-size: .82rem;
  font-weight: 600;
  color: var(--brand);
  text-decoration: none;
}
.mega-list__see-all:hover { text-decoration: underline; }

/* Region hover flyout — shows which property-type categories have
   listings in that destination (e.g. "Liptov" -> "Chaty (3)"). Opens
   to the RIGHT of the link (not below it) — `width: max-content` on
   the `<li>` shrinks its box to the link's own text so `left: 100%`
   lands right next to the label instead of at the far edge of the
   (much wider) column. Shown via a JS-added `.show` class (main.js,
   same delayed mouseenter/mouseleave pattern as the top-level
   dropdowns) rather than plain CSS :hover alone — a pure-CSS flyout
   has a dead zone between the trigger and the flyout, and crossing
   that gap was enough to hide it before the cursor arrived. `:hover`
   stays too as a no-JS fallback. */
.mega-list__item { position: relative; width: max-content; max-width: 100%; }
.region-flyout {
  display: none;
  position: absolute;
  left: 100%;
  top: 50%;
  margin-left: .5rem;
  background: var(--surface);
  border-radius: .75rem;
  box-shadow: 0 10px 30px rgba(0,0,0,.14);
  padding: .5rem;
  min-width: 170px;
  opacity: 0;
  visibility: hidden;
  transform: translate(-4px, -50%);
  /* A snappier "ease-out" curve on the transform reads more like a real
     app's flyout/tooltip than a plain linear/ease slide (2026-09-21) —
     the JS-driven open (main.js) computes its own viewport-clamped
     top/left/transform inline, so this transition is what actually
     animates between the pre- and post-open values it sets. */
  transition: opacity .18s ease, transform .22s cubic-bezier(.16, 1, .3, 1), visibility .18s;
  pointer-events: none;
  z-index: 20;
}
/* `display: none` (not just opacity/visibility) when closed, added
   2026-09-21: a flyout for an item near the BOTTOM of its 8-row column
   extends well past `.mega-dest-sections`'s own bottom edge even while
   fully invisible — an opacity/visibility-hidden box still occupies
   its absolutely-positioned layout space and was silently inflating
   the row's own `scrollHeight`, which (since that row now needs
   `overflow-x: auto`, forcing overflow-y to clip/scroll too) showed an
   unwanted, unnecessary vertical scrollbar even though no visible
   content actually needed one. `display: none` removes it from layout
   entirely while closed, so it can no longer inflate anything. */
.mega-list__item:hover .region-flyout,
.mega-list__item.show .region-flyout {
  display: block;
  opacity: 1;
  visibility: visible;
  transform: translate(0, -50%);
  pointer-events: auto;
}
/* Once `.mega-dest-sections` needs `overflow-x: auto` (2026-09-21, so
   16 destinations per section can scroll instead of wrapping the whole
   row), the browser is forced to also clip vertically — overflow-x and
   overflow-y can't independently be scroll/visible, only one or the
   other computed for both once either isn't `visible`. That silently
   clipped this flyout whenever it extended above the row's own top
   edge (any item in roughly the first 2 rows). Fixed in main.js by
   reparenting the flyout to <body> with JS-computed `position: fixed`
   the moment it opens — no longer a descendant of the clipping
   container at all — so this class (not the ancestor-dependent
   `.show`/`:hover` selectors above, which stop matching the instant
   it's moved) is what actually shows it while reparented; z-index
   raised well past Bootstrap's own dropdown (1000) since the flyout
   now sits in its own top-level stacking context on <body>. */
.region-flyout--open {
  display: block;
  opacity: 1;
  visibility: visible;
  pointer-events: auto;
  z-index: 1060;
}
.region-flyout__item {
  display: block;
  text-decoration: none;
  color: var(--ink);
  font-size: .84rem;
  font-weight: 500;
  white-space: nowrap;
  padding: .3rem .5rem;
  border-radius: .5rem;
  transition: background .12s ease;
}
.region-flyout__item:hover { background: var(--surface-alt); color: var(--brand); }

/* "Typ ubytovania" mega-menu hover flyout (2026-09-21) — same visual
   shape and reparent-to-<body> JS mechanism as .region-flyout above
   (shared function, main.js), kept as its own separate set of classes
   rather than refactored to share CSS rules with an already-recently-
   stabilized feature (History #109/#111 both fixed real regressions in
   the region-flyout's own CSS) — duplicating a small, proven-working
   shape here carries far less regression risk than merging it. Only
   real difference: the city list itself scrolls (`max-height` +
   `overflow-y: auto`) since a type can have far more matching cities
   than fit in one screen's height, per the user's own explicit ask. */
.type-flyout-item { position: relative; }
.type-flyout-item__chevron { font-size: .68rem; color: var(--muted); margin-left: .75rem; flex-shrink: 0; }
.type-city-flyout {
  display: none;
  position: absolute;
  left: 100%;
  top: 0;
  margin-left: .5rem;
  background: var(--surface);
  border-radius: .75rem;
  box-shadow: 0 10px 30px rgba(0,0,0,.14);
  padding: .5rem;
  min-width: 220px;
  opacity: 0;
  visibility: hidden;
  transform: translateX(-4px);
  transition: opacity .18s ease, transform .22s cubic-bezier(.16, 1, .3, 1), visibility .18s;
  pointer-events: none;
  z-index: 20;
}
.type-flyout-item:hover .type-city-flyout,
.type-flyout-item.show .type-city-flyout {
  display: block;
  opacity: 1;
  visibility: visible;
  transform: translateX(0);
  pointer-events: auto;
}
.type-city-flyout--open {
  display: block;
  opacity: 1;
  visibility: visible;
  pointer-events: auto;
  z-index: 1060;
}
/* Only the country matching the visitor's current Destinácie tab
   selection is ever shown (main.js toggles `.active` right before the
   flyout opens) — everything else stays `display:none` so an unrelated
   country's cities never flash into view even for a frame. */
.type-city-flyout__country { display: none; }
.type-city-flyout__country.active { display: block; }
.type-city-flyout__scroll {
  /* 320px is only the no-JS/no-hover CSS-`:hover` fallback ceiling — on a
     real hover-capable device, initHoverFlyout() overrides this inline
     with a viewport-derived max-height (2026-09-21, user's own explicit
     ask for "as tall as possible, only scrolls once genuinely needed"). */
  max-height: 320px;
  overflow-y: auto;
  padding-right: .25rem;
}
.type-city-flyout__item {
  display: block;
  text-decoration: none;
  color: var(--ink);
  font-size: .84rem;
  font-weight: 500;
  white-space: nowrap;
  padding: .3rem .5rem;
  border-radius: .5rem;
  transition: background .12s ease;
}
.type-city-flyout__item:hover { background: var(--surface-alt); color: var(--brand); }

/* ---------- Hero ---------- */
.hero {
  position: relative;
  background-image:
    linear-gradient(180deg, rgba(0,20,50,.72), rgba(0,10,28,.68)),
    url('https://images.unsplash.com/photo-1506905925346-21bda4d32df4?auto=format&fit=crop&w=1920&q=80');
  background-size: cover;
  background-position: center;
  color: #fff;
  padding: 45px 20px 30px;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  text-align: center;
  overflow: hidden;
  transition: padding .25s ease;
}

/* Shown once a search/category filter is active, so results sit closer
   to the top of the page instead of forcing a long scroll past the hero. */
.hero--compact {
  padding: 32px 20px;
}
.hero--compact h1 { font-size: clamp(1.3rem, 2.4vw, 1.9rem); }
.hero--compact .subtitle { font-size: .92rem; }
.hero--compact .ai-search-hint { margin-top: .3rem; }

.hero h1 {
  font-size: clamp(1.6rem, 3.2vw, 2.5rem);
  font-weight: 700;
  letter-spacing: 0.02em;
  line-height: 1.15;
  text-transform: uppercase;
  text-shadow: 0 2px 12px rgba(0,0,0,0.35);
  margin: 0;
}

.hero p.subtitle {
  color: rgba(255,255,255,0.65);
  margin-top: 0.5rem;
  margin-bottom: 0;
  font-size: .95rem;
  font-weight: 400;
  line-height: 1.3;
}

.ai-search-wrap {
  position: relative;
  width: 100%;
  max-width: 980px;
  margin: 0 auto;
  /* .hero is a column flex container; auto cross-axis margins make a flex
     item shrink-to-content instead of stretching, which silently defeated
     max-width above. Explicit width:100% forces the stretch, then
     max-width clamps it (same pattern Bootstrap's .container uses). */
  align-self: center;
}

/* Full-panel loading state shown for the whole real-navigation wait
   after submitting the hero search (server-side AI query parsing genuinely
   takes a couple of seconds) — replaces the old live-as-you-type dropdown,
   which read as a cheap suggestions popup rather than a serious tool. */
.search-loading-overlay {
  position: absolute;
  inset: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: .9rem;
  background: rgba(255,255,255,.92);
  border-radius: var(--radius);
  opacity: 0;
  visibility: hidden;
  transition: opacity .2s ease;
  z-index: 25;
}
:root:not([data-theme="light"]) .search-loading-overlay { background: rgba(15,23,42,.88); }
:root[data-theme="dark"] .search-loading-overlay { background: rgba(15,23,42,.88); }
.search-loading-overlay.is-visible { opacity: 1; visibility: visible; }
.search-loading-overlay__spinner { display: flex; gap: .4rem; }
.search-loading-overlay__spinner span {
  width: .65rem;
  height: .65rem;
  border-radius: 50%;
  background: var(--brand);
  animation: mu-search-bounce 1.1s ease-in-out infinite;
}
.search-loading-overlay__spinner span:nth-child(2) { animation-delay: .15s; }
.search-loading-overlay__spinner span:nth-child(3) { animation-delay: .3s; }
@keyframes mu-search-bounce {
  0%, 80%, 100% { transform: scale(.6); opacity: .5; }
  40% { transform: scale(1); opacity: 1; }
}
.search-loading-overlay__text {
  margin: 0;
  font-weight: 700;
  font-size: .92rem;
  color: var(--ink);
}
@media (prefers-reduced-motion: reduce) {
  .search-loading-overlay__spinner span { animation: none; opacity: 1; transform: none; }
}

/* Structured, segmented search panel (Booking.com-style: Location / Type
   / Dates / Search as distinct fields in one bar) instead of a single
   pill input — reads as a serious booking tool rather than a chat box. */
.search-panel {
  max-width: 980px;
  margin: 1.1rem auto 0;
  background: var(--surface);
  border-radius: var(--radius);
  box-shadow: 0 10px 30px rgba(0,0,0,.22);
  display: flex;
  align-items: stretch;
  overflow: hidden;
  text-align: left;
}
.search-panel__field {
  flex: 1 1 0;
  min-width: 0;
  padding: .4rem 1.1rem;
  display: flex;
  flex-direction: column;
  justify-content: center;
}
.search-panel__field > label {
  font-size: .62rem;
  text-transform: uppercase;
  letter-spacing: .05em;
  font-weight: 700;
  color: var(--muted);
  margin-bottom: 0;
  line-height: 1.3;
}
.search-panel__field > input,
.search-panel__field > select {
  border: none;
  outline: none;
  background: transparent;
  padding: 0;
  font-size: .93rem;
  font-weight: 500;
  color: var(--ink);
  width: 100%;
  appearance: none;
}
/* The field itself has no visible border to move outline:none's focus
   indication onto, so the visible focus ring (WCAG 2.4.7) goes on the
   parent field wrapper instead when a keyboard user tabs into it. */
.search-panel__field:focus-within {
  outline: 2px solid var(--brand);
  outline-offset: 2px;
  border-radius: var(--radius);
}
/* Both narrowed to direct children (2026-09-26) — these two selectors
   used to match ANY input/select nested anywhere inside a field,
   including the guests dropdown's own pet checkbox further down the
   tree, which silently stripped its native checkbox appearance
   (appearance:none + width:100% on a checkbox renders as an invisible
   blank box) and uppercased/shrank its <label> text. The date inputs
   don't need this rule at all — .search-panel__date-sub input[type="date"]
   (below) already duplicates the identical styling for them. */
.search-panel__field > input::placeholder {
  color: var(--muted);
  font-weight: 400;
  opacity: .75;
}
.search-panel__field--type { flex: 0 1 170px; }
.search-panel__field--dates { flex: 0 1 220px; padding-left: 0; padding-right: 0; }
.search-panel__dates-inputs { display: flex; height: 100%; }
.search-panel__date-sub {
  flex: 1;
  min-width: 0;
  position: relative;
  padding: .4rem .8rem;
  display: flex;
  border-radius: var(--radius);
  transition: background-color .15s ease;
}
.search-panel__date-sub:hover { background-color: var(--surface-alt); }
.search-panel__date-sub + .search-panel__date-sub { border-left: 1px solid var(--border); }
/* Check-in/check-out as one clickable button, not an editable native
   date input sitting directly in the compact bar (2026-09-26 follow-up
   — clicking a dd/mm/yyyy segment used to highlight it blue, which read
   as broken/fiddly for a field meant to look like a single unit). The
   real <input type="date"> still exists — inside the dropdown-menu below,
   where its own native segment editing is expected and fine — this
   button is purely the always-visible trigger + a formatted display. */
.search-panel__date-btn {
  border: none;
  background: transparent;
  padding: 0;
  width: 100%;
  text-align: left;
  cursor: pointer;
  display: flex;
  flex-direction: column;
  justify-content: center;
}
.search-panel__date-label {
  font-size: .62rem;
  text-transform: uppercase;
  letter-spacing: .05em;
  font-weight: 700;
  color: var(--muted);
  line-height: 1.3;
}
.search-panel__date-value { font-size: .93rem; font-weight: 500; color: var(--ink); }
.search-date-menu { min-width: 280px; border: 0; box-shadow: 0 10px 30px rgba(0,0,0,.18); border-radius: var(--radius); }

/* Self-contained calendar grid, replacing a native <input type="date">
   (2026-09-26) — showPicker() opened a SECOND, browser-native calendar
   overlay positioned by the browser itself, independent of our own
   already-correctly-positioned dropdown box, which is what actually
   produced the reported "kalendár vyskakuje úplne mimo" bug (a headless
   Playwright check can't see that native overlay at all, which is exactly
   why the earlier verification pass missed it). Everything visible now
   lives inside the one dropdown-menu box we already position ourselves. */
.mu-cal { width: 244px; }
.mu-cal__header { display: flex; align-items: center; justify-content: space-between; margin-bottom: .5rem; }
.mu-cal__nav {
  width: 28px; height: 28px; border-radius: 50%; border: none; background: transparent;
  color: var(--ink); font-size: 1.15rem; line-height: 1; cursor: pointer;
  display: flex; align-items: center; justify-content: center; transition: background-color .15s ease;
}
.mu-cal__nav:hover:not(:disabled) { background: var(--surface-alt); }
.mu-cal__nav:disabled { opacity: .3; cursor: not-allowed; }
.mu-cal__title { font-size: .88rem; font-weight: 700; color: var(--ink); text-transform: capitalize; }
.mu-cal__weekdays { display: grid; grid-template-columns: repeat(7, 1fr); text-align: center; margin-bottom: .2rem; }
.mu-cal__weekdays span { font-size: .68rem; font-weight: 700; color: var(--muted); text-transform: uppercase; }
.mu-cal__days { display: grid; grid-template-columns: repeat(7, 1fr); gap: 2px; }
.mu-cal__day {
  aspect-ratio: 1; border: none; background: transparent; border-radius: 50%;
  font-size: .84rem; color: var(--ink); cursor: pointer; display: flex; align-items: center; justify-content: center;
  transition: background-color .15s ease;
}
.mu-cal__day.is-empty { cursor: default; visibility: hidden; }
.mu-cal__day:hover:not(:disabled):not(.is-empty) { background: var(--surface-alt); }
.mu-cal__day:disabled { color: var(--muted); opacity: .35; cursor: not-allowed; }
.mu-cal__day.is-selected { background: var(--brand); color: #fff; font-weight: 700; }
.mu-cal__day.is-today:not(.is-selected) { box-shadow: inset 0 0 0 1px var(--brand); }
.search-panel__divider { width: 1px; background: var(--border); margin: .6rem 0; flex-shrink: 0; }

/* "Nice animated jump" between the check-in date, check-out date, and
   guests picker (2026-09-26) — a brief pulse ring on whichever field the
   flow just auto-advanced focus/opening to, since a native date input's
   own picker/focus state can't otherwise be styled or animated by us. */
@keyframes mu-field-pulse {
  0% { box-shadow: 0 0 0 0 rgba(0, 74, 173, .35); }
  70% { box-shadow: 0 0 0 10px rgba(0, 74, 173, 0); }
  100% { box-shadow: 0 0 0 0 rgba(0, 74, 173, 0); }
}
.search-panel__field--pulse { animation: mu-field-pulse .7s ease-out; }
@media (prefers-reduced-motion: reduce) {
  .search-panel__field--pulse { animation: none; }
}

/* Guests picker (2026-09-26) — a plain Bootstrap dropdown so open/close/
   outside-click all come for free (same pattern as the header's own
   language/currency/notification dropdowns); no .dropdown-toggle class on
   the trigger button so Bootstrap's caret pseudo-element doesn't appear,
   keeping the flat borderless look every other search-panel field has. */
.search-panel__field--guests { flex: 0 1 150px; padding-left: .8rem; padding-right: .8rem; position: relative; }
.search-panel__guests-btn {
  border: none;
  background: transparent;
  padding: 0;
  width: 100%;
  text-align: left;
  font-size: .93rem;
  font-weight: 500;
  color: var(--ink);
  cursor: pointer;
}
.search-guests-menu { min-width: 260px; border: 0; box-shadow: 0 10px 30px rgba(0,0,0,.18); border-radius: var(--radius); }
.search-guests-menu__row { display: flex; align-items: center; justify-content: space-between; padding: .5rem 0; gap: 1rem; }
.search-guests-menu__row + .search-guests-menu__row { border-top: 1px solid var(--border); }
.qty-stepper { display: flex; align-items: center; gap: .6rem; }
.qty-stepper__btn {
  width: 28px; height: 28px; border-radius: 50%; border: 1px solid var(--border);
  background: var(--surface); color: var(--ink); font-size: 1rem; line-height: 1;
  display: flex; align-items: center; justify-content: center; cursor: pointer;
}
.qty-stepper__btn:hover { border-color: var(--brand); color: var(--brand); }
.qty-stepper__value { min-width: 1.5rem; text-align: center; font-weight: 600; }
.search-panel__submit {
  background: var(--brand);
  color: #fff;
  font-weight: 700;
  border: none;
  padding: 0 1.85rem;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: .45rem;
  white-space: nowrap;
  flex-shrink: 0;
  transition: background-color .15s ease;
}
.search-panel__submit:hover { background: var(--brand-dark); }
.search-panel__submit:disabled { opacity: .6; cursor: not-allowed; }

@media (max-width: 767.98px) {
  .search-panel { flex-direction: column; }
  .search-panel__divider { display: none; }
  .search-panel__field,
  .search-panel__field--type,
  .search-panel__field--dates,
  .search-panel__field--guests { flex: 1 1 auto; border-bottom: 1px solid var(--border); }
  .search-panel__submit { padding: .9rem; }
}

/* ---------- Full-width "all listings" map (homepage, above the footer) ---------- */
.all-listings-map { width: 100%; }
.all-listings-map #allListingsMap {
  width: 100%;
  height: 266px; /* matches #heroSection's own rendered height, so the two sit at equal visual weight */
}
/* footer.php uses .mt-5 for spacing after regular page content, but
   right after this edge-to-edge map that reads as an unwanted gap.
   General sibling (~) because the map's own <link>/<script> tags sit
   between the section and the footer in the DOM. */
.all-listings-map ~ .site-footer { margin-top: 0 !important; }
.listings-map-popup {
  display: block;
  width: 180px;
  text-decoration: none;
  color: var(--ink);
}
.listings-map-popup img {
  width: 100%;
  height: 100px;
  object-fit: cover;
  border-radius: var(--radius);
  margin-bottom: .4rem;
}
.listings-map-popup__title {
  font-weight: 700;
  font-size: .85rem;
  line-height: 1.25;
  margin-bottom: .15rem;
}
.listings-map-popup__price {
  font-size: .8rem;
  font-weight: 600;
  color: var(--brand);
}
.leaflet-popup-content { margin: .6rem; }

/* ---------- Availability calendar (property.php) ---------- */
.avail-cal { min-width: 0; }
.avail-cal__header { font-weight: 700; font-size: .9rem; text-align: center; margin-bottom: .5rem; }
.pubcal-months { display: grid; grid-template-columns: repeat(3, 1fr); gap: 2.5rem; }
@media (max-width: 991.98px) {
  .pubcal-months { grid-template-columns: repeat(2, 1fr); }
  .pubcal-months .avail-cal:nth-child(3) { display: none; }
}
@media (max-width: 575.98px) {
  .pubcal-months { grid-template-columns: 1fr; }
  .pubcal-months .avail-cal:nth-child(2) { display: none; }
}
.avail-cal__grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 2px; }
.avail-cal__dow { font-size: .7rem; color: var(--muted); text-align: center; font-weight: 700; padding-bottom: .2rem; }
.avail-cal__day {
  aspect-ratio: 1;
  display: flex; align-items: center; justify-content: center;
  font-size: .78rem; border-radius: .4rem;
}
.avail-cal__day--free { background: #eef7ee; color: #1a5c1a; }
.avail-cal__day--busy { background: #fbe9e9; color: #a33; text-decoration: line-through; }
.avail-cal__day--empty { background: transparent; }
.avail-cal__legend { display: inline-block; width: .7rem; height: .7rem; border-radius: .2rem; margin-right: .25rem; vertical-align: middle; }
.avail-cal__legend--free { background: #eef7ee; border: 1px solid #1a5c1a; }
.avail-cal__legend--busy { background: #fbe9e9; border: 1px solid #a33; }

/* Public property.php guest calendar, bar style — no channel/guest
   detail (that's the host-only .ccal-* calendar below), just a single
   neutral "obsadené" color spanning check-in to check-out. */
.pubcal-dow { display: grid; grid-template-columns: repeat(7, 1fr); font-size: .68rem; color: var(--muted); text-align: center; font-weight: 700; padding-bottom: .2rem; }
.pubcal-week { display: grid; grid-template-columns: repeat(7, 1fr); position: relative; row-gap: 1px; margin-bottom: 1px; }
.pubcal-day { font-size: .74rem; text-align: center; padding: .1rem 0; color: var(--ink); }
.pubcal-day--muted { color: #c7ccd1; }
.pubcal-bar { border-radius: .25rem; background: #fbe9e9; color: #a33; font-size: .62rem; padding: 0 .3rem; height: 12px; display: flex; align-items: center; overflow: hidden; white-space: nowrap; margin-top: 1px; }

/* Host/admin channel-manager calendar (host/property-manage.php) */
.ccal-legend { display: flex; gap: 1rem; flex-wrap: wrap; }
.ccal-legend span { display: flex; align-items: center; gap: .3rem; }
.ccal-legend__dot { width: .6rem; height: .6rem; border-radius: 50%; flex-shrink: 0; display: inline-block; }
.ccal-dow { display: grid; grid-template-columns: repeat(7, 1fr); font-size: .72rem; color: var(--muted); text-align: center; font-weight: 700; padding-bottom: .3rem; }
.ccal-week { display: grid; grid-template-columns: repeat(7, 1fr); column-gap: 2px; row-gap: 2px; border-bottom: 1px solid var(--border); padding-bottom: 4px; margin-bottom: 4px; }
.ccal-day {
  font-size: .78rem;
  text-align: center;
  padding: .2rem 0;
  cursor: pointer;
  border-radius: .3rem;
}
.ccal-day:hover { background: var(--surface-tint); }
.ccal-day--muted { color: #c7ccd1; }
.ccal-bar {
  border-radius: .3rem;
  font-size: .68rem;
  font-weight: 600;
  padding: 0 .35rem;
  display: flex;
  align-items: center;
  overflow: hidden;
  white-space: nowrap;
  cursor: pointer;
}
.ccal-list__item {
  display: flex;
  align-items: center;
  gap: .6rem;
  padding: .5rem .25rem;
  border-bottom: 1px solid var(--border);
  cursor: pointer;
}

/* ---------- Maps (Leaflet/OpenStreetMap — add/edit form picker + property page) ---------- */
.map-picker {
  height: 280px;
  border-radius: var(--radius);
  border: 1px solid var(--border);
  overflow: hidden;
}
.property-map {
  height: 320px;
  border-radius: var(--radius);
  overflow: hidden;
}
#nearbyAttractionsSection { opacity: 0; transform: translateY(6px); transition: opacity .35s ease, transform .35s ease; }
#nearbyAttractionsSection.is-visible { opacity: 1; transform: none; }
.nearby-attraction {
  width: 100%; height: 100%;
  display: flex;
  align-items: center;
  gap: .75rem;
  padding: .6rem .75rem;
  border: 1px solid var(--border);
  border-radius: 12px;
  background: var(--surface);
  color: var(--ink);
  text-align: left;
  transition: border-color .15s ease, box-shadow .15s ease;
}
.nearby-attraction:hover { border-color: var(--brand); box-shadow: 0 4px 14px rgba(0,0,0,.06); }
.nearby-attraction__icon {
  flex: 0 0 auto; width: 36px; height: 36px; border-radius: 10px;
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--surface-tint); color: var(--brand); font-size: 1rem;
}
.nearby-attraction__body { display: flex; flex-direction: column; min-width: 0; flex: 1; }
.nearby-attraction__name { font-weight: 600; font-size: .88rem; line-height: 1.25; overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; }
.nearby-attraction__category { font-size: .75rem; color: var(--muted); }
.nearby-attraction__distance { font-size: .8rem; font-weight: 700; color: var(--brand); white-space: nowrap; }

/* ---------- Left sidebar filter panel ---------- */
/* A plain `position: sticky` with no height cap pins the panel's TOP edge
   near the viewport top but still lets its own bottom extend past the
   visible viewport once it has enough filter groups (price/guests/rooms/
   rating/type/meal-plan/amenities) — reaching anything below the fold
   inside the panel then requires scrolling the WHOLE PAGE (i.e. past
   every listing card) rather than just the panel itself, a real,
   reported UX bug. Capping its own height and giving it its own scroll
   makes it independently reachable with the mouse wheel while hovering
   over it, without ever needing to scroll the results list to get there. */
.filter-sidebar {
  position: sticky;
  top: 1rem;
  max-height: calc(100vh - 2rem);
  overflow-y: auto;
  scrollbar-width: thin;
}
.filter-sidebar::-webkit-scrollbar { width: 6px; }
.filter-sidebar::-webkit-scrollbar-thumb { background: var(--border); border-radius: 3px; }
.filter-group:not(:last-child) {
  border-bottom: 1px solid var(--border);
  padding-bottom: 1rem;
}
.filter-amenities__list .form-check { margin-bottom: .3rem; }

/* AJAX filter loading state (2026-09-21: real content now fades OUT to
   skeleton rows, then skeleton fades OUT to real content, rather than
   just dimming the old results in place — see main.js's fadeSwapPane()/
   buildSkeletonList()) — the transition lives on the pane itself since
   both fades toggle the same inline opacity style; .is-loading only
   blocks interaction while either fade/fetch is in flight. */
#resultsPane {
  transition: opacity .15s ease;
}
#resultsPane.is-loading {
  pointer-events: none;
}

/* ---------- Trust strip (homepage, below hero) ---------- */
.trust-strip { background: var(--surface); }
.featured-rotation { background: var(--surface-alt); }
.trust-strip__heading {
  text-align: center;
  font-style: italic;
  font-weight: 600;
  font-size: 1.05rem;
  color: var(--ink);
  margin-bottom: 1rem;
}
.trust-strip__icon {
  font-size: 1.4rem;
  color: var(--brand);
  margin-bottom: .4rem;
  display: inline-block;
}
.trust-strip__title {
  font-size: .92rem;
  font-weight: 700;
  margin-bottom: .2rem;
}
.trust-strip__desc {
  font-size: .82rem;
  color: var(--muted);
  margin-bottom: 0;
  line-height: 1.3;
}

.ai-search-hint {
  margin-top: 0.4rem;
  margin-left: auto;
  margin-right: auto;
  font-size: 0.78rem;
  font-weight: 400;
  color: rgba(255,255,255,0.55);
  display: flex;
  justify-content: center;
  align-items: center;
  gap: .4rem;
  text-align: center;
}
.ai-search-hint .badge {
  background: rgba(255,255,255,0.12);
  color: rgba(255,255,255,0.7);
  backdrop-filter: blur(6px);
  font-weight: 700;
  letter-spacing: .03em;
}

/* ---------- Property cards: cards separated by shadow alone (no
   border) — the clean look of Airbnb/Booking-style professional
   portals against the site's all-white canvas (--bg above), rather
   than a bordered-tile look. ---------- */
.property-card {
  background: var(--surface);
  border-radius: 1rem;
  overflow: hidden;
  box-shadow: 0 1px 2px rgba(0,0,0,0.04), 0 2px 8px rgba(0,0,0,0.05);
  transition: box-shadow 0.2s ease, transform 0.2s ease;
  height: 100%;
  display: flex;
  flex-direction: column;
}
.property-card:hover {
  box-shadow: 0 4px 10px rgba(0,0,0,0.06), 0 16px 32px rgba(0,0,0,0.12);
  transform: translateY(-3px);
}

.property-card__image-wrap {
  position: relative;
  display: block;
  aspect-ratio: 16 / 9;
  overflow: hidden;
  background: var(--surface-alt);
}
.property-card__image-wrap img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform .3s ease;
}
.property-card:hover .property-card__image-wrap img {
  transform: scale(1.04);
}

.badge-onimage {
  position: absolute;
  top: .75rem;
  font-size: .72rem;
  font-weight: 700;
  padding: .35rem .65rem;
  border-radius: var(--radius);
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
}
.badge-type {
  left: .75rem;
  background: rgba(255,255,255,0.75);
  color: var(--ink);
  letter-spacing: 0.03em;
}
.badge-capacity {
  right: .75rem;
  background: rgba(0,0,0,0.45);
  color: #fff;
}
.badge-top {
  left: .75rem;
  top: auto;
  bottom: .75rem;
  background: #b8860b;
  color: #fff;
  font-weight: 700;
  letter-spacing: 0.04em;
}
/* TOP and "Overený partner" can both be true for one listing — stacked
   in one bottom-left column instead of two independently absolutely-
   positioned badges fighting over the same corner. */
.badge-onimage-stack { position: absolute; left: .75rem; bottom: .75rem; display: flex; flex-direction: column; align-items: flex-start; gap: .35rem; }
.badge-onimage-stack .badge-onimage { position: static; }
.badge-verified {
  background: #0d6efd;
  color: #fff;
  font-weight: 700;
  letter-spacing: 0.02em;
}
/* Host-package badges (2026-09-24 repricing) — distinct colors from TOP
   (gold) and Overený partner (blue) so all four can never be confused with
   each other when stacked together. */
.badge-exclusive {
  background: #6f42c1;
  color: #fff;
  font-weight: 700;
  letter-spacing: 0.02em;
}
.badge-lifetime {
  background: #146c43;
  color: #fff;
  font-weight: 700;
  letter-spacing: 0.02em;
}

/* Favorite/compare/share icon cluster — bottom-right of the image is the
   one corner .badge-onimage doesn't already use (type top-left, capacity
   top-right, TOP badge bottom-left when promoted). */
.card-actions {
  position: absolute;
  right: .75rem;
  bottom: .75rem;
  display: flex;
  gap: .4rem;
  z-index: 2;
}
.card-action-btn {
  width: 2rem;
  height: 2rem;
  border-radius: 50%;
  border: none;
  background: rgba(255,255,255,.85);
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--ink);
  font-size: .95rem;
  transition: transform .15s ease, background-color .15s ease, color .15s ease;
}
.card-action-btn:hover { transform: scale(1.08); background: #fff; }
.card-action-btn--active { color: #e0245e; }
.card-action-btn--active .bi-heart::before { content: "\f415"; } /* bi-heart-fill */
.card-action-btn--copied { color: var(--brand); }

/* Sticky compare bar — global (includes/footer.php), builds up as the
   visitor adds items across different pages/category browses, not just
   within one page's card grid. */
.compare-bar {
  position: fixed;
  left: 50%;
  bottom: 1.25rem;
  transform: translateX(-50%);
  z-index: 1040;
  background: var(--ink);
  color: #fff;
  border-radius: 999px;
  padding: .6rem .6rem .6rem 1.1rem;
  display: flex;
  align-items: center;
  gap: .75rem;
  box-shadow: 0 10px 30px rgba(0,0,0,.25);
  max-width: calc(100vw - 2rem);
}
.compare-bar__count { font-weight: 700; }
.compare-bar__hint { font-size: .8rem; opacity: .75; }
.compare-bar:not(.compare-bar--ready) .compare-bar__go { opacity: .5; pointer-events: none; }
/* Reserves space for the fixed compare bar so it never floats on top of
   real content on a short page (e.g. compare.php with just 1-2 rows). */
body.has-compare-bar { padding-bottom: 4.5rem; }

/* GDPR cookie consent banner — z-index above the compare bar since it is
   a legal-consent gate, not a passive convenience widget. */
.cookie-banner {
  position: fixed;
  left: 0; right: 0; bottom: 0;
  z-index: 1055;
  background: var(--surface);
  border-top: 1px solid var(--border);
  box-shadow: 0 -4px 20px rgba(0,0,0,.1);
  padding: 1rem 1.25rem;
  padding-bottom: calc(1rem + env(safe-area-inset-bottom, 0px));
}
.cookie-banner__inner {
  max-width: 1100px;
  margin: 0 auto;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 1rem;
  justify-content: space-between;
}
.cookie-banner__text { flex: 1 1 320px; font-size: .875rem; color: var(--ink); margin: 0; }
.cookie-banner__actions { display: flex; flex-wrap: wrap; gap: .5rem; }
@media (max-width: 575.98px) {
  .cookie-banner__actions { width: 100%; }
  .cookie-banner__actions .btn { flex: 1 1 auto; }
}
/* While the banner is showing, push every other fixed bottom-corner
   widget (chat bubble, compare bar) up above it — otherwise the banner's
   full-width div (it needs a solid background, so it can't just have a
   transparent cutout) sits on top of and intercepts clicks on whatever
   was already anchored to that corner. Generous, not measured, offsets:
   the banner's own height varies with viewport width/translated text
   length, and being a little too generous costs nothing visually. */
body.has-cookie-banner .chat-widget,
body.has-cookie-banner .compare-bar,
body.has-cookie-banner .inspector-toggle { bottom: 6.5rem; }
@media (max-width: 575.98px) {
  body.has-cookie-banner .chat-widget,
  body.has-cookie-banner .compare-bar,
  body.has-cookie-banner .inspector-toggle { bottom: 10rem; }
}

/* Real bug found live (2026-09-22, dark-mode toggle verification): the
   mobile off-canvas drawer's own theme-toggle row sits at the same fixed
   screen position as the chat bubble, which visually/functionally sat ON
   TOP of it — a tap meant for the switch opened the chat widget instead.
   Hiding the bubble entirely while any off-canvas menu is open (same
   "hide the floating widget rather than patch around it" choice already
   made for the cookie banner above) is simpler and more robust than
   repositioning one specific row, and correctly covers any future
   off-canvas content too, not just this one row. */
body:has(.offcanvas.show) .chat-widget { display: none; }

/* Skip-to-content link (WCAG 2.4.1) — visually hidden until focused via
   keyboard, so it never affects sighted mouse users' layout. */
.skip-link {
  position: absolute;
  left: -9999px;
  top: 0;
  z-index: 2000;
  background: var(--brand);
  color: #fff;
  padding: .75rem 1.25rem;
  border-radius: 0 0 var(--radius) 0;
  font-weight: 600;
  text-decoration: none;
}
.skip-link:focus { left: 0; }

/* Notification Center bell dropdown (assets/js/notifications.js) —
   shared markup/classes for both the public header's desktop dropdown
   and the admin panel's own bell. */
.notif-item {
  display: flex; align-items: flex-start; gap: .65rem;
  padding: .65rem .9rem; text-decoration: none; color: inherit;
  border-bottom: 1px solid var(--border);
}
.notif-item:last-child { border-bottom: none; }
.notif-item:hover { background: var(--surface-alt); }
.notif-item--unread { background: rgba(var(--brand-rgb), .04); }
.notif-item__icon {
  width: 34px; height: 34px; border-radius: 50%; flex-shrink: 0;
  display: flex; align-items: center; justify-content: center;
  background: rgba(var(--brand-rgb), .1); color: var(--brand); font-size: .9rem;
}
.notif-item__body { display: flex; flex-direction: column; min-width: 0; flex: 1; }
.notif-item__title { font-weight: 600; font-size: .84rem; color: var(--ink); }
.notif-item__message {
  font-size: .78rem; color: var(--muted); overflow: hidden; text-overflow: ellipsis;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
}
.notif-item__time { font-size: .72rem; color: var(--muted); margin-top: .15rem; }
.notif-item__dot { width: 8px; height: 8px; border-radius: 50%; background: var(--brand); flex-shrink: 0; margin-top: .3rem; }

.property-card__body {
  padding: 1rem 1.15rem 1.15rem;
  display: flex;
  flex-direction: column;
  flex: 1;
}

.property-card__title {
  font-weight: 700;
  font-size: 1.05rem;
  margin-bottom: 0.25rem;
  color: var(--ink);
}
.property-card__title a {
  color: inherit;
  text-decoration: none;
}
.property-card__title a:hover {
  text-decoration: underline;
}

.property-card__location {
  color: var(--muted);
  font-size: 0.9rem;
  margin-bottom: 0.5rem;
}

/* OMNIBUS-directive disclosure (private individual vs. business host) */
.property-card__owner-type {
  font-size: 0.75rem;
  margin-bottom: 0.4rem;
}
.listing-row__specs .bi-person,
.listing-row__specs .bi-briefcase { margin-left: .25rem; }

.property-card__excerpt {
  color: var(--muted);
  font-size: 0.78rem;
  line-height: 1.35;
  margin-bottom: 0.6rem;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.property-card__price {
  font-weight: 700;
  color: var(--ink);
  margin-bottom: 0.75rem;
  margin-top: auto;
  padding-top: 0.5rem;
}
.property-card__price span {
  font-weight: 400;
  color: var(--muted);
  font-size: 0.85rem;
}

/* Gated-contacts placeholder on property.php — a generic masked string,
   never the real number (that never reaches the page source pre-unlock),
   blurred purely so the "locked" state reads as a phone number shape. */
.contact-blur {
  filter: blur(4px);
  user-select: none;
  pointer-events: none;
  letter-spacing: 1px;
  font-weight: 600;
  color: var(--muted);
  text-align: center;
  padding: 0.5rem 0;
}

.btn-outline-full {
  display: block;
  width: 100%;
  text-align: center;
  border: 1px solid var(--ink);
  color: var(--ink);
  font-weight: 600;
  font-size: 0.82rem;
  padding: 0.4rem 1rem;
  border-radius: .75rem;
  transition: background-color 0.15s ease, color 0.15s ease;
  text-decoration: none;
}
.btn-outline-full:hover {
  background: var(--ink);
  color: #fff;
}

/* ---------- Horizontal listing row (search/category/destination pages
   — the homepage keeps its .property-card grid above, unchanged) ---------- */
.listing-row-list {
  display: flex;
  flex-direction: column;
  gap: 1.25rem;
}
.listing-row {
  display: flex;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  overflow: hidden;
  transition: box-shadow .2s ease, transform .2s ease;
}
.listing-row:hover {
  box-shadow: 0 4px 10px rgba(0,0,0,0.06), 0 16px 32px rgba(0,0,0,0.12);
  transform: translateY(-2px);
}
.listing-row__gallery {
  position: relative;
  flex: 0 0 300px;
  aspect-ratio: 4 / 3;
  overflow: hidden;
  background: var(--surface-alt);
}
.listing-row__gallery img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
.listing-row__nav {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  width: 1.9rem;
  height: 1.9rem;
  border-radius: 50%;
  border: none;
  background: rgba(255,255,255,.85);
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--ink);
  opacity: 0;
  transition: opacity .15s ease, background-color .15s ease;
  z-index: 2;
}
.listing-row__gallery:hover .listing-row__nav { opacity: 1; }
.listing-row__nav:hover { background: #fff; }
.listing-row__nav--prev { left: .5rem; }
.listing-row__nav--next { right: .5rem; }
.listing-row__dots {
  position: absolute;
  bottom: .6rem;
  left: 0;
  right: 0;
  display: flex;
  justify-content: center;
  gap: .3rem;
  z-index: 2;
}
.listing-row__dot {
  width: .35rem;
  height: .35rem;
  border-radius: 50%;
  background: rgba(255,255,255,.6);
}
.listing-row__dot.active { background: #fff; }

.listing-row__body {
  flex: 1 1 auto;
  display: flex;
  padding: 1.1rem 1.3rem;
  gap: 1rem;
  min-width: 0;
}
.listing-row__main { flex: 1 1 auto; min-width: 0; }
.listing-row__title {
  font-size: 1.15rem;
  font-weight: 700;
  margin-bottom: .25rem;
}
.listing-row__title a { color: var(--ink); text-decoration: none; }
.listing-row__title a:hover { color: var(--brand); }
.listing-row__location {
  font-size: .85rem;
  color: var(--muted);
  margin-bottom: .6rem;
}
.listing-row__specs {
  display: flex;
  flex-wrap: wrap;
  gap: .9rem;
  font-size: .82rem;
  color: var(--ink);
  margin-bottom: .6rem;
}
.listing-row__specs span { display: inline-flex; align-items: center; gap: .3rem; }
.listing-row__specs i { color: var(--muted); }
.listing-row__excerpt {
  font-size: .82rem;
  color: var(--muted);
  margin-bottom: 0;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.listing-row__side {
  flex: 0 0 190px;
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  justify-content: space-between;
  text-align: right;
  gap: .5rem;
}
.listing-row__rating {
  display: flex;
  align-items: baseline;
  gap: .35rem;
  justify-content: flex-end;
}
.listing-row__rating-word { font-size: .82rem; font-weight: 600; color: var(--ink); }
.listing-row__rating-score {
  background: var(--brand);
  color: #fff;
  font-weight: 700;
  font-size: .85rem;
  padding: .15rem .5rem;
  border-radius: .4rem;
}
.listing-row__price { line-height: 1.25; }
.listing-row__price strong { font-size: 1.25rem; color: var(--ink); }
.listing-row__cta {
  width: 100%;
  font-weight: 700;
  white-space: nowrap;
}

@media (max-width: 767.98px) {
  .listing-row { flex-direction: column; }
  .listing-row__gallery { flex-basis: auto; aspect-ratio: 16 / 9; }
  .listing-row__body { flex-direction: column; padding: 1rem; }
  .listing-row__side { flex-basis: auto; align-items: stretch; text-align: left; }
  .listing-row__rating { justify-content: flex-start; }
  .listing-row__price { text-align: left; }
}

/* ---------- Filter sidebar map preview (lazy-inits Leaflet on click) ---------- */
.filter-map-preview__placeholder {
  padding: 1.75rem 1rem;
  text-align: center;
}
.filter-map-preview__placeholder i {
  font-size: 1.6rem;
  color: var(--brand);
  margin-bottom: .5rem;
  display: block;
}
.filter-map-preview__map {
  height: 220px;
  width: 100%;
}

/* ---------- Status badges (host/admin) ---------- */
.status-pill {
  display: inline-flex;
  align-items: center;
  font-size: 0.75rem;
  font-weight: 700;
  padding: 0.25rem 0.6rem;
  border-radius: var(--radius);
}
.status-pending { background: #fef3c7; color: #92400e; }
.status-approved { background: #d1fae5; color: #065f46; }
.status-rejected { background: #fee2e2; color: #991b1b; }

/* ---------- Compact dashboard stat cards (host/dashboard.php) ----------
   Were plain Bootstrap-utility cards (border rounded-4 p-3, fs-4 value)
   that took up much more vertical space than 6-8 short numbers actually
   need — a direct user report ("zaberaju vela miesta na vysku"). */
.host-stat { border: 1px solid var(--border); border-radius: .75rem; padding: .55rem .75rem; }
.host-stat__value { font-size: 1.3rem; font-weight: 700; line-height: 1.15; color: var(--ink); }
.host-stat__label { font-size: .7rem; color: var(--muted); }

.host-feedback-widget {
  background: linear-gradient(135deg, var(--brand), var(--brand-dark));
  border-radius: 1rem;
  color: #fff;
  padding: 1.75rem 2rem;
  box-shadow: 0 1px 2px rgba(0,0,0,0.04), 0 2px 8px rgba(0,0,0,0.05);
}
.host-feedback-widget__title { font-weight: 700; font-size: 1.15rem; margin-bottom: .35rem; }
.host-feedback-widget__subtitle { color: rgba(255,255,255,.82); font-size: .9rem; max-width: 40rem; }
.host-feedback-widget .form-select, .host-feedback-widget .form-control {
  border: none;
}
.host-feedback-widget .form-control::placeholder { color: #6b7280; }

/* ---------- Off-canvas mobile menu & accordion ---------- */
.offcanvas-header { border-bottom: 1px solid var(--border); }
.accordion-item { border-color: var(--border); }
.accordion-button { font-weight: 600; }
.accordion-button:not(.collapsed) {
  color: var(--brand);
  background-color: var(--surface-tint);
  box-shadow: none;
}
.accordion-button:focus { box-shadow: none; border-color: var(--border); }

/* ---------- Animated stepper (add_property.php) ---------- */
.stepper { position: relative; padding: 0 .5rem; }
.stepper__track {
  position: absolute;
  top: 1.35rem;
  left: 2.5rem;
  right: 2.5rem;
  height: 3px;
  background: var(--border);
  border-radius: 999px;
  z-index: 1;
}
.stepper__progress {
  height: 100%;
  width: 0%;
  background: var(--brand);
  border-radius: 999px;
  transition: width .4s ease;
}
.stepper__steps {
  position: relative;
  z-index: 2;
  display: flex;
  justify-content: space-between;
}
.stepper__step {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: .5rem;
  flex: 1;
}
.stepper__circle {
  width: 2.7rem;
  height: 2.7rem;
  border-radius: 50%;
  background: var(--surface);
  border: 2px solid var(--border);
  display: flex;
  align-items: center;
  justify-content: center;
  font-weight: 700;
  color: var(--muted);
  transition: all .25s ease;
}
.stepper__label {
  font-size: .75rem;
  font-weight: 600;
  color: var(--muted);
  transition: color .25s ease;
  text-align: center;
}
.stepper__step.active .stepper__circle {
  border-color: var(--brand);
  color: var(--brand);
  background: var(--surface-tint);
  transform: scale(1.1);
  box-shadow: 0 0 0 5px rgba(var(--brand-rgb),.12);
}
.stepper__step.active .stepper__label { color: var(--ink); }
.stepper__step.done .stepper__circle {
  background: var(--brand);
  border-color: var(--brand);
  color: #fff;
}
.stepper__step.done .stepper__label { color: var(--ink); }
@media (max-width: 575.98px) {
  .stepper__label { display: none; }
  .stepper__circle { width: 2.2rem; height: 2.2rem; font-size: .85rem; }
  .stepper__track { left: 1.75rem; right: 1.75rem; top: 1.1rem; }
}

/* ---------- Multi-step form panels ---------- */
.form-step { display: none; }
.form-step.active {
  display: block;
  animation: stepFadeIn .35s ease;
}
@keyframes stepFadeIn {
  from { opacity: 0; transform: translateY(10px); }
  to { opacity: 1; transform: translateY(0); }
}
.form-step-card {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: 1.25rem;
  padding: 2rem;
  box-shadow: 0 2px 10px rgba(0,0,0,.03);
}
@media (max-width: 575.98px) {
  .form-step-card { padding: 1.25rem; }
}

.form-floating > label { color: var(--muted); }
.form-floating > .form-control:focus ~ label,
.form-floating > .form-control:not(:placeholder-shown) ~ label {
  color: var(--brand);
}

.ai-generate-btn {
  background: linear-gradient(135deg, var(--brand), var(--brand-dark));
  color: #fff;
  font-weight: 600;
  border: none;
  transition: transform .15s ease, box-shadow .15s ease;
}
.ai-generate-btn:hover {
  color: #fff;
  transform: translateY(-1px);
  box-shadow: 0 6px 16px rgba(var(--brand-rgb),.3);
}

/* Amenity selection chips */
.amenity-check {
  position: relative;
  display: flex;
  align-items: center;
  gap: .75rem;
  border: 1.5px solid var(--border);
  border-radius: 1rem;
  padding: .85rem 1rem;
  cursor: pointer;
  background: var(--surface);
  transition: border-color .18s ease, background-color .18s ease, box-shadow .18s ease, transform .18s ease;
}
.amenity-check:hover {
  border-color: #d1d5db;
  transform: translateY(-2px);
  box-shadow: 0 6px 16px rgba(0,0,0,.06);
}
.amenity-check input { position: absolute; opacity: 0; width: 0; height: 0; }
.amenity-check__icon {
  width: 2.3rem;
  height: 2.3rem;
  border-radius: 50%;
  background: var(--surface-alt);
  color: var(--muted);
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  font-size: 1rem;
  transition: background-color .18s ease, color .18s ease;
}
.amenity-check__label { font-weight: 600; font-size: .88rem; flex: 1; }
.amenity-check__check {
  opacity: 0;
  transform: scale(.5);
  color: var(--brand);
  font-size: 1.15rem;
  transition: opacity .18s ease, transform .18s ease;
}
.amenity-check:has(input:checked) {
  border-color: var(--brand);
  background: var(--surface-tint);
  box-shadow: 0 6px 16px rgba(var(--brand-rgb),.12);
}
.amenity-check:has(input:checked) .amenity-check__icon {
  background: var(--brand);
  color: #fff;
}
.amenity-check:has(input:checked) .amenity-check__check {
  opacity: 1;
  transform: scale(1);
}

/* ---------- Footer ---------- */
.site-footer { background: var(--surface); }

/* App-download teaser — no real app yet, so the badges are deliberately
   inert (a <div>, not a link/button) rather than pointing at a store page
   that doesn't exist. The "soon" ribbon is what keeps that honest instead
   of looking like a broken download link. */
.app-download {
  background: linear-gradient(135deg, var(--brand), var(--brand-dark));
  border-radius: 1rem;
  color: #fff;
  padding: 1.75rem 2rem;
  box-shadow: 0 1px 2px rgba(0,0,0,0.04), 0 2px 8px rgba(0,0,0,0.05);
}
.app-download__title { font-weight: 700; font-size: 1.15rem; margin-bottom: .35rem; }
.app-download__subtitle { color: rgba(255,255,255,.82); font-size: .875rem; max-width: 38rem; margin-bottom: 0; }
.app-badges { display: flex; flex-wrap: wrap; gap: .75rem; }
.app-badge {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: .6rem;
  background: #000;
  color: #fff;
  border-radius: var(--radius);
  padding: .5rem 1.1rem .5rem .9rem;
  cursor: default;
  user-select: none;
}
.app-badge i { font-size: 1.65rem; line-height: 1; }
.app-badge__text { display: flex; flex-direction: column; line-height: 1.1; }
.app-badge__text small { font-size: .62rem; text-transform: uppercase; letter-spacing: .04em; color: rgba(255,255,255,.75); }
.app-badge__text strong { font-size: .95rem; font-weight: 700; }
.app-badge__soon {
  position: absolute;
  top: -.55rem;
  right: -.5rem;
  background: #ffc107;
  color: #1a1a1a;
  font-size: .58rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .03em;
  padding: .18rem .5rem;
  border-radius: 999px;
  box-shadow: 0 1px 3px rgba(0,0,0,.25);
}
@media (max-width: 767.98px) {
  .app-download { text-align: center; }
  .app-download__subtitle { margin-left: auto; margin-right: auto; }
  .app-badges { justify-content: center; }
}

/* Facebook community card — deliberately plain HTML/CSS, no SDK/iframe/JS
   at all, so there is nothing to lazy-load and zero added page weight. */
.fb-community-card {
  display: flex;
  align-items: center;
  gap: 1.1rem;
  background: var(--surface);
  border: 1px solid rgba(0,0,0,.07);
  border-radius: 1rem;
  padding: 1.15rem 1.4rem;
  box-shadow: 0 1px 2px rgba(0,0,0,0.04), 0 2px 8px rgba(0,0,0,0.05);
}
.fb-community-card__icon {
  flex: 0 0 auto;
  width: 3rem;
  height: 3rem;
  border-radius: 50%;
  background: #1877F2;
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 1.5rem;
  line-height: 1;
}
.fb-community-card__body { flex: 1 1 auto; min-width: 0; }
.fb-community-card__name { font-weight: 700; font-size: .95rem; margin-bottom: .15rem; }
.fb-community-card__count { color: #6c757d; font-size: .82rem; margin-bottom: 0; }
.fb-community-card__btn {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  gap: .45rem;
  background: #1877F2;
  color: #fff;
  font-weight: 700;
  font-size: .85rem;
  padding: .6rem 1.15rem;
  border-radius: 999px;
  text-decoration: none;
  white-space: nowrap;
  transition: background .15s ease;
}
.fb-community-card__btn:hover { background: #145dbf; color: #fff; }
@media (max-width: 575.98px) {
  .fb-community-card { flex-wrap: wrap; text-align: center; justify-content: center; }
  .fb-community-card__body { flex-basis: 100%; }
  .fb-community-card__btn { flex-basis: 100%; justify-content: center; }
}

/* ---------- Phone dial-code picker (add/edit listing, register forms) ---------- */
.phone-picker { display: flex; gap: .5rem; }
.phone-picker .dropdown-toggle { flex-shrink: 0; white-space: nowrap; }
.phone-picker .form-control, .phone-picker .form-floating { flex: 1; min-width: 0; }
.phone-picker .dropdown-menu { max-height: 260px; overflow-y: auto; }

/* ---------- Photo manager (add/edit listing forms) ---------- */
.photo-manager__item { display: flex; flex-direction: column; gap: .3rem; width: 110px; }
.photo-manager__caption-input { font-size: .72rem; padding: .25rem .5rem; }
.photo-manager__cell {
  position: relative;
  width: 110px;
  height: 110px;
  border-radius: .75rem;
  overflow: hidden;
  background: var(--surface-alt);
  border: 1px solid var(--border);
}
.photo-manager__thumb-link { display: block; width: 100%; height: 100%; }
.photo-manager__thumb-link img { width: 100%; height: 100%; object-fit: cover; display: block; }
.photo-manager__spinner { display: flex; align-items: center; justify-content: center; width: 100%; height: 100%; color: var(--muted); }
.photo-manager__badge {
  position: absolute; left: .35rem; bottom: .35rem;
  background: rgba(0,0,0,.6); color: #fff; font-size: .62rem; font-weight: 700;
  padding: .15rem .45rem; border-radius: 999px; letter-spacing: .02em;
}
.photo-manager__remove {
  position: absolute; top: .25rem; right: .25rem; width: 22px; height: 22px;
  border-radius: 50%; border: none; background: rgba(0,0,0,.55); color: #fff;
  font-size: 1rem; line-height: 1; display: flex; align-items: center; justify-content: center; cursor: pointer;
}
.photo-manager__remove:hover { background: rgba(0,0,0,.8); }
.photo-manager__grid { display: flex; flex-wrap: wrap; gap: .6rem; margin-bottom: .75rem; }
.photo-manager__season-toggles {
  position: absolute; top: .25rem; left: .25rem; display: flex; gap: .2rem;
}
.photo-manager__season-btn {
  width: 22px; height: 22px; border-radius: 50%; border: none; cursor: pointer;
  background: rgba(0,0,0,.45); font-size: .7rem; line-height: 1;
  display: flex; align-items: center; justify-content: center; opacity: .7;
}
.photo-manager__season-btn:hover { opacity: 1; }
.photo-manager__season-btn.active { background: var(--brand); opacity: 1; box-shadow: 0 0 0 2px #fff; }

/* ---------- Misc ---------- */
.form-control:focus, .form-select:focus {
  border-color: var(--brand);
  box-shadow: 0 0 0 .2rem rgba(var(--brand-rgb),.15);
}

/* Defensive stacked-field spacing: force it via margin rather than
   trusting the flexbox `gap` utility alone, so fields never end up
   glued together regardless of browser/CDN quirks. */
.vstack { gap: 0 !important; }
.vstack > * + * { margin-top: 1rem; }
.vstack.gap-2 > * + * { margin-top: .5rem; }
.vstack.gap-4 > * + * { margin-top: 1.5rem; }
.row.g-3, .row.g-4, .row.g-2 { row-gap: 1rem; }
.row.g-2 { row-gap: .5rem; }
.row.g-4 { row-gap: 1.5rem; }

@media (max-width: 991.98px) {
  .mega-panel { min-width: 320px; }
}

/* ---------- AI režim (ai-add.php) ---------- */
.ai-hero { padding-bottom: 4rem; }
.ai-hero__badge {
  background: rgba(255,255,255,0.18);
  backdrop-filter: blur(6px);
  color: #fff;
  font-weight: 700;
  padding: .5rem 1rem;
  font-size: .8rem;
  display: inline-flex;
}
.ai-step:not(.d-none) { animation: stepFadeIn .35s ease; }

.pricing-card {
  position: relative;
  background: var(--surface);
  border: 1.5px solid var(--border);
  border-radius: 1.25rem;
  padding: 2rem 1.5rem;
  text-align: center;
  height: 100%;
  transition: transform .2s ease, box-shadow .2s ease;
}
.pricing-card:hover { transform: translateY(-4px); box-shadow: 0 12px 28px rgba(0,0,0,.08); }
.pricing-card--highlight {
  border-color: var(--brand);
  box-shadow: 0 12px 28px rgba(var(--brand-rgb),.15);
}
.pricing-card__badge {
  position: absolute;
  top: -.75rem;
  left: 50%;
  transform: translateX(-50%);
  background: var(--brand);
  color: #fff;
  font-size: .72rem;
  font-weight: 700;
  padding: .3rem .8rem;
  border-radius: var(--radius);
  white-space: nowrap;
}
.pricing-card__label { font-weight: 600; color: var(--muted); margin-bottom: .5rem; }
.pricing-card__price { font-size: 2.25rem; font-weight: 700; color: var(--ink); }
.pricing-card__price span { font-size: 1.1rem; font-weight: 600; color: var(--muted); }
.pricing-card__note { font-size: .8rem; color: var(--muted); margin-top: .35rem; }
.pricing-card__features { text-align: left; font-size: .86rem; list-style: none; padding-left: 0; margin: 1.25rem 0 0; }
.pricing-card__features li { display: flex; align-items: flex-start; gap: .5rem; margin-bottom: .6rem; line-height: 1.35; }
.pricing-card__features li i { color: var(--brand); margin-top: .2rem; flex-shrink: 0; }

/* ---------- Live chat widget ---------- */
.chat-widget {
  position: fixed;
  right: 1.25rem;
  bottom: 1.25rem;
  z-index: 1050;
}
.chat-widget__toggle {
  width: 3.5rem;
  height: 3.5rem;
  border-radius: 50%;
  background: var(--brand);
  color: #fff;
  border: none;
  font-size: 1.4rem;
  box-shadow: 0 8px 24px rgba(var(--brand-rgb),.35);
  transition: transform .18s ease, box-shadow .18s ease;
}
.chat-widget__toggle:hover { transform: scale(1.06); box-shadow: 0 10px 28px rgba(var(--brand-rgb),.45); }

.chat-widget__panel {
  position: absolute;
  right: 0;
  bottom: 4.25rem;
  width: 340px;
  max-width: calc(100vw - 2rem);
  height: 480px;
  max-height: 70vh;
  background: var(--surface);
  border-radius: 1.25rem;
  box-shadow: 0 20px 50px rgba(0,0,0,.2);
  display: flex;
  flex-direction: column;
  overflow: hidden;
  animation: stepFadeIn .25s ease;
}
.chat-widget__header {
  background: linear-gradient(135deg, var(--brand), var(--brand-dark));
  color: #fff;
  font-weight: 700;
  padding: .9rem 1rem;
  display: flex;
  align-items: center;
  justify-content: space-between;
}
.chat-widget__messages {
  flex: 1;
  overflow-y: auto;
  padding: 1rem;
  display: flex;
  flex-direction: column;
  gap: .6rem;
  background: var(--surface-alt);
}
.chat-msg {
  max-width: 85%;
  padding: .55rem .85rem;
  border-radius: 1rem;
  font-size: .88rem;
  line-height: 1.4;
}
.chat-msg--bot {
  align-self: flex-start;
  background: var(--surface);
  border: 1px solid var(--border);
  border-bottom-left-radius: .25rem;
}
.chat-msg--user {
  align-self: flex-end;
  background: var(--brand);
  color: #fff;
  border-bottom-right-radius: .25rem;
}
.chat-msg--thinking { color: var(--muted); font-style: italic; }
.chat-msg--bot { white-space: pre-line; overflow-wrap: anywhere; }
.chat-msg--bot a { color: var(--brand); font-weight: 600; }

.chat-result-card {
  display: flex;
  gap: .6rem;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: .85rem;
  padding: .5rem;
  align-items: center;
  text-decoration: none;
  color: var(--ink);
  transition: box-shadow .15s ease;
}
.chat-result-card:hover { box-shadow: 0 4px 12px rgba(0,0,0,.08); }
.chat-result-card img { width: 3rem; height: 3rem; border-radius: .6rem; object-fit: cover; flex-shrink: 0; }
.chat-result-card__title { font-weight: 700; font-size: .82rem; }
.chat-result-card__meta { font-size: .75rem; color: var(--muted); }

.chat-widget__input {
  display: flex;
  gap: .5rem;
  padding: .75rem;
  border-top: 1px solid var(--border);
  background: var(--surface);
}
.chat-widget__input input {
  flex: 1;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: .5rem 1rem;
  font-size: .88rem;
  outline: none;
}
.chat-widget__input input:focus { border-color: var(--brand); }
.chat-widget__input button {
  width: 2.5rem;
  height: 2.5rem;
  border-radius: 50%;
  background: var(--brand);
  color: #fff;
  border: none;
  flex-shrink: 0;
}
.chat-widget__input button:hover { background: var(--brand-dark); }

@media (max-width: 420px) {
  .chat-widget__panel { width: calc(100vw - 2rem); }
}

/* ---------- Property gallery (Hero Grid) ---------- */
.gallery-tile {
  position: relative;
  overflow: hidden;
  cursor: pointer;
  background: var(--surface-alt);
  /* Grid/flex items default to min-height:auto, which refuses to shrink
     below an <img> child's intrinsic aspect-ratio height — without this
     override, a tall image inside a short grid row overflows its own
     tile and visually overlaps whatever sits below it (real bug, caught
     via a Playwright bounding-box check: stacked tiles were rendering
     ~286px tall inside a 156px row and covering the bottom row below). */
  min-height: 0;
  min-width: 0;
}
.gallery-tile img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  opacity: 0;
  transition: transform .3s ease, opacity .35s ease;
}
.gallery-tile.is-loaded img { opacity: 1; }
.gallery-tile:hover img { transform: scale(1.04); }

.gallery-hero {
  display: grid;
  grid-template-columns: 2fr 1fr;
  gap: .5rem;
  height: 320px;
  overflow: hidden;
}
.gallery-tile-stack {
  display: grid;
  grid-template-rows: 1fr 1fr;
  gap: .5rem;
  height: 100%;
  min-height: 0;
  overflow: hidden;
}
.gallery-bottom-row {
  display: grid;
  gap: .5rem;
  height: 110px;
  margin-top: .5rem;
  overflow: hidden;
}
.gallery-tile__overlay {
  position: absolute;
  inset: 0;
  background: rgba(0, 15, 40, .62);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  font-weight: 700;
  font-size: 1.05rem;
  text-align: center;
  padding: .5rem;
}
.gallery-grid--single .gallery-tile { height: 360px; }
.gallery-grid--two { display: grid; grid-template-columns: 1fr 1fr; gap: .5rem; height: 360px; }
.gallery-grid--two .gallery-tile { height: 100%; }

.gallery-placeholder-banner {
  position: relative;
  height: 300px;
  overflow: hidden;
}
.gallery-placeholder-banner img { width: 100%; height: 100%; object-fit: cover; opacity: 0; transition: opacity .35s ease; }
.gallery-placeholder-banner.is-loaded img { opacity: 1; }
.gallery-placeholder-banner__badge {
  position: absolute;
  top: 1rem;
  left: 1rem;
  background: rgba(0, 15, 40, .55);
  color: #fff;
  padding: .35rem .85rem;
  border-radius: 50px;
  font-size: .8rem;
  font-weight: 600;
}

/* Rating badge, moved onto the hero photo per direct user follow-up
   (History #150) — top-left, dark translucent pill + white text so it
   stays legible "on any photo" regardless of how light or dark the
   underlying image is (the same contrast approach .badge-capacity
   already uses on index.php's own cards, rather than a light/translucent
   pill that could blend into a bright photo). */
.gallery-rating-badge {
  position: absolute;
  top: .75rem;
  left: .75rem;
  z-index: 2;
  display: inline-flex;
  align-items: center;
  gap: .3rem;
  padding: .35rem .65rem;
  border-radius: var(--radius);
  background: rgba(0, 0, 0, .55);
  color: #fff;
  font-size: .72rem;
  font-weight: 700;
  text-decoration: none;
  white-space: nowrap;
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
}
.gallery-rating-badge:hover { background: rgba(0, 0, 0, .7); color: #fff; }
.gallery-rating-badge .bi-star-fill { color: #ffc107; }
.gallery-rating-badge--empty .bi-star { color: rgba(255, 255, 255, .85); }

/* Only needed on the zero-real-photos placeholder banner, where the
   "Ilustračné fotografie" label already claims the plain top-left corner
   — stacks both badges vertically instead of them overlapping, the same
   stacking approach .badge-onimage-stack already uses bottom-left. */
.gallery-topleft-stack {
  position: absolute;
  top: 1rem;
  left: 1rem;
  z-index: 2;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: .5rem;
}
.gallery-topleft-stack .gallery-placeholder-banner__badge,
.gallery-topleft-stack .gallery-rating-badge {
  position: static;
}

@media (max-width: 767.98px) {
  .gallery-grid, .gallery-placeholder-banner--desktop { display: none !important; }
}
@media (min-width: 768px) {
  .gallery-carousel-wrap { display: none !important; }
}

/* Mobile touch carousel */
.gallery-carousel-wrap { position: relative; margin-bottom: 1.5rem; }
.gallery-carousel {
  display: flex;
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  -webkit-overflow-scrolling: touch;
  border-radius: 1rem;
  scrollbar-width: none;
}
.gallery-carousel::-webkit-scrollbar { display: none; }
.gallery-carousel__slide {
  flex: 0 0 100%;
  scroll-snap-align: start;
  aspect-ratio: 4 / 3;
  cursor: pointer;
}
.gallery-carousel__slide img { width: 100%; height: 100%; object-fit: cover; display: block; opacity: 0; transition: opacity .35s ease; }
.gallery-carousel__slide.is-loaded img { opacity: 1; }
.gallery-carousel__counter {
  position: absolute;
  bottom: .75rem;
  right: .75rem;
  background: rgba(0, 15, 40, .65);
  color: #fff;
  font-size: .8rem;
  font-weight: 600;
  padding: .25rem .7rem;
  border-radius: 50px;
}

/* Video (YouTube/Vimeo) — floating "play" card over the gallery area
   (property.php's .property-gallery-wrap), rather than a tile squeezed
   into the photo grid's own carefully-tuned per-count layouts. */
.property-gallery-wrap { position: relative; }
.gallery-video-btn {
  position: absolute;
  bottom: 1rem;
  right: 1rem;
  width: 160px;
  height: 90px;
  border-radius: .85rem;
  overflow: hidden;
  border: 2px solid rgba(255, 255, 255, .85);
  padding: 0;
  cursor: pointer;
  background: #0a1a2e;
  box-shadow: 0 6px 20px rgba(0, 10, 30, .35);
  z-index: 2;
}
.gallery-video-btn img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; opacity: 0; transition: opacity .35s ease; }
.gallery-video-btn.is-loaded img { opacity: .75; }
.gallery-video-btn__overlay {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  color: #fff;
  font-size: 2rem;
  background: rgba(0, 10, 30, .25);
  transition: background-color .15s ease;
}
.gallery-video-btn:hover .gallery-video-btn__overlay { background: rgba(0, 10, 30, .45); }
.gallery-video-btn__label {
  position: absolute;
  left: 0; right: 0; bottom: 0;
  color: #fff;
  font-size: .7rem;
  font-weight: 700;
  text-align: center;
  padding: .3rem .25rem;
  background: linear-gradient(to top, rgba(0, 10, 30, .85), transparent);
}
@media (max-width: 575.98px) {
  .gallery-video-btn { width: 120px; height: 68px; bottom: .6rem; right: .6rem; }
  .gallery-video-btn__overlay { font-size: 1.4rem; }
  .gallery-video-btn__label { font-size: .62rem; }
}

/* Photo-loading skeletons on property.php (2026-09-24) — every real <img>
   on the detail page (hero grid, mobile carousel, video thumbnail, zero-
   photo placeholder banner, and the "similar nearby" cards at the bottom,
   scoped to #similarPropertiesSection only — the homepage/list-view grid
   is untouched, not part of this request) shimmers with the same
   .skeleton gradient (assets/js/gallery.js's initImageSkeletons() adds
   .is-loaded the instant each <img> actually finishes loading, or
   immediately for an already-cached one) instead of popping in abruptly
   or sitting on a flat gray fill. */
.gallery-tile:not(.is-loaded),
.gallery-video-btn:not(.is-loaded),
.gallery-placeholder-banner:not(.is-loaded),
.gallery-carousel__slide:not(.is-loaded),
#similarPropertiesSection .property-card__image-wrap:not(.is-loaded) {
  background: linear-gradient(90deg, #e9ebee 25%, #f6f7f9 37%, #e9ebee 63%);
  background-size: 400% 100%;
  animation: mu-skeleton-shimmer 1.4s ease-in-out infinite;
}
[data-theme="dark"] .gallery-tile:not(.is-loaded),
[data-theme="dark"] .gallery-video-btn:not(.is-loaded),
[data-theme="dark"] .gallery-placeholder-banner:not(.is-loaded),
[data-theme="dark"] .gallery-carousel__slide:not(.is-loaded),
[data-theme="dark"] #similarPropertiesSection .property-card__image-wrap:not(.is-loaded) {
  background: linear-gradient(90deg, #242e3a 25%, #313d4d 37%, #242e3a 63%);
  background-size: 400% 100%;
}
@media (prefers-reduced-motion: reduce) {
  .gallery-tile:not(.is-loaded),
  .gallery-video-btn:not(.is-loaded),
  .gallery-placeholder-banner:not(.is-loaded),
  .gallery-carousel__slide:not(.is-loaded),
  #similarPropertiesSection .property-card__image-wrap:not(.is-loaded) {
    animation: none;
    background: var(--surface-alt);
  }
}
#similarPropertiesSection .property-card__image-wrap img {
  opacity: 0;
  transition: opacity .35s ease;
}
#similarPropertiesSection .property-card__image-wrap.is-loaded img {
  opacity: 1;
}

/* Lightbox */
.mu-lightbox {
  position: fixed;
  inset: 0;
  background: rgba(0, 8, 20, .94);
  z-index: 1080;
  display: none;
  align-items: center;
  justify-content: center;
}
.mu-lightbox.is-open { display: flex; }
.mu-lightbox__img { max-width: 92vw; max-height: 85vh; object-fit: contain; user-select: none; }
.mu-lightbox__close, .mu-lightbox__prev, .mu-lightbox__next, .mu-lightbox__share {
  position: absolute;
  background: rgba(255, 255, 255, .12);
  color: #fff;
  border: 0;
  border-radius: 50%;
  width: 44px;
  height: 44px;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 1.3rem;
  cursor: pointer;
}
.mu-lightbox__close:hover, .mu-lightbox__prev:hover, .mu-lightbox__next:hover, .mu-lightbox__share:hover { background: rgba(255, 255, 255, .25); }
.mu-lightbox__close { top: 1.25rem; right: 1.25rem; }
.mu-lightbox__share { top: 1.25rem; right: 5rem; font-size: 1.1rem; }
.mu-lightbox__share--copied { background: rgba(76, 175, 80, .55); }
.mu-lightbox__prev { left: 1.25rem; top: 50%; transform: translateY(-50%); }
.mu-lightbox__next { right: 1.25rem; top: 50%; transform: translateY(-50%); }
.mu-lightbox__caption {
  position: absolute;
  bottom: 4.25rem;
  left: 50%;
  transform: translateX(-50%);
  max-width: 90vw;
  text-align: center;
  color: #fff;
  font-size: .85rem;
  background: rgba(0, 0, 0, .45);
  padding: .4rem 1rem;
  border-radius: 12px;
}
.mu-lightbox__counter {
  position: absolute;
  bottom: 1.25rem;
  left: 50%;
  transform: translateX(-50%);
  color: #fff;
  font-size: .9rem;
  font-weight: 600;
  background: rgba(255, 255, 255, .12);
  padding: .3rem .9rem;
  border-radius: 50px;
}
@media (max-width: 575.98px) {
  .mu-lightbox__prev, .mu-lightbox__next { width: 38px; height: 38px; font-size: 1.1rem; }
  .mu-lightbox__share { right: auto; left: 1.25rem; top: 1.25rem; width: 38px; height: 38px; font-size: 1rem; }
}

/* Video lightbox — reuses .mu-lightbox's dark full-screen backdrop/close
   button, swapping the image for a responsive 16:9 iframe frame. A
   separate overlay from the photo one (not a mixed-in "slide") since a
   single video has no prev/next to navigate, and mixing an <iframe> into
   the photo lightbox's index-based showSlide() would complicate stopping
   playback on every photo navigation for no real benefit. */
.mu-video-lightbox__frame {
  width: min(92vw, 1100px);
  aspect-ratio: 16 / 9;
  max-height: 85vh;
}

/* ---------- Property-detail breadcrumbs (compact, muted) ---------- */
/* Scoped to property.php's own wrapper rather than the shared .breadcrumb
   class index.php also uses for its own (differently-shaped) trail. */
.property-breadcrumbs .breadcrumb {
  font-size: .8rem;
  color: #8c9196;
  margin-bottom: 0;
  flex-wrap: nowrap;
  overflow-x: auto;
  white-space: nowrap;
  scrollbar-width: none;
  padding-bottom: 2px;
}
.property-breadcrumbs .breadcrumb::-webkit-scrollbar { display: none; }
.property-breadcrumbs .breadcrumb-item, .property-breadcrumbs .breadcrumb-item a {
  color: #8c9196;
}
.property-breadcrumbs .breadcrumb-item.active { color: #6c757d; }
.property-breadcrumbs .breadcrumb-item + .breadcrumb-item::before { color: #c3c7cc; }
.property-breadcrumbs .breadcrumb-item a:hover { color: var(--brand); text-decoration: underline; }

/* ---------- Property-detail page: sharp-contrast body text (History
   #142/#143/#145) ----------
   Font-family is deliberately NOT set here anymore — 'arial' became the
   sitewide default font choice (site_font_options(), adm/settings.php's
   Systém tab) in History #145, so this page's own font now already
   matches without a page-scoped override; only the darker body-text
   color from #143 is still page-specific. */
.property-detail-page {
  --pd-body-color: #1a1a1a;
  /* The description paragraph uses Bootstrap's .text-body utility, which
     is color:rgba(var(--bs-body-color-rgb),...) !important — redefining
     the variable it reads (same technique as History #122's dark-mode
     button fix) is the only way to recolor it without fighting !important
     directly. */
  --bs-body-color-rgb: 26, 26, 26;
  color: var(--pd-body-color);
}
[data-theme="dark"] .property-detail-page {
  --pd-body-color: var(--ink);
  --bs-body-color-rgb: 231, 234, 238; /* matches --ink's own dark-mode hex, #e7eaee */
}
/* Description/address/type-category badges sized down to match the
   page's own existing small-text convention (e.g. the availability-
   calendar hint, the "no reviews yet" line) — explicit user request.
   The type/secondary-category/capacity badges also carry a plain
   `.small` class in the markup, but Bootstrap's own `.badge` rule sets
   font-size at equal specificity and is declared LATER in bootstrap.
   min.css, so it silently wins over `.small` there without this
   higher-specificity override. */
.property-detail-page .property-header__badges .badge { font-size: .875em; }

/* ---------- Property header (title / location / rating / badges / actions) ---------- */
.property-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 1.5rem;
}
.property-header__left { flex: 1 1 320px; min-width: 0; }
.property-header__title {
  font-size: 1.9rem;
  font-weight: 700;
  letter-spacing: -.01em;
  margin-bottom: .35rem;
  line-height: 1.2;
}
.property-header__location {
  color: var(--muted);
  margin-bottom: 0;
}
.location-map-link {
  color: var(--brand);
  font-weight: 400;
  text-decoration: none;
  margin-left: .15rem;
  white-space: normal;
}
.location-map-link:hover { text-decoration: underline; }

/* Right column: exactly two rows — rating+badges together, then the
   action icons — both right-aligned so they read as one clean unit
   next to the left column instead of drifting apart vertically. */
.property-header__right {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: .6rem;
  flex: 0 1 auto;
}
.property-header__top-row {
  display: flex;
  align-items: center;
  gap: .6rem;
  flex-wrap: wrap;
  justify-content: flex-end;
}
.property-header__badges {
  display: flex;
  gap: .4rem;
  flex-wrap: wrap;
  justify-content: flex-end;
}
.badge-pastel-type { background: #e7f0fd; color: var(--brand); }
.badge-pastel-capacity { background: #eef2f6; color: #33475b; }
.property-header__actions {
  display: flex;
  gap: .5rem;
  justify-content: flex-end;
}

@media (max-width: 575.98px) {
  .property-header { align-items: flex-start; }
  .property-header__title { font-size: 1.5rem; }
  .property-header__right { width: 100%; align-items: flex-start; }
  .property-header__top-row { justify-content: flex-start; width: 100%; }
  .property-header__badges { justify-content: flex-start; }
  .property-header__actions { justify-content: flex-end; width: 100%; }
}

/* ---------- Section inspector (testing aid) ---------- */
.inspector-toggle {
  position: fixed;
  left: 1.25rem;
  bottom: 1.25rem;
  z-index: 1040;
  width: 3rem;
  height: 3rem;
  border-radius: 50%;
  background: #1a1a1a;
  color: #fff;
  border: none;
  font-size: 1.1rem;
  box-shadow: 0 6px 18px rgba(0,0,0,.25);
  opacity: .55;
  transition: opacity .15s ease, transform .15s ease;
}
.inspector-toggle:hover { opacity: 1; transform: scale(1.05); }

body.inspect-mode [data-region] {
  outline: 2px dashed #ff385c;
  outline-offset: -2px;
  position: relative;
}
body.inspect-mode [data-region]::before {
  content: attr(data-region);
  position: absolute;
  top: 0;
  left: 0;
  background: #ff385c;
  color: #fff;
  font: 700 11px/1.4 Arial, sans-serif;
  padding: 2px 8px;
  z-index: 1045;
  border-bottom-right-radius: .5rem;
  pointer-events: none;
}

/* Page transitions (2026-09-21) — this is a plain server-rendered
   multi-page site (no client-side router), so the native cross-document
   View Transitions API is the whole mechanism: opting in via
   `navigation: auto` makes every normal same-origin navigation (link
   clicks, back/forward, a form's POST-redirect-GET) automatically
   capture a snapshot of the old and new page and cross-fade between
   them, entirely in the browser's own compositor — no JS, so it can
   never block a click handler or an AJAX call (the sidebar filter swap,
   the notification bell, etc. never trigger a real navigation, so this
   has zero effect on them either way). Only the timing is customized
   here; the cross-fade itself is the browser's own default animation on
   ::view-transition-old(root)/::view-transition-new(root), just sped up
   and re-eased to feel snappier than the ~300ms/ease default. */
@view-transition {
  navigation: auto;
}

::view-transition-old(root),
::view-transition-new(root) {
  animation-duration: 0.22s;
  animation-timing-function: ease-in-out;
}

@media (prefers-reduced-motion: reduce) {
  ::view-transition-group(*),
  ::view-transition-old(*),
  ::view-transition-new(*) {
    animation: none !important;
  }
}

/* Fallback for browsers with no View Transitions support at all (the
   @supports check itself is what "not (view-transition-name: none)"
   means — a browser that doesn't recognize that CSS property here also
   doesn't implement the API, so this block is inert everywhere the rule
   above already works, and is the ONLY thing that runs where it
   doesn't — never both at once). */
@supports not (view-transition-name: none) {
  @media (prefers-reduced-motion: no-preference) {
    body {
      animation: mu-fallback-page-fade-in 0.2s ease-in-out;
    }
  }
}

@keyframes mu-fallback-page-fade-in {
  from { opacity: 0; }
  to { opacity: 1; }
}

/* Skeleton loaders (2026-09-21) — one reusable `.skeleton` class (a
   shimmering gray block) that main.js's buildSkeletonList() assembles
   into fake rows using the REAL .listing-row/__gallery/__body/__main/
   __side class names, so every dimension/gap/responsive breakpoint the
   real row already has applies to the skeleton for free; only content
   (image, text, button) is ever replaced by a .skeleton block. Used
   while the sidebar-filter AJAX swap (History #60/#61) is in flight,
   replacing the old opacity-dim loading state entirely. */
.skeleton {
  background: linear-gradient(90deg, #e9ebee 25%, #f6f7f9 37%, #e9ebee 63%);
  background-size: 400% 100%;
  animation: mu-skeleton-shimmer 1.4s ease-in-out infinite;
  border-radius: 4px;
  display: block;
}
.listing-row__gallery.skeleton { border-radius: 0; }

@keyframes mu-skeleton-shimmer {
  0% { background-position: 100% 50%; }
  100% { background-position: 0 50%; }
}

@media (prefers-reduced-motion: reduce) {
  .skeleton {
    animation: none;
    background: var(--surface-alt);
  }
}

/* ============================================================
   Dark mode (2026-09-22)
   ------------------------------------------------------------
   Resolution happens in JS (includes/header.php's inline head
   script + assets/js/theme-toggle.js), never a bare CSS media
   query alone — the script reads localStorage first, falls back
   to `prefers-color-scheme`, and sets BOTH `data-theme` (this
   file's own tokens) and `data-bs-theme` (Bootstrap 5.3's own
   native dark-mode support, which handles every stock Bootstrap
   component — buttons, forms, modals, dropdowns' own base
   styling, badges, alerts — for free) on <html> in one pass, so
   the two systems can never disagree about which theme is active.
   Deliberately scoped to pages that load includes/header.php
   (public + host) — /adm never sets data-theme at all, so it
   always renders in the light tokens below regardless of the
   visitor's OS setting; a genuinely separate admin dark-mode
   pass (with its own toggle) wasn't asked for and isn't safely
   inferable from "add a switch next to the heart/bell icons",
   which only exist in the public/host header.

   Token values were chosen for contrast, not just inverted —
   --brand in particular is NOT the light-mode navy #003580
   turned up in lightness by a fixed formula: that navy reads as
   near-black-on-black wherever --brand is used as TEXT/icon
   color (the overwhelmingly common use in this file), so a
   distinct, brighter blue is used instead, still saturated
   enough to keep working as a button BACKGROUND with white text.
   ============================================================ */
:root[data-theme="dark"] {
  --brand: #3b82f6;
  --brand-dark: #60a5fa;
  --brand-rgb: 59,130,246;
  --ink: #e7eaee;
  --muted: #98a2b3;
  --border: #2b3542;
  --surface: #1a212b;
  --bg: #10151c;
  --surface-alt: #242e3a;
  --surface-tint: rgba(59,130,246,.16);
}

/* Elements that rely on Bootstrap's `shadow-lg border-0` pattern for
   visual separation (a black box-shadow reads fine floating over a
   WHITE page, but is nearly invisible floating over a dark one) — add
   back a real, visible border in dark mode specifically. Every card-
   style component below this point (.form-step-card, .listing-row,
   .pricing-card, .chat-msg--bot, etc.) already declares its own
   `border: 1px solid var(--border)` explicitly, so those need no
   extra rule here — they pick up the new dark border color for free
   the moment the token above changes. */
[data-theme="dark"] .dropdown-menu,
[data-theme="dark"] .mega-panel,
[data-theme="dark"] .type-city-flyout,
[data-theme="dark"] .region-flyout {
  border: 1px solid var(--border);
}

[data-theme="dark"] .skeleton {
  background: linear-gradient(90deg, #242e3a 25%, #313d4d 37%, #242e3a 63%);
}
[data-theme="dark"] .navbar-nav .nav-link:hover,
[data-theme="dark"] .navbar-nav .nav-link:focus {
  background-color: var(--surface-alt);
}
[data-theme="dark"] .lang-switch-btn:hover,
[data-theme="dark"] .user-chip:hover {
  background: var(--surface-alt);
  border-color: var(--border);
}

/* Real bug found live (2026-09-22, user report: "Pridať ubytovanie"
   invisible in dark mode) — root cause, confirmed by reading Bootstrap's
   own compiled CSS: .btn-outline-dark/.btn-dark are literal "near-black"
   colors (#212529) with NO [data-bs-theme=dark] override of their own
   anywhere in Bootstrap itself (unlike the semantic/brand button colors
   — primary/success/danger/warning — which Bootstrap DOES remap, and
   which stay visible regardless since they're saturated colors, not
   near-black). Every .btn-outline-dark/.btn-dark on this site (41
   occurrences across 10 files — nav "Pridať ubytovanie" CTA, the mobile
   language/currency picker's active-state pill, and several form/host
   page buttons) was reading as near-black-on-near-black. Fixed once,
   here, via Bootstrap's own CSS custom-property hooks on these classes
   (--bs-btn-*) rather than touching any of the 10 template files
   individually — every current AND future .btn-outline-dark/.btn-dark
   on the site is covered automatically. Colors reuse this file's own
   already-dark-mode-aware tokens rather than new hardcoded values, so
   they can never drift out of sync with the rest of the dark palette. */
[data-theme="dark"] .btn-outline-dark {
  --bs-btn-color: var(--ink);
  --bs-btn-border-color: var(--border);
  --bs-btn-hover-color: var(--bg);
  --bs-btn-hover-bg: var(--ink);
  --bs-btn-hover-border-color: var(--ink);
  --bs-btn-active-color: var(--bg);
  --bs-btn-active-bg: var(--ink);
  --bs-btn-active-border-color: var(--ink);
  --bs-btn-disabled-color: var(--muted);
  --bs-btn-disabled-border-color: var(--border);
}
[data-theme="dark"] .btn-dark {
  --bs-btn-color: var(--bg);
  --bs-btn-bg: var(--ink);
  --bs-btn-border-color: var(--ink);
  --bs-btn-hover-color: var(--bg);
  --bs-btn-hover-bg: var(--muted);
  --bs-btn-hover-border-color: var(--muted);
  --bs-btn-active-color: var(--bg);
  --bs-btn-active-bg: var(--muted);
  --bs-btn-active-border-color: var(--muted);
  --bs-btn-disabled-color: var(--bg);
  --bs-btn-disabled-bg: var(--ink);
  --bs-btn-disabled-border-color: var(--ink);
}

/* ---------- Elegant sun/moon theme switch ---------- */
.theme-switch {
  border: none;
  background: transparent;
  padding: 0;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  line-height: 0;
}
.theme-switch__track {
  width: 44px;
  height: 24px;
  border-radius: 999px;
  background: var(--border);
  position: relative;
  display: inline-flex;
  align-items: center;
  padding: 2px;
  transition: background-color .25s ease;
}
.theme-switch__thumb {
  width: 20px;
  height: 20px;
  border-radius: 50%;
  background: #fff;
  box-shadow: 0 1px 3px rgba(0,0,0,.3);
  display: flex;
  align-items: center;
  justify-content: center;
  position: relative;
  transition: transform .3s cubic-bezier(.4,0,.2,1), background-color .25s ease;
}
.theme-switch__icon {
  position: absolute;
  font-size: .66rem;
  transition: opacity .2s ease, transform .25s ease;
}
.theme-switch__icon--sun { color: #f59e0b; opacity: 1; transform: scale(1) rotate(0deg); }
.theme-switch__icon--moon { color: #6366f1; opacity: 0; transform: scale(.4) rotate(-40deg); }
[data-theme="dark"] .theme-switch__track { background: var(--brand); }
[data-theme="dark"] .theme-switch__thumb { transform: translateX(20px); background: #1a212b; }
[data-theme="dark"] .theme-switch__icon--sun { opacity: 0; transform: scale(.4) rotate(40deg); }
[data-theme="dark"] .theme-switch__icon--moon { opacity: 1; transform: scale(1) rotate(0deg); color: #fbbf24; }
.theme-switch:focus-visible .theme-switch__track { outline: 2px solid var(--brand); outline-offset: 2px; }

/* Regional travel blog (2026-09-25) — typography for the article body,
   which is trusted admin-authored HTML echoed raw by blog.php. */
.blog-content { font-size: 1.05rem; line-height: 1.75; color: var(--ink); }
.blog-content h2 { font-size: 1.35rem; font-weight: 700; margin-top: 2rem; margin-bottom: .75rem; }
.blog-content h3 { font-size: 1.12rem; font-weight: 700; margin-top: 1.5rem; margin-bottom: .5rem; }
.blog-content p { margin-bottom: 1.1rem; }
.blog-content ul, .blog-content ol { margin-bottom: 1.1rem; padding-left: 1.4rem; }
.blog-content li { margin-bottom: .35rem; }
.blog-content img { max-width: 100%; height: auto; border-radius: .75rem; margin: 1.25rem 0 .25rem; display: block; }
.blog-content figcaption, .blog-content .blog-img-credit { font-size: .78rem; color: var(--muted); margin-bottom: 1.25rem; }
.blog-content blockquote { border-left: 3px solid var(--brand); padding: .25rem 0 .25rem 1rem; color: var(--muted); font-style: italic; margin: 1.25rem 0; }

/* Booking inquiry card (property detail) */
.booking-card {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: 20px;
  padding: 1.5rem;
  box-shadow: 0 14px 36px rgba(0,0,0,.08);
}
.booking-card__price { display: flex; align-items: baseline; gap: .35rem; flex-wrap: wrap; }
.booking-card__amount { font-size: 1.75rem; font-weight: 700; color: var(--ink); line-height: 1.1; }
.booking-card__unit { font-size: .9rem; color: var(--muted); }
.booking-card__note { font-size: .8rem; color: var(--muted); margin: .35rem 0 1rem; }
.booking-card__note .bi { color: #198754; }
.booking-card__success {
  display: flex; gap: .7rem; align-items: flex-start;
  background: rgba(25,135,84,.1); color: var(--ink);
  border-radius: 14px; padding: 1rem; font-size: .9rem;
}
.booking-card__success .bi { color: #198754; font-size: 1.3rem; line-height: 1; }
.booking-card__divider {
  display: flex; align-items: center; gap: .75rem;
  color: var(--muted); font-size: .75rem; margin: 1.25rem 0 .9rem;
}
.booking-card__divider::before, .booking-card__divider::after { content: ''; flex: 1; height: 1px; background: var(--border); }

.booking-form { display: flex; flex-direction: column; gap: .6rem; }
.booking-form .form-control, .booking-form .form-select { border-radius: 12px; }
.booking-form__section-title { font-weight: 700; font-size: .85rem; color: var(--ink); margin-top: .5rem; }
.booking-form__submit { font-weight: 700; font-size: 1rem; padding-top: .8rem; padding-bottom: .8rem; margin-top: .25rem; }
.booking-form__submit .bi { margin-right: .35rem; }
.booking-form__free { text-align: center; font-size: .76rem; color: var(--muted); margin: 0; }

.booking-box { border: 1px solid #b8bec8; border-radius: 14px; background: var(--surface); }
.booking-box__row { display: flex; border-bottom: 1px solid #b8bec8; }
.booking-box__cell { flex: 1 1 0; min-width: 0; position: relative; }
.booking-box__row .booking-box__cell + .booking-box__cell { border-left: 1px solid #b8bec8; }
.booking-box__btn {
  width: 100%; background: transparent; border: 0; text-align: left;
  padding: .6rem .9rem; display: flex; flex-direction: column; gap: .1rem;
  color: var(--ink); cursor: pointer; transition: background-color .15s ease;
}
.booking-box__row .booking-box__cell:first-child .booking-box__btn { border-top-left-radius: 13px; }
.booking-box__row .booking-box__cell:last-child .booking-box__btn { border-top-right-radius: 13px; }
.booking-box__cell--guests .booking-box__btn { border-bottom-left-radius: 13px; border-bottom-right-radius: 13px; padding-right: 2.2rem; }
.booking-box__btn:hover, .booking-box__btn[aria-expanded="true"] { background: var(--surface-alt); }
.booking-box__btn:focus-visible { outline: 2px solid var(--brand); outline-offset: -2px; }
.booking-box__label { font-size: .66rem; font-weight: 700; text-transform: uppercase; letter-spacing: .04em; color: var(--ink); }
.booking-box__value { font-size: .9rem; color: var(--muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.booking-box__btn.has-value .booking-box__value, .booking-box__cell--guests .booking-box__value { color: var(--ink); }
.booking-box__chevron { position: absolute; right: .9rem; top: 50%; transform: translateY(-50%); color: var(--muted); font-size: .8rem; transition: transform .2s ease; }
.booking-box__btn[aria-expanded="true"] .booking-box__chevron { transform: translateY(-50%) rotate(180deg); }
[data-theme="dark"] .booking-box,
[data-theme="dark"] .booking-box__row,
[data-theme="dark"] .booking-box__row .booking-box__cell + .booking-box__cell { border-color: #465264; }

.booking-guests-menu { min-width: 280px; }
.booking-guests-menu__hint { font-size: .75rem; color: var(--muted); padding-top: .55rem; margin-top: .25rem; border-top: 1px solid var(--border); max-width: 250px; }
.booking-guests-menu__hint--warn { color: #b45309; }

.booking-cal-legend { display: flex; align-items: center; gap: .4rem; font-size: .72rem; color: var(--muted); margin-top: .6rem; }
.booking-cal-legend__busy { width: 14px; height: 14px; border-radius: 4px; background: rgba(220,53,69,.14); }
.mu-cal__day.is-busy { background: rgba(220,53,69,.14); text-decoration: line-through; }
.mu-cal__day.is-in-range { background: var(--surface-tint); color: var(--ink); border-radius: 0; }
.mu-cal__day.is-range-start, .mu-cal__day.is-range-start:disabled { background: var(--brand); color: #fff; opacity: 1; font-weight: 700; }

.booking-price { background: var(--surface-alt); border-radius: 12px; padding: .7rem .95rem; font-size: .88rem; color: var(--ink); }
.booking-price__label { font-size: .68rem; font-weight: 700; text-transform: uppercase; letter-spacing: .04em; color: var(--muted); margin-bottom: .15rem; }
.booking-price__row { display: flex; justify-content: space-between; align-items: baseline; gap: .5rem; }
.booking-price__row strong { font-size: 1.1rem; }
.booking-price__meta { font-size: .76rem; color: var(--muted); margin-top: .2rem; }
.booking-price__warn { font-size: .8rem; color: #dc3545; margin-top: .3rem; }
.booking-price__loading { color: var(--muted); }
.booking-price.is-error { color: #dc3545; }
.booking-box .dropdown-menu, .booking-box .dropdown-menu[data-bs-popper] { position: absolute; top: calc(100% + 6px); left: 0; right: auto; margin-top: 0; z-index: 1030; }
.booking-box .booking-box__row .booking-box__cell:last-child .dropdown-menu { left: auto; right: 0; }
.booking-box .booking-guests-menu { left: 0; right: 0; min-width: 0; }
.booking-form__message { height: 170px !important; font-size: .88rem; line-height: 1.45; }
.booking-form__msg-hint { display: flex; justify-content: space-between; align-items: center; gap: .5rem; font-size: .74rem; color: var(--muted); margin-top: -.25rem; min-height: 1rem; }
.booking-form__msg-hint .is-edited { visibility: hidden; }
.booking-form__msg-regen { background: none; border: 0; padding: 0; color: var(--brand); font-size: .74rem; font-weight: 600; white-space: nowrap; }
.booking-form__msg-regen:hover { text-decoration: underline; }

/* Host contact unlock (sidebar + modal) */
.contact-gate__locked, .contact-gate__phone {
  width: 100%; display: flex; align-items: center; gap: .75rem;
  padding: .7rem .85rem; border: 1px solid var(--border); border-radius: 14px;
  background: var(--surface-alt); color: var(--ink); text-align: left; text-decoration: none;
  transition: border-color .15s ease, background-color .15s ease;
}
.contact-gate__locked:hover, .contact-gate__phone:hover { border-color: var(--brand); color: var(--ink); }
.contact-gate__icon {
  flex: 0 0 auto; width: 38px; height: 38px; border-radius: 50%;
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--surface); color: var(--brand); font-size: 1rem; box-shadow: 0 1px 3px rgba(0,0,0,.08);
}
.contact-gate__phone .contact-gate__icon { background: var(--brand); color: #fff; }
.contact-gate__text { display: flex; flex-direction: column; min-width: 0; flex: 1; }
.contact-gate__label { font-size: .68rem; font-weight: 700; text-transform: uppercase; letter-spacing: .04em; color: var(--muted); }
.contact-gate__text .contact-blur { font-size: .95rem; font-weight: 600; padding: 0; text-align: left; }
.contact-gate__number { font-size: 1.1rem; font-weight: 700; letter-spacing: .02em; }
.contact-gate__lock { color: var(--muted); font-size: .9rem; }
.contact-gate__actions { display: flex; flex-direction: column; gap: .5rem; }
.contact-gate__row { display: flex; gap: .5rem; }

.unlock-modal { border: 0; border-radius: 22px; padding: 1.75rem 1.75rem 1.5rem; position: relative; background: var(--surface); }
.unlock-modal__close { position: absolute; top: 1rem; right: 1rem; }
.unlock-modal__head { text-align: center; margin-bottom: 1rem; }
.unlock-modal__badge {
  width: 56px; height: 56px; border-radius: 50%; margin: 0 auto .75rem;
  display: flex; align-items: center; justify-content: center;
  background: var(--surface-tint); color: var(--brand); font-size: 1.5rem;
}
.unlock-modal__badge--success { background: rgba(25,135,84,.12); color: #198754; font-size: 1.8rem; }
.unlock-modal__title { font-size: 1.3rem; font-weight: 700; margin-bottom: .35rem; color: var(--ink); }
.unlock-modal__subtitle { font-size: .88rem; color: var(--muted); margin: 0 auto; max-width: 360px; }
.unlock-modal__listing {
  display: flex; align-items: center; gap: .75rem; padding: .6rem;
  border: 1px solid var(--border); border-radius: 14px; margin-bottom: .9rem;
}
.unlock-modal__listing img { width: 64px; height: 48px; object-fit: cover; border-radius: 10px; flex: 0 0 auto; }
.unlock-modal__listing-title { font-weight: 700; font-size: .9rem; color: var(--ink); line-height: 1.25; }
.unlock-modal__listing-meta { font-size: .78rem; color: var(--muted); }
.unlock-modal__benefits { list-style: none; padding: 0; margin: 0 0 1rem; display: grid; gap: .35rem; }
.unlock-modal__benefits li { font-size: .84rem; color: var(--ink); display: flex; align-items: center; gap: .5rem; }
.unlock-modal__benefits .bi { color: #198754; }
.unlock-modal__form { display: flex; flex-direction: column; gap: .6rem; }
.unlock-modal__form .form-control { border-radius: 12px; }
.unlock-modal__field-hint { font-size: .74rem; color: var(--muted); margin-top: -.3rem; padding-left: .25rem; }
.unlock-modal__submit { font-weight: 700; font-size: 1rem; padding-top: .8rem; padding-bottom: .8rem; }
.unlock-modal__submit .bi { margin-right: .35rem; }
.unlock-modal__privacy { font-size: .74rem; color: var(--muted); text-align: center; margin: 0; }
.unlock-modal__privacy a { color: var(--muted); }
.unlock-modal__success { text-align: center; }
.unlock-modal__success .contact-gate__actions { margin-top: 1.25rem; text-align: left; }
@media (max-width: 575.98px) {
  .unlock-modal { padding: 1.5rem 1.1rem 1.25rem; }
}
.unlock-modal__head { display: flex; align-items: center; gap: .9rem; text-align: left; margin: 0 1.75rem .9rem 0; }
.unlock-modal__head .unlock-modal__badge { flex: 0 0 auto; width: 48px; height: 48px; margin: 0; font-size: 1.3rem; }
.unlock-modal__head .unlock-modal__title { font-size: 1.15rem; margin-bottom: .2rem; }
.unlock-modal__head .unlock-modal__subtitle { font-size: .82rem; max-width: none; margin: 0; line-height: 1.4; }
.unlock-modal { padding-top: 1.4rem; }
.unlock-modal__listing { margin-bottom: .7rem; }
.unlock-modal__benefits { display: flex; flex-wrap: wrap; gap: .35rem .9rem; margin-bottom: .85rem; }
.unlock-modal__benefits li { font-size: .8rem; }
.booking-card.sticky-top { z-index: 10; }

/* Add-listing account step: auto password note + instant e-mail check */
.account-auto-note {
  display: flex; gap: .65rem; align-items: center;
  font-size: .8rem; line-height: 1.45; color: var(--muted);
  margin: 1.1rem 0 0; padding-top: .9rem; border-top: 1px solid var(--border);
}
.account-auto-note .bi {
  flex: 0 0 auto; width: 30px; height: 30px; border-radius: 50%;
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--surface-tint); color: var(--brand); font-size: .9rem;
}
.email-check-status:empty { display: none; }
.email-check-alert {
  display: flex; gap: .75rem; align-items: flex-start;
  border: 1px solid rgba(245,158,11,.45); background: rgba(245,158,11,.1);
  border-radius: 14px; padding: .8rem .9rem; animation: emailCheckIn .25s ease;
}
.email-check-alert__icon {
  flex: 0 0 auto; width: 36px; height: 36px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  background: var(--surface); color: #b45309; font-size: 1.1rem;
}
.email-check-alert__body { display: flex; flex-direction: column; gap: .15rem; font-size: .84rem; color: var(--ink); }
.email-check-alert__actions { display: flex; align-items: center; gap: .9rem; flex-wrap: wrap; margin-top: .45rem; }
.email-check-alert__link { font-size: .8rem; color: var(--muted); }
@keyframes emailCheckIn { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: none; } }
@media (prefers-reduced-motion: reduce) { .email-check-alert { animation: none; } }

/* Billing details block */
.billing-form { display: flex; flex-direction: column; gap: .85rem; }
.billing-form__body, .billing-form__fields { display: flex; flex-direction: column; gap: .75rem; }
.billing-form__fields.d-none, .billing-form__body.d-none { display: none !important; }
.billing-type { display: grid; grid-template-columns: 1fr 1fr; gap: .6rem; }
.billing-type__tile {
  position: relative; display: flex; align-items: center; gap: .7rem; cursor: pointer;
  padding: .85rem .9rem; border: 1.5px solid var(--border); border-radius: 14px; background: var(--surface);
  transition: border-color .15s ease, background-color .15s ease, box-shadow .15s ease;
}
.billing-type__tile:hover { border-color: var(--brand); }
.billing-type__tile input { position: absolute; opacity: 0; pointer-events: none; }
.billing-type__tile:has(input:checked) { border-color: var(--brand); background: var(--surface-tint); box-shadow: 0 0 0 3px rgba(var(--brand-rgb), .12); }
.billing-type__tile:has(input:focus-visible) { outline: 2px solid var(--brand); outline-offset: 2px; }
.billing-type__icon {
  flex: 0 0 auto; width: 40px; height: 40px; border-radius: 12px; display: flex; align-items: center; justify-content: center;
  background: var(--surface-alt); color: var(--brand); font-size: 1.15rem;
}
.billing-type__tile:has(input:checked) .billing-type__icon { background: var(--brand); color: #fff; }
.billing-type__text { display: flex; flex-direction: column; line-height: 1.25; }
.billing-type__text strong { font-size: .92rem; color: var(--ink); }
.billing-type__text small { font-size: .75rem; color: var(--muted); }
@media (max-width: 575.98px) { .billing-type { grid-template-columns: 1fr; } }
.billing-lookup { font-size: .8rem; color: var(--muted); margin-top: .45rem; display: flex; align-items: center; gap: .4rem; flex-wrap: wrap; }
.billing-lookup .bi { color: var(--brand); }
.billing-lookup--ok { color: #198754; } .billing-lookup--ok .bi { color: #198754; }
.billing-lookup--warn { color: #b45309; } .billing-lookup--warn .bi { color: #b45309; }
.billing-lookup__warn { width: 100%; color: #b45309; }
.billing-filled { animation: billingFilled 1.2s ease; }
@keyframes billingFilled { 0% { background-color: rgba(25,135,84,.18); } 100% { background-color: transparent; } }
.billing-same, .billing-vat { display: flex; align-items: center; gap: .5rem; margin: 0; font-size: .88rem; }
.billing-vat { height: 100%; padding-left: .25rem; }
.billing-form .form-control, .billing-form .form-select { border-radius: 12px; }
.billing-summary {
  display: flex; align-items: center; gap: .8rem; padding: .8rem .9rem;
  border: 1px solid var(--border); border-radius: 14px; background: var(--surface-alt);
}
.billing-summary__icon { flex: 0 0 auto; width: 40px; height: 40px; border-radius: 12px; display: flex; align-items: center; justify-content: center; background: var(--surface); color: var(--brand); }
.billing-summary__text { display: flex; flex-direction: column; flex: 1; min-width: 0; font-size: .86rem; color: var(--ink); }
.billing-summary__text span { color: var(--muted); font-size: .8rem; }
.billing-summary__label { font-size: .7rem; font-weight: 700; text-transform: uppercase; letter-spacing: .04em; color: var(--muted); }
.billing-same, .billing-vat { padding-left: 0; }
.billing-same .form-check-input, .billing-vat .form-check-input { float: none; margin: 0; flex: 0 0 auto; }

/* Add-listing: quick-start note, "details later" hint, account-created card */
.quickstart-note {
  display: flex; gap: .85rem; align-items: flex-start;
  background: var(--surface-tint); border-radius: 16px; padding: 1rem 1.1rem; font-size: .88rem; color: var(--ink);
}
.quickstart-note p { color: var(--muted); font-size: .84rem; margin-top: .15rem; }
.quickstart-note__icon {
  flex: 0 0 auto; width: 40px; height: 40px; border-radius: 12px; display: flex; align-items: center; justify-content: center;
  background: var(--brand); color: #fff; font-size: 1.1rem;
}
.later-note { display: flex; gap: .5rem; align-items: flex-start; font-size: .8rem; color: var(--muted); margin: 0; }
.later-note .bi { color: var(--brand); }
.account-created {
  display: flex; gap: .8rem; align-items: flex-start; padding: .9rem 1rem;
  border-radius: 14px; background: rgba(25,135,84,.1); color: var(--ink); font-size: .88rem;
  animation: emailCheckIn .3s ease;
}
.account-created p { color: var(--muted); font-size: .84rem; margin-top: .15rem; }
.account-created__icon {
  flex: 0 0 auto; width: 40px; height: 40px; border-radius: 50%; display: flex; align-items: center; justify-content: center;
  background: #198754; color: #fff; font-size: 1.1rem;
}

/* Photo manager: drop zone, add tile, upload progress, failed state */
.photo-dropzone {
  border: 2px dashed var(--border); border-radius: 16px; padding: .85rem;
  transition: border-color .15s ease, background-color .15s ease;
}
.photo-dropzone.is-dragover { border-color: var(--brand); background: var(--surface-tint); }
.photo-dropzone__hint { font-size: .78rem; color: var(--muted); margin-bottom: .7rem; display: flex; gap: .45rem; align-items: flex-start; }
.photo-dropzone__hint .bi { color: var(--brand); font-size: 1rem; line-height: 1.1; }
.photo-dropzone .photo-manager__grid { margin-bottom: 0; }
.photo-manager__add-tile {
  width: 110px; height: 110px; border-radius: .75rem; border: 2px dashed var(--border);
  background: var(--surface); color: var(--brand); display: flex; flex-direction: column;
  align-items: center; justify-content: center; gap: .25rem; font-size: .74rem; font-weight: 600; cursor: pointer;
  transition: border-color .15s ease, background-color .15s ease;
}
.photo-manager__add-tile .bi { font-size: 1.5rem; }
.photo-manager__add-tile:hover { border-color: var(--brand); background: var(--surface-tint); }
.photo-manager__cell > img { width: 100%; height: 100%; object-fit: cover; display: block; }
.photo-manager__cell--queued > img, .photo-manager__cell--uploading > img { opacity: .45; filter: grayscale(.3); }
.photo-manager__cell--failed > img { opacity: .3; }
.photo-manager__overlay {
  position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: .3rem; padding: .4rem; text-align: center; font-size: .66rem; color: var(--ink);
}
.photo-manager__cell--failed .photo-manager__overlay { background: rgba(220,53,69,.12); color: #b02a37; }
.photo-manager__cell--failed .photo-manager__overlay .bi { font-size: 1rem; }
.photo-manager__progress { width: 78%; height: 6px; border-radius: 999px; background: rgba(0,0,0,.15); overflow: hidden; }
.photo-manager__progress span { display: block; height: 100%; background: var(--brand); border-radius: 999px; transition: width .2s ease; }
.photo-manager__cell--queued .photo-manager__progress span { width: 0 !important; }
.photo-manager__retry {
  border: none; background: #fff; color: #b02a37; border-radius: 999px; font-size: .66rem; font-weight: 700;
  padding: .2rem .5rem; box-shadow: 0 1px 3px rgba(0,0,0,.15); cursor: pointer;
}
.photo-manager__make-main {
  position: absolute; left: .3rem; bottom: .3rem; width: 24px; height: 24px; border-radius: 50%; border: none;
  background: rgba(0,0,0,.5); color: #fff; font-size: .72rem; display: flex; align-items: center; justify-content: center;
  cursor: pointer; opacity: 0; transition: opacity .15s ease;
}
.photo-manager__cell:hover .photo-manager__make-main, .photo-manager__make-main:focus-visible { opacity: 1; }
@media (hover: none) { .photo-manager__make-main { opacity: .85; } }
.video-add { margin-top: .25rem; }

/* Package choice in the add-listing form */
.plan-pick { display: grid; grid-template-columns: repeat(3, 1fr); gap: .6rem; }
.plan-pick__tile {
  position: relative; display: flex; flex-direction: column; gap: .15rem; cursor: pointer;
  padding: .85rem .9rem; border: 1.5px solid var(--border); border-radius: 14px; background: var(--surface);
  transition: border-color .15s ease, background-color .15s ease, box-shadow .15s ease;
}
.plan-pick__tile:hover { border-color: var(--brand); }
.plan-pick__tile input { position: absolute; opacity: 0; pointer-events: none; }
.plan-pick__tile:has(input:checked) { border-color: var(--brand); background: var(--surface-tint); box-shadow: 0 0 0 3px rgba(var(--brand-rgb), .12); }
.plan-pick__tile:has(input:focus-visible) { outline: 2px solid var(--brand); outline-offset: 2px; }
.plan-pick__name { font-weight: 700; color: var(--ink); font-size: .95rem; }
.plan-pick__tag { font-size: .62rem; font-weight: 700; text-transform: uppercase; letter-spacing: .03em; color: #fff; background: var(--brand); border-radius: 999px; padding: .1rem .45rem; margin-left: .25rem; vertical-align: middle; }
.plan-pick__price { font-size: 1.3rem; font-weight: 700; color: var(--brand); }
.plan-pick__note { font-size: .74rem; color: var(--muted); line-height: 1.3; }
@media (max-width: 575.98px) { .plan-pick { grid-template-columns: 1fr; } }

.field-hint { font-size: .75rem; color: var(--muted); margin-top: .3rem; padding-left: .2rem; }

/* Amenity picker */
.amenity-picker { display: flex; flex-direction: column; gap: .75rem; }
.amenity-picker__toggle {
  align-self: flex-start; display: inline-flex; align-items: center; gap: .4rem; border: 1px solid var(--border);
  background: var(--surface); color: var(--brand); border-radius: 999px; padding: .45rem .95rem; font-size: .85rem; font-weight: 600;
}
.amenity-picker__toggle:hover { border-color: var(--brand); background: var(--surface-tint); }
.amenity-picker__more { display: flex; flex-direction: column; gap: .5rem; }
.amenity-picker__more.d-none { display: none !important; }
.amenity-picker__cat { font-size: .72rem; font-weight: 700; text-transform: uppercase; letter-spacing: .04em; color: var(--muted); margin-top: .5rem; }
.amenity-details { border: 1px solid var(--border); border-radius: 14px; padding: .85rem .95rem; background: var(--surface-alt); display: flex; flex-direction: column; gap: .7rem; }
.amenity-details__head { display: flex; flex-direction: column; font-size: .85rem; color: var(--ink); }
.amenity-details__head span { font-size: .75rem; color: var(--muted); }
.amenity-details__row { display: flex; flex-direction: column; gap: .35rem; border-radius: 10px; }
.amenity-details__row--flash { animation: amenityFlash 1.2s ease; }
@keyframes amenityFlash { 0% { background: var(--surface-tint); } 100% { background: transparent; } }
.amenity-details__name { font-size: .84rem; font-weight: 600; color: var(--ink); display: flex; align-items: center; gap: .4rem; }
.amenity-details__name .bi { color: var(--brand); }
.amenity-details__chips { display: flex; flex-wrap: wrap; gap: .4rem; }
.amenity-chip { position: relative; cursor: pointer; margin: 0; }
.amenity-chip input { position: absolute; opacity: 0; pointer-events: none; }
.amenity-chip span {
  display: inline-block; font-size: .78rem; padding: .3rem .7rem; border-radius: 999px;
  border: 1px solid var(--border); background: var(--surface); color: var(--ink); transition: all .15s ease;
}
.amenity-chip:hover span { border-color: var(--brand); }
.amenity-chip input:checked + span { background: var(--brand); border-color: var(--brand); color: #fff; }
.amenity-chip input:focus-visible + span { outline: 2px solid var(--brand); outline-offset: 2px; }

/* Amenity list on the listing page */
.amenity-item { display: flex; align-items: flex-start; gap: .55rem; color: var(--ink); }
.amenity-item > .bi { color: var(--brand); font-size: 1rem; line-height: 1.3; flex: 0 0 auto; }
.amenity-item span { display: flex; flex-direction: column; line-height: 1.35; }
.amenity-item__details { color: var(--muted); font-size: .78rem; }
.photo-manager__cell--failed .photo-manager__overlay span { font-weight: 700; }
.photo-manager__cell--failed .photo-manager__retry { margin-top: .1rem; }
.quickstart-note__ai {
  display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: .6rem;
  margin-top: .75rem; padding-top: .75rem; border-top: 1px dashed rgba(var(--brand-rgb), .25);
  font-size: .84rem; color: var(--ink);
}
.quickstart-note__ai .bi-magic { color: var(--brand); }
.quickstart-note__ai span { flex: 1 1 260px; }

/* Add-listing: description check + autosave */
.desc-improve { display: flex; align-items: center; justify-content: flex-end; flex-wrap: wrap; gap: .5rem .75rem; margin-top: .6rem; animation: mu-fade-in .25s ease; }
.desc-improve__hint { font-size: .8rem; color: var(--muted); }
.desc-improve__hint.is-ok { color: #15803d; }
.desc-improve__hint.is-error { color: #b91c1c; }
.desc-improve__btn { border: 1px solid var(--border); background: var(--surface); color: var(--brand); font-weight: 600; }
.desc-improve__btn:hover { background: var(--surface-tint); color: var(--brand); border-color: var(--brand); }
.desc-suggestion { margin-top: .75rem; border: 1px solid var(--border); border-left: 3px solid var(--brand); border-radius: 12px; background: var(--surface-alt); padding: .9rem 1rem; animation: mu-fade-in .25s ease; }
.desc-suggestion__head { display: flex; gap: .45rem; align-items: center; font-size: .9rem; margin-bottom: .5rem; }
.desc-suggestion__head .bi { color: var(--brand); }
.desc-suggestion__text { white-space: pre-line; font-size: .9rem; line-height: 1.55; background: var(--surface); border-radius: 8px; padding: .75rem .85rem; margin-bottom: .6rem; }
.desc-suggestion__changes { font-size: .8rem; color: var(--muted); margin: 0 0 .75rem; padding-left: 1.1rem; }
.draft-status { text-align: center; font-size: .78rem; color: var(--muted); min-height: 1.2em; }
.draft-status .bi { color: var(--brand); margin-right: .25rem; }
.draft-banner { display: flex; gap: .85rem; align-items: center; flex-wrap: wrap; border: 1px solid var(--border); background: var(--surface-tint); border-radius: 16px; padding: .9rem 1.1rem; font-size: .88rem; }
.draft-banner p { color: var(--muted); }
.draft-banner__icon { width: 38px; height: 38px; border-radius: 50%; background: var(--surface); color: var(--brand); display: inline-flex; align-items: center; justify-content: center; flex: 0 0 auto; }
@keyframes mu-fade-in { from { opacity: 0; transform: translateY(-3px); } to { opacity: 1; transform: none; } }
@media (prefers-reduced-motion: reduce) { .desc-improve, .desc-suggestion { animation: none; } }

/* Package payment page */
.plan-final-note { display: flex; gap: .5rem; align-items: flex-start; font-size: .82rem; color: var(--muted); margin: .25rem 0 0; }
.plan-final-note .bi { color: #15803d; font-size: 1rem; line-height: 1.2; }
.plan-final-note--center { justify-content: center; text-align: left; max-width: 720px; margin-left: auto; margin-right: auto; }
.payment-hero__icon { width: 64px; height: 64px; border-radius: 50%; margin: 0 auto 1rem; display: flex; align-items: center; justify-content: center; font-size: 2rem; color: #fff; background: linear-gradient(135deg, #16a34a, #15803d); box-shadow: 0 10px 25px rgba(22, 163, 74, .25); }
.payment-cur-toggle { display: inline-flex; background: var(--surface-alt); border: 1px solid var(--border); border-radius: 999px; padding: 3px; }
.payment-cur-toggle button { border: 0; background: transparent; color: var(--muted); font-weight: 600; font-size: .85rem; padding: .35rem .9rem; border-radius: 999px; display: inline-flex; align-items: center; gap: .35rem; }
.payment-cur-toggle button.active { background: var(--surface); color: var(--ink); box-shadow: 0 1px 4px rgba(0, 0, 0, .12); }
.payment-method { border: 1px solid var(--border); border-radius: 16px; background: var(--surface); padding: 1.1rem 1.2rem; }
.payment-method__head { display: flex; gap: .75rem; align-items: center; margin-bottom: 1rem; }
.payment-method__icon { width: 40px; height: 40px; border-radius: 12px; background: var(--surface-tint); color: var(--brand); display: inline-flex; align-items: center; justify-content: center; font-size: 1.15rem; flex: 0 0 auto; }
.payment-method__tag { margin-left: auto; font-size: .7rem; font-weight: 600; color: #15803d; background: rgba(22, 163, 74, .1); border-radius: 999px; padding: .2rem .6rem; white-space: nowrap; }
.payment-details__row { display: flex; justify-content: space-between; align-items: center; gap: .75rem; padding: .45rem 0; border-bottom: 1px dashed var(--border); }
.payment-details__row:last-child { border-bottom: 0; }
.payment-details dt { font-weight: 400; font-size: .8rem; color: var(--muted); }
.payment-details dd { margin: 0; display: flex; align-items: center; gap: .35rem; font-weight: 600; font-size: .9rem; text-align: right; word-break: break-all; }
.payment-copy { border: 0; background: transparent; color: var(--muted); padding: .15rem .3rem; border-radius: 6px; }
.payment-copy:hover { color: var(--brand); background: var(--surface-tint); }
.payment-copy.is-copied { color: #15803d; }
.payment-qr { display: inline-block; background: #fff; border: 1px solid var(--border); border-radius: 12px; padding: .5rem; }
.payment-qr img { display: block; width: 180px; height: 180px; image-rendering: pixelated; }
.payment-paypal-btn { background: #ffc439; color: #111; font-weight: 700; border: 0; }
.payment-paypal-btn:hover { background: #f2b52e; color: #111; }
.payment-cards { font-size: .8rem; color: var(--muted); }
.payment-summary { border: 1px solid var(--border); border-radius: 18px; background: var(--surface); padding: 1.3rem; position: sticky; top: 90px; }
.payment-summary__list > div { display: flex; justify-content: space-between; gap: 1rem; padding: .35rem 0; font-size: .88rem; }
.payment-summary__list dt { font-weight: 400; color: var(--muted); }
.payment-summary__list dd { margin: 0; font-weight: 600; text-align: right; }
.payment-summary__total { display: flex; justify-content: space-between; align-items: flex-end; border-top: 1px solid var(--border); margin-top: .5rem; padding-top: .9rem; }
.payment-summary__total strong { font-size: 1.5rem; display: block; line-height: 1.1; text-align: right; }
.payment-summary__total small { display: block; font-size: .72rem; color: var(--muted); text-align: right; }
.payment-summary__final { display: flex; gap: .5rem; font-size: .8rem; background: rgba(22, 163, 74, .08); color: var(--ink); border-radius: 10px; padding: .6rem .75rem; margin: 1rem 0; }
.payment-summary__final .bi { color: #15803d; }
.payment-supplier { font-size: .78rem; color: var(--muted); line-height: 1.5; }
.payment-next__list { padding-left: 1.2rem; font-size: .88rem; color: var(--muted); }
.payment-next__list li { margin-bottom: .45rem; }
@media (max-width: 991.98px) { .payment-summary { position: static; } }
.payment-method--card { border-color: var(--brand); box-shadow: 0 6px 20px rgba(0, 53, 128, .08); }
.payment-summary__paid { color: #15803d; font-weight: 600; }

/* Host billing & subscription */
.billing-empty { border: 1px dashed var(--border); border-radius: 14px; padding: 1.2rem; color: var(--muted); font-size: .9rem; background: var(--surface); }
.sub-card { border: 1px solid var(--border); border-radius: 16px; background: var(--surface); padding: 1.1rem 1.2rem; height: 100%; display: flex; flex-direction: column; border-top: 4px solid var(--sub-tone, var(--border)); }
.sub-card--success { --sub-tone: #16a34a; }
.sub-card--warning { --sub-tone: #f59e0b; }
.sub-card--danger { --sub-tone: #dc2626; }
.sub-card--info { --sub-tone: var(--brand); }
.sub-card--muted { --sub-tone: var(--border); }
.sub-card .min-w-0 { min-width: 0; }
.sub-card__badge { flex: 0 0 auto; font-size: .7rem; font-weight: 600; border-radius: 999px; padding: .2rem .6rem; background: color-mix(in srgb, var(--sub-tone) 14%, transparent); color: var(--ink); white-space: nowrap; }
.sub-card__validity { margin-top: .5rem; }
.sub-card__bar { height: 6px; border-radius: 999px; background: var(--surface-alt); overflow: hidden; }
.sub-card__bar span { display: block; height: 100%; border-radius: 999px; background: var(--sub-tone); }
.sub-card > .d-flex:last-child { margin-top: auto !important; padding-top: .75rem; }
.billing-table-wrap { border: 1px solid var(--border); border-radius: 16px; overflow: hidden; background: var(--surface); }
.billing-table th { font-size: .75rem; font-weight: 600; color: var(--muted); text-transform: none; background: var(--surface-alt); border-bottom-color: var(--border); }
.billing-table td { font-size: .88rem; border-color: var(--border); }
.pay-pill { display: inline-flex; align-items: center; gap: .3rem; font-size: .75rem; font-weight: 600; border-radius: 999px; padding: .2rem .6rem; white-space: nowrap; }
.pay-pill--paid { color: #15803d; background: rgba(22, 163, 74, .1); }
.pay-pill--pending { color: #b45309; background: rgba(245, 158, 11, .14); }
@media (max-width: 767.98px) {
  .billing-table thead { display: none; }
  .billing-table tr { display: block; border-bottom: 1px solid var(--border); padding: .5rem .25rem; }
  .billing-table td { display: flex; justify-content: space-between; gap: 1rem; border: 0; padding: .25rem .75rem; text-align: right; }
  .billing-table td::before { content: attr(data-label); color: var(--muted); font-size: .78rem; text-align: left; }
}

/* Footer: accepted payment methods */
.footer-payments { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 1rem 2rem; margin-top: 2rem; padding: 1.1rem 1.3rem; border: 1px solid var(--border); border-radius: 16px; background: var(--surface); }
.footer-payments__text { display: flex; align-items: center; gap: .8rem; }
.footer-payments__text strong { display: block; font-size: .9rem; color: var(--ink); }
.footer-payments__text > div > span { display: block; font-size: .78rem; color: var(--muted); }
.footer-payments__shield { width: 38px; height: 38px; flex: 0 0 auto; border-radius: 50%; display: inline-flex !important; align-items: center; justify-content: center; background: rgba(22, 163, 74, .12); color: #15803d; font-size: 1.05rem; }
.footer-payments__list { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; list-style: none; margin: 0; padding: 0; }
.payment-badge { height: 34px; min-width: 52px; padding: 0 .6rem; display: inline-flex; align-items: center; justify-content: center; gap: .35rem; background: #fff; border: 1px solid #e5e7eb; border-radius: 7px; box-shadow: 0 1px 2px rgba(0, 0, 0, .04); }
.payment-badge svg { height: 22px; width: auto; display: block; }
.payment-badge .bi { font-size: 1rem; color: #374151; }
.payment-badge__label { font-size: .72rem; font-weight: 600; color: #374151; white-space: nowrap; }
.payment-badge--stripe { gap: .25rem; }
.payment-badge--stripe svg { height: 18px; }
.payment-badge__by { font-size: .62rem; color: #6b7280; white-space: nowrap; }
@media (max-width: 575.98px) { .footer-payments { justify-content: center; text-align: left; } .footer-payments__list { justify-content: center; } }
.payment-badge--visa svg { height: 26px; }
.payment-badge--applepay svg, .payment-badge--googlepay svg { height: 40px; margin: -4px 0; }
.payment-badge--mastercard-color svg { height: 22px; }
.payment-supplier summary { cursor: pointer; font-weight: 600; color: var(--muted); list-style: none; display: inline-flex; align-items: center; gap: .3rem; margin-bottom: .25rem; }
.payment-supplier summary::-webkit-details-marker { display: none; }
.payment-supplier summary::after { content: '\F282'; font-family: 'bootstrap-icons'; font-size: .7rem; transition: transform .2s; }
.payment-supplier[open] summary::after { transform: rotate(180deg); }
.chat-contact { display: flex; flex-direction: column; gap: .4rem; margin: .25rem 0 .75rem; padding: .75rem; border: 1px solid var(--border-color, #e5e7eb); border-radius: 14px; background: var(--surface, #fff); }
.chat-contact__actions { display: flex; align-items: center; gap: .5rem; }
.chat-contact__error { color: #dc3545; font-size: .8rem; }
.chat-contact__note { color: var(--muted); font-size: .72rem; }
.property-topline { display: flex; align-items: center; justify-content: space-between; gap: .5rem 1rem; flex-wrap: wrap; }
.property-topline .property-breadcrumbs { min-width: 0; }
.property-topline .property-breadcrumbs .breadcrumb { margin-bottom: 0; }
.claim-cta { display: flex; align-items: center; gap: .55rem; flex: 0 1 400px; min-width: 0; padding: .35rem .75rem .35rem .4rem; border: 1px solid color-mix(in srgb, var(--brand) 35%, transparent); border-radius: 999px; background: color-mix(in srgb, var(--brand) 7%, var(--surface, #fff)); color: var(--ink); text-align: left; transition: box-shadow .2s; }
.claim-cta:hover { box-shadow: 0 4px 14px rgba(0, 53, 128, .14); }
.claim-cta__icon { flex-shrink: 0; width: 30px; height: 30px; display: grid; place-items: center; border-radius: 50%; background: var(--brand); color: #fff; font-size: .9rem; }
.claim-cta__text { display: flex; flex-direction: column; min-width: 0; font-size: .76rem; line-height: 1.25; }
.claim-cta__text strong, .claim-cta__text span { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.claim-cta__text strong { font-size: .82rem; }
.claim-cta__text span { color: var(--muted); }
.claim-cta__arrow { margin-left: auto; color: var(--brand); flex-shrink: 0; }
@media (max-width: 767.98px) { .claim-cta { flex-basis: 100%; } }
.claim-calendar-cta { display: flex; align-items: center; justify-content: space-between; gap: .75rem; flex-wrap: wrap; padding: .75rem 1rem; background: color-mix(in srgb, var(--brand) 7%, var(--surface, #fff)); border: 1px dashed color-mix(in srgb, var(--brand) 40%, transparent); font-size: .9rem; }
.claim-preview-banner { display: flex; align-items: center; justify-content: space-between; gap: .75rem; flex-wrap: wrap; padding: .75rem 1rem; background: #1f2937; color: #fff; font-size: .92rem; }
.claim-sent__icon { font-size: 2.4rem; color: var(--brand); margin-bottom: .5rem; }
.claim-draft-banner { display: flex; align-items: center; gap: 1rem; flex-wrap: wrap; padding: 1rem 1.25rem; background: color-mix(in srgb, var(--brand) 8%, var(--surface, #fff)); border: 1px solid color-mix(in srgb, var(--brand) 30%, transparent); }
.claim-draft-banner__icon { width: 44px; height: 44px; flex-shrink: 0; display: grid; place-items: center; border-radius: 50%; background: var(--brand); color: #fff; font-size: 1.2rem; }
/* Attractions catalogue */
.attr-country-tabs { display: flex; gap: .5rem; flex-wrap: wrap; }
.attr-country-tab { display: inline-flex; align-items: center; gap: .4rem; padding: .4rem .9rem; border: 1px solid var(--border, #dee2e6); border-radius: 999px; color: var(--ink); text-decoration: none; font-size: .9rem; background: var(--surface, #fff); }
.attr-country-tab span { color: var(--muted); font-size: .8rem; }
.attr-country-tab.is-active { border-color: var(--brand); background: color-mix(in srgb, var(--brand) 8%, var(--surface, #fff)); font-weight: 600; }
.attr-cat-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); gap: .9rem; }
.attr-cat-tile { position: relative; display: flex; flex-direction: column; justify-content: flex-end; min-height: 130px; padding: .85rem; border-radius: 16px; overflow: hidden; color: #fff; text-decoration: none; background: linear-gradient(135deg, var(--brand), #0a4fb3); }
.attr-cat-tile img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; transition: transform .35s; }
.attr-cat-tile:hover img { transform: scale(1.05); }
.attr-cat-tile__shade { position: absolute; inset: 0; background: linear-gradient(to top, rgba(0, 0, 0, .72), rgba(0, 0, 0, .08) 70%); }
.attr-cat-tile__icon, .attr-cat-tile__label, .attr-cat-tile__count { position: relative; }
.attr-cat-tile__icon { position: absolute; top: .7rem; left: .7rem; width: 34px; height: 34px; display: grid; place-items: center; border-radius: 50%; background: rgba(255, 255, 255, .92); color: var(--brand); }
.attr-cat-tile__label { font-weight: 700; font-size: 1.02rem; line-height: 1.2; }
.attr-cat-tile__count { font-size: .8rem; opacity: .9; }
.attr-card-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 1rem; }
.attr-card { display: flex; flex-direction: column; border: 1px solid var(--border, #e5e7eb); border-radius: 16px; overflow: hidden; background: var(--surface, #fff); color: var(--ink); text-decoration: none; transition: box-shadow .2s, transform .2s; }
.attr-card:hover { box-shadow: 0 8px 24px rgba(0, 0, 0, .08); transform: translateY(-2px); }
.attr-card__media { position: relative; display: block; aspect-ratio: 3 / 2; overflow: hidden; background: var(--surface-alt, #f3f5f8); }
.attr-card__media img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.attr-card__placeholder { position: absolute; inset: 0; display: grid; place-items: center; font-size: 2.4rem; color: color-mix(in srgb, var(--brand) 55%, transparent); }
.attr-card__badge { position: absolute; left: .6rem; bottom: .6rem; padding: .2rem .55rem; border-radius: 999px; background: rgba(255, 255, 255, .94); color: #1f2937; font-size: .75rem; font-weight: 600; }
.attr-card__body { display: flex; flex-direction: column; gap: .2rem; padding: .75rem .85rem .9rem; }
.attr-card__title { font-weight: 700; line-height: 1.25; }
.attr-card__region { color: var(--muted); font-size: .82rem; }
.attr-card__count { color: var(--brand); font-size: .84rem; font-weight: 600; }
.attr-region-chips { display: flex; gap: .4rem; flex-wrap: wrap; }
.attr-chip { display: inline-flex; align-items: center; gap: .3rem; padding: .3rem .75rem; border: 1px solid var(--border, #dee2e6); border-radius: 999px; font-size: .84rem; color: var(--ink); text-decoration: none; background: var(--surface, #fff); }
.attr-chip span { color: var(--muted); font-size: .76rem; }
.attr-chip.is-active { border-color: var(--brand); color: var(--brand); background: color-mix(in srgb, var(--brand) 8%, var(--surface, #fff)); font-weight: 600; }
.attr-map { height: 380px; border: 1px solid var(--border, #e5e7eb); z-index: 0; }
.attr-map--detail { height: 340px; }
.attr-detail__head { display: flex; justify-content: space-between; align-items: flex-start; gap: 1rem; flex-wrap: wrap; }
.attr-detail__stat { display: flex; flex-direction: column; align-items: center; padding: .6rem 1.1rem; border-radius: 16px; background: color-mix(in srgb, var(--brand) 8%, var(--surface, #fff)); color: var(--brand); text-align: center; line-height: 1.2; }
.attr-detail__stat strong { font-size: 1.6rem; }
.attr-detail__stat span { font-size: .8rem; }
.attr-detail__desc { font-size: 1.02rem; line-height: 1.65; }
.attr-detail__photo { display: flex; flex-direction: column; height: 100%; }
.attr-detail__photo-frame { position: relative; flex: 1 1 auto; min-height: 320px; overflow: hidden; background: var(--surface-alt, #f3f5f8); }
.attr-detail__photo-frame img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
@media (max-width: 991.98px) { .attr-detail__photo { height: auto; } .attr-detail__photo-frame { flex: none; min-height: 0; aspect-ratio: 4 / 3; } }
.attr-distance-badge { left: auto; right: .6rem; top: .6rem; background: rgba(0, 53, 128, .92); color: #fff; }
@media (max-width: 575.98px) { .attr-cat-grid { grid-template-columns: repeat(2, 1fr); } .attr-cat-tile { min-height: 110px; } .attr-map { height: 300px; } }
.nearby-attraction-wrap { position: relative; height: 100%; }
.nearby-attraction.has-link { padding-right: 3rem; }
.nearby-attraction__link { position: absolute; right: .55rem; top: 50%; transform: translateY(-50%); width: 30px; height: 30px; display: grid; place-items: center; border-radius: 50%; background: var(--brand); color: #fff; text-decoration: none; font-size: .9rem; }
.nearby-attraction__link:hover { color: #fff; filter: brightness(1.15); }
/* Weather (property detail) */
.weather-days { display: grid; grid-template-columns: repeat(7, minmax(84px, 1fr)); gap: .5rem; overflow-x: auto; padding-bottom: .25rem; }
.weather-day { display: flex; flex-direction: column; align-items: center; gap: .15rem; padding: .7rem .4rem; border: 1px solid var(--border, #e5e7eb); border-radius: 14px; background: var(--surface, #fff); text-align: center; }
.weather-day:first-child { border-color: color-mix(in srgb, var(--brand) 45%, transparent); background: color-mix(in srgb, var(--brand) 6%, var(--surface, #fff)); }
.weather-day__name { font-weight: 700; font-size: .85rem; text-transform: capitalize; }
.weather-day__date { color: var(--muted); font-size: .72rem; }
.weather-day__icon { font-size: 1.7rem; color: var(--brand); line-height: 1.3; }
.weather-day__temp { font-size: .92rem; }
.weather-day__temp span { color: var(--muted); }
.weather-day__rain { color: #2563eb; font-size: .74rem; }
.weather-months { display: grid; grid-template-columns: repeat(12, minmax(42px, 1fr)); gap: .3rem; overflow-x: auto; padding-bottom: .25rem; }
.weather-month { display: flex; flex-direction: column; align-items: center; gap: .15rem; padding: .4rem .1rem; border-radius: 10px; font-size: .74rem; }
.weather-month.is-current { background: color-mix(in srgb, var(--brand) 8%, var(--surface, #fff)); }
.weather-month__max { font-weight: 700; }
.weather-month__min { color: var(--muted); }
.weather-month__bar { position: relative; width: 8px; height: 70px; border-radius: 6px; background: var(--surface-alt, #f1f3f6); }
.weather-month__bar span { position: absolute; left: 0; right: 0; border-radius: 6px; background: linear-gradient(to bottom, #f97316, #38bdf8); }
.weather-month__rain { color: #2563eb; }
.weather-month__rain small { font-size: .62rem; }
.weather-month__name { font-weight: 600; text-transform: capitalize; color: var(--ink); }
/* Mobile sticky inquiry bar */
.mobile-cta { position: fixed; left: 0; right: 0; bottom: 0; z-index: 1040; display: flex; align-items: center; justify-content: space-between; gap: .75rem; padding: .6rem 1rem calc(.6rem + env(safe-area-inset-bottom)); background: var(--surface, #fff); border-top: 1px solid var(--border, #e5e7eb); box-shadow: 0 -6px 20px rgba(0, 0, 0, .08); transform: translateY(110%); transition: transform .25s ease; }
.mobile-cta.is-visible { transform: translateY(0); }
.mobile-cta__price { line-height: 1.15; }
.mobile-cta__from, .mobile-cta__unit { color: var(--muted); font-size: .8rem; }
.mobile-cta__price strong { font-size: 1.1rem; }
@media (max-width: 991.98px) { body.has-mobile-cta .chat-widget { bottom: 5.25rem; } body.has-mobile-cta { padding-bottom: 4.5rem; } }
