/* ==========================================================================
   Softbnb property page themes — SHARED layer
   Spec: docs/property-themes.md

   Loaded by resources/views/property/themes/layout.blade.php after
   css/softbnb-ds.css and BEFORE the theme stylesheet.

   SCOPE
     .pp            page root  (<div class="sb-page pp pp--{theme}" data-pp-root>)
     .pp-overlays   wrapper of everything rendered outside the root
                    (<div class="pp-overlays sb-modal pp--{theme}">: dialogs + mobile bar)
     .pp-dialog     every <dialog> (also carries .sb-modal + .pp--{theme})
     .pp-preview    the admin preview banner
     body.pp-body   added before paint by the layout (also body.pp-body--{theme})
   Pushed CSS is printed BEFORE Bootstrap and style.css, so every selector here
   carries at least two classes. `:is(.pp, .pp-overlays) .x` is the usual prefix
   because most components can live in the page and in a dialog.

   THEMING
     Components use only --sb-* tokens plus the --pp-* component variables listed
     below. A theme re-points tokens on its class. Because softbnb-ds.css flips
     tokens with `body.dark-mode .sb-page / .sb-modal`, an always-dark theme must
     repeat its override for dark mode:
         .pp--cinematic, body.dark-mode .pp--cinematic { --sb-bg: …; --sb-text: …; }
     The class sits on the root, on .pp-overlays AND on every dialog, so one rule
     reaches all three.

   COMPONENT VARIABLES (all optional; defaults are tokens)
     --pp-a / --pp-a-hover     link colour / hover colour. The site ships
                               `a:hover{color:#f14e4e !important}`; the reset below
                               answers with an !important var(), so colour links
                               through these two variables, never with `color` on :hover.
     --pp-bw / --pp-bc         border width / colour of a <button>. style.css ships
                               `button:focus{border:0}`; buttons therefore draw their
                               border from these variables in every state.
     --pp-section-bg           background of a <section> in dark mode (the header ships
                               `body.dark-mode section{background:#0f172a !important}`).
     --pp-booking-bg / -border / -radius / -shadow / -pad     booking surface
     --pp-field-bg / --pp-field-border                        booking fields
     --pp-cal-cell             calendar day size                          (44px)
     --pp-cal-accent / --pp-cal-accent-ink / --pp-cal-range   selection colours
     --pp-dialog-w             dialog width                               (560px)
     --pp-bar-h                height of the mobile booking bar           (68px)
     --pp-nav-h                height of the site bottom nav              (62px)
     --pp-consent-inset        set by the JS on <html>: viewport bottom → top of the
                               site cookie notice while it is open, else 0px. Bottom-
                               pinned UI adds it so the notice never covers it
                               (body.pp-consent-open is set at the same time).
     --pp-rail-card            width of a card in a rail                  (280px)
     --pp-map-ratio            aspect ratio of the map box                (16 / 9)
     --pp-level                host level colour (set inline by shared/host)

   CALENDAR — classes js/property-page.js generates (styled in section 6)
     .pp-cal                   root of one calendar instance
       .pp-cal__head           row: [.pp-cal__nav--prev] … [.pp-cal__nav--next]
         button.pp-cal__nav    month navigation (44px, [disabled] at the limits)
       .pp-cal__months         1 month on small boxes, 2 side by side when there is room
         .pp-cal__month
           .pp-cal__title      "October 2026"
           .pp-cal__dow        7-column row of weekday initials (<span>)
           .pp-cal__grid       role=grid: .pp-cal__row[role=row] per week, each a 7-column grid of
                               <span class="pp-cal__pad" role=gridcell> blanks + day buttons
             button.pp-cal__day   text = day number, aria-label = full date
                 .is-today      today
                 .is-disabled   past / outside the bookable window  (+ [disabled])
                 .is-blocked    booked or blocked by the host        (+ [disabled])
                 .is-start      check-in      .is-end   check-out
                 .is-inrange    between the two (also the hover preview)
                 .is-focus      roving-tabindex day (keyboard cursor)
       .pp-cal__legend         > .pp-cal__legend-item > .pp-cal__swatch(--selected|--blocked) + text
       .pp-cal__foot           > .pp-cal__hint (text, aria-live) + button.pp-cal__clear
     .pp-cal__popover          floating panel; the Blade slot [data-pp-calendar-pop] already has
                               this class and [hidden]. Modifiers: --left (align left edge),
                               --up (open upwards). Inline calendars render straight into
                               [data-pp-calendar-inline].

   QUOTE — rows JS renders into [data-pp-quote]
     .pp-quote__row > .pp-quote__label + .pp-quote__value
     .pp-quote__row--discount   value in the success colour
     .pp-quote__row--total      rule above, bold
     .pp-quote__row--deposit    refundable deposit, listed after the total
     .pp-quote__note            small print under the rows

   STATUS — JS sets the class on [data-pp-status]:  .pp-status--error | .pp-status--warn
     optional children: <strong> title + <span> text. Empty = collapsed.

   BUSY — JS sets aria-busy="true" + [disabled] on [data-pp-submit]; the spinner inside shows.

   TOAST — fallback when window.showNotification is missing:
     <div class="pp-toast pp-toast--success|--error" role="status"> inside .pp-overlays
     (or inside the open dialog), add .is-in to show.
   ========================================================================== */


/* ==========================================================================
   1. Reset — Bootstrap 4 reboot + style.css element rules, inside our scope.
      `.pp-legacy` marks included legacy partials (reviews, property cards) that
      bring their own CSS: the reset leaves them alone. :where() keeps the reset
      at (0,1,1) so any two-class rule of a theme wins.
   ========================================================================== */

.pp.sb-page {
  font-weight: var(--sb-w-normal);
  letter-spacing: 0;
  text-align: left;
  padding-bottom: var(--sb-7);
}

.pp-overlays.sb-modal,
.pp-overlays .pp-dialog,
.pp-preview.sb-modal {
  font-family: var(--sb-font-body);
  font-size: var(--sb-t-body);
  font-weight: var(--sb-w-normal);
  line-height: var(--sb-lh-body);
  color: var(--sb-text);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

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

.pp :is(h1, h2, h3, h4, h5, h6):where(:not(.pp-legacy *)),
.pp-overlays :is(h1, h2, h3, h4, h5, h6) {
  margin: 0;
  font-family: inherit;
  font-size: inherit;
  font-weight: var(--sb-w-medium);
  line-height: var(--sb-lh-heading);
  color: inherit;
}
/* header.blade.php: body.dark-mode h1…h6{color:#e2e8f0} is (0,1,2). This is (0,1,3):
   it wins over that, and still loses to any two-class component rule. */
html body.dark-mode :where(.pp, .pp-overlays) :is(h1, h2, h3, h4, h5, h6):where(:not(.pp-legacy *)),
html body.dark-mode :where(.pp, .pp-overlays) label:where(:not(.pp-legacy *)) { color: inherit; }

.pp :is(p, ul, ol, dl, dd, figure, blockquote):where(:not(.pp-legacy *)),
.pp-overlays :is(p, ul, ol, dl, dd, figure, blockquote) { margin: 0; }

.pp :is(ul, ol):where(:not(.pp-legacy *)),
.pp-overlays :is(ul, ol) { padding: 0; list-style: none; }

.pp dt:where(:not(.pp-legacy *)),
.pp-overlays dt { font-weight: inherit; }

.pp label:where(:not(.pp-legacy *)),
.pp-overlays label { display: inline; margin: 0; color: inherit; }

.pp img:where(:not(.pp-legacy *)),
.pp-overlays img { max-width: 100%; border: 0; }

.pp a:where(:not(.pp-legacy *)),
.pp-overlays a,
.pp-preview a {
  color: var(--pp-a, var(--sb-ink));
  text-decoration: none;
  background: none;
}
.pp a:where(:not(.pp-legacy *)):hover,
.pp-overlays a:hover,
.pp-preview a:hover {
  color: var(--pp-a-hover, var(--pp-a, var(--sb-primary-strong))) !important;
}

.pp button:where(:not(.pp-legacy *)),
.pp-overlays button {
  --pp-bw: 0px;
  --pp-bc: transparent;
  margin: 0;
  padding: 0;
  border: var(--pp-bw) solid var(--pp-bc);
  border-radius: 0;
  background: none;
  color: inherit;
  font: inherit;
  letter-spacing: inherit;
  text-align: inherit;
  text-transform: none;
  cursor: pointer;
  -webkit-appearance: none;
  appearance: none;
  -webkit-tap-highlight-color: transparent;
}
.pp button:where(:not(.pp-legacy *)):focus,
.pp-overlays button:focus { border: var(--pp-bw) solid var(--pp-bc); }

.pp button:where(:not(.pp-legacy *)):disabled,
.pp-overlays button:disabled { cursor: not-allowed; }

.pp [hidden]:where(:not(.pp-legacy *)),
.pp-overlays [hidden] { display: none !important; }

/* Semantic <section> is safe: neutralise the header's dark-mode repaint. */
.pp section,
.pp-overlays section { --pp-section-bg: initial; }
body.dark-mode .pp section,
body.dark-mode .pp-overlays section { background-color: var(--pp-section-bg, transparent) !important; }

/* Focus ring for everything outside .sb-page (ds.css covers the root).
   No border-radius here: this (0,3,0) rule would beat every two-class component rule and
   snap round buttons / pills to 8px squares while focused. Outlines follow the element's
   own radius in current browsers. */
.pp-overlays :focus-visible,
.pp-preview :focus-visible,
.pp.sb-page :focus-visible {
  outline: 3px solid var(--pp-focus, var(--sb-primary-strong));
  outline-offset: 3px;
}
.pp-overlays :focus:not(:focus-visible) { outline: none; }

/* Page chrome: keep the footer clear of the booking bar + bottom nav (< 992px). */
@media (max-width: 991.98px) {
  body.pp-body #footer {
    padding-bottom: calc(var(--pp-nav-h, 62px) + var(--pp-bar-h, 68px) + 16px) !important;
  }
}

/* Body scroll lock while a dialog is open. The class must win on its own: site scripts
   reset body.style.overflow = '' behind our back (public_mobile_nav's document-level
   Escape handler fires on every keypress, e.g. Esc inside the gallery viewer). The JS
   still writes the inline style + a padding-right for the scrollbar gap. */
body.pp-body.pp-scroll-locked { overflow: hidden !important; }


/* ==========================================================================
   2. Primitives — block, headings, links, buttons, chips, spinner
   ========================================================================== */

.pp .pp-block { display: block; min-width: 0; }

.pp .pp-block__title,
.pp-overlays .pp-block__title {
  font-family: var(--sb-font-display);
  font-size: var(--sb-t-h3);
  font-weight: var(--sb-w-medium);
  line-height: var(--sb-lh-snug);
  letter-spacing: var(--sb-ls-heading);
  color: var(--sb-ink);
  margin: 0 0 var(--sb-4);
  text-wrap: balance;
}

