/* ==========================================================================
   Right Path Builders — brand layer over the Pooluxe theme.
   Load order: bootstrap → plugins → swiper → style → coloring → scheme-rp → THIS.

   The template's own layout, components and rhythm are kept as they ship. This
   file only changes what makes it a pool company: the navy ground becomes
   charcoal, the type colour goes from navy-black to near-black, and a few
   components are added that the theme has no equivalent for (hero video,
   TikTok cards, the review letter-badges).

   THE TRAP: style.css declares its custom properties in a universal `* { }`
   block (style.css:25), not `:root`. A `:root` override is inherited and then
   shadowed on every element, so it silently does nothing. Anything declared
   there has to be overridden with `*` too. (`--primary-color` is the exception:
   it lives only in css/colors/*.css, which is why the scheme file works.)
   ========================================================================== */

* {
  /* navy → charcoal. Same three-step ladder the theme uses for stacked cards.
     White text on these reads 16.9:1 / 15.0:1 / 12.7:1. */
  --bg-dark-1: #1A1D21;
  --bg-dark-1-rgb: 26, 29, 33;
  --bg-dark-2: #23272C;
  --bg-dark-3: #2E333A;

  --heading-font-color: #16181C;
  --body-font-color: rgba(22, 24, 28, .76);
  --bg-light: #F5F5F1;

  --btn-color: #ffffff;          /* white label on the accent button */
  --btn-hover-bg: #16181C;
  --btn-hover-color: #ffffff;
}

/* --------------------------------------------------------------------------
   style.css:180 sets `html { overflow-x: hidden }` and style.css:186 sets
   `body { overflow: hidden }`. The body one is the SHORTHAND, so it clips both
   axes; overriding only overflow-x leaves overflow-y hidden, body turns into a
   clipping container, and the page collapses (footer paints over the hero).
   Both axes have to be named. `clip` rather than `hidden` also keeps
   `position: sticky` working.
   -------------------------------------------------------------------------- */
html { overflow-x: clip; overflow-y: visible; }
body { overflow-x: clip; overflow-y: visible; }

/* --------------------------------------------------------------------------
   Sticky header: always visible, both directions

   The theme ships an auto-hiding header. `designesia.js:9` sets
   `headerAutoshow = "on"`, and the scroll handler then toggles two classes whose
   effect is inverted from the usual pattern: scrolling DOWN adds `.scroll-down`,
   which is `margin-top: -90px` (style.css:320) and lifts the bar off screen,
   while scrolling UP adds `.nav-up` and brings it back. So the menu disappears
   exactly when someone is reading down the page.

   The flag in designesia.js is flipped to "off" as well, which stops the class
   churn on every scroll event, but these rules are the authoritative fix: they
   survive designesia.js being re-copied from pooluxe/ during a theme update.
   -------------------------------------------------------------------------- */
header.scroll-down,
header.nav-up,
header.header-center.scroll-down { margin-top: 0 !important; }

/* --------------------------------------------------------------------------
   Header and logo scale

   The theme's header is 80px, sized entirely by the menu link
   (`padding: 25px 0` + `line-height: 30px`). Both go up ~20% at Jonathan's
   request: 96px bar, 64px logo, which still leaves 16px of air above and below
   the mark. Desktop only — the mobile header uses a different layout.
   -------------------------------------------------------------------------- */
@media only screen and (min-width: 993px) {
  #mainmenu > li > a.menu-item { padding-top: 33px; padding-bottom: 33px; }
}

/* --------------------------------------------------------------------------
   Hero video
   The theme's hero is a Swiper of background images. Right Path supplied a
   brand film, so the swiper is replaced by a <video> in the same stacking
   context, keeping the theme's overlay and edge-gradient divs on top of it.
   -------------------------------------------------------------------------- */