:is(.pp, .pp-overlays) .pp-link {
  --pp-a: var(--sb-ink);
  --pp-a-hover: var(--sb-primary-strong);
  display: inline-flex;
  align-items: center;
  gap: var(--sb-2);
  min-height: 44px;
  font-size: var(--sb-t-small);
  font-weight: var(--sb-w-medium);
  color: var(--pp-a);
  text-decoration: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: 4px;
  transition: color var(--sb-dur-fast) var(--sb-ease);
}
:is(.pp, .pp-overlays) .pp-link:hover { color: var(--pp-a-hover); }
:is(.pp, .pp-overlays) .pp-link > i { font-size: 12px; transition: transform var(--sb-dur-fast) var(--sb-ease); }
:is(.pp, .pp-overlays) .pp-link[aria-expanded="true"] > i { transform: rotate(180deg); }

:is(.pp, .pp-overlays) .pp-btn {
  --pp-bw: 1px;
  --pp-bc: transparent;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--sb-2);
  min-height: 48px;
  padding: 0 var(--sb-5);
  border: var(--pp-bw) solid var(--pp-bc);
  border-radius: var(--sb-r-sm);
  font-family: var(--sb-font-body);
  font-size: var(--sb-t-small);
  font-weight: var(--sb-w-medium);
  line-height: 1.2;
  letter-spacing: 0.01em;
  text-align: center;
  text-decoration: none;
  white-space: nowrap;
  cursor: pointer;
  transition: background-color var(--sb-dur-fast) var(--sb-ease),
              color var(--sb-dur-fast) var(--sb-ease),
              border-color var(--sb-dur-fast) var(--sb-ease),
              box-shadow var(--sb-dur-fast) var(--sb-ease),
              transform var(--sb-dur-press) var(--sb-ease);
}
:is(.pp, .pp-overlays) .pp-btn:active { transform: scale(0.98); }
:is(.pp, .pp-overlays) .pp-btn:disabled,
:is(.pp, .pp-overlays) .pp-btn[aria-disabled="true"] { opacity: 0.55; cursor: not-allowed; transform: none; }
:is(.pp, .pp-overlays) .pp-btn--block { display: flex; width: 100%; }
:is(.pp, .pp-overlays) .pp-btn--sm { min-height: 44px; padding: 0 var(--sb-4); font-size: var(--sb-t-caption); }

/* --sb-primary-strong: 5.12:1 against white text (AA). */
:is(.pp, .pp-overlays) .pp-btn--primary {
  --pp-a: #fff;
  --pp-a-hover: #fff;
  background: var(--sb-primary-strong);
  color: #fff;
  box-shadow: var(--sb-shadow-1);
}
:is(.pp, .pp-overlays) .pp-btn--primary:hover:not(:disabled) { background: var(--sb-primary-hover); box-shadow: var(--sb-shadow-2); }

:is(.pp, .pp-overlays) .pp-btn--ghost {
  --pp-a: var(--sb-ink);
  --pp-a-hover: var(--sb-ink);
  --pp-bc: var(--sb-border-strong);
  background: transparent;
  color: var(--sb-ink);
}
:is(.pp, .pp-overlays) .pp-btn--ghost:hover:not(:disabled) { --pp-bc: var(--sb-ink); background: var(--sb-surface-2); }

/* On photography / video. Pinned colours: tokens may be inverted around it. */
:is(.pp, .pp-overlays) .pp-btn--onmedia {
  --pp-a: #fff;
  --pp-a-hover: #fff;
  --pp-bc: rgba(255, 255, 255, 0.5);
  background: rgba(20, 16, 14, 0.5);
  color: #fff;
  -webkit-backdrop-filter: blur(8px);
  backdrop-filter: blur(8px);
}
:is(.pp, .pp-overlays) .pp-btn--onmedia:hover:not(:disabled) { --pp-bc: #fff; background: rgba(20, 16, 14, 0.7); }

:is(.pp, .pp-overlays) .pp-chip {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 6px 12px;
  border: 1px solid var(--sb-border);
  border-radius: var(--sb-r-pill);
  background: var(--sb-surface-2);
  color: var(--sb-ink-soft);
  font-size: var(--sb-t-caption);
  font-weight: var(--sb-w-medium);
  line-height: 1.3;
  white-space: nowrap;
}
:is(.pp, .pp-overlays) .pp-chip--ok { color: var(--sb-success); border-color: currentColor; background: transparent; }
:is(.pp, .pp-overlays) .pp-chip--onmedia {
  background: rgba(20, 16, 14, 0.62);
  color: #fff;
  border-color: rgba(255, 255, 255, 0.18);
  -webkit-backdrop-filter: blur(6px);
  backdrop-filter: blur(6px);
}

:is(.pp, .pp-overlays) .pp-spinner {
  display: inline-block;
  flex: none;
  width: 18px;
  height: 18px;
  border: 2px solid currentColor;
  border-right-color: transparent;
  border-radius: 50%;
  animation: pp-spin 0.7s linear infinite;
}
:is(.pp, .pp-overlays) .pp-btn__spinner { display: none; }
:is(.pp, .pp-overlays) .pp-btn[aria-busy="true"] .pp-btn__spinner { display: inline-block; }
:is(.pp, .pp-overlays) .pp-btn[aria-busy="true"] > i { display: none; }
@keyframes pp-spin { to { transform: rotate(360deg); } }


/* ==========================================================================
   3. Actions (share / save)
   ========================================================================== */

.pp .pp-actions { display: inline-flex; align-items: center; gap: var(--sb-2); }

.pp .pp-action {
  --pp-bw: 1px;
  --pp-bc: var(--sb-border);
  --pp-a: var(--sb-ink);
  --pp-a-hover: var(--sb-ink);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--sb-2);
  min-width: 44px;
  min-height: 44px;
  padding: 0 var(--sb-4);
  border: var(--pp-bw) solid var(--pp-bc);
  border-radius: var(--sb-r-pill);
  background: var(--sb-surface);
  color: var(--sb-ink);
  font-size: var(--sb-t-small);
  font-weight: var(--sb-w-medium);
  line-height: 1;
  transition: background-color var(--sb-dur-fast) var(--sb-ease), border-color var(--sb-dur-fast) var(--sb-ease);
}
.pp .pp-action:hover { --pp-bc: var(--sb-border-strong); background: var(--sb-surface-2); }
.pp .pp-action > i { font-size: 15px; }

.pp .pp-actions--dark .pp-action {
  --pp-bc: rgba(255, 255, 255, 0.35);
  --pp-a: #fff;
  --pp-a-hover: #fff;
  background: rgba(20, 16, 14, 0.45);
  color: #fff;
  -webkit-backdrop-filter: blur(8px);
  backdrop-filter: blur(8px);
}
.pp .pp-actions--dark .pp-action:hover { --pp-bc: rgba(255, 255, 255, 0.7); background: rgba(20, 16, 14, 0.65); }

.pp .pp-action .pp-action__on { display: none; color: var(--sb-primary); }
.pp .pp-action[aria-pressed="true"] .pp-action__on { display: inline-block; }
.pp .pp-action[aria-pressed="true"] .pp-action__off { display: none; }
.pp .pp-action[aria-busy="true"] { opacity: 0.6; pointer-events: none; }

@media (max-width: 575.98px) {
  .pp .pp-action { padding: 0; width: 44px; }
  .pp .pp-action .pp-action__label {
    position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0;
    overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
  }
}


/* ==========================================================================
   4. Content blocks
   ========================================================================== */

/* ── Facts ─────────────────────────────────────────────────────────────── */
.pp .pp-facts__list { display: flex; flex-wrap: wrap; gap: var(--sb-3) var(--sb-5); }
.pp .pp-fact { display: inline-flex; align-items: center; gap: var(--sb-2); font-size: var(--sb-t-small); color: var(--sb-muted); }
.pp .pp-fact > i { width: 18px; text-align: center; color: var(--sb-ink-soft); font-size: 14px; }
.pp .pp-fact strong { font-weight: var(--sb-w-bold); color: var(--sb-ink); }

/* ── About + read more ─────────────────────────────────────────────────── */
.pp .pp-about__text { max-width: 68ch; color: var(--sb-text); }
.pp .pp-about__summary,
.pp .pp-about__para { white-space: pre-line; overflow-wrap: anywhere; }
.pp .pp-about__more { margin-top: var(--sb-5); }
.pp .pp-about__subtitle {
  font-size: var(--sb-t-body);
  font-weight: var(--sb-w-bold);
  color: var(--sb-ink);
  margin-bottom: var(--sb-2);
}
.pp .pp-about__toggle { display: none; margin-top: var(--sb-2); }
body.pp-body .pp .pp-about__toggle { display: inline-flex; }

/* Clamp only when JS is on (body.pp-body): without JS the whole text stays readable. */
body.pp-body .pp .pp-readmore:not(.is-open) {
  max-height: 9.6em;                      /* 6 lines at 1.6 */
  overflow: hidden;
  -webkit-mask-image: linear-gradient(to bottom, #000 55%, transparent);
  mask-image: linear-gradient(to bottom, #000 55%, transparent);
}

/* ── Amenities / safety ────────────────────────────────────────────────── */
:is(.pp, .pp-overlays) .pp-amenities__list {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(min(100%, 230px), 1fr));
  gap: var(--sb-1) var(--sb-5);
}
:is(.pp, .pp-overlays) .pp-amenities__list--full { grid-template-columns: repeat(auto-fill, minmax(min(100%, 210px), 1fr)); }
:is(.pp, .pp-overlays) .pp-amenity {
  display: flex;
  align-items: center;
  gap: var(--sb-3);
  min-height: 44px;
  padding: var(--sb-2) 0;
  border-bottom: 1px solid var(--sb-border);
  font-size: var(--sb-t-small);
  color: var(--sb-text);
}
:is(.pp, .pp-overlays) .pp-amenity > i { flex: none; width: 22px; text-align: center; font-size: 16px; color: var(--sb-ink-soft); }
.pp .pp-amenities__all { margin-top: var(--sb-5); }

/* ── Host ──────────────────────────────────────────────────────────────── */
.pp .pp-host__card {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  align-items: center;
  gap: var(--sb-4) var(--sb-5);
  padding: var(--sb-5);
  border: 1px solid var(--sb-border);
  border-radius: var(--sb-r-lg);
  background: var(--sb-surface);
}
.pp .pp-host__avatar { display: block; width: 72px; height: 72px; border-radius: 50%; overflow: hidden; background: var(--sb-surface-3); }
.pp .pp-host__avatar img { display: block; width: 100%; height: 100%; object-fit: cover; }
.pp .pp-host__name { font-size: var(--sb-t-h4); font-weight: var(--sb-w-bold); line-height: var(--sb-lh-heading); color: var(--sb-ink); overflow-wrap: anywhere; }
.pp .pp-host__name a { --pp-a: var(--sb-ink); --pp-a-hover: var(--sb-primary-strong); }
.pp .pp-host__since { font-family: var(--sb-font-meta); font-size: var(--sb-t-small); color: var(--sb-muted); }
.pp .pp-host__badges { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sb-2); margin-top: var(--sb-2); }
.pp .pp-host__level {
  display: inline-flex; align-items: center; gap: 5px;
  padding: 4px 14px;
  border-radius: var(--sb-r-pill);
  background: var(--pp-level, var(--sb-deep));
  color: #fff;
  font-size: var(--sb-t-micro);
  font-weight: var(--sb-w-medium);
}
.pp .pp-host__level > i { font-size: 10px; }
.pp .pp-host__stats {
  grid-column: 1 / -1;
  display: flex;
  flex-wrap: wrap;
  gap: var(--sb-3) var(--sb-6);
  padding-top: var(--sb-4);
  border-top: 1px solid var(--sb-border);
}
.pp .pp-host__stat { display: flex; flex-direction: column-reverse; gap: 2px; }
.pp .pp-host__stat dt { font-family: var(--sb-font-meta); font-size: var(--sb-t-caption); color: var(--sb-muted); }
.pp .pp-host__stat dd { font-size: var(--sb-t-lead); font-weight: var(--sb-w-bold); color: var(--sb-ink); }
.pp .pp-host__stat dd > i { font-size: 14px; color: var(--sb-primary); }
.pp .pp-host__actions { grid-column: 1 / -1; }
@media (max-width: 575.98px) {
  .pp .pp-host__card { padding: var(--sb-4); }
  .pp .pp-host__actions .pp-btn { display: flex; width: 100%; }
}

/* ── Reviews: "New on Softbnb" + token re-skin of partials.property_reviews ── */
.pp .pp-new {
  display: flex;
  align-items: center;
  gap: var(--sb-4);
  padding: var(--sb-4) var(--sb-5);
  border: 1px solid var(--sb-border);
  border-radius: var(--sb-r-md);
  background: var(--sb-surface-2);
}
.pp .pp-new__icon {
  flex: none; display: grid; place-items: center;
  width: 44px; height: 44px; border-radius: 50%;
  background: var(--sb-primary-soft); color: var(--sb-primary-strong); font-size: 17px;
}
.pp .pp-new__text { display: flex; flex-direction: column; gap: 2px; font-size: var(--sb-t-small); color: var(--sb-muted); }
.pp .pp-new__text strong { font-size: var(--sb-t-body); font-weight: var(--sb-w-bold); color: var(--sb-ink); }

/* Three classes: the partial's own rules are (0,1,0) and body.dark-mode ones (0,2,1). */
.pp .pp-reviews .rv-section { padding: 0; }
.pp .pp-reviews .rv-head-title { font-family: var(--sb-font-display); font-size: var(--sb-t-h3); font-weight: var(--sb-w-medium); color: var(--sb-ink); margin: 0; }
.pp .pp-reviews .rv-head-score { background: var(--sb-surface-2); border: 1px solid var(--sb-border); border-radius: var(--sb-r-md); }
.pp .pp-reviews .rv-head-score-num { font-weight: var(--sb-w-bold); color: var(--sb-ink); }
.pp .pp-reviews .rv-head-score-count { font-weight: var(--sb-w-medium); color: var(--sb-muted); }
.pp .pp-reviews .rv-head-score-stars i,
.pp .pp-reviews .rv-stars i.filled { color: var(--sb-primary); }
.pp .pp-reviews .rv-stars i.empty { color: var(--sb-border-strong); }
.pp .pp-reviews .rv-breakdown { background: var(--sb-surface-2); border-color: var(--sb-border); border-radius: var(--sb-r-md); }
.pp .pp-reviews .rv-bar-label { font-weight: var(--sb-w-medium); color: var(--sb-muted); }
.pp .pp-reviews .rv-bar-track { background: var(--sb-surface-3); }
.pp .pp-reviews .rv-bar-fill { background: var(--sb-primary-strong); }
.pp .pp-reviews .rv-bar-score { font-weight: var(--sb-w-bold); color: var(--sb-ink); }
.pp .pp-reviews .rv-card { background: var(--sb-surface); border-color: var(--sb-border); border-radius: var(--sb-r-md); box-shadow: none; transform: none; }
.pp .pp-reviews .rv-card:hover { border-color: var(--sb-border-strong); box-shadow: var(--sb-shadow-1); transform: none; }
.pp .pp-reviews .rv-avatar { border-color: var(--sb-border); }
.pp .pp-reviews .rv-card-name { font-weight: var(--sb-w-bold); color: var(--sb-ink); }
.pp .pp-reviews .rv-card-date { font-family: var(--sb-font-meta); color: var(--sb-muted); }
.pp .pp-reviews .rv-card-msg { font-size: var(--sb-t-small); color: var(--sb-text); }
.pp .pp-reviews .rv-card-readmore { min-height: 44px; font-weight: var(--sb-w-medium); color: var(--sb-primary-strong); }
.pp .pp-reviews .rv-more-btn { background: transparent; border: 1px solid var(--sb-border-strong); border-radius: var(--sb-r-sm); font-weight: var(--sb-w-medium); color: var(--sb-ink); min-height: 48px; }
.pp .pp-reviews .rv-more-btn:hover { background: var(--sb-surface-2); border-color: var(--sb-ink); color: var(--sb-ink) !important; }
.pp .pp-reviews .rv-divider { display: none; }

/* ── Map ───────────────────────────────────────────────────────────────── */
.pp .pp-location__place {
  display: flex; align-items: center; gap: var(--sb-2);
  margin-bottom: var(--sb-4);
  font-size: var(--sb-t-small); color: var(--sb-muted);
}
.pp .pp-location__place > i { color: var(--sb-primary-strong); }
.pp .pp-map {
  position: relative;
  width: 100%;
  aspect-ratio: var(--pp-map-ratio, 16 / 9);
  min-height: 260px;
  max-height: 520px;
  overflow: hidden;
  border: 1px solid var(--sb-border);
  border-radius: var(--sb-r-lg);
  background: var(--sb-surface-3);
  isolation: isolate;
}
.pp .pp-map__canvas { position: absolute; inset: 0; }
.pp .pp-map.is-loading::after {
  content: "";
  position: absolute; inset: 0; z-index: 1;
  background: linear-gradient(100deg, transparent 30%, var(--sb-surface-2) 50%, transparent 70%) var(--sb-surface-3);
  background-size: 200% 100%;
  animation: pp-shimmer 1.4s linear infinite;
}
.pp .pp-map.is-ready::after,
.pp .pp-map.is-failed::after { content: none; }
.pp .pp-map__fallback {
  position: absolute; inset: 0; z-index: 2;
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: var(--sb-2); padding: var(--sb-5);
  text-align: center; font-size: var(--sb-t-small); color: var(--sb-muted);
  background: var(--sb-surface-2);
}
.pp .pp-map__fallback > i { font-size: 24px; }
.pp .pp-location__note {
  display: flex; align-items: flex-start; gap: var(--sb-2);
  margin-top: var(--sb-3);
  font-family: var(--sb-font-meta); font-size: var(--sb-t-caption); color: var(--sb-muted);
}
.pp .pp-location__note > i { margin-top: 3px; }
body.dark-mode .pp .pp-map.is-ready .pp-map__canvas { filter: brightness(0.85) contrast(1.05); }
@keyframes pp-shimmer { to { background-position: -200% 0; } }

/* ── Policies ──────────────────────────────────────────────────────────── */
.pp .pp-policies__grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 240px), 1fr));
  gap: var(--sb-5) var(--sb-6);
}
.pp .pp-policies__title {
  display: flex; align-items: center; gap: var(--sb-2);
  margin-bottom: var(--sb-3);
  font-size: var(--sb-t-body); font-weight: var(--sb-w-bold); color: var(--sb-ink);
}
.pp .pp-policies__title > i { font-size: 14px; color: var(--sb-muted); }
.pp .pp-policies__list { display: grid; gap: var(--sb-2); font-size: var(--sb-t-small); color: var(--sb-muted); }
.pp .pp-policies__list > li { position: relative; padding-left: 18px; }
.pp .pp-policies__list > li::before {
  content: ""; position: absolute; left: 2px; top: 0.62em;
  width: 6px; height: 6px; border-radius: 50%; background: var(--sb-border-strong);
}
.pp .pp-policies__facts { display: grid; gap: var(--sb-2); font-size: var(--sb-t-small); }
.pp .pp-policies__facts > div { display: flex; justify-content: space-between; gap: var(--sb-4); }
.pp .pp-policies__facts dt { color: var(--sb-muted); }
.pp .pp-policies__facts dd { color: var(--sb-ink); font-weight: var(--sb-w-medium); text-align: right; }
.pp .pp-report {
  --pp-a: var(--sb-muted);
  --pp-a-hover: var(--sb-ink);
  display: inline-flex; align-items: center; gap: var(--sb-2);
  min-height: 44px; margin-top: var(--sb-5);
  font-size: var(--sb-t-caption);
  text-decoration: underline; text-underline-offset: 4px;
}

/* ── Rails ─────────────────────────────────────────────────────────────── */
.pp .pp-rail { min-width: 0; }
.pp .pp-rail__head { display: flex; align-items: flex-end; justify-content: space-between; gap: var(--sb-4); margin-bottom: var(--sb-4); }
.pp .pp-rail__head .pp-block__title { margin-bottom: 0; }
.pp .pp-rail__nav { display: flex; gap: var(--sb-2); flex: none; }
.pp .pp-rail__btn {
  --pp-bw: 1px;
  --pp-bc: var(--sb-border-strong);
  display: grid; place-items: center;
  width: 44px; height: 44px;
  border-radius: 50%;
  background: var(--sb-surface);
  color: var(--sb-ink);
  font-size: 13px;
  transition: background-color var(--sb-dur-fast) var(--sb-ease), border-color var(--sb-dur-fast) var(--sb-ease), opacity var(--sb-dur-fast) var(--sb-ease);
}
.pp .pp-rail__btn:hover:not(:disabled) { --pp-bc: var(--sb-ink); background: var(--sb-surface-2); }
.pp .pp-rail__btn:disabled { opacity: 0.35; }
.pp .pp-rail__track {
  display: flex;
  gap: var(--sb-4);
  margin: 0;
  padding: 4px 2px var(--sb-3);
  overflow-x: auto;
  overscroll-behavior-x: contain;
  scroll-snap-type: x proximity;
  scroll-behavior: smooth;
  scrollbar-width: none;
  -webkit-overflow-scrolling: touch;
}
.pp .pp-rail__track::-webkit-scrollbar { display: none; }
.pp .pp-rail__track > * { flex: 0 0 var(--pp-rail-card, 245px); max-width: var(--pp-rail-card, 245px); scroll-snap-align: start; }
/* partials.property_card is a Bootstrap column with a negative-margin card on phones. */
.pp .pp-rail__track > [class*="col-"] { width: auto; margin-bottom: 0; padding-left: 0; padding-right: 0; }
.pp .pp-rail__track .prop-card { width: 100%; margin-left: 0; margin-right: 0; }
@media (max-width: 575.98px) {
  .pp .pp-rail__nav { display: none; }
  .pp .pp-rail__track > * { flex-basis: min(68vw, var(--pp-rail-card, 245px)); max-width: min(68vw, var(--pp-rail-card, 245px)); }
}