.rp-hero-video {
  position: absolute; inset: 0;
  width: 100%; height: 100%;
  object-fit: cover;
  z-index: 0;
}
.rp-hero-media { position: absolute; inset: 0; overflow: hidden; background: #16181C; }
.rp-hero-media .sw-overlay,
.rp-hero-media .gradient-edge-start { z-index: 1; }

/* the film is high-key, so the copy side needs a floor under the white type */
.rp-hero-scrim {
  position: absolute; inset: 0; z-index: 1;
  background: linear-gradient(100deg, rgba(16,17,20,.82) 0%, rgba(16,17,20,.46) 44%, rgba(16,17,20,.05) 78%);
}


/* --------------------------------------------------------------------------
   Hero secondary CTA

   Deliberately not a second button: a play disc and a plain underlined label, so
   it reads as "there is a video further down" rather than competing with Get a
   Quote. It scrolls to the Yossi section, and the disc borrows the same pulse the
   video's own play button uses so the two feel like one thread.
   -------------------------------------------------------------------------- */
.rp-herocta { display: flex; align-items: center; flex-wrap: wrap; gap: 14px 26px; }

.rp-watch {
  display: inline-flex; align-items: center; gap: 12px;
  color: #fff; text-decoration: none;
  padding: 4px 0;
}
.rp-watch__disc {
  position: relative; flex: none;
  width: 42px; height: 42px; border-radius: 50%;
  display: grid; place-items: center;
  border: 1px solid rgba(255,255,255,.55);
  background: rgba(255,255,255,.12);
  -webkit-backdrop-filter: blur(4px); backdrop-filter: blur(4px);
  padding-left: 3px;                       /* optical centring for the triangle */
  transition: background-color .28s ease, color .28s ease, transform .28s ease;
}
.rp-watch__disc::before {
  content: ""; position: absolute; inset: -1px;
  border-radius: 50%; border: 2px solid rgba(255,255,255,.5);
  animation: rp-pulse 2.8s cubic-bezier(.2,.6,.3,1) infinite;
  pointer-events: none;
}
.rp-watch__label {
  font-size: 15px; font-weight: 600; color: #fff;
  border-bottom: 1px solid rgba(255,255,255,.42);
  padding-bottom: 2px;
  transition: border-color .25s ease;
}
.rp-watch:hover { color: #fff; }
.rp-watch:hover .rp-watch__disc { background: #fff; color: var(--bg-dark-1); transform: scale(1.07); }
.rp-watch:hover .rp-watch__label { border-bottom-color: #fff; }

@media (prefers-reduced-motion: reduce) {
  .rp-watch__disc::before { animation: none; opacity: 0; }
  .rp-watch:hover .rp-watch__disc { transform: none; }
}

/* Anchor targets have to clear the 96px fixed header, or a jump lands with the
   section's heading tucked underneath it. Bootstrap already provides the smooth
   scroll (`:root{scroll-behavior:smooth}` under no-preference). */
main > section[id], #rp-hero-end { scroll-margin-top: 104px; }
@media only screen and (max-width: 992px) { main > section[id] { scroll-margin-top: 100px; } }

/* --------------------------------------------------------------------------
   Credential strip, transparent over the hero film

   The scrim is a gradient rather than a flat panel so the film still reads
   through the top of the strip. Its floor is dark enough that white text clears
   AA even against the brightest frame in the 64s loop (a blown-out midday lawn),
   which is the case that matters.
   -------------------------------------------------------------------------- */
.rp-cred {
  position: absolute; left: 0; right: 0; bottom: 0;
  padding: 26px 0 28px;
  border-top: 1px solid rgba(255,255,255,.20);
  background: linear-gradient(to top, rgba(11,12,15,.78) 0%, rgba(11,12,15,.58) 55%, rgba(11,12,15,.16) 100%);
  -webkit-backdrop-filter: blur(3px);
  backdrop-filter: blur(3px);
}
.rp-cred .de_count h2 { color: #fff; }
.rp-cred .de_count span { color: rgba(255,255,255,.82); font-size: 14px; line-height: 1.35; display: block; }
/* a lightened cut of the brand blue: the accent itself is too dark to read here */
.rp-cred .de_count i { color: #8CBCE6; }

/* ⚠ Desktop spacing, in two bands.

   The tiles were four equal `col-md-3` columns with content left-aligned inside
   each, so the gaps came out by content width: "One Contractor / One Schedule.
   One Point of Contact." nearly touched the next icon while "1118256" left a
   hole before its neighbour.

   >= 1200px: a flex line of auto-width tiles with the space distributed
   BETWEEN them, so every gap is identical whatever a label's length. Verified
   equal gaps (131px at 1440, 96px at 1200) with all four on one line.

   992 to 1199px: there is NOT enough room for that. Forcing it there pushed the
   last tile past the container and put 49px of horizontal scroll on the page
   at 1024. So this band keeps the theme's four equal columns and simply
   centres each tile inside its column, which reads as balanced without
   needing the width. Below 992 the theme's 2x2 grid takes over. */
@media only screen and (min-width: 1200px) {
  .rp-cred .rp-cred__row {
    display: flex;
    flex-wrap: nowrap;
    justify-content: space-between;
    align-items: center;
    column-gap: 32px;
  }
  .rp-cred .rp-cred__row > [class*="col-"] {
    flex: 0 1 auto;
    width: auto;
    max-width: none;
  }
  .rp-cred .de_count span { white-space: nowrap; }
}
@media only screen and (min-width: 992px) and (max-width: 1199px) {
  .rp-cred .de_count .d-flex { justify-content: center; }
  .rp-cred .de_count h2 { font-size: 26px !important; }
  .rp-cred .de_count span { font-size: 13px; }
}

@media only screen and (max-width: 991px) {
  /* 2x2 on tablet and phone, tightened so the strip does not eat the hero */
  .rp-cred { padding: 16px 0 18px; }
  .rp-cred .row { --bs-gutter-y: 0.75rem; }
  .rp-cred .de_count i { font-size: 22px !important; margin-right: .6rem !important; }
  .rp-cred .de_count h2 { font-size: 20px !important; }
  .rp-cred .de_count span { font-size: 11.5px; }
}
@media only screen and (max-width: 400px) {
  .rp-cred .de_count h2 { font-size: 17px !important; }
  .rp-cred .de_count span { font-size: 10.5px; }
  .rp-cred .de_count i { font-size: 18px !important; }
}

/* --------------------------------------------------------------------------
   Button hover

   The theme's `.fx-slide` slides the label down and slides a ::before copy in
   from above, with the copy's text taken from the button's own label by
   designesia.js. So the label is replaced by an identical label: mechanically it
   runs, but there is nothing to see beyond a small vertical jitter.

   The slide is kept (it is the theme's signature) and given something to land
   on: the button lifts, takes a shadow, and the ground colour moves. The
   transition is named rather than `all`, because the theme sets `all .5s` on
   .btn-main and that also animates the transform on first paint.
   -------------------------------------------------------------------------- */
a.btn-main,
.btn-main,
input[type=button].btn-main,
input[type=submit].btn-main,
a.btn-line {
  transition:
    background-color .3s ease,
    color .3s ease,
    border-color .3s ease,
    transform .3s cubic-bezier(.2,.7,.3,1),
    box-shadow .3s ease;
}
a.btn-main:hover,
.btn-main:hover,
input[type=button].btn-main:hover,
a.btn-line:hover {
  transform: translateY(-3px);
  box-shadow: 0 12px 26px -10px rgba(12,14,18,.6);
}
a.btn-main:active,
.btn-main:active,
a.btn-line:active { transform: translateY(-1px); }

/* the disabled enquiry submit must not pretend to be pressable */
input[type=submit].btn-main:disabled:hover,
.btn-main:disabled:hover {
  transform: none; box-shadow: none;
}

/* the theme's carousel arrows get the same treatment */
.de-custom-nav .d-prev,
.de-custom-nav .d-next {
  transition: background-color .3s ease, transform .3s cubic-bezier(.2,.7,.3,1), box-shadow .3s ease;
}
.de-custom-nav .d-prev:hover,
.de-custom-nav .d-next:hover {
  transform: translateY(-3px);
  box-shadow: 0 10px 22px -10px rgba(12,14,18,.55);
}

@media (prefers-reduced-motion: reduce) {
  a.btn-main, .btn-main, a.btn-line,
  .de-custom-nav .d-prev, .de-custom-nav .d-next { transition: background-color .2s ease, color .2s ease; }
  a.btn-main:hover, .btn-main:hover, a.btn-line:hover,
  .de-custom-nav .d-prev:hover, .de-custom-nav .d-next:hover { transform: none; }
}

/* --------------------------------------------------------------------------
   Mobile sticky call bar

   Edge to edge, thumb height, and the single highest-intent action on a phone.
   Desktop never sees it: the header already carries Call Now there.

   `100dvh`-era detail: the bar pads itself with env(safe-area-inset-bottom) so
   it clears the iPhone home indicator rather than sitting under it.
   -------------------------------------------------------------------------- */
.rp-callbar {
  position: fixed; left: 0; right: 0; bottom: 0;
  z-index: 1030;
  display: none;                      /* mobile only, switched on below */
  background: var(--primary-color);
  padding-bottom: env(safe-area-inset-bottom, 0px);
  box-shadow: 0 -8px 26px -10px rgba(10,12,16,.55);
  transform: translateY(110%);
  transition: transform .38s cubic-bezier(.2,.7,.3,1);
}
.rp-callbar.is-in { transform: none; }

.rp-callbar__btn {
  display: flex; align-items: center; justify-content: center; gap: 13px;
  min-height: 64px; padding: 10px 18px;
  color: #fff; text-decoration: none;
  background: var(--primary-color);
  transition: background-color .2s ease;
}
.rp-callbar__btn:active { background: #1A5E99; }
.rp-callbar__btn:hover { color: #fff; }

.rp-callbar__icon {
  display: grid; place-items: center; flex: none;
  width: 40px; height: 40px; border-radius: 50%;
  background: rgba(255,255,255,.18); color: #fff;
}
/* a slow, quiet pulse: enough to catch the eye, not enough to nag */
.rp-callbar.is-in .rp-callbar__icon { animation: rp-callpulse 2.6s ease-in-out infinite; }
@keyframes rp-callpulse {
  0%, 100% { transform: scale(1);    box-shadow: 0 0 0 0 rgba(255,255,255,.34); }
  55%      { transform: scale(1.06); box-shadow: 0 0 0 11px rgba(255,255,255,0); }
}

.rp-callbar__text { display: flex; flex-direction: column; line-height: 1.15; }
.rp-callbar__lead {
  font-size: 18px; font-weight: 700; letter-spacing: .01em;
}
.rp-callbar__num {
  /* full white, not a dimmed one: at .86 on the accent this measured 4.36:1 at
     13px and missed AA. The step down to `.rp-callbar__lead` is carried by size
     and weight, which is enough. */
  font-size: 13px; font-weight: 500; color: #fff; letter-spacing: .04em;
}

/* the cross rides above the bar so the button itself runs the full width */
.rp-callbar__close {
  position: absolute; top: -17px; right: 12px;
  width: 34px; height: 34px; border-radius: 50%;
  display: grid; place-items: center;
  background: var(--bg-dark-1); color: #fff;
  border: 1px solid rgba(255,255,255,.3);
  box-shadow: 0 4px 12px -4px rgba(10,12,16,.6);
  cursor: pointer; padding: 0;
}
.rp-callbar__close:active { transform: scale(.94); }

@media only screen and (max-width: 992px) {
  .rp-callbar { display: block; }
  /* keep the footer's last line clear of the bar once it is up */
  body.rp-callbar-on { padding-bottom: 64px; }
}
@media (prefers-reduced-motion: reduce) {
  .rp-callbar { transition: none; }
  .rp-callbar.is-in .rp-callbar__icon { animation: none; }
}

/* --------------------------------------------------------------------------
   Header buttons: Call Now sits beside Get a Quote
   -------------------------------------------------------------------------- */
.menu_side_area { display: flex; align-items: center; gap: 10px; }
.rp-btn-call {
  background: transparent !important;
  border: 1px solid rgba(255,255,255,.55);
  color: #fff !important;
}
.rp-btn-call span { color: #fff; }
/* ⚠ Recolour the ANCHOR, not just the span. `.fx-slide` slides the real label
   out and slides in a `::before` copy that designesia fills from the button's
   own text (designesia.js:1354), and that pseudo-element inherits its colour
   from the anchor. Setting only `span` left the visible hover label white on the
   white hover background: the button read as empty. #1A1D21 on white is 16.9:1. */
.rp-btn-call:hover,
.rp-btn-call:focus-visible { background: #fff !important; border-color: #fff; }
.rp-btn-call:hover,
.rp-btn-call:hover span,
.rp-btn-call:hover:before,
.rp-btn-call:focus-visible,
.rp-btn-call:focus-visible span,
.rp-btn-call:focus-visible:before { color: var(--bg-dark-1) !important; }

/* --------------------------------------------------------------------------
   Reviews
   The theme's testimonial card carries a stock headshot. These are real named
   people from Google, so a stock face would be a fabrication. A letter badge in
   the brand accent fills the same 40px slot.
   -------------------------------------------------------------------------- */
.rp-avatar {
  width: 40px; height: 40px; border-radius: 50%;
  background: var(--primary-color); color: #fff;
  display: grid; place-items: center; flex: none;
  font-weight: 700; font-size: 15px; line-height: 1;
}
.rp-review-text { min-height: 132px; }

/* The Google mark is a square SVG sized only by width (.w-30px). As a flex item
   under the default `align-items: stretch` it was pulled to the row's full 55px
   height and rendered 30x55, visibly squashed. */
#section-reviews .w-30px { align-self: flex-start; height: auto; }

/* --------------------------------------------------------------------------
   Interview video band, built on the theme's full-width video-teaser section
   -------------------------------------------------------------------------- */
.rp-interview { position: relative; background: #16181C; }

/* Exactly one of the two is in flow at any time. Previously the <video> (showing
   its poster) and the cover's <img> were both block-level and in flow, so the
   section rendered the same frame twice, stacked, with only the lower one
   playable.
   ⚠ The parked video is NOT `display: none`. Safari will not paint frames for a
   video that was display:none when play() was called: the audio ran and the box
   stayed black. It is kept rendered but invisible and out of flow instead. */
.rp-interview video {
  position: absolute; inset: 0; width: 100%; height: 100%;
  opacity: 0; pointer-events: none; object-fit: cover;
}
.rp-interview.is-playing video {
  position: relative; inset: auto; height: auto; max-height: 82vh;
  opacity: 1; pointer-events: auto; object-fit: contain; display: block;
}
.rp-interview.is-playing .rp-interview-cover { display: none; }

.rp-interview-cover {
  display: block; position: relative; width: 100%;
  border: 0; padding: 0; background: none; cursor: pointer;
}
.rp-interview-cover > img { width: 100%; display: block; max-height: 82vh; object-fit: cover; }

/* The frame is a bright, high-key interior, so white type needs a real floor.
   The theme's .hover-op-05 only darkens on hover, which is no help at rest. */
.rp-interview-scrim {
  position: absolute; inset: 0; display: block;
  background: linear-gradient(180deg, rgba(16,17,20,.34) 0%, rgba(16,17,20,.52) 45%, rgba(16,17,20,.72) 100%);
  transition: background-color .3s ease;
}
.rp-interview-cover:hover .rp-interview-scrim { background: rgba(16,17,20,.60); }

.rp-interview-copy {
  position: absolute; inset: 0;
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 22px; padding: 24px; text-align: center; color: #fff;
}
.rp-interview-disc {
  position: relative;
  width: 88px; height: 88px; border-radius: 50%; flex: none;
  border: 1px solid rgba(255,255,255,.8); background: rgba(255,255,255,.16);
  display: grid; place-items: center; color: #fff;
  backdrop-filter: blur(4px);
  padding-left: 6px;   /* optical centring for the triangle */
  transition: transform .28s ease, background-color .28s ease, color .28s ease;
}
/* Two rings expanding out of the disc on a stagger, so the still frame reads as
   a video without needing a caption to say so. */
.rp-interview-disc::before,
.rp-interview-disc::after {
  content: ""; position: absolute; inset: -1px;
  border-radius: 50%; border: 2px solid rgba(255,255,255,.6);
  animation: rp-pulse 2.8s cubic-bezier(.2,.6,.3,1) infinite;
  pointer-events: none;
}
.rp-interview-disc::after { animation-delay: 1.4s; }
@keyframes rp-pulse {
  0%   { transform: scale(1);    opacity: .7; }
  70%  { transform: scale(1.85); opacity: 0; }
  100% { transform: scale(1.85); opacity: 0; }
}
/* and a slow breathe on the disc itself */
.rp-interview-cover .rp-interview-disc { animation: rp-breathe 2.8s ease-in-out infinite; }
@keyframes rp-breathe {
  0%, 100% { transform: scale(1); }
  50%      { transform: scale(1.06); }
}
.rp-interview-cover:hover .rp-interview-disc {
  animation-play-state: paused; transform: scale(1.1);
  background: #fff; color: #16181C;
}
.rp-interview-cover:hover .rp-interview-disc::before,
.rp-interview-cover:hover .rp-interview-disc::after { border-color: rgba(255,255,255,.85); }

@media (prefers-reduced-motion: reduce) {
  .rp-interview-disc::before, .rp-interview-disc::after { animation: none; opacity: 0; }
  .rp-interview-cover .rp-interview-disc { animation: none; }
}

.rp-interview-h {
  font-family: var(--heading-font); font-weight: var(--heading-font-weight);
  font-size: clamp(1.35rem, 2.6vw, 2.1rem); line-height: 1.2; letter-spacing: -.02em;
  color: #fff; max-width: 18ch;
}

/* --------------------------------------------------------------------------
   Build-stage pair (the slot the theme uses for its before/after wiper)
   -------------------------------------------------------------------------- */
/* The theme has no global `img { height: auto }`, so an HTML height attribute
   applies as a presentational hint while the width is overridden, and the image
   renders stretched. The wiper sizes its container from the first image, so
   without this the 16:9 pair rendered 837x900. */
.twentytwenty-container img { height: auto; }
/* until the slider initialises, only the first frame shows (the plugin stacks
   them itself once it runs); otherwise both photos sit one under the other */
.twentytwenty-container { position: relative; overflow: hidden; }
.twentytwenty-container img:nth-of-type(2):not(.twentytwenty-after) { position: absolute; inset: 0; visibility: hidden; }

/* --------------------------------------------------------------------------
   Project carousel captions
   The theme's `.overlay-dark-3` is a light scrim, tuned for its own dark stock
   photography. Right Path's project shots are bright (midday lawn, pool, sky),
   and the caption panel's body copy measured 1.70:1 on top of them. A firmer
   panel takes white text to ~7.9:1 and the 80% body copy to ~5.8:1 against the
   brightest frame in the set.
   -------------------------------------------------------------------------- */
/* The panel is translucent over an arbitrary project photo, so the case that has
   to hold is the panel over WHITE — that is the lightest ground any of these
   images can present, and every darker pixel only improves the ratio.

   At .62 / .88 / .82 the 14px `<small>` measured 4.25:1 against that worst case
   and missed AA. Deepening the panel to .68 and lifting the two alphas keeps the
   three-step hierarchy (title, caption, body) and clears it with room:
   5.9:1 for the caption, 6.3:1 for the body copy. */
#section-projects .overlay-dark-3 {
  background: rgba(14, 15, 18, .68);
}
#section-projects .overlay-dark-3 p { color: rgba(255,255,255,.92); }
#section-projects .overlay-dark-3 small { color: rgba(255,255,255,.90); }

/* --------------------------------------------------------------------------
   Process band
   The theme's own `.sw-overlay.op-7` was tuned for its dark stock photography.
   Right Path's dusk pool shot is far brighter, and white body copy at 15px was
   sitting straight on lit water. A flat scrim under the whole section fixes it
   without losing the image.
   -------------------------------------------------------------------------- */
#section-process { overflow: hidden; }
.rp-procmedia { position: absolute; inset: 0; z-index: 0; background: #14161A; }
.rp-procvideo { width: 100%; height: 100%; object-fit: cover; display: block; }

/* Lighter than the flat 0.90 wash this replaced: the waterfall needs to be
   legible as moving water, not just a dark texture. It is still dark enough that
   white body copy clears AA against the brightest part of the footage, which is
   the falling water itself. */
.rp-procscrim {
  position: absolute; inset: 0;
  background:
    radial-gradient(115% 85% at 50% 48%, rgba(13,15,18,.66) 0%, rgba(13,15,18,.46) 58%, rgba(13,15,18,.34) 100%),
    linear-gradient(180deg, rgba(13,15,18,.46) 0%, rgba(13,15,18,.16) 26%, rgba(13,15,18,.16) 74%, rgba(13,15,18,.50) 100%);
}
#section-process .container { position: relative; z-index: 2; }
#section-process .de-step p { color: rgba(255,255,255,.90); }
#section-process .de-step h3,
#section-process h2,
#section-process .subtitle { text-shadow: 0 1px 14px rgba(10,11,13,.55); }
#section-process > p, #section-process .col-md-6 p { text-shadow: 0 1px 12px rgba(10,11,13,.5); }

@media (prefers-reduced-motion: reduce) { .rp-procvideo { display: none; } }

/* --------------------------------------------------------------------------
   Active nav item

   The theme colours the current page's menu item with --primary-color. Over the
   dark banner (and the dark sticky bar) that blue is 3.20:1 against #1A1D21,
   which fails AA for 15px text. White plus an accent underline says "you are
   here" just as clearly and reads 16.9:1.
   -------------------------------------------------------------------------- */
/* ⚠ The accent is applied by `style.css:723`,
   `#mainmenu li a.active { color: var(--primary-color) !important }` — note the
   `!important`, which is why raising specificity alone did nothing and why the
   `box-shadow` below landed while the `color` beside it did not. `coloring.css:132`
   (`header.smaller #mainmenu a.menu-item.active`) sets the same colour and is the
   rule that looks responsible, but it is not the one that wins.

   So this needs `!important` too, at higher specificity than (1,2,2). All three
   selectors clear it: the header carries `.transparent` at the top of the page and
   `.smaller` once scrolled, and the first covers the plain case. */
header #mainmenu > li > a.menu-item.active,
header.smaller #mainmenu a.menu-item.active,
header.transparent #mainmenu a.menu-item.active {
  color: #fff !important;
  box-shadow: inset 0 -2px 0 0 var(--primary-color);
}
/* --------------------------------------------------------------------------
   Dropdowns and the Services mega panel

   The theme's dropdown is a 190px white column with an accent-filled hover row.
   With 16 services in it that came out 657px tall: a wall of names, no grouping,
   no way to scan it, and a white box hanging off a dark header.

   Both dropdowns are now dark, so they read as an extension of the header bar
   rather than a separate object, and Services is a four-column mega panel.

   ⚠ The active item's colour is the thing to be careful with here. It has now
   been wrong in both directions: the theme paints it in the accent, which is
   3.20:1 on this dark ground and fails AA; a first fix forced white, which was
   correct on the dark bar but landed on the then-white dropdown as white on
   white and made the current page's own entry vanish from the list entirely.
   On a dark panel the answer is white plus an accent marker, the same
   "you are here" language the top-level bar uses.
   -------------------------------------------------------------------------- */
/* The theme opens dropdowns on `:hover` alone (style.css:753), so a keyboard user
   tabbing through the header could not reach any of the 15 service links at all.
   Same treatment on focus-within, which costs nothing for mouse users. */
header:not(.header-mobile) #mainmenu li:focus-within > ul {
  visibility: visible;
  opacity: 1;
  margin-top: 0;
}
header #mainmenu li ul {
  background: var(--bg-dark-1);
  border: solid 1px rgba(255, 255, 255, .10);
  border-top: solid 2px var(--primary-color);
  border-radius: 0 0 4px 4px;
  box-shadow: 0 24px 48px rgba(8, 10, 13, .45);
  padding: 6px 0;
}
header #mainmenu li li a {
  color: #C9CED6;                    /* 10.1:1 on #1A1D21 */
  border-bottom: none;
  padding: 9px 18px;
  transition: color .18s ease, background-color .18s ease, padding-left .18s ease;
}
/* the theme fills the whole row with the accent on hover, which at 15px puts
   white on 3.20:1. A tint plus a white label is the same affordance and reads. */
header #mainmenu li li a:hover,
header #mainmenu ul li:hover > a {
  background: rgba(255, 255, 255, .06);
  color: #fff;
}
header #mainmenu li ul li.active > a,
header #mainmenu li ul li.active > a:hover {
  color: #fff !important;
  font-weight: 600;
  box-shadow: inset 2px 0 0 0 var(--primary-color);
}

/* ---- the mega panel ---- */
header #mainmenu li ul.rp-mega {
  /* ⚠ The panel is laid out even while closed: `visibility: hidden` does not
     remove it from the scrollable overflow. Anchored at the Services item's
     left edge (x=153 at 1024, x=241 at 1200), a flat 920px reached x=1073 on a
     1024 viewport and put 49px of horizontal scroll on EVERY page at tablet-
     landscape widths, with nothing visible to explain it. The 200px is the
     item's offset plus a margin; from 1200 up there is room for the full width. */
  width: min(920px, calc(100vw - 240px));
  padding: 0;
}
header #mainmenu li ul.rp-mega > li.rp-mega__panel {
  display: block;
  float: none;
  width: 100%;
  font-size: 14px;
}
/* designesia stamps `.has-child` on any li containing a ul (designesia.js:1472),
   which would hang the theme's dropdown chevron off the panel wrapper */
header #mainmenu li.rp-mega__panel:after,
header #mainmenu li.rp-mega__panel > a:after { content: none; }

.rp-mega__grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr)) 1.15fr;
  gap: 0 28px;
  padding: 26px 30px 28px;
}
.rp-mega__head {
  margin: 0 0 12px;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: #9AA5B1;                    /* 6.7:1 on #1A1D21 */
  line-height: 1.4;
}
header #mainmenu ul.rp-mega .rp-mega__list {
  /* A plain list inside the panel, not another floating dropdown.

     ⚠ `visibility: inherit`, never `visible`. These lists match the theme's own
     `#mainmenu li ul { visibility: hidden }` and so need an override, but a flat
     `visible` wins against the hidden ANCESTOR rather than following it: the
     service links then painted over the page while the panel itself was still
     closed. `inherit` ties them to the panel's own state, which is what the
     theme's `#mainmenu li:hover > ul` toggles. The theme's hover rule cannot
     reach these lists directly because their parent is a div, not the li. */
  position: static;
  visibility: inherit;
  opacity: 1;
  width: auto;
  background: none;
  border: none;
  box-shadow: none;
  padding: 0;
  margin: 0;
  border-radius: 0;
}
header #mainmenu ul.rp-mega .rp-mega__list > li {
  display: block;
  float: none;
  margin: 0;
  border: none;
}
header #mainmenu ul.rp-mega .rp-mega__list > li > a {
  display: block;
  padding: 7px 10px 7px 12px;
  border-radius: 3px;
  font-size: 14.5px;
  line-height: 1.35;
  white-space: normal;
}
header #mainmenu ul.rp-mega .rp-mega__list > li > a:hover {
  padding-left: 16px;
}