/* ── Gallery strip ─────────────────────────────────────────────────────── */
.pp .pp-strip { display: grid; grid-auto-flow: column; grid-auto-columns: minmax(0, 1fr); gap: var(--sb-2); }
.pp .pp-strip__item { min-width: 0; }
.pp .pp-strip__btn {
  position: relative; display: block; width: 100%;
  aspect-ratio: 4 / 3;
  overflow: hidden;
  border-radius: var(--sb-r-sm);
  background: var(--sb-surface-3);
}
.pp .pp-strip__btn img { display: block; width: 100%; height: 100%; object-fit: cover; transition: transform var(--sb-dur-slow) var(--sb-ease-out); }
.pp .pp-strip__more {
  position: absolute; inset: 0; display: grid; place-items: center;
  background: rgba(20, 16, 14, 0.58); color: #fff;
  font-size: var(--sb-t-h4); font-weight: var(--sb-w-bold);
}
@media (hover: hover) and (pointer: fine) {
  .pp .pp-strip__btn:hover img { transform: scale(1.04); }
}
@media (max-width: 575.98px) {
  .pp .pp-strip { grid-auto-columns: 38vw; overflow-x: auto; scrollbar-width: none; }
  .pp .pp-strip::-webkit-scrollbar { display: none; }
}


/* ==========================================================================
   5. Booking — one structure, five variants (variants adjust layout only)

      form.pp-booking.pp-booking--{card|bar|tile|desk|sheet}
        .pp-booking__head      price + rating
        .pp-booking__min       minimum-stay note (optional)
        .pp-booking__fields    dates button, calendar popover slot, guests stepper
        .pp-booking__calendar  inline calendar (desk, sheet)
        .pp-booking__line      one-line quote summary
        .pp-booking__loading   spinner row
        .pp-quote              price breakdown
        .pp-status             unavailable / minimum stay / errors
        .pp-booking__actions   submit + reassurance, or the blocked reason
        .pp-booking__foot      cancellation line + link
   ========================================================================== */

:is(.pp, .pp-overlays) .pp-booking {
  --pp-booking-bg: var(--sb-surface);
  --pp-booking-border: var(--sb-border);
  --pp-booking-radius: var(--sb-r-lg);
  --pp-booking-shadow: var(--sb-shadow-2);
  --pp-booking-pad: var(--sb-5);
  --pp-field-bg: var(--sb-surface);
  --pp-field-border: var(--sb-border-strong);
  position: relative;
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: var(--sb-4);
  margin: 0;
  padding: var(--pp-booking-pad);
  border: 1px solid var(--pp-booking-border);
  border-radius: var(--pp-booking-radius);
  background: var(--pp-booking-bg);
  box-shadow: var(--pp-booking-shadow);
  color: var(--sb-text);
  font-size: var(--sb-t-small);
}

:is(.pp, .pp-overlays) .pp-booking__head { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: var(--sb-1) var(--sb-4); }
:is(.pp, .pp-overlays) .pp-booking__price { display: flex; align-items: baseline; gap: 6px; color: var(--sb-ink); }
:is(.pp, .pp-overlays) .pp-booking__amount { font-size: var(--sb-t-h2); font-weight: var(--sb-w-bold); line-height: 1.1; letter-spacing: var(--sb-ls-tight); }
:is(.pp, .pp-overlays) .pp-booking__unit { font-family: var(--sb-font-meta); font-size: var(--sb-t-small); color: var(--sb-muted); }
:is(.pp, .pp-overlays) .pp-booking__rating { display: inline-flex; align-items: center; gap: 6px; font-size: var(--sb-t-caption); font-weight: var(--sb-w-medium); color: var(--sb-ink-soft); }
:is(.pp, .pp-overlays) .pp-booking__rating > i { font-size: 12px; color: var(--sb-primary); }

:is(.pp, .pp-overlays) .pp-booking__min {
  display: flex; align-items: center; gap: var(--sb-2);
  padding: var(--sb-2) var(--sb-3);
  border-radius: var(--sb-r-sm);
  background: var(--sb-surface-2);
  font-size: var(--sb-t-caption); color: var(--sb-ink-soft);
}

:is(.pp, .pp-overlays) .pp-booking__fields {
  position: relative;
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  border: 1px solid var(--pp-field-border);
  border-radius: var(--sb-r-md);
  background: var(--pp-field-bg);
}
:is(.pp, .pp-overlays) .pp-booking__dates {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
  align-items: center;
  gap: var(--sb-2);
  width: 100%;
  min-height: 60px;
  padding: var(--sb-2) var(--sb-4);
  border-radius: var(--sb-r-md) var(--sb-r-md) 0 0;
  text-align: left;
  transition: background-color var(--sb-dur-fast) var(--sb-ease);
}
:is(.pp, .pp-overlays) .pp-booking__dates:hover,
:is(.pp, .pp-overlays) .pp-booking__dates[aria-expanded="true"] { background: var(--sb-surface-2); }
:is(.pp, .pp-overlays) .pp-booking__date { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
:is(.pp, .pp-overlays) .pp-booking__date-sep { color: var(--sb-muted-2); font-size: 11px; }
:is(.pp, .pp-overlays) .pp-booking__label {
  font-size: var(--sb-t-micro);
  font-weight: var(--sb-w-medium);
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--sb-muted);
}
:is(.pp, .pp-overlays) .pp-booking__value {
  font-size: var(--sb-t-small); font-weight: var(--sb-w-medium); color: var(--sb-ink);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
:is(.pp, .pp-overlays) .pp-booking__value.is-empty { font-weight: var(--sb-w-normal); color: var(--sb-muted); }

:is(.pp, .pp-overlays) .pp-booking__guests {
  display: flex; align-items: center; justify-content: space-between; gap: var(--sb-3);
  min-height: 60px;
  padding: var(--sb-2) var(--sb-3) var(--sb-2) var(--sb-4);
  border-top: 1px solid var(--pp-field-border);
}
:is(.pp, .pp-overlays) .pp-booking__guests-text { display: flex; flex-direction: column; gap: 2px; }
:is(.pp, .pp-overlays) .pp-booking__hint { font-family: var(--sb-font-meta); font-size: var(--sb-t-caption); color: var(--sb-muted); }

:is(.pp, .pp-overlays) .pp-stepper { display: inline-flex; align-items: center; gap: var(--sb-1); }
:is(.pp, .pp-overlays) .pp-stepper__btn {
  --pp-bw: 1px;
  --pp-bc: var(--sb-border-strong);
  display: grid; place-items: center;
  width: 44px; height: 44px;
  border-radius: 50%;
  color: var(--sb-ink);
  font-size: 12px;
  transition: border-color var(--sb-dur-fast) var(--sb-ease), background-color var(--sb-dur-fast) var(--sb-ease), opacity var(--sb-dur-fast) var(--sb-ease);
}
:is(.pp, .pp-overlays) .pp-stepper__btn:hover:not(:disabled) { --pp-bc: var(--sb-ink); background: var(--sb-surface-2); }
:is(.pp, .pp-overlays) .pp-stepper__btn:disabled { opacity: 0.3; }
:is(.pp, .pp-overlays) .pp-stepper__value { min-width: 28px; text-align: center; font-size: var(--sb-t-body); font-weight: var(--sb-w-medium); color: var(--sb-ink); }

/* The quote summary row grows and shrinks rather than appearing outright, so the
   bar resizes smoothly when dates are picked or cleared. When collapsed it also
   pulls back the grid row-gap it would otherwise leave behind, so an empty bar
   is exactly as tall as it was before this row existed. */
:is(.pp, .pp-overlays) .pp-booking__line {
  font-size: var(--sb-t-small);
  font-weight: var(--sb-w-medium);
  color: var(--sb-ink);
  overflow: hidden;
  max-height: 2.4em;
  opacity: 1;
  transition: max-height var(--sb-dur) var(--sb-ease-out),
              opacity var(--sb-dur-fast) var(--sb-ease-out),
              margin-block-start var(--sb-dur) var(--sb-ease-out);
}
:is(.pp, .pp-overlays) .pp-booking__line.is-collapsed {
  max-height: 0;
  opacity: 0;
  margin-block-start: calc(var(--sb-2) * -1);
  pointer-events: none;
}
@media (prefers-reduced-motion: reduce) {
  :is(.pp, .pp-overlays) .pp-booking__line { transition: none; }
}
:is(.pp, .pp-overlays) .pp-booking__loading { display: flex; align-items: center; gap: var(--sb-2); font-size: var(--sb-t-caption); color: var(--sb-muted); }
:is(.pp, .pp-overlays) .pp-booking__loading .pp-spinner { width: 14px; height: 14px; }

/* Quote */
:is(.pp, .pp-overlays) .pp-quote { display: grid; gap: var(--sb-2); font-size: var(--sb-t-small); }
:is(.pp, .pp-overlays) .pp-quote__row { display: flex; align-items: baseline; justify-content: space-between; gap: var(--sb-4); color: var(--sb-text); }
:is(.pp, .pp-overlays) .pp-quote__label { color: var(--sb-muted); }
:is(.pp, .pp-overlays) .pp-quote__value { font-variant-numeric: tabular-nums; text-align: right; white-space: nowrap; }
:is(.pp, .pp-overlays) .pp-quote__row--discount .pp-quote__value { color: var(--sb-success); }
:is(.pp, .pp-overlays) .pp-quote__row--total {
  margin-top: var(--sb-1); padding-top: var(--sb-3);
  border-top: 1px solid var(--sb-border);
  font-size: var(--sb-t-body); font-weight: var(--sb-w-bold); color: var(--sb-ink);
}
:is(.pp, .pp-overlays) .pp-quote__row--total .pp-quote__label { color: var(--sb-ink); }
:is(.pp, .pp-overlays) .pp-quote__row--deposit { font-size: var(--sb-t-caption); }
:is(.pp, .pp-overlays) .pp-quote__note { font-family: var(--sb-font-meta); font-size: var(--sb-t-micro); line-height: 1.45; color: var(--sb-muted); }

/* Status */
:is(.pp, .pp-overlays) .pp-status:empty { display: none; }
:is(.pp, .pp-overlays) .pp-status {
  display: flex; flex-direction: column; gap: 2px;
  padding: var(--sb-3) var(--sb-4);
  border: 1px solid var(--sb-border);
  border-left-width: 3px;
  border-radius: var(--sb-r-sm);
  background: var(--sb-surface-2);
  font-size: var(--sb-t-caption); line-height: 1.45; color: var(--sb-text);
}
:is(.pp, .pp-overlays) .pp-status strong { font-size: var(--sb-t-small); font-weight: var(--sb-w-bold); color: var(--sb-ink); }
:is(.pp, .pp-overlays) .pp-status--error { border-left-color: var(--sb-error); }
:is(.pp, .pp-overlays) .pp-status--error strong { color: var(--sb-error); }
:is(.pp, .pp-overlays) .pp-status--warn { border-left-color: var(--sb-warning); }
:is(.pp, .pp-overlays) .pp-status--warn strong { color: var(--sb-warning); }

/* Actions + foot */
:is(.pp, .pp-overlays) .pp-booking__actions { display: grid; gap: var(--sb-2); }
:is(.pp, .pp-overlays) .pp-booking__submit { min-height: 52px; font-size: var(--sb-t-body); }
:is(.pp, .pp-overlays) .pp-booking__note {
  display: flex; align-items: center; justify-content: center; gap: 6px;
  font-family: var(--sb-font-meta); font-size: var(--sb-t-caption); color: var(--sb-muted); text-align: center;
}
:is(.pp, .pp-overlays) .pp-booking__note > i { font-size: 11px; }
:is(.pp, .pp-overlays) .pp-booking__blocked {
  display: flex; align-items: flex-start; gap: var(--sb-3);
  padding: var(--sb-4);
  border: 1px solid var(--sb-border);
  border-left: 3px solid var(--sb-warning);
  border-radius: var(--sb-r-sm);
  background: var(--sb-surface-2);
}
:is(.pp, .pp-overlays) .pp-booking__blocked--kyc { border-left-color: var(--sb-error); }
:is(.pp, .pp-overlays) .pp-booking__blocked > i { margin-top: 3px; font-size: 17px; color: var(--sb-warning); }
:is(.pp, .pp-overlays) .pp-booking__blocked--kyc > i { color: var(--sb-error); }
:is(.pp, .pp-overlays) .pp-booking__blocked-title { font-size: var(--sb-t-small); font-weight: var(--sb-w-bold); color: var(--sb-ink); }
:is(.pp, .pp-overlays) .pp-booking__blocked-text { margin-top: 2px; font-size: var(--sb-t-caption); color: var(--sb-muted); }
:is(.pp, .pp-overlays) .pp-booking__blocked .pp-btn { margin-top: var(--sb-3); }
:is(.pp, .pp-overlays) .pp-booking__foot {
  display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 0 var(--sb-4);
  padding-top: var(--sb-3);
  border-top: 1px solid var(--sb-border);
}
:is(.pp, .pp-overlays) .pp-booking__cancel { display: flex; align-items: flex-start; gap: var(--sb-2); font-size: var(--sb-t-caption); color: var(--sb-muted); }
:is(.pp, .pp-overlays) .pp-booking__cancel > i { margin-top: 3px; color: var(--sb-success); }
:is(.pp, .pp-overlays) .pp-booking__cancel strong { display: block; font-weight: var(--sb-w-medium); color: var(--sb-ink); }
:is(.pp, .pp-overlays) .pp-booking__cancel-short { display: block; }
:is(.pp, .pp-overlays) .pp-booking__foot .pp-link { font-size: var(--sb-t-caption); }

/* ── Variant: tile (Bento) — quieter chrome, fills its cell ─────────────── */
.pp .pp-booking--tile { --pp-booking-shadow: none; --pp-booking-pad: var(--sb-4); height: 100%; align-content: start; }

/* ── Variant: sheet (phone) — the dialog is the surface ─────────────────── */
.pp-overlays .pp-booking--sheet { --pp-booking-shadow: none; --pp-booking-pad: 0; --pp-booking-bg: transparent; border: 0; border-radius: 0; }
.pp-overlays .pp-booking--sheet .pp-booking__actions {
  position: sticky; bottom: 0; z-index: 2;
  order: 2;
  margin: 0 calc(var(--pp-body-pad, var(--sb-4)) * -1);
  padding: var(--sb-3) var(--pp-body-pad, var(--sb-4)) max(var(--sb-3), env(safe-area-inset-bottom));
  border-top: 1px solid var(--sb-border);
  background: var(--sb-bg);
}
.pp-overlays .pp-booking--sheet .pp-booking__foot { order: 1; border-top: 0; padding-top: 0; }

/* ── Variant: desk (Booking Desk) — calendar beside the summary ─────────── */
@media (min-width: 992px) {
  .pp .pp-booking--desk {
    grid-template-columns: minmax(0, 1.35fr) minmax(300px, 1fr);
    column-gap: var(--sb-6);
    align-items: start;
  }
  .pp .pp-booking--desk > * { grid-column: 2; }
  .pp .pp-booking--desk > .pp-booking__calendar { grid-column: 1; grid-row: 1 / span 9; align-self: stretch; }
}

/* ── Variant: bar (hero bar) — one row from 992px, a card below ─────────── */
@media (min-width: 992px) {
  .pp .pp-booking--bar {
    --pp-booking-pad: var(--sb-3) var(--sb-3) var(--sb-3) var(--sb-5);
    grid-template-columns: auto minmax(0, 1fr) auto;
    align-items: center;
    gap: var(--sb-2) var(--sb-5);
  }
  .pp .pp-booking--bar .pp-booking__head { flex-direction: column; align-items: flex-start; gap: 2px; }
  .pp .pp-booking--bar .pp-booking__fields { grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr); }
  .pp .pp-booking--bar .pp-booking__dates { border-radius: var(--sb-r-md) 0 0 var(--sb-r-md); }
  .pp .pp-booking--bar .pp-booking__guests { border-top: 0; border-left: 1px solid var(--pp-field-border); }
  .pp .pp-booking--bar .pp-booking__actions { grid-column: 3; grid-row: 1; }
  .pp .pp-booking--bar .pp-booking__submit { min-width: 200px; min-height: 60px; }
  .pp .pp-booking--bar .pp-booking__min,
  .pp .pp-booking--bar .pp-booking__note,
  .pp .pp-booking--bar .pp-quote,
  .pp .pp-booking--bar .pp-booking__foot { display: none; }
  .pp .pp-booking--bar .pp-booking__line,
  .pp .pp-booking--bar .pp-booking__loading,
  .pp .pp-booking--bar .pp-status,
  .pp .pp-booking--bar .pp-booking__blocked { grid-column: 1 / -1; }
  .pp .pp-booking--bar .pp-booking__actions:has(.pp-booking__blocked) { grid-column: 1 / -1; grid-row: auto; }
}