/* the fourth column is a panel, not a list */
.rp-mega__promo {
  border-left: solid 1px rgba(255, 255, 255, .10);
  padding-left: 28px;
}
.rp-mega__promotext {
  margin: 0 0 14px;
  font-size: 13.5px;
  line-height: 1.55;
  color: #AEB6C0;                    /* 7.9:1 on #1A1D21 */
  text-transform: none;
  letter-spacing: 0;
}
header #mainmenu ul.rp-mega .rp-mega__cta > li > a {
  color: #fff !important;
  font-weight: 600;
  padding-left: 0;
  box-shadow: inset 0 -1px 0 0 rgba(255, 255, 255, .28);
  border-radius: 0;
  display: inline-block;
  margin-bottom: 8px;
}
header #mainmenu ul.rp-mega .rp-mega__cta > li > a:hover {
  padding-left: 0;
  background: none;
  box-shadow: inset 0 -1px 0 0 var(--primary-color);
}
/* `#mainmenu li li a` is (1,0,3) and beats a bare class, so these two need the
   menu scope in front of them or they silently keep the theme's link grey. */
header #mainmenu ul.rp-mega a.rp-mega__phone {
  display: inline-block;
  margin-top: 6px;
  padding: 0;
  font-size: 17px;
  font-weight: 700;
  color: #fff;
  letter-spacing: .01em;
  background: none;
}
header #mainmenu ul.rp-mega a.rp-mega__phone:hover {
  color: #fff;
  opacity: .82;
  background: none;
  padding-left: 0;
}

/* ⚠ `style.css:10045` is `header.header-mobile #mainmenu li ul { height: 0;
   overflow: hidden }`, specificity (1,2,3). That collapse is what designesia's
   drawer animates, so the OUTER panel must keep it. The inner column lists must
   not: they are not separate submenus, and holding them at height 0 stacked all
   three columns on top of each other inside a 131px box, so the drawer showed
   fifteen overlapping service links.

   Keyed on `.header-mobile` rather than a width, so it tracks whatever breakpoint
   designesia uses to add that class. (1,3,3) to clear the theme's (1,2,3). */
header.header-mobile #mainmenu ul.rp-mega .rp-mega__list {
  height: auto;
  overflow: visible;
}

/* ---- mobile: the panel becomes a plain stacked list ----
   designesia's drawer toggle animates the height of `ul:first` inside the item
   (designesia.js:860), so the panel has to be in normal flow with a real height
   at that width. Grid columns collapse to one and the promo column is dropped:
   its two links duplicate nav items that are already in the drawer. */
@media only screen and (max-width: 992px) {
  header #mainmenu li ul,
  header #mainmenu li ul.rp-mega {
    width: 100%;
    border: none;
    border-top: none;
    box-shadow: none;
    background: rgba(255, 255, 255, .03);
    border-radius: 0;
  }
  .rp-mega__grid {
    grid-template-columns: 1fr;
    gap: 0;
    padding: 4px 0 8px;
  }
  .rp-mega__head {
    padding: 14px 18px 6px;
    margin: 0;
  }
  .rp-mega__promo { display: none; }
  header #mainmenu ul.rp-mega .rp-mega__list > li > a { padding: 9px 18px; }
  header #mainmenu ul.rp-mega .rp-mega__list > li > a:hover { padding-left: 18px; }
}

/* --------------------------------------------------------------------------
   Inner pages: banner + card blocks (see _build/gen.py)

   The header is fixed and transparent over the banner, so the banner carries its
   own top padding. The theme's own subheader assumed a static header.
   -------------------------------------------------------------------------- */