/* ==========================================================================
   6. Calendar (markup generated by js/property-page.js — see the header)
   ========================================================================== */

:is(.pp, .pp-overlays) .pp-cal {
  --pp-cal-cell: 44px;
  --pp-cal-accent: var(--sb-primary-strong);
  --pp-cal-accent-ink: #fff;
  --pp-cal-range: var(--sb-primary-soft);
  display: grid;
  gap: var(--sb-3);
  position: relative;
  color: var(--sb-text);
  font-size: var(--sb-t-small);
  user-select: none;
  -webkit-user-select: none;
}
:is(.pp, .pp-overlays) .pp-cal__head {
  position: absolute; top: 0; left: 0; right: 0;
  display: flex; justify-content: space-between;
  pointer-events: none;
}
:is(.pp, .pp-overlays) .pp-cal__nav {
  display: grid; place-items: center;
  width: 44px; height: 44px;
  border-radius: 50%;
  color: var(--sb-ink);
  font-size: 13px;
  pointer-events: auto;
  transition: background-color var(--sb-dur-fast) var(--sb-ease), opacity var(--sb-dur-fast) var(--sb-ease);
}
:is(.pp, .pp-overlays) .pp-cal__nav:hover:not(:disabled) { background: var(--sb-surface-2); }
:is(.pp, .pp-overlays) .pp-cal__nav:disabled { opacity: 0.3; }

:is(.pp, .pp-overlays) .pp-cal__months {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr));
  gap: var(--sb-5) var(--sb-6);
}
:is(.pp, .pp-overlays) .pp-cal__month { min-width: 0; }
:is(.pp, .pp-overlays) .pp-cal__title {
  display: grid; place-items: center;
  height: 44px; margin: 0 44px var(--sb-1);
  font-size: var(--sb-t-small); font-weight: var(--sb-w-bold); color: var(--sb-ink);
  text-align: center;
}
/* role=grid > role=row (.pp-cal__row, one per week) > 7 gridcells (pads + day buttons). */
:is(.pp, .pp-overlays) .pp-cal__dow,
:is(.pp, .pp-overlays) .pp-cal__row { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); }
:is(.pp, .pp-overlays) .pp-cal__dow {
  margin-bottom: var(--sb-1);
  font-family: var(--sb-font-meta); font-size: var(--sb-t-micro); color: var(--sb-muted);
  text-align: center;
}
:is(.pp, .pp-overlays) .pp-cal__dow > * { padding: var(--sb-1) 0; }
:is(.pp, .pp-overlays) .pp-cal__grid { display: grid; grid-template-columns: minmax(0, 1fr); row-gap: 2px; }
:is(.pp, .pp-overlays) .pp-cal__pad { min-height: var(--pp-cal-cell); }

:is(.pp, .pp-overlays) .pp-cal__day {
  position: relative;
  isolation: isolate;
  display: grid; place-items: center;
  width: 100%;
  min-height: var(--pp-cal-cell);
  border-radius: 0;
  font-size: var(--sb-t-small);
  font-variant-numeric: tabular-nums;
  color: var(--sb-ink);
}
/* ::before = the range band, ::after = the round marker (hover, today, start / end). */
:is(.pp, .pp-overlays) .pp-cal__day::before,
:is(.pp, .pp-overlays) .pp-cal__day::after { content: ""; position: absolute; z-index: -1; pointer-events: none; }
:is(.pp, .pp-overlays) .pp-cal__day::before { inset: 3px 0; }
:is(.pp, .pp-overlays) .pp-cal__day::after {
  top: 50%; left: 50%;
  width: min(100%, var(--pp-cal-cell)); height: min(100%, var(--pp-cal-cell));
  max-width: 42px; max-height: 42px;
  transform: translate(-50%, -50%);
  border: 1px solid transparent;
  border-radius: 50%;
  transition: background-color var(--sb-dur-fast) var(--sb-ease), border-color var(--sb-dur-fast) var(--sb-ease);
}
@media (hover: hover) and (pointer: fine) {
  :is(.pp, .pp-overlays) .pp-cal__day:hover:not(:disabled)::after { border-color: var(--sb-ink); }
}
:is(.pp, .pp-overlays) .pp-cal__day.is-today { font-weight: var(--sb-w-bold); }
:is(.pp, .pp-overlays) .pp-cal__day.is-today::after { border-color: var(--sb-border-strong); }
:is(.pp, .pp-overlays) .pp-cal__day.is-focus::after { border-color: var(--sb-ink); }