.rp-banner {
  position: relative;
  background-size: cover;
  background-position: center;
  padding-top: 96px;                 /* clears the fixed header */
  isolation: isolate;
}
.rp-bannerscrim {
  position: absolute; inset: 0; z-index: -1;
  background:
    linear-gradient(100deg, rgba(14,16,19,.86) 0%, rgba(14,16,19,.60) 48%, rgba(14,16,19,.32) 100%),
    linear-gradient(180deg, rgba(14,16,19,.55) 0%, rgba(14,16,19,.20) 40%, rgba(14,16,19,.45) 100%);
}
.rp-banner h1 { color: #fff; }
.rp-banner .subtitle { background: rgba(255,255,255,.18); color: #fff; }

/* the theme already draws the separator with `.crumb li:after` (a FontAwesome
   chevron in the accent colour), so this must not add one of its own */
.rp-banner .crumb { margin: 0; padding: 3px 0; list-style: none; background: none; }
.rp-banner .crumb li { font-size: 14px; color: rgba(255,255,255,.9); }
.rp-banner .crumb a { color: #fff; opacity: .72; }
.rp-banner .crumb a:hover { opacity: 1; }
.rp-banner .crumb li.active { color: #fff; font-weight: 600; }

.rp-card {
  background: var(--bg-light);
  border: 1px solid rgba(22,24,28,.08);
  border-radius: var(--rounded-1);
  padding: 30px 28px;
  transition: transform .3s cubic-bezier(.2,.7,.3,1), box-shadow .3s ease, border-color .3s ease;
}
.rp-card:hover {
  transform: translateY(-4px);
  border-color: rgba(22,24,28,.16);
  box-shadow: 0 16px 34px -18px rgba(12,14,18,.4);
}
.rp-card i { display: block; }
.bg-color-op-1 .rp-card { background: #fff; }

@media (prefers-reduced-motion: reduce) {
  .rp-card { transition: none; }
  .rp-card:hover { transform: none; }
}

/* --------------------------------------------------------------------------
   Financing partner cards

   Both marks are white-on-transparent, so they need the dark band. They also
   have very different proportions (Lyon 243x66, Synchrony 520x174), so the logo
   sits in a fixed-height well and is capped on BOTH axes rather than stretched
   to a common width, which would have made Lyon tower over Synchrony.
   -------------------------------------------------------------------------- */
.rp-fin {
  display: flex; flex-direction: column; align-items: center; gap: 22px;
  height: 100%;
  padding: 34px 26px 28px;
  background: rgba(255,255,255,.045);
  border: 1px solid rgba(255,255,255,.14);
  border-radius: var(--rounded-1);
  text-decoration: none;
  transition: background-color .3s ease, border-color .3s ease,
              transform .3s cubic-bezier(.2,.7,.3,1), box-shadow .3s ease;
}
.rp-fin:hover {
  background: rgba(255,255,255,.085);
  border-color: rgba(255,255,255,.3);
  transform: translateY(-4px);
  box-shadow: 0 16px 34px -14px rgba(0,0,0,.7);
}

.rp-fin__logo {
  display: grid; place-items: center;
  height: 78px; width: 100%;
}
.rp-fin__logo img {
  max-height: 100%;
  max-width: 210px;
  width: auto; height: auto;   /* the theme has no global img{height:auto} */
  display: block;
}

.rp-fin__cta {
  display: inline-flex; align-items: center; gap: 9px;
  color: #fff; font-size: 15px; font-weight: 600; letter-spacing: .01em;
}
.rp-fin__cta svg { transition: transform .3s cubic-bezier(.2,.7,.3,1); }
.rp-fin:hover .rp-fin__cta svg { transform: translateX(5px); }

@media (prefers-reduced-motion: reduce) {
  .rp-fin, .rp-fin__cta svg { transition: background-color .2s ease, border-color .2s ease; }
  .rp-fin:hover { transform: none; }
  .rp-fin:hover .rp-fin__cta svg { transform: none; }
}

/* --------------------------------------------------------------------------
   Social buttons row
   -------------------------------------------------------------------------- */
.rp-follow { display: flex; flex-wrap: wrap; gap: 10px; justify-content: center; }
.rp-btn-social {
  background: transparent !important;
  border: 1px solid rgba(22,24,28,.30);
}
.rp-btn-social span { color: var(--heading-font-color); }
.rp-btn-social:hover { background: var(--bg-dark-1) !important; border-color: var(--bg-dark-1); }
.rp-btn-social:hover span { color: #fff; }

/* --------------------------------------------------------------------------
   Who we are + interview
   -------------------------------------------------------------------------- */
.rp-owner-role {
  font-size: 12px; font-weight: 600; letter-spacing: .14em; text-transform: uppercase;
  color: var(--primary-color); margin: -6px 0 18px;
}

/* --------------------------------------------------------------------------
   TikTok cards
   -------------------------------------------------------------------------- */
.rp-tt-card {
  background: var(--bg-light);
  border-radius: var(--rounded-1);
  overflow: hidden;
  min-height: 560px;
}
.rp-tt-card blockquote { margin: 0 !important; }

/* --------------------------------------------------------------------------
   Small corrections to theme components under the brand palette
   -------------------------------------------------------------------------- */

/* The theme's form border is #cfdde8, 1.4:1 on white: an invisible edge.
   The fields sit on the tinted contact panel rather than plain white, so the
   replacement is measured against that: #7A8087 is 3.41:1 on the field, clearing
   the 3:1 that WCAG 1.4.11 asks of a UI component boundary. */
.form-control {
  border-color: #7A8087;
  border-radius: var(--rounded-1);
}
.form-control:focus {
  border-color: var(--primary-color);
  box-shadow: 0 0 0 3px rgba(var(--primary-color-rgb), .22);
}
.form-control::placeholder { color: #767C83; }

/* The logo ships white-on-transparent, which suits this header in both states
   (it is dark at rest and dark when scrolled). `images/logo-ink.png` exists for a
   light header and is not referenced.

   The theme sizes the logo by WIDTH alone (`--logo-width: 220px`), which suits its
   own 423x42 wordmark: that renders 22px tall inside an 80px header driven by the
   menu. Right Path's mark is 486x222 — a roof above two stacked lines — so the
   same width made it 87px tall, taller than the header itself, and it sat flush
   against the top and bottom edges.

   Capping the HEIGHT is all that is needed; the theme already centres the logo
   vertically, so 64px inside the 96px header leaves 16px of air either side.
   Setting a width or padding here instead re-inflates the header to 180px.

   This is the ONLY place the logo height is set. An earlier attempt put a second
   `#logo img` rule in the header-scale media query above, which lost to this one
   on source order and silently did nothing. */
#logo img { max-height: 64px; width: auto; max-width: none; }
.logo-footer { max-height: 72px; width: auto; max-width: none; }

/* --------------------------------------------------------------------------
   Full-height hero
   The theme caps the hero at `.mh-800` (min-height: 800px), which leaves the
   credential bar poking above the fold on a tall display and crops the copy on a
   short one. `svh` rather than `vh` so mobile browser chrome does not push the
   bottom of the hero out of view.
   -------------------------------------------------------------------------- */
#section-intro .mh-800 {
  min-height: 100vh;
  min-height: 100svh;
}
@media only screen and (max-width: 992px) {
  /* a floor for short landscape phones, where 100svh alone squeezes the copy */
  #section-intro .mh-800 { min-height: max(100svh, 620px); }
}

/* --------------------------------------------------------------------------
   VENDOR BUG: the mobile header.
   Verified against the untouched template at 390px, so this is Pooluxe's own
   defect, not something the rebrand introduced. `#mainmenu` is never hidden in
   the closed state, so the menu items ("Services", "Projects") render straight
   under the logo on first paint, and the CTA wraps onto three lines.

   The theme stamps `menu-open` on <header> when the burger is tapped, so the
   closed state can be hidden without touching the open one or its animation.
   -------------------------------------------------------------------------- */
@media only screen and (max-width: 992px) {
  header.header-mobile:not(.menu-open) #mainmenu { display: none !important; }

  header.header-mobile .menu_side_area { display: flex; align-items: center; gap: 12px; }
  header.header-mobile .menu_side_area .btn-main {
    white-space: nowrap; padding: 10px 16px; font-size: 14px;
  }
  /* Two CTAs plus the burger do not fit a 390px bar: the burger ended up at
     x=431, off screen and unreachable. On mobile the header keeps Call Now only,
     which is the higher-intent action on a phone and is reinforced by the sticky
     bottom bar. Get a Quote is still one tap away in the hero and the drawer. */
  header.header-mobile .menu_side_area .btn-main:not(.rp-btn-call) { display: none; }
  header.header-mobile #logo img { max-width: 150px; }

  /* the open menu sits over the hero film, so it needs its own ground */
  header.header-mobile.menu-open #mainmenu {
    background: var(--bg-dark-1);
    padding: 8px 16px 16px;
    border-radius: var(--rounded-1);
  }
}

/* the notice on the inert enquiry form */
.rp-notice {
  background: rgba(var(--primary-color-rgb), .10);
  border: 1px solid rgba(var(--primary-color-rgb), .38);
  border-radius: var(--rounded-1);
  padding: 14px 16px; font-size: 14.5px; line-height: 1.6;
}
/* the notice sits on a tint of a tint, where the accent itself is only 4.06:1 */
.rp-notice a { color: #1A5E99; font-weight: 600; text-decoration: underline; }
/* A disabled control is exempt from WCAG 1.4.3, but this one is carrying a real
   message (the form is not wired up yet), so it is worth reading. 5.6:1. */
input[type=submit]:disabled, .btn-main:disabled {
  background: #D2D4CE; color: #3E4347; cursor: not-allowed;
}

/* The theme's link colour lands at 4.18:1 on the tinted contact panel. These two
   are the page's primary conversions, so they get ink plus an underline: clearly
   a link, and 14.6:1. */
#section-contact a { color: var(--heading-font-color); text-decoration: underline; text-underline-offset: 3px; }
#section-contact a:hover { color: #1A5E99; }

/* licence strip under the hero copy */
.rp-lic { letter-spacing: .16em; font-size: 11px; text-transform: uppercase; }

@media (max-width: 767px) {
    .rp-review-text { min-height: 0; }
}

@media (prefers-reduced-motion: reduce) {
  .rp-hero-video { display: none; }
}

/* --------------------------------------------------------------------------
   Project gallery (gallery.html, the `photogrid` block in _build/gen.py)

   ⚠ The theme's `#filters` styling assumes a DARK section. `style.css:9326`
   onward only ever sets a colour under `.text-light`, and `#filters a.selected`
   is a flat `color: #fff` with no ground of its own, so on a light section the
   selected tab renders white on white and the rest fall through to the default
   link colour. Every state is named explicitly here.
   -------------------------------------------------------------------------- */
.rp-filters { margin-bottom: 34px; }
#filters li { margin: 0 8px 12px 0; }
#filters a {
  display: inline-block;
  background: var(--bg-light);
  border: solid 1px rgba(26, 29, 33, .12);
  color: #3C424A;                       /* 9.1:1 on the pale ground */
  transition: background-color .2s ease, color .2s ease, border-color .2s ease;
}
#filters a:hover {
  background: rgba(var(--primary-color-rgb), .10);
  border-color: rgba(var(--primary-color-rgb), .35);
  color: #1A5E99;
}
#filters a.selected,
#filters a.selected:hover {
  background: var(--primary-color);
  border-color: var(--primary-color);
  color: #fff;                          /* 5.28:1 on the accent */
}
.rp-fcount {
  display: inline-block;
  margin-left: 6px;
  font-size: 12px;
  font-weight: 600;
  opacity: .68;
}
#filters a.selected .rp-fcount { opacity: .85; }

/* The tile is a FIXED 3:2 box. That is what makes `loading="lazy"` safe here:
   Isotope measures the grid at init, and without a known height it would read
   zero for every unloaded image and stack all 184 on top of each other. It also
   means the width/height attributes on the img cannot stretch anything, which
   is the theme's usual trap (no global `img { height: auto }`). */
.rp-tile {
  position: relative;
  margin: 0;
  aspect-ratio: 3 / 2;
  overflow: hidden;
  border-radius: 6px;
  background: #E9ECEF;                  /* holds the shape before the image lands */
}
.rp-tile img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  transition: transform .6s cubic-bezier(.2, .6, .2, 1);
}
.rp-tile__veil {
  position: absolute; inset: 0;
  background: linear-gradient(180deg, rgba(10,11,13,.05) 0%, rgba(10,11,13,.55) 100%);
  opacity: 0;
  transition: opacity .3s ease;
}
.rp-tile__zoom {
  position: absolute; left: 50%; top: 50%;
  transform: translate(-50%, -46%);
  padding: 9px 20px;
  border: solid 1px rgba(255,255,255,.85);
  border-radius: 4px;
  color: #fff;
  font-size: 12px;
  font-weight: 700;
  letter-spacing: .16em;
  text-transform: uppercase;
  opacity: 0;
  transition: opacity .3s ease, transform .3s ease;
  pointer-events: none;
}
.rp-shot:hover .rp-tile img { transform: scale(1.06); }
.rp-shot:hover .rp-tile__veil { opacity: 1; }
.rp-shot:hover .rp-tile__zoom { opacity: 1; transform: translate(-50%, -50%); }

/* keyboard parity: the gallery is 184 links, and hover-only affordances leave
   a keyboard user with no indication of which one is focused */
.rp-shot:focus-visible { outline: none; }
.rp-shot:focus-visible .rp-tile {
  outline: 3px solid var(--primary-color);
  outline-offset: 3px;
}
.rp-shot:focus-visible .rp-tile__veil,
.rp-shot:focus-visible .rp-tile__zoom { opacity: 1; }

@media (prefers-reduced-motion: reduce) {
  .rp-tile img { transition: none; }
  .rp-shot:hover .rp-tile img { transform: none; }
}

/* Magnific's caption: the theme never styles it for a light-on-dark overlay */
.mfp-title {
  color: rgba(255,255,255,.92);
  font-size: 14px;
  padding-right: 44px;
}
.mfp-counter { color: rgba(255,255,255,.62); font-size: 13px; }

/* ---- homepage mini gallery (the block that replaced the projects carousel) --- */
/* The label is white over an arbitrary project photo, so the case that has to
   hold is the veil over a WHITE frame: at .55 that is 4.67:1 at 13px, passing
   but thin, and these frames include bright sky and white stucco. .68 takes it
   to 7.4:1. The veil is always on for these tiles, unlike the gallery's, because
   the label has to stay readable at rest and not only on hover. */
.rp-minishot .rp-tile__veil {
  opacity: 1;
  background: linear-gradient(180deg, rgba(10,11,13,.10) 40%, rgba(10,11,13,.68) 100%);
}
.rp-minishot__label {
  position: absolute;
  left: 14px; bottom: 12px; right: 14px;
  color: #fff;
  font-size: 13px;
  font-weight: 700;
  letter-spacing: .09em;
  text-transform: uppercase;
  text-shadow: 0 1px 10px rgba(10, 11, 13, .6);   /* the veil alone is not enough over a bright frame */
  pointer-events: none;
}
.rp-minishot__label:after {
  content: "";
  display: block;
  width: 26px; height: 2px;
  margin-top: 7px;
  background: var(--primary-color);
  transition: width .3s ease;
}
.rp-minishot:hover .rp-minishot__label:after { width: 46px; }

/* ---- reviews carousel controls (js/rp.js `reviews()`) ---------------------
   The theme styles `.owl-prev` / `.owl-next` for a section with room at the
   edges. This one is `container-fluid` and centred, so the arrows sit over the
   cards; and `top: 27.5%` (style.css:7712) lands them near the top of a tall
   quote card rather than beside it. Placed and sized here instead. */
.rp-reviews .owl-nav { margin: 0; display: block; }
.rp-reviews .owl-prev,
.rp-reviews .owl-next {
  top: 50%;
  transform: translateY(-50%);
  width: 46px;
  height: 46px;
  display: grid;
  place-items: center;
  background: #fff;
  border: solid 1px rgba(26, 29, 33, .16);
  box-shadow: 0 6px 22px rgba(10, 11, 13, .12);
  transition: background-color .2s ease, border-color .2s ease, box-shadow .2s ease;
}
.rp-reviews .owl-prev { left: 14px; }
.rp-reviews .owl-next { right: 14px; }
.rp-reviews .owl-prev:hover,
.rp-reviews .owl-next:hover {
  transform: translateY(-50%) scale(1.06);
  background: var(--primary-color);
  border-color: var(--primary-color);
  box-shadow: 0 10px 28px rgba(10, 11, 13, .2);
}
.rp-reviews .rp-owlnav { display: grid; place-items: center; width: 100%; height: 100%; }
.rp-reviews .rp-owlnav i { color: #3C424A; font-size: 15px; }   /* 9.1:1 on white */
.rp-reviews .owl-prev:hover .rp-owlnav i,
.rp-reviews .owl-next:hover .rp-owlnav i { color: #fff; }       /* 5.28:1 on the accent */
.rp-reviews .owl-prev:focus-visible,
.rp-reviews .owl-next:focus-visible { outline: 3px solid var(--primary-color); outline-offset: 3px; }

.rp-reviews .owl-dots { margin-top: 26px; text-align: center; }
/* ⚠ The theme hides the dot's inner <span> (style.css:7835) and paints the
   <button> itself (7825: 8x8, margin 0 5px), so span rules do nothing here. */
.rp-reviews .owl-dots .owl-dot {
  width: 9px; height: 9px; margin: 0 5px;
  background: rgba(26, 29, 33, .22);
  transition: background-color .2s ease, width .2s ease;
}
.rp-reviews .owl-dots .owl-dot.active { background: var(--primary-color); width: 22px; }
.rp-reviews .owl-dots .owl-dot:hover { background: rgba(var(--primary-color-rgb), .55); }
/* 23 cards is 23 dots. At 9px on 10px of margin that is 437px and wraps onto a
   second row at 390px; 7px on 4px is 253px plus the wide active dot. */
@media (max-width: 599px) {
  .rp-reviews .owl-dots .owl-dot { width: 7px; height: 7px; margin: 0 2px; }
  .rp-reviews .owl-dots .owl-dot.active { width: 16px; }
}
  .rp-reviews .owl-dot.active span { width: 16px; }
}

@media (max-width: 767px) {
  /* at one card per view the arrows would sit on top of the quote */
  .rp-reviews .owl-nav { display: none; }
}

/* --------------------------------------------------------------------------
   #section-services — a built background, not a photograph

   Layers, back to front: the section's own dark ground, a perspective grid, three
   drifting light fields, a vignette, then the content at z-index 2.

   Everything animated is `transform` or `opacity` only, so none of it triggers
   layout or paint. `will-change` is deliberately NOT set: three always-on
   promoted layers cost more than they save here, and the transforms already
   promote themselves while running.
   -------------------------------------------------------------------------- */
.rp-stage {
  position: relative;
  overflow: hidden;
  background: var(--bg-dark-1);
  isolation: isolate;                 /* keeps the blend modes off the page behind */
}
.rp-stage > .container { position: relative; z-index: 2; }

/* ---- the receding grid: perspective is what reads as 3D ---- */
.rp-stage__grid {
  position: absolute;
  inset: -20% -30% -35%;
  z-index: 0;
  background-image:
    linear-gradient(to right,  rgba(255,255,255,.055) 1px, transparent 1px),
    linear-gradient(to bottom, rgba(255,255,255,.055) 1px, transparent 1px);
  background-size: 68px 68px;
  transform: perspective(680px) rotateX(58deg) translateZ(0);
  transform-origin: 50% 0;
  animation: rp-grid-drift 26s linear infinite;
  /* fades the grid out before it reaches the copy, so it never sits behind text */
  -webkit-mask-image: radial-gradient(120% 78% at 50% 108%, #000 8%, transparent 62%);
          mask-image: radial-gradient(120% 78% at 50% 108%, #000 8%, transparent 62%);
}
@keyframes rp-grid-drift {
  from { background-position: 0 0, 0 0; }
  to   { background-position: 0 68px, 0 68px; }
}

/* ---- the light fields ---- */
.rp-stage__aurora { position: absolute; inset: 0; z-index: 1; }
.rp-stage__blob {
  position: absolute;
  display: block;
  border-radius: 50%;
  filter: blur(80px);
  opacity: .5;
  mix-blend-mode: screen;
}
.rp-stage__blob--a {
  width: 52vw; height: 52vw; left: -12vw; top: -18vw;
  background: radial-gradient(circle, rgba(31,111,178,.85) 0%, rgba(31,111,178,0) 68%);
  animation: rp-drift-a 21s ease-in-out infinite;
}
.rp-stage__blob--b {
  width: 46vw; height: 46vw; right: -14vw; top: 6vw;
  background: radial-gradient(circle, rgba(64,176,214,.62) 0%, rgba(64,176,214,0) 68%);
  animation: rp-drift-b 27s ease-in-out infinite;
}
.rp-stage__blob--c {
  width: 60vw; height: 60vw; left: 26vw; bottom: -30vw;
  background: radial-gradient(circle, rgba(20,70,120,.75) 0%, rgba(20,70,120,0) 70%);
  animation: rp-drift-c 33s ease-in-out infinite;
}
@keyframes rp-drift-a {
  0%,100% { transform: translate3d(0,0,0) scale(1); }
  50%     { transform: translate3d(6vw, 4vw, 0) scale(1.14); }
}
@keyframes rp-drift-b {
  0%,100% { transform: translate3d(0,0,0) scale(1.06); }
  50%     { transform: translate3d(-7vw, 5vw, 0) scale(.92); }
}
@keyframes rp-drift-c {
  0%,100% { transform: translate3d(0,0,0) scale(1); }
  50%     { transform: translate3d(-5vw,-6vw, 0) scale(1.1); }
}

/* ---- vignette: pins the centre down so the copy always has a dark ground ---- */
.rp-stage__vignette {
  position: absolute; inset: 0; z-index: 1;
  background:
    radial-gradient(78% 62% at 50% 42%, rgba(16,18,22,.86) 0%, rgba(16,18,22,.55) 46%, rgba(16,18,22,.22) 100%),
    linear-gradient(180deg, rgba(16,18,22,.92) 0%, rgba(16,18,22,0) 22%, rgba(16,18,22,0) 78%, rgba(16,18,22,.92) 100%);
}

@media (prefers-reduced-motion: reduce) {
  .rp-stage__grid,
  .rp-stage__blob { animation: none; }
}
/* the blur is the expensive part; drop its radius where the section is narrow */
@media (max-width: 767px) {
  .rp-stage__blob { filter: blur(52px); opacity: .42; }
  .rp-stage__grid { background-size: 46px 46px; }
}

/* --------------------------------------------------------------------------
   FAQ page (faq.html, the `faqpage` block)

   ⚠ The collapsed state uses `grid-template-rows: 0fr` and NOT `display: none`.
   The whole value of this page is that a crawler or an answer engine can read
   every answer without running the accordion, so the text has to stay in the
   DOM and stay measurable. `0fr` animates to `1fr` for free and leaves the
   content present.

   And it fails OPEN: the collapse rule requires `.rp-faq-js` on <html>, which
   only js/rp.js sets. With no JavaScript every answer is simply visible.
   -------------------------------------------------------------------------- */
.rp-faqrail {
  position: sticky;
  top: 120px;                          /* clears the 96px fixed header */
}
.rp-faqrail__head {
  font-size: 11px; font-weight: 700; letter-spacing: .14em; text-transform: uppercase;
  color: #6B7280; margin: 0 0 12px;
}
.rp-faqrail ul { list-style: none; padding: 0; margin: 0; }
.rp-faqrail li { margin: 0 0 2px; }
.rp-faqrail a {
  display: flex; align-items: baseline; justify-content: space-between; gap: 10px;
  padding: 8px 12px;
  border-radius: 6px;
  border-left: solid 2px transparent;
  color: #3C424A;                      /* 9.1:1 on white */
  font-size: 14.5px;
  line-height: 1.35;
  transition: background-color .18s ease, color .18s ease, border-color .18s ease;
}
.rp-faqrail a:hover,
.rp-faqrail a.is-current {
  background: rgba(var(--primary-color-rgb), .07);
  border-left-color: var(--primary-color);
  color: #1A5E99;                      /* 5.9:1 on that tint */
}
.rp-faqcount { font-size: 12px; font-weight: 600; color: #6B7280; }

.rp-faq__group { padding: 0 0 46px; }
.rp-faq__group + .rp-faq__group { padding-top: 6px; }
.rp-faq__h2 {
  font-size: 26px;
  margin: 0 0 18px;
  padding-bottom: 12px;
  border-bottom: solid 1px rgba(26, 29, 33, .10);
  scroll-margin-top: 118px;            /* anchor jumps clear the fixed header */
}
.rp-faq__group { scroll-margin-top: 118px; }

.rp-faq__item { border-bottom: solid 1px rgba(26, 29, 33, .09); }
.rp-faq__q { margin: 0; font-size: inherit; font-weight: inherit; }
.rp-faq__btn {
  width: 100%;
  display: flex; align-items: flex-start; justify-content: space-between; gap: 18px;
  padding: 18px 2px;
  background: none; border: 0; text-align: left; cursor: pointer;
  font-family: inherit;
  font-size: 17px; font-weight: 600; line-height: 1.45;
  color: var(--heading-color, #1A1D21);
  transition: color .18s ease;
}
.rp-faq__btn:hover { color: var(--primary-color); }
.rp-faq__btn:focus-visible { outline: 3px solid var(--primary-color); outline-offset: 2px; border-radius: 4px; }

.rp-faq__chev {
  flex: 0 0 auto; width: 22px; height: 22px; margin-top: 2px; position: relative;
}
.rp-faq__chev:before,
.rp-faq__chev:after {
  content: ""; position: absolute; left: 50%; top: 50%;
  background: var(--primary-color);
  transform: translate(-50%, -50%);
  transition: transform .25s ease, opacity .25s ease;
}
.rp-faq__chev:before { width: 13px; height: 2px; }
.rp-faq__chev:after  { width: 2px; height: 13px; }
.rp-faq__btn[aria-expanded="true"] .rp-faq__chev:after { transform: translate(-50%,-50%) scaleY(0); opacity: 0; }

.rp-faq__a { padding: 0 2px 18px; }
.rp-faq__a p {
  margin: 0;
  max-width: 68ch;                     /* measure, not the full 9-column width */
  color: #4A5058;                      /* 7.9:1 on white */
  line-height: 1.72;
}

/* The collapsed state, JS only.

   max-height rather than the tidier `grid-template-rows: 0fr / 1fr`. Both work;
   this one is simply the more compatible of the two. (For the record: `0fr/1fr`
   was swapped out after it appeared to stick at 0px on reopen, and that turned
   out to be a measurement artifact, not a bug. Transitions do not advance in a
   document that is not being rendered, so a headless probe reads the start value
   forever. Worth remembering before "fixing" any other transition here.)

   The cap only has to exceed the tallest answer; these measure about 240px at
   140 words, so 1200px is far clear and the easing never reaches it.

   Still no `display: none` and still no injection on click: the text is in the
   DOM at full length either way, which is the whole point of this page. */
.rp-faq-js .rp-faq__a {
  max-height: 1200px;
  overflow: hidden;
  transition: max-height .3s ease, padding-bottom .3s ease, opacity .25s ease;
}
/* ⚠ Keyed off `.rp-faq__item.is-closed`, NOT off the button with an adjacent
   sibling combinator. The button lives inside the `<h3>`, so `.rp-faq__btn +
   .rp-faq__a` matches nothing at all and every answer stayed permanently open
   while `aria-expanded` said otherwise: the accordion looked broken AND lied to
   assistive tech. The class goes on the item, which is a real ancestor of both. */
.rp-faq-js .rp-faq__item.is-closed .rp-faq__a {
  max-height: 0;
  padding-bottom: 0;
  opacity: 0;
}
@media (prefers-reduced-motion: reduce) {
  .rp-faq-js .rp-faq__a { transition: none; }
  .rp-faq__chev:before, .rp-faq__chev:after { transition: none; }
}
@media (max-width: 991px) {
  .rp-faqrail { position: static; margin-bottom: 8px; }
  .rp-faqrail ul { display: flex; flex-wrap: wrap; gap: 6px; }
  .rp-faqrail li { margin: 0; }
  .rp-faqrail a { border-left: 0; border: solid 1px rgba(26,29,33,.12); }
}

/* --------------------------------------------------------------------------
   Process band: the theme's step arrows are removed

   ⚠ `.de-step-arrow::after` (style.css:9588) is `content: "→"` at
   `right: -25px; top: 50%`. That works for the theme's own steps, which are just
   an icon and a short title. Ours carry a paragraph, so the step box is 404px
   tall and `top: 50%` puts the arrow at 202px, which is the middle of the body
   copy. Worse, at `row-cols-lg-5` the columns butt together with an effective
   gutter of 0px, so `right: -25px` lands the glyph 25px INSIDE the next step's
   text, striking through the first word of a line.

   Removed rather than repositioned: the five steps are numbered by their icons
   and read left to right on their own, so the arrow was decoration that cost
   legibility. To bring it back, align it to the icon row instead of the box
   centre (`top: 44px`) and give the row real gutters first.
   -------------------------------------------------------------------------- */
#section-process .de-step-arrow::after { content: none; }

/* Yelp source mark on review cards, in the 30px slot the Google SVG uses.
   Yelp's own logo is not bundled and must not be hotlinked; the FontAwesome
   brand glyph is, in Yelp red. #D32323 on the card tint reads 4.7:1. */
.rp-yelp { display: inline-flex; align-items: center; justify-content: center; width: 30px; height: 30px; flex: 0 0 30px; }
.rp-yelp i { font-size: 26px; line-height: 1; color: #D32323; }

/* ==========================================================================
   WordPress layer. Everything below exists only in the WordPress theme:
   review source marks, the blog, comments, core block support, and the
   classes the theme directory requires.
   ========================================================================== */

/* review source marks (Google, Yelp, Facebook, Houzz) via Font Awesome */
.rp-mark { display: inline-flex; align-items: center; justify-content: center; width: 30px; height: 30px; flex: 0 0 30px; }
.rp-mark i { font-size: 24px; line-height: 1; }
.rp-mark--google i { color: #4285F4; }
.rp-mark--yelp i { font-size: 26px; color: #D32323; }
.rp-mark--facebook i { color: #1877F2; }
.rp-mark--houzz i { color: #4DBC15; }

/* text logo when no image logo is set */
.rp-logo-text {
  font-family: var(--heading-font);
  font-weight: 800;
  font-size: 22px;
  letter-spacing: -.02em;
  color: #fff;
  text-decoration: none;
  white-space: nowrap;
}
#logo a { display: inline-flex; align-items: center; min-height: 64px; }
/* the image logo is capped at 150px on phones (above); the text logo has to
   fit the same slot or the call button pushes the burger off screen */
header.header-mobile .rp-logo-text { font-size: 17px; max-width: 150px; white-space: normal; line-height: 1.15; }
/* between 992 and 1199 the desktop bar is tight: a 22px text logo pushes the
   menu onto a second line. 17px keeps it within the image logo's width. */
@media (min-width: 992px) and (max-width: 1199px) {
  header:not(.header-mobile) .rp-logo-text { font-size: 16px; max-width: 140px; white-space: normal; line-height: 1.15; }
  /* seven menu items plus two buttons is a tight row: a shade less air */
  header:not(.header-mobile) #mainmenu > li { margin-right: 22px; }
  header:not(.header-mobile) .menu_side_area .btn-main { padding-left: 18px; padding-right: 18px; white-space: nowrap; }
}
footer .rp-logo-text { font-size: 24px; }

/* banner without a featured image */
.rp-banner--plain { background: var(--bg-dark-1); }
.rp-banner--plain .rp-bannerscrim { display: none; }
.rp-banner h1 span { color: var(--primary-color); }

/* skip link */
.skip-link { position: absolute; left: -9999px; top: 0; z-index: 100000; }
.skip-link:focus {
  left: 12px; top: 12px;
  padding: 10px 16px;
  background: var(--primary-color);
  color: #fff;
  border-radius: 6px;
  outline: 3px solid #fff;
}

/* header nav wrapper must not add layout of its own */
.header-col-mid nav { display: contents; }

/* menu button as a real control */
#menu-btn:focus-visible { outline: 3px solid var(--primary-color); outline-offset: 2px; }

/* mega menu group headings when a heading item is also a link */
.rp-mega__head a { color: inherit; text-decoration: none; }

/* front page: the static page's own content */
.rp-frontcontent .entry-content > *:last-child { margin-bottom: 0; }

/* service cards (Services Hub template) */
.rp-svc-card {
  display: flex; flex-direction: column; height: 100%;
  background: #fff; border-radius: 12px; overflow: hidden;
  color: inherit; text-decoration: none;
  box-shadow: 0 1px 2px rgba(22, 24, 28, .06), 0 8px 24px rgba(22, 24, 28, .06);
  transition: transform .25s ease, box-shadow .25s ease;
}
.rp-svc-card:hover { transform: translateY(-4px); box-shadow: 0 2px 4px rgba(22, 24, 28, .08), 0 18px 40px rgba(22, 24, 28, .12); color: inherit; }
.rp-svc-card__media { display: block; aspect-ratio: 3 / 2; overflow: hidden; }
.rp-svc-card__media img { width: 100%; height: 100%; object-fit: cover; display: block; transition: transform .6s ease; }
.rp-svc-card:hover .rp-svc-card__media img { transform: scale(1.04); }
.rp-svc-card__body { display: flex; flex-direction: column; gap: 8px; padding: 24px 26px 26px; flex: 1; }
.rp-svc-card__title { display: block; color: var(--heading-font-color); font-family: var(--heading-font); font-weight: 700; }
.rp-svc-card__text { display: block; color: var(--body-font-color); }
.rp-svc-card__more { margin-top: auto; padding-top: 8px; color: var(--primary-color); font-weight: 700; font-size: 14px; }
.rp-svc-card__more:after { content: "\2192"; margin-left: 6px; }

/* financing card with no logo image */
.rp-fin__name { color: #fff; font-family: var(--heading-font); font-weight: 800; font-size: 24px; }

/* contact form wrapper: give plugin forms the theme's field look */
.rp-form input[type="text"],
.rp-form input[type="email"],
.rp-form input[type="tel"],
.rp-form input[type="url"],
.rp-form input[type="number"],
.rp-form select,
.rp-form textarea {
  width: 100%;
  padding: 12px 16px;
  border: 1px solid rgba(22, 24, 28, .18);
  border-radius: 8px;
  background: #fff;
  font: inherit;
  color: var(--heading-font-color);
  margin-bottom: 16px;
}
.rp-form textarea { min-height: 140px; }
.rp-form label { display: block; font-weight: 700; color: var(--heading-font-color); margin-bottom: 8px; }
.rp-form input[type="submit"],
.rp-form button[type="submit"] {
  background: var(--primary-color); color: #fff; border: 0; border-radius: 6px;
  padding: 14px 28px; font-weight: 700; cursor: pointer;
}
.rp-form input[type="submit"]:hover,
.rp-form button[type="submit"]:hover { background: var(--bg-dark-1); }
.rp-notice a { display: inline-block; margin-right: 16px; font-weight: 700; }
/* Contact Form 7 inside the contact section: the field wrappers become plain
   blocks, validation reads in the theme's colours, and the button is the
   theme's button */
.rp-form .wpcf7-form-control-wrap { display: block; }
.rp-form .wpcf7-form .row > [class*="col-"] { margin-bottom: 0; }
/* CF7 wraps the template in <p> and turns every line break into <br>, which
   doubled the spacing: the row gutter (g-4) is the only spacing wanted */
.rp-form .wpcf7-form p { margin: 0; }
.rp-form .wpcf7-form br { display: none; }
.rp-form .wpcf7-form label { margin-bottom: 8px; }
.rp-form .wpcf7-form input:not([type="submit"]),
.rp-form .wpcf7-form select { height: 52px; margin-bottom: 0; }
.rp-form .wpcf7-form textarea { margin-bottom: 0; }
/* macOS and iOS ignore padding on a native <select>; draw it ourselves */
.rp-form select {
  -webkit-appearance: none; appearance: none;
  padding-right: 44px; cursor: pointer;
  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='9' viewBox='0 0 14 9'%3E%3Cpath d='M1 1l6 6 6-6' fill='none' stroke='%2316181C' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-position: right 18px center;
}
.rp-form input:focus, .rp-form select:focus, .rp-form textarea:focus { outline: 0; border-color: var(--primary-color); box-shadow: 0 0 0 3px rgba(var(--primary-color-rgb), .18); }
.rp-form .wpcf7-form input[type="submit"] { background: var(--primary-color); color: #fff; border: 0; border-radius: 30px; padding: 14px 32px; font-weight: 700; cursor: pointer; margin-top: 4px; transition: background-color .25s ease, transform .25s ease; }
.rp-form .wpcf7-form input[type="submit"]:hover { background: var(--bg-dark-1); transform: translateY(-3px); }
.rp-form .wpcf7-form input[type="submit"]:disabled { opacity: .6; transform: none; }
.rp-form .wpcf7-spinner { display: inline-block; margin-left: 12px; }
.rp-form .wpcf7-not-valid { border-color: #c0392b !important; }
.rp-form .wpcf7-not-valid-tip { display: block; margin: -8px 0 12px; color: #c0392b; font-size: 13px; }
.rp-form .wpcf7-response-output { margin: 20px 0 0; padding: 14px 18px; border: 0; border-radius: 8px; background: rgba(31, 111, 178, .10); color: var(--heading-font-color); }
.rp-form .wpcf7-form.invalid .wpcf7-response-output,
.rp-form .wpcf7-form.failed .wpcf7-response-output { background: rgba(192, 57, 43, .10); }
.rp-form .wpcf7-form.sent .wpcf7-response-output { background: rgba(31, 111, 178, .12); font-weight: 600; }
.rp-form .screen-reader-response { position: absolute; left: -9999px; }

/* blog cards */
.rp-post { background: #fff; border-radius: 12px; overflow: hidden; box-shadow: 0 1px 2px rgba(22, 24, 28, .06), 0 8px 24px rgba(22, 24, 28, .06); display: flex; flex-direction: column; }
.rp-post .post-thumbnail { margin: 0 !important; }
.rp-post .post-thumbnail img { border-radius: 0 !important; display: block; aspect-ratio: 3 / 2; object-fit: cover; }
.rp-post__body { padding: 24px 26px 26px; display: flex; flex-direction: column; flex: 1; }
.rp-post__meta { color: var(--body-font-color); }
.rp-post .entry-title a { color: var(--heading-font-color); text-decoration: none; }
.rp-post .entry-title a:hover { color: var(--primary-color); }
.rp-post .entry-summary p { margin-bottom: 12px; }
.rp-more { margin-top: auto; font-weight: 700; color: var(--primary-color); text-decoration: none; }
.rp-more:after { content: "\2192"; margin-left: 6px; }
.rp-single .entry-meta { color: var(--body-font-color); }
.rp-single .entry-content > *:first-child { margin-top: 0; }

/* pagination and post navigation */
.rp-pagination .nav-links { display: flex; flex-wrap: wrap; gap: 6px; justify-content: center; }
.rp-pagination .page-numbers {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 42px; height: 42px; padding: 0 12px;
  border-radius: 8px; background: #fff; color: var(--heading-font-color);
  text-decoration: none; font-weight: 600;
  box-shadow: 0 1px 2px rgba(22, 24, 28, .08);
}
.rp-pagination .page-numbers.current,
.rp-pagination a.page-numbers:hover { background: var(--primary-color); color: #fff; }
.rp-postnav .nav-links { display: flex; justify-content: space-between; gap: 24px; border-top: 1px solid rgba(22, 24, 28, .12); padding-top: 24px; }
.rp-postnav a { text-decoration: none; color: var(--heading-font-color); max-width: 48%; }
.rp-postnav .nav-subtitle { display: block; font-size: 12px; text-transform: uppercase; letter-spacing: .08em; color: var(--primary-color); font-weight: 700; }
.rp-postnav .nav-title { font-weight: 700; }
.rp-postnav .nav-next { text-align: right; margin-left: auto; }

/* widgets */
.widget-area .widget { margin-bottom: 36px; }
.widget-area .widget ul { list-style: none; padding: 0; margin: 0; }
.widget-area .widget li { padding: 6px 0; border-bottom: 1px solid rgba(22, 24, 28, .08); }
.widget-area .widget a { color: var(--heading-font-color); text-decoration: none; }
.widget-area .widget a:hover { color: var(--primary-color); }
.widget-area select { width: 100%; padding: 10px 12px; border-radius: 8px; border: 1px solid rgba(22, 24, 28, .18); }
footer .rp-footer-widgets { margin-top: 24px; }
footer .widget ul { list-style: none; padding: 0; margin: 0; }

/* search form */
.rp-search .form-control { padding: 12px 16px; border-radius: 8px; border: 1px solid rgba(22, 24, 28, .18); }
.rp-search .btn-main { border: 0; }

/* comments */
.comment-list, .comment-list .children { list-style: none; padding: 0; margin: 0; }
.comment-list .children { margin-left: 40px; }
.rp-comment__body { background: #fff; border-radius: 12px; padding: 22px 24px; margin-bottom: 16px; box-shadow: 0 1px 2px rgba(22, 24, 28, .06); }
.rp-comment__body .comment-metadata a { color: var(--body-font-color); font-size: 13px; text-decoration: none; }
.rp-comment__body .reply a { font-weight: 700; color: var(--primary-color); text-decoration: none; font-size: 14px; }
.comment-form label { display: block; font-weight: 700; color: var(--heading-font-color); margin-bottom: 6px; }
.comment-form input[type="text"],
.comment-form input[type="email"],
.comment-form input[type="url"],
.comment-form textarea { width: 100%; padding: 12px 16px; border: 1px solid rgba(22, 24, 28, .18); border-radius: 8px; margin-bottom: 14px; font: inherit; }
.comment-form .submit { border: 0; cursor: pointer; }
.comment-form-cookies-consent { display: flex; gap: 8px; align-items: center; margin-bottom: 14px; }
.comment-form-cookies-consent label { margin: 0; font-weight: 400; }
.comment-navigation .nav-links { display: flex; justify-content: space-between; margin: 16px 0; }

/* page content wrappers */
#rp-content .entry-content > *:first-child { margin-top: 0; }

/* core block alignment and caption classes (required by the theme directory) */
.alignleft { float: left; margin: .5em 1.5em 1em 0; }
.alignright { float: right; margin: .5em 0 1em 1.5em; }
.aligncenter { display: block; margin: 1em auto; clear: both; }
.alignwide { max-width: 1320px; margin-left: auto; margin-right: auto; }
.alignfull { width: 100vw; max-width: 100vw; margin-left: calc(50% - 50vw); margin-right: calc(50% - 50vw); }
.wp-caption { max-width: 100%; }
.wp-caption img { height: auto; }
.wp-caption-text, .gallery-caption { font-size: 14px; color: var(--body-font-color); text-align: center; margin-top: 6px; }
.sticky .entry-title:before { content: "\2605"; color: var(--primary-color); margin-right: 6px; }
.bypostauthor .comment-author:after { content: attr(data-author); }
.screen-reader-text {
  border: 0; clip: rect(1px, 1px, 1px, 1px); clip-path: inset(50%);
  height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute !important; width: 1px; word-wrap: normal !important;
}
.screen-reader-text:focus {
  background: #fff; border-radius: 3px; box-shadow: 0 0 2px 2px rgba(0, 0, 0, .6);
  clip: auto !important; clip-path: none; color: var(--heading-font-color); display: block;
  font-size: 14px; font-weight: 700; height: auto; left: 5px; line-height: normal; padding: 15px 23px 14px;
  text-decoration: none; top: 5px; width: auto; z-index: 100000;
}
.entry-content img, .entry-content video, .entry-content iframe { max-width: 100%; height: auto; }
.entry-content .wp-block-image img { height: auto; }
.entry-content .wp-block-quote { border-left: 4px solid var(--primary-color); padding-left: 20px; }
.entry-content .wp-block-button__link { background: var(--primary-color); color: #fff; border-radius: 6px; }
.entry-content .wp-block-table table { width: 100%; }
.entry-content ul:not([class]), .entry-content ol:not([class]) { padding-left: 1.4em; margin-bottom: 1.2em; }
.page-links { margin: 24px 0; font-weight: 700; }
.page-links a, .page-links > span { display: inline-block; margin-left: 6px; }

/* The base stylesheet styles the bare <footer> element as the site footer.
   Footers inside content (comments, the Latest Comments block, article
   footers) must not inherit that dark band. */
main footer,
main footer p,
main footer a,
main footer h3,
main footer h5,
main footer h6 { position: static; background: transparent; color: inherit; padding: 0; margin: 0; }
main footer a { color: var(--primary-color); }
main .comment-meta, main .entry-footer { margin-bottom: 8px; }

/* block styles registered in functions.php */
.wp-block-group.is-style-rp-card { background: #fff; border-radius: 12px; padding: 28px 30px; box-shadow: 0 1px 2px rgba(22, 24, 28, .06), 0 8px 24px rgba(22, 24, 28, .06); }
.wp-block-group.is-style-rp-dark { background: var(--bg-dark-1); color: rgba(255, 255, 255, .85); border-radius: 12px; padding: 40px; }
.wp-block-group.is-style-rp-dark h1, .wp-block-group.is-style-rp-dark h2, .wp-block-group.is-style-rp-dark h3, .wp-block-group.is-style-rp-dark h4 { color: #fff; }
.wp-block-list.is-style-ul-check, ul.is-style-ul-check { list-style: none; padding-left: 0; }
ul.is-style-ul-check li { position: relative; padding-left: 28px; margin-bottom: 8px; }
ul.is-style-ul-check li:before { content: "\f00c"; font-family: "FontAwesome"; color: var(--primary-color); position: absolute; left: 0; }

/* outline button inside the dark services tab panel: white on dark, and a
   white fill on hover (the social-row button's ink-on-white styling does not
   survive a dark ground) */
.d-tab-content .btn-main.rp-tab-more { background: transparent !important; color: #fff; border: 1px solid rgba(255, 255, 255, .45); }
.d-tab-content .btn-main.rp-tab-more span { color: #fff; }
.d-tab-content .btn-main.rp-tab-more:hover { background: #fff !important; border-color: #fff; }
.d-tab-content .btn-main.rp-tab-more:hover span,
.d-tab-content .btn-main.rp-tab-more:hover:before { color: var(--bg-dark-1) !important; }
/* the stage decoration must never intercept a click */
.rp-stage__grid, .rp-stage__aurora, .rp-stage__vignette { pointer-events: none; }

/* ==========================================================================
   Page-builder pages (Elementor). The theme's sections are full-bleed bands
   with their own .container inside, so the builder's boxed container, its
   padding and its widget gaps must step aside around them.
   ========================================================================== */
.elementor-widget[data-widget_type^="rp-"] { width: 100%; margin-bottom: 0 !important; }
.elementor-widget[data-widget_type^="rp-"] > .elementor-widget-container { width: 100%; }
.e-con:has(> .elementor-widget[data-widget_type^="rp-"]),
.e-con:has(> .e-con-inner > .elementor-widget[data-widget_type^="rp-"]) {
  --content-width: 100%;
  --width: 100%;
  --padding-top: 0; --padding-right: 0; --padding-bottom: 0; --padding-left: 0;
  --gap: 0; --row-gap: 0; --column-gap: 0;
  --margin-top: 0; --margin-bottom: 0;
}
.elementor-section:has(.elementor-widget[data-widget_type^="rp-"]) > .elementor-container { max-width: none; }
.elementor-section:has(.elementor-widget[data-widget_type^="rp-"]) .elementor-widget-wrap { padding: 0; }
/* ⚠ Elementor's editor reuses the name `--primary-color` for its own selection
   outline (editor-preview.css sets it on every .e-con), which turned the theme's
   accent pink inside the editor. The accent is re-declared from its own alias
   on each widget, so the theme's variable wins under any ancestor. */
.elementor-widget[data-widget_type^="rp-"] { --primary-color: var(--rp-accent); }
/* the builder's editor never scrolls the page, so reveal-on-scroll never fires there */
.elementor-editor-active .wow { visibility: visible !important; animation-name: none !important; }
.rp-el-missing { padding: 40px; text-align: center; background: #fff3cd; }