:is(.pp, .pp-overlays) .pp-cal__day.is-inrange::before { background: var(--pp-cal-range); }
/* Half bands under the end caps — only once a full range exists. */
:is(.pp, .pp-overlays) .pp-cal:has(.is-end) .pp-cal__day.is-start::before { left: 50%; background: var(--pp-cal-range); }
:is(.pp, .pp-overlays) .pp-cal:has(.is-start) .pp-cal__day.is-end::before { right: 50%; background: var(--pp-cal-range); }
:is(.pp, .pp-overlays) .pp-cal__day.is-start.is-end::before { background: none; }

:is(.pp, .pp-overlays) .pp-cal__day.is-start,
:is(.pp, .pp-overlays) .pp-cal__day.is-end { color: var(--pp-cal-accent-ink); font-weight: var(--sb-w-bold); }
:is(.pp, .pp-overlays) .pp-cal__day.is-start::after,
:is(.pp, .pp-overlays) .pp-cal__day.is-end::after { background: var(--pp-cal-accent); border-color: var(--pp-cal-accent); }

:is(.pp, .pp-overlays) .pp-cal__day.is-disabled,
:is(.pp, .pp-overlays) .pp-cal__day.is-blocked { color: var(--sb-muted-2); opacity: 0.55; cursor: not-allowed; }
:is(.pp, .pp-overlays) .pp-cal__day.is-blocked { text-decoration: line-through; }
:is(.pp, .pp-overlays) .pp-cal__day.is-disabled::after,
:is(.pp, .pp-overlays) .pp-cal__day.is-blocked::after { border-color: transparent; }

:is(.pp, .pp-overlays) .pp-cal__legend { display: flex; flex-wrap: wrap; gap: var(--sb-2) var(--sb-4); font-size: var(--sb-t-micro); color: var(--sb-muted); }
:is(.pp, .pp-overlays) .pp-cal__legend-item { display: inline-flex; align-items: center; gap: 6px; }
:is(.pp, .pp-overlays) .pp-cal__swatch { width: 12px; height: 12px; border-radius: 50%; border: 1px solid var(--sb-border-strong); }
:is(.pp, .pp-overlays) .pp-cal__swatch--selected { background: var(--pp-cal-accent); border-color: var(--pp-cal-accent); }
:is(.pp, .pp-overlays) .pp-cal__swatch--blocked { background: var(--sb-surface-3); position: relative; }
:is(.pp, .pp-overlays) .pp-cal__swatch--blocked::after { content: ""; position: absolute; left: -2px; right: -2px; top: 50%; height: 1px; background: var(--sb-muted-2); }

:is(.pp, .pp-overlays) .pp-cal__foot { display: flex; align-items: center; justify-content: space-between; gap: var(--sb-3); min-height: 44px; }
:is(.pp, .pp-overlays) .pp-cal__hint { font-family: var(--sb-font-meta); font-size: var(--sb-t-caption); color: var(--sb-muted); }
:is(.pp, .pp-overlays) .pp-cal__clear {
  min-height: 44px; padding: 0 var(--sb-2);
  font-size: var(--sb-t-caption); font-weight: var(--sb-w-medium); color: var(--sb-ink);
  text-decoration: underline; text-underline-offset: 4px;
}

/* Floating panel (card / bar / tile). Anchored to .pp-booking__fields. */
.pp .pp-cal__popover {
  position: absolute;
  z-index: 40;
  top: calc(100% + var(--sb-2));
  right: 0;
  width: max-content;
  min-width: 100%;
  max-width: min(700px, calc(100vw - 48px));
  padding: var(--sb-5);
  border: 1px solid var(--sb-border);
  border-radius: var(--sb-r-lg);
  background: var(--sb-surface);
  box-shadow: var(--sb-shadow-3);
  animation: pp-pop var(--sb-dur) var(--sb-ease-out);
}
.pp .pp-cal__popover .pp-cal { width: min(640px, calc(100vw - 96px)); }
.pp .pp-cal__popover--left { right: auto; left: 0; }
.pp .pp-cal__popover--up { top: auto; bottom: calc(100% + var(--sb-2)); }
@keyframes pp-pop { from { opacity: 0; transform: translateY(6px); } }

/* Inline (desk, sheet) */
:is(.pp, .pp-overlays) .pp-booking__calendar { min-width: 0; }
:is(.pp, .pp-overlays) .pp-booking__calendar:empty { min-height: 320px; border-radius: var(--sb-r-md); background: var(--sb-surface-2); }


/* ==========================================================================
   7. Dialogs
   ========================================================================== */

.pp-overlays .pp-dialog {
  --pp-dialog-w: 560px;
  position: fixed;
  inset: 0;
  width: min(var(--pp-dialog-w), calc(100vw - 32px));
  max-width: none;
  height: fit-content;
  max-height: min(86vh, 820px);
  max-height: min(86dvh, 820px);
  margin: auto;
  padding: 0;
  border: 1px solid var(--sb-border);
  border-radius: var(--sb-r-lg);
  background: var(--sb-bg);
  color: var(--sb-text);
  box-shadow: var(--sb-shadow-3);
  overflow: hidden;
}
.pp-overlays .pp-dialog[open] { display: flex; animation: pp-dialog-in var(--sb-dur) var(--sb-ease-out); }
/* Fallback when HTMLDialogElement.showModal is missing: js/property-page.js sets [open] + .is-open
   and inserts a sibling .pp-backdrop. No top layer there, so the stacking is done by hand. */
.pp-overlays .pp-dialog.is-open { display: flex; z-index: 2147482000; }
.pp-overlays .pp-backdrop { position: fixed; inset: 0; z-index: 2147481999; background: rgba(12, 9, 8, 0.62); }
.pp-overlays .pp-dialog::backdrop { background: rgba(12, 9, 8, 0.62); animation: pp-fade var(--sb-dur) var(--sb-ease); }
@keyframes pp-dialog-in { from { opacity: 0; transform: translateY(12px) scale(0.985); } }
@keyframes pp-fade { from { opacity: 0; } }

.pp-dialog .pp-dialog__panel { position: relative; display: flex; flex-direction: column; flex: 1 1 auto; min-width: 0; min-height: 0; max-height: inherit; }
.pp-dialog .pp-dialog__head {
  position: relative;
  flex: none;
  display: flex; align-items: center; justify-content: space-between; gap: var(--sb-4);
  padding: var(--sb-4) var(--sb-4) var(--sb-4) var(--sb-5);
  border-bottom: 1px solid var(--sb-border);
}
.pp-dialog .pp-dialog__title {
  display: flex; flex-wrap: wrap; align-items: baseline; gap: 2px var(--sb-3);
  min-width: 0;
  font-family: var(--sb-font-display);
  font-size: var(--sb-t-lead); font-weight: var(--sb-w-medium); letter-spacing: var(--sb-ls-heading);
  color: var(--sb-ink);
}
.pp-dialog .pp-dialog__count { font-family: var(--sb-font-meta); font-size: var(--sb-t-caption); font-weight: var(--sb-w-quiet); color: var(--sb-muted); }
.pp-dialog .pp-dialog__close {
  flex: none;
  display: grid; place-items: center;
  width: 44px; height: 44px;
  border-radius: 50%;
  color: var(--sb-ink);
  font-size: 16px;
  transition: background-color var(--sb-dur-fast) var(--sb-ease);
}
.pp-dialog .pp-dialog__close:hover { background: var(--sb-surface-2); }
.pp-dialog .pp-dialog__close--onmedia { color: #fff; }
.pp-dialog .pp-dialog__close--onmedia:hover { background: rgba(255, 255, 255, 0.14); }
.pp-dialog .pp-dialog__body {
  --pp-body-pad: var(--sb-5);
  flex: 1 1 auto; min-height: 0;
  padding: var(--pp-body-pad);
  overflow-y: auto;
  overscroll-behavior: contain;
  -webkit-overflow-scrolling: touch;
}
.pp-dialog .pp-dialog__subtitle { margin: var(--sb-5) 0 var(--sb-2); font-size: var(--sb-t-body); font-weight: var(--sb-w-bold); color: var(--sb-ink); }
.pp-dialog .pp-dialog__subtitle:first-child { margin-top: 0; }
.pp-dialog .pp-dialog__empty { font-size: var(--sb-t-small); color: var(--sb-muted); }

/* Sizes */
.pp-overlays .pp-dialog--amenities { --pp-dialog-w: 720px; }
.pp-overlays .pp-dialog--booking-sheet { --pp-dialog-w: 520px; }
.pp-overlays .pp-dialog--gallery {
  width: 100vw; height: 100vh; height: 100dvh;
  max-height: none;
  border: 0; border-radius: 0;
  animation-name: pp-fade;
}

/* Phones: every dialog except the gallery becomes a bottom sheet with a handle. */
@media (max-width: 767.98px) {
  .pp-overlays .pp-dialog:not(.pp-dialog--gallery) {
    inset: auto 0 0 0;
    width: 100%;
    max-height: 92vh; max-height: 92dvh;
    margin: 0;
    border-width: 1px 0 0;
    border-radius: var(--sb-r-xl) var(--sb-r-xl) 0 0;
  }
  .pp-overlays .pp-dialog:not(.pp-dialog--gallery)[open] { animation-name: pp-sheet-in; }
  .pp-dialog:not(.pp-dialog--gallery) .pp-dialog__head { padding-top: var(--sb-5); }
  .pp-dialog:not(.pp-dialog--gallery) .pp-dialog__head::before {
    content: "";
    position: absolute; top: 8px; left: 50%;
    width: 40px; height: 4px; margin-left: -20px;
    border-radius: var(--sb-r-pill);
    background: var(--sb-border-strong);
  }
  .pp-dialog:not(.pp-dialog--gallery) .pp-dialog__body { --pp-body-pad: var(--sb-4); padding-bottom: max(var(--sb-4), env(safe-area-inset-bottom)); }
  .pp-overlays .pp-dialog--booking-sheet { height: 92vh; height: 92dvh; }
  .pp-dialog.pp-dialog--booking-sheet .pp-dialog__body { padding-bottom: 0; }
}
@keyframes pp-sheet-in { from { transform: translateY(100%); } }

/* ── Gallery ───────────────────────────────────────────────────────────── */
.pp-dialog .pp-gallery { display: grid; grid-template-columns: minmax(0, 1fr); grid-template-rows: minmax(0, 1fr); gap: 0; padding: 0; overflow: hidden; }
.pp-dialog .pp-gallery--areas { grid-template-columns: 240px minmax(0, 1fr); }
.pp-dialog .pp-gallery__areas {
  display: flex; flex-direction: column; gap: 2px;
  padding: var(--sb-4);
  border-right: 1px solid var(--sb-border);
  overflow-y: auto;
}
.pp-dialog .pp-gallery__area {
  display: flex; align-items: center; justify-content: space-between; gap: var(--sb-3);
  width: 100%; min-height: 44px;
  padding: var(--sb-2) var(--sb-3);
  border-radius: var(--sb-r-sm);
  font-size: var(--sb-t-small); color: var(--sb-muted);
  transition: background-color var(--sb-dur-fast) var(--sb-ease), color var(--sb-dur-fast) var(--sb-ease);
}
.pp-dialog .pp-gallery__area:hover { background: var(--sb-surface-2); color: var(--sb-ink); }
.pp-dialog .pp-gallery__area.is-active { background: var(--sb-surface-2); color: var(--sb-ink); font-weight: var(--sb-w-medium); }
.pp-dialog .pp-gallery__area-count { font-family: var(--sb-font-meta); font-size: var(--sb-t-micro); color: var(--sb-muted); }
.pp-dialog .pp-gallery__main {
  min-height: 0;
  padding: var(--sb-5) max(var(--sb-5), calc((100% - 1100px) / 2)) var(--sb-8);
  overflow-y: auto;
  overscroll-behavior: contain;
  scroll-behavior: smooth;
}
.pp-dialog .pp-gallery__section + .pp-gallery__section { margin-top: var(--sb-7); }
.pp-dialog .pp-gallery__section { scroll-margin-top: var(--sb-4); }
.pp-dialog .pp-gallery__heading { margin-bottom: var(--sb-3); font-size: var(--sb-t-h4); font-weight: var(--sb-w-medium); color: var(--sb-ink); }
.pp-dialog .pp-gallery__grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--sb-2); }
/* Editorial rhythm: every third photo spans the row; a lone last photo spans too. */
.pp-dialog .pp-gallery__grid > :nth-child(3n + 1),
.pp-dialog .pp-gallery__grid > :nth-child(3n + 2):last-child { grid-column: 1 / -1; }
.pp-dialog .pp-gallery__grid--one { grid-template-columns: minmax(0, 1fr); }
.pp-dialog .pp-gallery__thumb {
  position: relative; display: block; width: 100%;
  aspect-ratio: 4 / 3;
  overflow: hidden;
  border-radius: var(--sb-r-sm);
  background: var(--sb-surface-3);
  cursor: zoom-in;
}
.pp-dialog .pp-gallery__grid > .pp-gallery__thumb:nth-child(3n + 1),
.pp-dialog .pp-gallery__grid > .pp-gallery__thumb:nth-child(3n + 2):last-child { aspect-ratio: 16 / 9; }
.pp-dialog .pp-gallery__thumb img { display: block; width: 100%; height: 100%; object-fit: cover; transition: transform var(--sb-dur-slow) var(--sb-ease-out), opacity var(--sb-dur-fast) var(--sb-ease); }
@media (hover: hover) and (pointer: fine) {
  .pp-dialog .pp-gallery__thumb:hover img { transform: scale(1.03); opacity: 0.92; }
}
.pp-dialog .pp-gallery__empty { padding: var(--sb-7) 0; text-align: center; color: var(--sb-muted); }
@media (max-width: 767.98px) {
  .pp-dialog .pp-gallery--areas { grid-template-columns: minmax(0, 1fr); grid-template-rows: auto minmax(0, 1fr); }
  .pp-dialog .pp-gallery__areas {
    flex-direction: row; gap: var(--sb-2);
    padding: var(--sb-2) var(--sb-4);
    border-right: 0; border-bottom: 1px solid var(--sb-border);
    overflow-x: auto; overflow-y: hidden;
    scrollbar-width: none;
  }
  .pp-dialog .pp-gallery__areas::-webkit-scrollbar { display: none; }
  .pp-dialog .pp-gallery__area { --pp-bw: 1px; --pp-bc: var(--sb-border); width: auto; flex: none; border-radius: var(--sb-r-pill); padding: 0 var(--sb-4); white-space: nowrap; }
  .pp-dialog .pp-gallery__area.is-active { --pp-bc: var(--sb-ink); }
  .pp-dialog .pp-gallery__main { padding: var(--sb-4) var(--sb-4) var(--sb-7); }
  .pp-dialog .pp-gallery__grid { grid-template-columns: minmax(0, 1fr); }
  .pp-dialog .pp-gallery__grid > .pp-gallery__thumb:nth-child(n) { aspect-ratio: 4 / 3; }
}

/* ── Viewer (always dark: pinned colours) ──────────────────────────────── */
.pp-dialog .pp-viewer {
  position: absolute; inset: 0; z-index: 5;
  display: flex; flex-direction: column;
  background: #0c0908;
  color: #fff;
}
.pp-dialog .pp-viewer__bar {
  flex: none;
  display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; gap: var(--sb-3);
  padding: var(--sb-2) var(--sb-3);
}
.pp-dialog .pp-viewer__bar > :last-child { justify-self: end; }
.pp-dialog .pp-viewer__back {
  justify-self: start;
  display: inline-flex; align-items: center; gap: var(--sb-2);
  min-height: 44px; padding: 0 var(--sb-3);
  border-radius: var(--sb-r-pill);
  font-size: var(--sb-t-small); color: #fff;
}
.pp-dialog .pp-viewer__back:hover { background: rgba(255, 255, 255, 0.14); }
.pp-dialog .pp-viewer__counter { font-size: var(--sb-t-small); color: rgba(255, 255, 255, 0.82); }
.pp-dialog .pp-viewer__stage {
  position: relative;
  flex: 1 1 auto; min-height: 0;
  display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; gap: var(--sb-2);
  padding: 0 var(--sb-3) var(--sb-4);
  touch-action: pan-y;
}
.pp-dialog .pp-viewer__figure { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: var(--sb-2); height: 100%; min-height: 0; margin: 0; }
.pp-dialog .pp-viewer__img { display: block; flex: 0 1 auto; min-height: 0; max-width: 100%; max-height: 100%; object-fit: contain; border-radius: var(--sb-r-sm); }
.pp-dialog .pp-viewer__img.is-loading { opacity: 0.4; }
.pp-dialog .pp-viewer__caption { flex: none; font-family: var(--sb-font-meta); font-size: var(--sb-t-caption); color: rgba(255, 255, 255, 0.72); text-align: center; }
.pp-dialog .pp-viewer__caption:empty { display: none; }
.pp-dialog .pp-viewer__nav {
  --pp-bw: 1px;
  --pp-bc: rgba(255, 255, 255, 0.3);
  display: grid; place-items: center;
  width: 48px; height: 48px;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.08);
  color: #fff; font-size: 15px;
  transition: background-color var(--sb-dur-fast) var(--sb-ease), opacity var(--sb-dur-fast) var(--sb-ease);
}
.pp-dialog .pp-viewer__nav:hover:not(:disabled) { background: rgba(255, 255, 255, 0.2); }
.pp-dialog .pp-viewer__nav:disabled { opacity: 0.3; }
.pp-dialog .pp-viewer :focus-visible { outline-color: #fff; }
@media (max-width: 767.98px) {
  .pp-dialog .pp-viewer__stage { grid-template-columns: minmax(0, 1fr); padding: 0 0 var(--sb-4); }
  .pp-dialog .pp-viewer__nav { position: absolute; bottom: max(var(--sb-4), env(safe-area-inset-bottom)); z-index: 1; }
  .pp-dialog .pp-viewer__nav--prev { left: var(--sb-4); }
  .pp-dialog .pp-viewer__nav--next { right: var(--sb-4); }
  .pp-dialog .pp-viewer__figure { padding-bottom: 72px; }
  .pp-dialog .pp-viewer__img { border-radius: 0; }
}

/* ── Share ─────────────────────────────────────────────────────────────── */
.pp-dialog .pp-share { display: grid; gap: var(--sb-5); }
.pp-dialog .pp-share__strip { display: flex; align-items: center; gap: var(--sb-3); }
.pp-dialog .pp-share__thumb { flex: none; width: 64px; height: 64px; border-radius: var(--sb-r-sm); object-fit: cover; background: var(--sb-surface-3); }
.pp-dialog .pp-share__name { display: flex; flex-direction: column; gap: 2px; min-width: 0; font-size: var(--sb-t-caption); color: var(--sb-muted); }
.pp-dialog .pp-share__name strong { font-size: var(--sb-t-body); font-weight: var(--sb-w-bold); color: var(--sb-ink); overflow-wrap: anywhere; }
.pp-dialog .pp-share__grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(92px, 1fr)); gap: var(--sb-2); }
.pp-dialog .pp-share__link {
  --pp-a: var(--sb-ink);
  --pp-a-hover: var(--sb-ink);
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: var(--sb-2);
  min-height: 84px; padding: var(--sb-3);
  border: 1px solid var(--sb-border);
  border-radius: var(--sb-r-md);
  font-size: var(--sb-t-caption); font-weight: var(--sb-w-medium);
  transition: background-color var(--sb-dur-fast) var(--sb-ease), border-color var(--sb-dur-fast) var(--sb-ease);
}
.pp-dialog .pp-share__link:hover { background: var(--sb-surface-2); border-color: var(--sb-border-strong); }
.pp-dialog .pp-share__link > i { font-size: 22px; }
.pp-dialog .pp-share__label { display: block; margin-bottom: var(--sb-2); font-size: var(--sb-t-caption); font-weight: var(--sb-w-medium); color: var(--sb-ink); }
.pp-dialog .pp-share__field { display: flex; gap: var(--sb-2); }
.pp-dialog input.pp-share__input {
  flex: 1 1 auto; min-width: 0;
  height: 44px; padding: 0 var(--sb-3);
  border: 1px solid var(--sb-border-strong);
  border-radius: var(--sb-r-sm);
  background: var(--sb-surface-2);
  color: var(--sb-text);
  font-family: var(--sb-font-meta); font-size: var(--sb-t-caption);
  text-overflow: ellipsis;
}
.pp-dialog input.pp-share__input:focus { outline: 3px solid var(--sb-primary-strong); outline-offset: 2px; }

/* ── Cancellation ──────────────────────────────────────────────────────── */
.pp-dialog .pp-policy__intro { margin-bottom: var(--sb-4); font-size: var(--sb-t-small); color: var(--sb-muted); }
.pp-dialog .pp-policy__intro strong { color: var(--sb-ink); font-weight: var(--sb-w-bold); }
.pp-dialog .pp-policy {
  --pp-policy: var(--sb-success);
  margin-bottom: var(--sb-3);
  padding: var(--sb-4);
  border: 1px solid var(--sb-border);
  border-radius: var(--sb-r-md);
}
.pp-dialog .pp-policy--warn { --pp-policy: var(--sb-warning); }
.pp-dialog .pp-policy--bad { --pp-policy: var(--sb-error); }
.pp-dialog .pp-policy.is-current { border-color: var(--pp-policy); box-shadow: inset 3px 0 0 var(--pp-policy); background-color: var(--sb-surface-2); --pp-section-bg: var(--sb-surface-2); }
.pp-dialog .pp-policy__name { display: flex; align-items: center; gap: var(--sb-2); margin-bottom: var(--sb-2); font-size: var(--sb-t-body); font-weight: var(--sb-w-bold); color: var(--sb-ink); }
.pp-dialog .pp-policy__dot { width: 10px; height: 10px; border-radius: 50%; background: var(--pp-policy); }
.pp-dialog .pp-policy__badge { margin-left: auto; padding: 3px 10px; border: 1px solid var(--pp-policy); border-radius: var(--sb-r-pill); font-size: var(--sb-t-micro); font-weight: var(--sb-w-medium); color: var(--pp-policy); }
.pp-dialog .pp-policy__list { display: grid; gap: var(--sb-2); }
.pp-dialog .pp-policy__point { display: flex; align-items: flex-start; gap: var(--sb-2); font-size: var(--sb-t-small); color: var(--sb-text); }
.pp-dialog .pp-policy__point > i { flex: none; width: 16px; margin-top: 5px; font-size: 12px; text-align: center; color: var(--sb-success); }
.pp-dialog .pp-policy__point--part > i { color: var(--sb-warning); }
.pp-dialog .pp-policy__point--no > i { color: var(--sb-error); }
.pp-dialog .pp-policy__note { display: flex; align-items: flex-start; gap: var(--sb-2); margin-top: var(--sb-4); font-family: var(--sb-font-meta); font-size: var(--sb-t-caption); color: var(--sb-muted); }
.pp-dialog .pp-policy__note > i { margin-top: 3px; }


/* ==========================================================================
   8. Mobile booking bar, preview banner, toast
   ========================================================================== */

.pp-overlays .pp-mobile-bar { display: none; }
@media (max-width: 991.98px) {
  .pp-overlays .pp-mobile-bar {
    position: fixed;
    left: 0; right: 0;
    /* Directly above .pub-mob-nav — or above the site cookie notice while that is open
       (it is fixed at the bottom with z-index 100000 and would cover the bar).
       The lift over the notice is a transform, not a change of `bottom`: moving
       `bottom` when the notice appeared was a layout shift (CLS 0.12 on this
       page), and transforms are not counted as one. */
    bottom: var(--pp-nav-h, 62px);
    transform: translateY(calc(-1 * max(0px, var(--pp-consent-inset, 0px) - var(--pp-nav-h, 62px))));
    transition: transform var(--sb-dur-fast, 180ms) ease-out;
    z-index: 1039;                            /* under the nav (1040) and its drawer */
    display: flex; align-items: center; justify-content: space-between; gap: var(--sb-3);
    min-height: var(--pp-bar-h, 68px);
    padding: var(--sb-2) max(var(--sb-4), env(safe-area-inset-right)) var(--sb-2) max(var(--sb-4), env(safe-area-inset-left));
    border-top: 1px solid var(--sb-border);
    background: var(--sb-surface);
    box-shadow: 0 -6px 20px rgba(20, 16, 14, 0.08);
  }
  /* When the site nav is not rendered the bar itself meets the home indicator. */
  body:not(:has(.pub-mob-nav)) .pp-overlays .pp-mobile-bar { bottom: 0; transform: translateY(calc(-1 * var(--pp-consent-inset, 0px))); padding-bottom: max(var(--sb-2), env(safe-area-inset-bottom)); }
}
.pp-overlays .pp-mobile-bar__info { min-width: 0; }
.pp-overlays .pp-mobile-bar__price { display: flex; align-items: baseline; gap: 5px; color: var(--sb-ink); line-height: 1.2; }
.pp-overlays .pp-mobile-bar__amount { font-size: var(--sb-t-lead); font-weight: var(--sb-w-bold); }
.pp-overlays .pp-mobile-bar__unit { font-family: var(--sb-font-meta); font-size: var(--sb-t-caption); color: var(--sb-muted); }
.pp-overlays .pp-mobile-bar__line { font-family: var(--sb-font-meta); font-size: var(--sb-t-caption); line-height: 1.3; color: var(--sb-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pp-overlays .pp-mobile-bar__cta { flex: none; padding: 0 var(--sb-4); }

.pp-preview.sb-modal {
  position: fixed;
  left: var(--sb-4); bottom: var(--sb-4);
  z-index: 1045;
  display: flex; align-items: center; gap: var(--sb-3);
  max-width: calc(100vw - 32px);
  padding: var(--sb-2) var(--sb-2) var(--sb-2) var(--sb-4);
  border-radius: var(--sb-r-pill);
  background: var(--sb-deep);
  color: #fff;
  box-shadow: var(--sb-shadow-3);
  font-size: var(--sb-t-caption);
  line-height: 1.3;
}
.pp-preview .pp-preview__hint { margin-left: 6px; opacity: 0.72; }
.pp-preview .pp-preview__exit {
  --pp-a: #14100E;
  --pp-a-hover: #14100E;
  flex: none;
  display: inline-flex; align-items: center;
  min-height: 44px; padding: 0 var(--sb-4);
  border-radius: var(--sb-r-pill);
  background: #fff;
  font-weight: var(--sb-w-medium);
}
@media (max-width: 991.98px) {
  /* above the booking bar + bottom nav */
  .pp-preview.sb-modal { left: var(--sb-3); bottom: calc(max(var(--pp-nav-h, 62px), var(--pp-consent-inset, 0px)) + var(--pp-bar-h, 68px) + var(--sb-3)); }
  .pp-preview .pp-preview__hint { display: none; }
}

.pp-overlays .pp-toast {
  position: fixed;
  left: 50%; bottom: calc(var(--sb-5) + env(safe-area-inset-bottom));
  z-index: 2147483000;
  transform: translate(-50%, 12px);
  max-width: min(420px, calc(100vw - 32px));
  padding: var(--sb-3) var(--sb-5);
  border-radius: var(--sb-r-pill);
  background: var(--sb-deep);
  color: #fff;
  box-shadow: var(--sb-shadow-3);
  font-size: var(--sb-t-small);
  text-align: center;
  opacity: 0;
  pointer-events: none;
  transition: opacity var(--sb-dur) var(--sb-ease), transform var(--sb-dur) var(--sb-ease-out);
}
.pp-overlays .pp-toast.is-in { opacity: 1; transform: translate(-50%, 0); }
.pp-overlays .pp-toast--error { background: var(--sb-error); }
@media (max-width: 991.98px) {
  .pp-overlays .pp-toast { bottom: calc(max(var(--pp-nav-h, 62px), var(--pp-consent-inset, 0px)) + var(--pp-bar-h, 68px) + var(--sb-4)); }
  .pp-dialog .pp-toast { bottom: calc(var(--sb-5) + env(safe-area-inset-bottom)); }
}


/* ==========================================================================
   9. Motion, touch, print
   ========================================================================== */

@media (hover: hover) and (pointer: fine) {
  :is(.pp, .pp-overlays) .pp-btn:hover:not(:disabled) { transform: translateY(-1px); }
  :is(.pp, .pp-overlays) .pp-btn:active:not(:disabled) { transform: scale(0.98); }
}

@media (prefers-reduced-motion: reduce) {
  .pp *,
  .pp *::before,
  .pp *::after,
  .pp-overlays *,
  .pp-overlays *::before,
  .pp-overlays *::after,
  .pp-overlays .pp-dialog::backdrop,
  .pp-preview * {
    animation-duration: 0.001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.001ms !important;
    scroll-behavior: auto !important;
  }
  .pp .pp-rail__track,
  .pp-dialog .pp-gallery__main { scroll-behavior: auto; }
  .pp .pp-cal__popover { animation: none; }
  :is(.pp, .pp-overlays) .pp-btn:hover:not(:disabled),
  :is(.pp, .pp-overlays) .pp-btn:active:not(:disabled) { transform: none; }
  .pp .pp-map.is-loading::after { animation: none; }
  :is(.pp, .pp-overlays) .pp-spinner { animation-duration: 1.4s !important; animation-iteration-count: infinite !important; }
}

@media print {
  .pp-overlays,
  .pp-preview.sb-modal,
  .pp .pp-actions,
  .pp .pp-rail__nav,
  .pp .pp-about__toggle,
  .pp .pp-amenities__all,
  .pp .pp-booking__actions,
  .pp .pp-cal__popover { display: none !important; }
  body.pp-body .pp .pp-readmore:not(.is-open) { max-height: none; -webkit-mask-image: none; mask-image: none; }
  .pp .pp-rail__track { flex-wrap: wrap; overflow: visible; }
  .pp .pp-booking { box-shadow: none; break-inside: avoid; }
  .pp .pp-map { break-inside: avoid; }
}

/* ==========================================================================
   What's nearby
   Distances come from the obfuscated centre, so the walk time leads and the
   metres follow it in a quieter weight — the guest reads "8 min", not "640 m".
   ========================================================================== */
:is(.pp, .pp-overlays) .pp-nearby__list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
}
:is(.pp, .pp-overlays) .pp-nearby__item {
  display: flex;
  align-items: center;
  gap: var(--sb-3);
  padding: var(--sb-3) 0;
  border-bottom: 1px solid var(--sb-border);
}
:is(.pp, .pp-overlays) .pp-nearby__item:last-child { border-bottom: 0; }
:is(.pp, .pp-overlays) .pp-nearby__icon {
  flex: none;
  width: 40px;
  height: 40px;
  display: grid;
  place-items: center;
  border-radius: var(--sb-r-md);
  background: var(--sb-surface-2);
  color: var(--sb-ink);
  font-size: 15px;
}
:is(.pp, .pp-overlays) .pp-nearby__body { display: flex; flex-direction: column; gap: 2px; min-width: 0; flex: 1 1 auto; }
:is(.pp, .pp-overlays) .pp-nearby__name {
  font-size: var(--sb-t-small);
  font-weight: var(--sb-w-medium);
  color: var(--sb-ink);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
:is(.pp, .pp-overlays) .pp-nearby__meta {
  display: flex;
  align-items: center;
  gap: 6px;
  font-family: var(--sb-font-meta);
  font-size: var(--sb-t-caption);
  color: var(--sb-muted);
}
:is(.pp, .pp-overlays) .pp-nearby__rating { display: inline-flex; align-items: center; gap: 4px; }
:is(.pp, .pp-overlays) .pp-nearby__rating > i { font-size: 10px; color: var(--sb-primary); }
:is(.pp, .pp-overlays) .pp-nearby__dist {
  flex: none;
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: 1px;
  text-align: right;
}
:is(.pp, .pp-overlays) .pp-nearby__walk {
  font-size: var(--sb-t-small);
  font-weight: var(--sb-w-medium);
  color: var(--sb-ink);
  white-space: nowrap;
}
:is(.pp, .pp-overlays) .pp-nearby__metres {
  font-family: var(--sb-font-meta);
  font-size: var(--sb-t-micro);
  color: var(--sb-muted);
  white-space: nowrap;
}
:is(.pp, .pp-overlays) .pp-nearby__note {
  display: flex;
  align-items: flex-start;
  gap: var(--sb-2);
  margin-top: var(--sb-4);
  font-family: var(--sb-font-meta);
  font-size: var(--sb-t-micro);
  line-height: 1.45;
  color: var(--sb-muted);
}
:is(.pp, .pp-overlays) .pp-nearby__note > i { margin-top: 2px; }
