*,
::before,
::after {
  --tw-border-spacing-x: 0;
  --tw-border-spacing-y: 0;
  --tw-translate-x: 0;
  --tw-translate-y: 0;
  --tw-rotate: 0;
  --tw-skew-x: 0;
  --tw-skew-y: 0;
  --tw-scale-x: 1;
  --tw-scale-y: 1;
  --tw-pan-x:  ;
  --tw-pan-y:  ;
  --tw-pinch-zoom:  ;
  --tw-scroll-snap-strictness: proximity;
  --tw-gradient-from-position:  ;
  --tw-gradient-via-position:  ;
  --tw-gradient-to-position:  ;
  --tw-ordinal:  ;
  --tw-slashed-zero:  ;
  --tw-numeric-figure:  ;
  --tw-numeric-spacing:  ;
  --tw-numeric-fraction:  ;
  --tw-ring-inset:  ;
  --tw-ring-offset-width: 0px;
  --tw-ring-offset-color: #fff;
  --tw-ring-color: rgb(59 130 246 / 0.5);
  --tw-ring-offset-shadow: 0 0 #0000;
  --tw-ring-shadow: 0 0 #0000;
  --tw-shadow: 0 0 #0000;
  --tw-shadow-colored: 0 0 #0000;
  --tw-blur:  ;
  --tw-brightness:  ;
  --tw-contrast:  ;
  --tw-grayscale:  ;
  --tw-hue-rotate:  ;
  --tw-invert:  ;
  --tw-saturate:  ;
  --tw-sepia:  ;
  --tw-drop-shadow:  ;
  --tw-backdrop-blur:  ;
  --tw-backdrop-brightness:  ;
  --tw-backdrop-contrast:  ;
  --tw-backdrop-grayscale:  ;
  --tw-backdrop-hue-rotate:  ;
  --tw-backdrop-invert:  ;
  --tw-backdrop-opacity:  ;
  --tw-backdrop-saturate:  ;
  --tw-backdrop-sepia:  ;
  --tw-contain-size:  ;
  --tw-contain-layout:  ;
  --tw-contain-paint:  ;
  --tw-contain-style:  ;
}

::backdrop {
  --tw-border-spacing-x: 0;
  --tw-border-spacing-y: 0;
  --tw-translate-x: 0;
  --tw-translate-y: 0;
  --tw-rotate: 0;
  --tw-skew-x: 0;
  --tw-skew-y: 0;
  --tw-scale-x: 1;
  --tw-scale-y: 1;
  --tw-pan-x:  ;
  --tw-pan-y:  ;
  --tw-pinch-zoom:  ;
  --tw-scroll-snap-strictness: proximity;
  --tw-gradient-from-position:  ;
  --tw-gradient-via-position:  ;
  --tw-gradient-to-position:  ;
  --tw-ordinal:  ;
  --tw-slashed-zero:  ;
  --tw-numeric-figure:  ;
  --tw-numeric-spacing:  ;
  --tw-numeric-fraction:  ;
  --tw-ring-inset:  ;
  --tw-ring-offset-width: 0px;
  --tw-ring-offset-color: #fff;
  --tw-ring-color: rgb(59 130 246 / 0.5);
  --tw-ring-offset-shadow: 0 0 #0000;
  --tw-ring-shadow: 0 0 #0000;
  --tw-shadow: 0 0 #0000;
  --tw-shadow-colored: 0 0 #0000;
  --tw-blur:  ;
  --tw-brightness:  ;
  --tw-contrast:  ;
  --tw-grayscale:  ;
  --tw-hue-rotate:  ;
  --tw-invert:  ;
  --tw-saturate:  ;
  --tw-sepia:  ;
  --tw-drop-shadow:  ;
  --tw-backdrop-blur:  ;
  --tw-backdrop-brightness:  ;
  --tw-backdrop-contrast:  ;
  --tw-backdrop-grayscale:  ;
  --tw-backdrop-hue-rotate:  ;
  --tw-backdrop-invert:  ;
  --tw-backdrop-opacity:  ;
  --tw-backdrop-saturate:  ;
  --tw-backdrop-sepia:  ;
  --tw-contain-size:  ;
  --tw-contain-layout:  ;
  --tw-contain-paint:  ;
  --tw-contain-style:  ;
}

html {
  scroll-behavior: smooth;
}

/* Safety net against horizontal overflow + max-width cap.
     - <html> uses overflow-x:hidden (document scroller — safe for sticky).
     - <body> uses overflow-x:CLIP, not hidden: hidden would force overflow-y
       to `auto`, making body a nested scroll container that BREAKS the sticky
       header/announcement. `clip` clamps the x-axis without that side effect. */

html {
  overflow-x: hidden;
  max-width: 100%;
}

body {
  overflow-x: clip;
  max-width: 100%;
  line-height: 1.7;
  text-rendering: optimizeLegibility;
  -webkit-font-smoothing: antialiased;
  /* Long unbreakable strings (e.g. {{TOKENS}}, URLs) wrap instead of
       overflowing their container — the actual fix for the stats values. */
  overflow-wrap: break-word;
}

h1,
h2,
h3,
h4 {
  font-family: Fraunces, Georgia, serif;
  --tw-text-opacity: 1;
  color: rgb(28 24 21 / var(--tw-text-opacity, 1));
  line-height: 1.12;
  letter-spacing: -0.01em;
}

/* Sticky stack is the announcement bar (~2.75rem) + header (5rem) — offset
     in-page anchor targets so headings aren't hidden beneath it when jumped to. */

[id] {
  scroll-margin-top: calc(8rem + env(safe-area-inset-top, 0px));
}

/* Restrained, consistent keyboard-focus ring — brown accent, never on
     mouse click. */

a:focus-visible,
button:focus-visible {
  border-radius: 0.125rem;
  outline: 2px solid transparent;
  outline-offset: 2px;
  --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0
    var(--tw-ring-offset-width) var(--tw-ring-offset-color);
  --tw-ring-shadow: var(--tw-ring-inset) 0 0 0
    calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);
  box-shadow:
    var(--tw-ring-offset-shadow), var(--tw-ring-shadow),
    var(--tw-shadow, 0 0 #0000);
  --tw-ring-color: rgb(107 45 45 / 0.4);
  --tw-ring-offset-width: 2px;
  --tw-ring-offset-color: #faf7f2;
}

/* Section wrapper — very generous vertical breathing room. */

.section {
  padding-top: 6rem;
  padding-bottom: 6rem;
}

@media (min-width: 1024px) {
  .section {
    padding-top: 8rem;
    padding-bottom: 8rem;
  }
}

/* Centered max-width container. */

.container-px {
  margin-left: auto;
  margin-right: auto;
  max-width: 80rem;
  padding-left: 1.5rem;
  padding-right: 1.5rem;
}

@media (min-width: 1024px) {
  .container-px {
    padding-left: 2rem;
    padding-right: 2rem;
  }
}

/* Small uppercase label — the main place brown appears in copy. */

.eyebrow {
  font-size: 0.75rem;
  line-height: 1rem;
  font-weight: 500;
  text-transform: uppercase;
  letter-spacing: 0.2em;
  --tw-text-opacity: 1;
  color: rgb(107 45 45 / var(--tw-text-opacity, 1));
}

/* Display heading. */

.h-display {
  font-family: Fraunces, Georgia, serif;
  font-size: 2.25rem;
  line-height: 2.5rem;
  --tw-text-opacity: 1;
  color: rgb(28 24 21 / var(--tw-text-opacity, 1));
}

@media (min-width: 640px) {
  .h-display {
    font-size: 3rem;
    line-height: 1;
  }
}

@media (min-width: 1024px) {
  .h-display {
    font-size: 3.75rem;
    line-height: 1;
  }
}

/* Section heading. */

.h-section {
  font-family: Fraunces, Georgia, serif;
  font-size: 1.875rem;
  line-height: 2.25rem;
  --tw-text-opacity: 1;
  color: rgb(28 24 21 / var(--tw-text-opacity, 1));
}

@media (min-width: 640px) {
  .h-section {
    font-size: 2.25rem;
    line-height: 2.5rem;
  }
}

/* Body lede. */

.lede {
  font-size: 1.125rem;
  line-height: 1.75rem;
  line-height: 1.625;
  color: rgb(28 24 21 / 0.7);
}

/* Thin brown rule — a restrained divider accent. */

.rule-accent {
  height: 1px;
  width: 3rem;
  --tw-bg-opacity: 1;
  background-color: rgb(107 45 45 / var(--tw-bg-opacity, 1));
}

/* Primary CTA — brown background, white text, oxblood on hover. */

.btn-primary {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: 9999px;
  --tw-bg-opacity: 1;
  background-color: rgb(107 45 45 / var(--tw-bg-opacity, 1));
  padding-left: 1.75rem;
  padding-right: 1.75rem;
  padding-top: 0.75rem;
  padding-bottom: 0.75rem;
  font-size: 0.875rem;
  line-height: 1.25rem;
  font-weight: 500;
  --tw-text-opacity: 1;
  color: rgb(255 255 255 / var(--tw-text-opacity, 1));
  transition-property:
    color, background-color, border-color, text-decoration-color, fill, stroke;
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  transition-duration: 300ms;
}

.btn-primary:hover {
  --tw-bg-opacity: 1;
  background-color: rgb(78 31 31 / var(--tw-bg-opacity, 1));
}

/* Secondary button — outline that warms to brown on hover. */

.btn-ghost {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: 9999px;
  border-width: 1px;
  border-color: rgb(28 24 21 / 0.2);
  padding-left: 1.75rem;
  padding-right: 1.75rem;
  padding-top: 0.75rem;
  padding-bottom: 0.75rem;
  font-size: 0.875rem;
  line-height: 1.25rem;
  font-weight: 500;
  --tw-text-opacity: 1;
  color: rgb(28 24 21 / var(--tw-text-opacity, 1));
  transition-property:
    color, background-color, border-color, text-decoration-color, fill, stroke;
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  transition-duration: 300ms;
}

.btn-ghost:hover {
  --tw-border-opacity: 1;
  border-color: rgb(107 45 45 / var(--tw-border-opacity, 1));
  --tw-text-opacity: 1;
  color: rgb(107 45 45 / var(--tw-text-opacity, 1));
}

/* Text link with brown accent. */

.link-accent {
  --tw-text-opacity: 1;
  color: rgb(107 45 45 / var(--tw-text-opacity, 1));
  text-underline-offset: 4px;
  transition-property:
    color, background-color, border-color, text-decoration-color, fill, stroke;
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  transition-duration: 300ms;
}

.link-accent:hover {
  --tw-text-opacity: 1;
  color: rgb(90 36 36 / var(--tw-text-opacity, 1));
  text-decoration-line: underline;
}

/* GSAP reveal: initial hidden state (script animates to visible). */

.reveal {
  --tw-translate-y: 1.5rem;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y))
    rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y))
    scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
  opacity: 0;
}

/* Form inputs — quiet, with a brown focus accent. */

.form-field {
  width: 100%;
  border-radius: 0.125rem;
  border-width: 1px;
  border-color: rgb(28 24 21 / 0.15);
  --tw-bg-opacity: 1;
  background-color: rgb(250 247 242 / var(--tw-bg-opacity, 1));
  padding-left: 1rem;
  padding-right: 1rem;
  padding-top: 0.75rem;
  padding-bottom: 0.75rem;
  --tw-text-opacity: 1;
  color: rgb(28 24 21 / var(--tw-text-opacity, 1));
  transition-property:
    color, background-color, border-color, text-decoration-color, fill, stroke;
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  transition-duration: 300ms;
}

.form-field::-moz-placeholder {
  color: rgb(28 24 21 / 0.35);
}

.form-field::placeholder {
  color: rgb(28 24 21 / 0.35);
}

.form-field:focus {
  --tw-border-opacity: 1;
  border-color: rgb(107 45 45 / var(--tw-border-opacity, 1));
  outline: 2px solid transparent;
  outline-offset: 2px;
  --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0
    var(--tw-ring-offset-width) var(--tw-ring-offset-color);
  --tw-ring-shadow: var(--tw-ring-inset) 0 0 0
    calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);
  box-shadow:
    var(--tw-ring-offset-shadow), var(--tw-ring-shadow),
    var(--tw-shadow, 0 0 #0000);
  --tw-ring-color: rgb(107 45 45 / 0.3);
}

/* Round nav button overlaid on a Swiper gallery. */

.swiper-nav-btn {
  position: absolute;
  top: 50%;
  z-index: 10;
  display: inline-flex;
  height: 2.5rem;
  width: 2.5rem;
  --tw-translate-y: -50%;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y))
    rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y))
    scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
  cursor: pointer;
  align-items: center;
  justify-content: center;
  border-radius: 9999px;
  background-color: rgb(250 247 242 / 0.9);
  --tw-text-opacity: 1;
  color: rgb(28 24 21 / var(--tw-text-opacity, 1));
  --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
  --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);
  box-shadow:
    var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000),
    var(--tw-shadow);
  transition-property:
    color, background-color, border-color, text-decoration-color, fill, stroke;
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  transition-duration: 300ms;
}

.swiper-nav-btn:hover {
  --tw-text-opacity: 1;
  color: rgb(107 45 45 / var(--tw-text-opacity, 1));
}

/* Swiper accent — brand brown for pagination/nav on the gallery. */

.gallery-swiper {
  --swiper-theme-color: #6b2d2d;
  --swiper-pagination-bottom: 12px;
}

/* ------------------------------------------------------------------
   Base — typographic rhythm, generous and airy.
------------------------------------------------------------------ */

/* ------------------------------------------------------------------
   Components — premium primitives. Brown used only as a sparing accent.
------------------------------------------------------------------ */

/* ------------------------------------------------------------------
   Section padding — phones only. `.section` is py-24 lg:py-32; on phones
   (<=767px, Tailwind's md cutoff) tighten to a calm 4rem top/bottom.
   Written as plain CSS (unlayered) so it also overrides any per-section
   padding utilities in the markup (e.g. featured's pt-0) on mobile.
   Desktop/tablet spacing is untouched.
------------------------------------------------------------------ */

@media (max-width: 767px) {
  /* .section.section: doubled specificity so this wins over per-section padding
     utilities (e.g. featured's pt-0) under the CDN, exactly as the original
     compiled build did via source order. */
  .section.section {
    padding-top: 4rem;
    padding-bottom: 4rem;
  }
}

/* ------------------------------------------------------------------
   Clients tiled background — phones only. The background-image/size/repeat
   live in an INLINE style on the .clients-section element, so overriding
   background-size needs !important to beat the inline value. Phones show the
   tile larger (60%); desktop/tablet keep the inline 30%. Only size changes —
   image, repeat, position, and the overlay are all untouched.
------------------------------------------------------------------ */

@media (max-width: 767px) {
  .clients-section {
    background-size: 60% !important;
  }
}

/* ------------------------------------------------------------------
   Header — notch-safe insets + animated mobile overlay menu.
   Written as plain CSS (outside @layer) so the JS-toggled `.is-open`
   state is never tree-shaken by Tailwind's content purge.
------------------------------------------------------------------ */

/* Pad the sticky header under the notch / Dynamic Island, and (in
   landscape) inside any side cutouts, so nav is never obscured. */

.header-safe {
  padding-top: env(safe-area-inset-top, 0px);
}

.px-safe {
  padding-left: max(1.5rem, env(safe-area-inset-left));
  padding-right: max(1.5rem, env(safe-area-inset-right));
}

@media (min-width: 1024px) {
  .px-safe {
    padding-left: max(2rem, env(safe-area-inset-left));
    padding-right: max(2rem, env(safe-area-inset-right));
  }
}

/* Mobile menu — drawer that slides in FROM THE LEFT with a fading backdrop.
   Hidden from pointer + assistive tech until opened. The container's
   visibility is delayed on close so the panel can slide fully out first. */

.mobile-menu {
  position: fixed;
  inset: 0;
  z-index: 100; /* above announcement (55), header (50) and all page content */
  visibility: hidden;
  pointer-events: none;
  transition: visibility 0s linear 0.35s;
}

.mobile-menu.is-open {
  visibility: visible;
  pointer-events: auto;
  transition: visibility 0s linear 0s;
}

/* Backdrop — semi-transparent charcoal; fades in; tap to close. */
.mobile-menu__backdrop {
  position: absolute;
  inset: 0;
  background: rgba(28, 24, 21, 0.5);
  opacity: 0;
  transition: opacity 0.35s ease;
}

.mobile-menu.is-open .mobile-menu__backdrop {
  opacity: 1;
}

/* Panel — solid cream drawer, always readable, slides from the left. Fixed
   max width, full height, scrollable if the content is tall. */
.mobile-menu__panel {
  position: absolute;
  /* Stretch to FULL height via top/bottom insets. (height:100% fails here:
     the fixed parent is sized only by inset:0, so its height *property* is
     auto and a percentage height resolves to auto — collapsing the panel to
     just the logo bar and hiding the nav links.) */
  top: 0;
  bottom: 0;
  left: 0;
  width: 85%;
  max-width: 380px;
  background: #ffffff; /* SOLID white — fully opaque, no page bleed-through */
  box-shadow: 0 10px 40px rgba(28, 24, 21, 0.25);
  transform: translateX(-100%);
  transition: transform 0.35s cubic-bezier(0.16, 1, 0.3, 1);
  overscroll-behavior: contain;
  will-change: transform;
}

.mobile-menu.is-open .mobile-menu__panel {
  transform: translateX(0);
}

/* Reduced motion: no slide/fade — the drawer simply appears/disappears. */
@media (prefers-reduced-motion: reduce) {
  .mobile-menu,
  .mobile-menu.is-open,
  .mobile-menu__backdrop,
  .mobile-menu__panel {
    transition: none;
  }
  .mobile-menu__panel {
    transform: none;
  }
}

/* ------------------------------------------------------------------
   Announcement bar — topmost sticky element; header pins beneath it.
------------------------------------------------------------------ */

/* The bar sits above the header, so it owns the notch inset
   (env(safe-area-inset-top)); the header no longer carries it. */

.announcement-bar {
  padding-top: env(safe-area-inset-top, 0px);
}

/* Sticky header offset = bar height (h-10 = 2.5rem) + the notch inset the bar
   absorbs, so the header pins flush below the bar with no gap or overlap. */

#site-header {
  top: calc(2.5rem + env(safe-area-inset-top, 0px));
}

/* ------------------------------------------------------------------
   Hero slider — device-set visibility, Ken Burns, overlay copy, dots, arrows.
------------------------------------------------------------------ */

/* Pre-JS visibility (initHero then detaches the hidden set entirely so only
   the 3 device-correct slides paginate). */

@media (min-width: 768px) {
  .hero-swiper .slide-phone {
    display: none;
  }
}

@media (max-width: 767px) {
  .hero-swiper .slide-desktop {
    display: none;
  }
}

/* Ken Burns: slow zoom + gentle pan on the active slide. The .hero-active class
   is (re)applied by initHero() on each activation, restarting the animation.
   6s > 5s autoplay so motion never freezes before the slide changes. */

@keyframes kenburns {
  from {
    transform: scale(1) translate3d(0, 0, 0);
  }

  to {
    transform: scale(1.08) translate3d(-1.2%, -1%, 0);
  }
}

.hero-swiper .kb-img {
  transform: scale(1);
  transform-origin: center;
  will-change: transform;
}

.hero-swiper .hero-active .kb-img {
  animation: kenburns 6s ease-out forwards;
}

/* Dark scrim keeps white overlay text readable over any image. */

.hero-scrim {
  background:
    linear-gradient(
      90deg,
      rgba(15, 12, 10, 0.66) 0%,
      rgba(15, 12, 10, 0.3) 50%,
      rgba(15, 12, 10, 0) 82%
    ),
    linear-gradient(0deg, rgba(15, 12, 10, 0.28), rgba(15, 12, 10, 0) 45%);
}

/* Overlay copy rises + fades in when its slide becomes active. */

@keyframes heroRise {
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

.hero-copy > * {
  opacity: 0;
  transform: translateY(18px);
}

.hero-swiper .hero-active .hero-copy > * {
  animation: heroRise 0.8s cubic-bezier(0.4, 0, 0.2, 1) forwards;
}

.hero-swiper .hero-active .hero-copy > * + * {
  animation-delay: 0.12s;
}

/* Pagination dots: inactive soft white, active brand brown pill. */

.hero-swiper {
  --swiper-pagination-bottom: 18px;
}

.hero-swiper .swiper-pagination-bullet {
  width: 8px;
  height: 8px;
  background: #ffffff;
  opacity: 0.5;
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
  transition:
    opacity 0.3s ease,
    background-color 0.3s ease,
    width 0.3s ease;
}

.hero-swiper .swiper-pagination-bullet-active {
  width: 22px;
  border-radius: 9999px;
  background: #6b2d2d;
  /* brand brown */
  opacity: 1;
}

/* Subtle arrows — desktop only, dots-only on tablet/phone. */

.hero-nav {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  z-index: 10;
  display: none;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  border-radius: 9999px;
  color: #ffffff;
  background: rgba(28, 24, 21, 0.35);
  transition: background-color 0.3s ease;
}

.hero-prev {
  left: 20px;
}

.hero-next {
  right: 20px;
}

.hero-nav:hover {
  background: #6b2d2d;
}

@media (min-width: 1024px) {
  .hero-nav {
    display: inline-flex;
  }
}

/* Reduced motion: no zoom, no reveal — content shown immediately. */

@media (prefers-reduced-motion: reduce) {
  .hero-swiper .kb-img,
  .hero-swiper .hero-active .kb-img {
    animation: none;
    transform: scale(1);
  }

  .hero-copy > *,
  .hero-swiper .hero-active .hero-copy > * {
    animation: none;
    opacity: 1;
    transform: none;
  }
}

/* ------------------------------------------------------------------
   USP marquee — continuous, seamless horizontal scroll below the hero.
   Two identical groups; track moves 0 → -50% (one group width) on loop.
------------------------------------------------------------------ */

.marquee {
  overflow: hidden;
  /* clip the over-wide track → no horizontal page scroll */
}

.marquee__track {
  display: flex;
  width: -moz-max-content;
  width: max-content;
  animation: marquee-scroll 28s linear infinite;
}

.marquee__group {
  display: flex;
  flex: 0 0 auto;
  align-items: center;
}

.marquee:hover .marquee__track {
  animation-play-state: paused;
  /* subtle pause on hover */
}

@keyframes marquee-scroll {
  from {
    transform: translateX(0);
  }

  to {
    transform: translateX(-50%);
  }
}

/* Reduced motion: no scroll — show one set, centered, wrapping if needed. */

@media (prefers-reduced-motion: reduce) {
  .marquee__track {
    animation: none;
    width: 100%;
    flex-wrap: wrap;
    justify-content: center;
  }

  .marquee__group[aria-hidden="true"] {
    display: none;
  }

  .marquee__group:first-child .marquee__item:last-child .marquee__sep {
    display: none;
    /* drop the trailing diamond when static */
  }
}

/* ------------------------------------------------------------------
   Product range — Swiper (2.5/view) on phone, centered 5-per-row grid
   on desktop. initProductRange() inits Swiper only below 768px; above
   768px these rules turn the same markup into a centered flex grid.
------------------------------------------------------------------ */

@media (min-width: 768px) {
  .pr-swiper {
    overflow: visible;
    /* let the hover lift / focus rings show */
  }

  .pr-swiper .swiper-wrapper {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    gap: 3rem 0rem;
    /* row-gap  column-gap */
    transform: none !important;
    /* never pan when used as a grid */
  }

  .pr-swiper .swiper-slide {
    /* 5 across, with four 1.5rem column-gaps; the last 2 wrap & center. */
    width: calc((100% - 4 * 1.5rem) / 5);
    margin: 0 !important;
  }
}

/* Phone pagination — themed brown, sits below the strip (not overlapping labels). */

.pr-swiper {
  --swiper-theme-color: #6b2d2d;
}

.pr-pagination {
  position: static;
  margin-top: 1.5rem;
  text-align: center;
}

.pr-swiper .swiper-pagination-bullet-active {
  background: #6b2d2d;
  /* brand brown */
}

/* ------------------------------------------------------------------
   Featured collection — horizontal expanding-panel accordion.
   Mobile/tablet (<1024px): a 1-col / 2-col grid of OPEN cards (image +
   title + description over a scrim), no hover needed.
   Desktop (>=1024px): a flex row of 5 vertical panels. The first is open by
   default; hovering/focusing a panel grows it (flex-grow) and collapses the
   rest — one open at a time. Collapsed panels show a vertical title; the open
   panel cross-fades to a horizontal title + description. Pure CSS.
------------------------------------------------------------------ */

.fc-panel {
  position: relative;
  display: block;
  overflow: hidden;
  border-radius: 0.125rem;
  /* rounded-sm */
  background-color: #d8d0c9;
  /* charcoal — shows if an image is missing */
  isolation: isolate;
}

/* Mobile/tablet card height (the grid layout). */

.fc-panel {
  height: 18rem;
}

@media (min-width: 640px) {
  .fc-panel {
    height: 20rem;
  }
}

.fc-panel__img {
  position: absolute;
  inset: 0;
  height: 90%;
  width: 90%;
  -o-object-fit: cover;
  object-fit: contain;
  transition: transform 0.6s ease-out;
  margin: auto;
}

.fc-panel:hover .fc-panel__img,
.fc-panel:focus-within .fc-panel__img {
  transform: scale(1.05);
}

/* Bottom scrim so white text stays readable over any image. */

.fc-panel__scrim {
  position: absolute;
  inset: 0;
  background: linear-gradient(
    to top,
    rgba(15, 12, 10, 0.78) 0%,
    rgba(15, 12, 10, 0.35) 38%,
    rgba(15, 12, 10, 0) 70%
  );
}

/* Horizontal title + description block (default visible on mobile/tablet). */

.fc-panel__content {
  position: absolute;
  inset-inline: 0;
  bottom: 0;
  padding: 1.5rem;
  color: #ffffff;
}

.fc-panel__title {
  font-family: "Fraunces", Georgia, serif;
  font-size: 1.25rem;
  line-height: 1.2;
  color: #ffffff;
}

.fc-panel__desc {
  margin-top: 0.5rem;
  font-size: 0.875rem;
  line-height: 1.6;
  color: rgba(255, 255, 255, 0.82);
  max-width: 22rem;
}

.fc-panel__cta {
  margin-top: 0.875rem;
  display: inline-flex;
  align-items: center;
  gap: 0.375rem;
  font-size: 0.875rem;
  font-weight: 600;
  color: #d8b483;
  /* warm tan — brand accent on the dark image */
}

/* Vertical title — only used on collapsed desktop panels. */

.fc-panel__vtitle {
  display: none;
}

/* Focus ring (keyboard), readable on the dark imagery. */

.fc-panel:focus-visible {
  outline: none;
  box-shadow:
    0 0 0 2px #faf7f2,
    0 0 0 4px #6b2d2d;
}

/* ---- Desktop accordion (>=1024px) ---- */

@media (min-width: 1024px) {
  .fc-accordion {
    height: 32rem;
    overflow: hidden;
    /* contain panels — no horizontal page overflow */
  }

  .fc-panel {
    height: 70%;
    /* Gentler open/closed ratio: collapsed 1.4, expanded 2.6 (≈1.9:1) so the
       closed panels keep a comfortable width for the image + vertical title. */
    flex: 1.4 1 0%;
    transition: flex-grow 0.55s cubic-bezier(0.4, 0, 0.2, 1);
  }

  /* First panel open by default. */

  .fc-panel:first-child {
    flex-grow: 2.6;
  }

  /* When the row is hovered / keyboard-focused, collapse all… */

  .fc-accordion:hover .fc-panel,
  .fc-accordion:focus-within .fc-panel {
    flex-grow: 1.4;
  }

  /* …and expand only the active one. */

  .fc-accordion .fc-panel:hover,
  .fc-accordion .fc-panel:focus-within {
    flex-grow: 2.6;
  }

  /* Title swap: vertical when collapsed, horizontal block when expanded. */

  .fc-panel__vtitle {
    display: block;
    position: absolute;
    bottom: 1.5rem;
    left: 50%;
    transform: translateX(-50%) rotate(180deg);
    writing-mode: vertical-rl;
    white-space: nowrap;
    font-family: "Fraunces", Georgia, serif;
    font-size: 1.05rem;
    letter-spacing: 0.02em;
    color: #ffffff;
    opacity: 1;
    transition: opacity 0.4s ease;
  }

  .fc-panel__content {
    width: 24rem;
    max-width: 90%;
    opacity: 0;
    transition: opacity 0.45s ease;
  }

  /* Default-open first panel: show horizontal, hide vertical. */

  .fc-panel:first-child .fc-panel__vtitle {
    opacity: 0;
  }

  .fc-panel:first-child .fc-panel__content {
    opacity: 1;
  }

  /* Row interacted → reset all to vertical… */

  .fc-accordion:hover .fc-panel .fc-panel__vtitle,
  .fc-accordion:focus-within .fc-panel .fc-panel__vtitle {
    opacity: 1;
  }

  .fc-accordion:hover .fc-panel .fc-panel__content,
  .fc-accordion:focus-within .fc-panel .fc-panel__content {
    opacity: 0;
  }

  /* …active panel → horizontal. */

  .fc-accordion .fc-panel:hover .fc-panel__vtitle,
  .fc-accordion .fc-panel:focus-within .fc-panel__vtitle {
    opacity: 0;
  }

  .fc-accordion .fc-panel:hover .fc-panel__content,
  .fc-accordion .fc-panel:focus-within .fc-panel__content {
    opacity: 1;
  }
}

/* Reduced motion: no expand/scale/fade animation — keep it usable & instant. */

@media (prefers-reduced-motion: reduce) {
  .fc-panel,
  .fc-panel__img,
  .fc-panel__vtitle,
  .fc-panel__content {
    transition: none;
  }

  .fc-panel:hover .fc-panel__img,
  .fc-panel:focus-within .fc-panel__img {
    transform: none;
  }
}

/* ------------------------------------------------------------------
   Projects — editorial carousel pagination (brand brown, below slider).
------------------------------------------------------------------ */

.projects-swiper {
  --swiper-theme-color: #6b2d2d;
}

.projects-pagination {
  position: static;
  margin-top: 2rem;
  text-align: center;
}

.projects-swiper .swiper-pagination-bullet-active {
  background: #6b2d2d;
  /* brand brown */
}

/* ------------------------------------------------------------------
   Clients — CONTINUOUS logo marquee. slidesPerView:'auto' + freeMode +
   autoplay delay:0 + high speed = a slow, gap-free conveyor (see
   initClientsLogos in main.js). Linear timing on the wrapper keeps the
   motion smooth (no per-slide easing). Each slide is a fixed-size white
   card so every logo shares one baseline height; logos object-contain so
   detailed government emblems never distort or crop, in light greyscale
   (full colour on hover) for legibility.
------------------------------------------------------------------ */

/* === Clients section overlay — CHANGE TINT/OPACITY HERE ===================
   One variable controls the whole clients-section overlay (tints the tiled
   background texture while keeping the heading + logo cards readable).
   Default: warm cream at 88%.
   For a DARK tint instead, swap the value to e.g. rgba(28, 24, 21, 0.6).
-------------------------------------------------------------------------- */

:root {
  --clients-overlay: hsl(38deg 100% 96.55% / 54%);
  /* change clients overlay tint/opacity here */
}

.clients-overlay {
  background: var(--clients-overlay);
}

.clients-swiper {
  --swiper-theme-color: #6b2d2d;
  /* brand brown */
}

.clients-swiper .swiper-wrapper {
  align-items: stretch;
  /* Smooth conveyor — Swiper sets the duration inline; we force linear easing
     so the marquee glides instead of easing in/out per slide. */
  transition-timing-function: linear;
}

.clients-swiper .swiper-slide {
  width: 160px;
  /* fixed width → even conveyor spacing at slidesPerView:'auto' */
  height: 96px;
  /* fixed height → all logo cards share one baseline */
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 1rem 1.25rem;
  background: #ffffff;
  border: 1px solid #e5ddd2;
  /* hairline */
  border-radius: 12px;
  box-shadow: 0 1px 2px rgba(28, 24, 21, 0.04);
}

@media (min-width: 1024px) {
  .clients-swiper .swiper-slide {
    width: 200px;
    height: 112px;
  }
}

/* ------------------------------------------------------------------
   Testimonials — carousel pagination (brand brown, below the cards).
------------------------------------------------------------------ */

.testimonials-swiper {
  --swiper-theme-color: #6b2d2d;
}

.testimonials-pagination {
  position: static;
  margin-top: 2rem;
  text-align: center;
}

.testimonials-swiper .swiper-pagination-bullet-active {
  background: #6b2d2d;
  /* brand brown */
}

/* ------------------------------------------------------------------
   AOS tuning — soften the default fade-up travel (100px is too much)
   to a subtle, premium rise. Loaded after aos.css so this wins.
------------------------------------------------------------------ */

[data-aos="fade-up"] {
  transform: translate3d(0, 24px, 0);
}

/* ------------------------------------------------------------------
   GSAP reveal targets — pre-hide before JS runs to avoid a flash, but
   ONLY when motion is allowed. Under prefers-reduced-motion the guard
   doesn't apply, so content shows immediately. If GSAP fails to load,
   initGsapReveals() clears this inline (opacity:1) so nothing stays hidden.
   These elements are animated by GSAP, never AOS (one library per element).
------------------------------------------------------------------ */

@media (prefers-reduced-motion: no-preference) {
  [data-reveal] {
    opacity: 0;
  }
}

/* ------------------------------------------------------------------
   Why Choose Us — feature block hover / focus interaction.
   Resting: faded brown number, charcoal title, body-grey copy, hairline
   underline. Hover/focus-within: number + title warm to brown, copy
   deepens, underline sweeps brown from the aligned side, block lifts.
   Strictly brown (#6B2D2D) / hairline (#E5DDD2) — no red.
------------------------------------------------------------------ */

.wcu-item {
  position: relative;
  border-bottom: 1px solid #e5ddd2;
  /* resting hairline divider */
  outline: none;
  transition: transform 0.3s ease-out;
}

.wcu-item:last-child {
  border-bottom: 0;
}

/* Animated brown underline that grows over the hairline on hover/focus. */

.wcu-item::after {
  content: "";
  position: absolute;
  bottom: -1px;
  left: 0;
  /* mobile (stacked, left-aligned): sweep from the left */
  width: 0;
  height: 1px;
  background-color: #6b2d2d;
  transition: width 0.4s ease-out;
}

/* Resting type colours (with transitions). */

.wcu-num {
  color: rgba(107, 45, 45, 0.13);
  /* faded brown ~13% */
  transition: color 0.3s ease-out;
}

.wcu-title {
  color: #1c1815;
  /* charcoal */
  transition: color 0.3s ease-out;
}

.wcu-desc {
  color: #4a433d;
  /* body grey */
  transition: color 0.3s ease-out;
}

/* Hover + keyboard focus share the same state. */

.wcu-item:hover,
.wcu-item:focus-within {
  transform: translateY(-3px);
}

.wcu-item:hover .wcu-num,
.wcu-item:focus-within .wcu-num {
  color: #6b2d2d;
  /* full, warm brown */
}

.wcu-item:hover .wcu-title,
.wcu-item:focus-within .wcu-title {
  color: #6b2d2d;
}

.wcu-item:hover .wcu-desc,
.wcu-item:focus-within .wcu-desc {
  color: #1c1815;
  /* deepen to charcoal */
}

.wcu-item:hover::after,
.wcu-item:focus-within::after {
  width: 100%;
}

/* Visible keyboard-focus ring (brand brown), only for keyboard users. */

.wcu-item:focus-visible {
  border-radius: 4px;
  box-shadow: 0 0 0 2px rgba(107, 45, 45, 0.4);
}

/* Desktop mirrored sweep: left column is right-aligned → underline grows
   from the RIGHT; right column stays left. */

@media (min-width: 1024px) {
  .wcu-col--end .wcu-item::after {
    left: auto;
    right: 0;
  }
}

/* Reduced motion: keep the colour cues, drop the movement. */

@media (prefers-reduced-motion: reduce) {
  .wcu-item,
  .wcu-item::after {
    transition: none;
  }

  .wcu-item:hover,
  .wcu-item:focus-within {
    transform: none;
  }
}

/* ------------------------------------------------------------------
   Process — thin connector between step icon circles (desktop only).
   A per-step ::after runs from this icon's centre to the next icon's
   centre (gap-independent: column width + the 2rem lg gap). Each icon
   circle sits above it (z-10 + bg) so the line shows only in the gaps.
------------------------------------------------------------------ */

.process-step::after {
  content: "";
  position: absolute;
  top: 2rem;
  /* vertical centre of the h-16 icon circle */
  left: 50%;
  /* from this icon's centre */
  width: calc(100% + 2rem);
  /* reach the next icon centre (column + lg gap) */
  height: 1px;
  background-color: #e5ddd2;
  /* hairline */
  display: none;
  z-index: 0;
}

@media (min-width: 1024px) {
  .process-step:not(:last-child)::after {
    display: block;
  }
}

/* ------------------------------------------------------------------
   FAQ accordion — smooth height via grid-template-rows (0fr → 1fr).
   The answer stays in the DOM when collapsed (height-collapsed, not
   removed), so crawlers / screen readers can still read it. Single-open
   behaviour + aria sync are handled by initFAQ() in assets/js/main.js.
------------------------------------------------------------------ */

.faq-panel {
  display: grid;
  grid-template-rows: 0fr;
  transition: grid-template-rows 0.3s ease;
}

.faq-panel-inner {
  overflow: hidden;
}

.faq-item.is-open .faq-panel {
  grid-template-rows: 1fr;
}

.faq-icon {
  transition: transform 0.3s ease;
}

.faq-item.is-open .faq-icon {
  transform: rotate(180deg);
}

@media (prefers-reduced-motion: reduce) {
  .faq-panel,
  .faq-icon {
    transition: none;
  }
}

/* ------------------------------------------------------------------
   Footer — premium light/cream band. Nav links rest in body grey and
   warm to brown with a small growing accent bar; inline links (contact,
   legal) warm to brown; socials are circular outlined icon buttons that
   fill brown (white glyph) on hover. Accents strictly brand brown
   (#6B2D2D) / warm tan (#B08D57). focus-visible rings use a cream offset
   so they read on the light band. Hover motion drops under reduced motion.
------------------------------------------------------------------ */

/* Nav links (Explore / Company): warm to brown, slide right, grow a bar. */

.footer-link {
  color: #4a433d;
  /* body grey */
  transition:
    color 0.3s ease,
    transform 0.3s ease;
}

.footer-link:hover,
.footer-link:focus-visible {
  color: #6b2d2d;
  /* brand brown */
}

.footer-link:hover {
  transform: translateX(2px);
}

/* The small accent bar that grows in from the left on hover/focus. */

.footer-link__bar {
  width: 0;
  height: 1px;
  margin-right: 0;
  background-color: #6b2d2d;
  /* brand brown */
  transition:
    width 0.3s ease,
    margin-right 0.3s ease;
}

.footer-link:hover .footer-link__bar,
.footer-link:focus-visible .footer-link__bar {
  width: 0.75rem;
  margin-right: 0.625rem;
}

/* Inline links (contact tel/mailto, Privacy/Terms): inherit resting colour,
   warm to brown on hover/focus. */

.footer-inline-link {
  color: inherit;
  transition: color 0.3s ease;
}

.footer-inline-link:hover,
.footer-inline-link:focus-visible {
  color: #6b2d2d;
  /* brand brown */
}

/* Social icon buttons — charcoal outline + glyph, fill brown (white glyph)
   on hover + gentle scale. */

.footer-social {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 2.75rem;
  /* 44px — comfortable tap target */
  height: 2.75rem;
  border-radius: 9999px;
  border: 1px solid rgba(28, 24, 21, 0.25);
  /* charcoal/25 */
  color: #1c1815;
  /* charcoal glyph */
  transition:
    color 0.3s ease,
    border-color 0.3s ease,
    background-color 0.3s ease,
    transform 0.3s ease;
}

.footer-social:hover,
.footer-social:focus-visible {
  color: #ffffff;
  /* white glyph on brown fill */
  background-color: #6b2d2d;
  /* brand brown */
  border-color: #6b2d2d;
  transform: scale(1.05) rotate(-4deg);
  /* gentle scale + slight rotate */
}

/* Keyboard focus rings — readable against the light band (cream offset). */

.footer-link:focus-visible,
.footer-inline-link:focus-visible,
.footer-social:focus-visible {
  outline: none;
  border-radius: 4px;
  box-shadow:
    0 0 0 2px #faf7f2,
    0 0 0 4px rgba(107, 45, 45, 0.6);
}

.footer-social:focus-visible {
  border-radius: 9999px;
}

/* ==================================================================
   Micro-interactions — small ambient + hover touches. Premium and
   restrained: low amplitude, slow, transform/opacity only, no overflow.
   Hover/interaction-triggered unless noted. The ONE looping idle motion is
   .idle-float (a single badge). All looping/animated motion is disabled
   under prefers-reduced-motion at the end of this block; hover end-states
   stay (they just apply instantly there).
================================================================== */

/* 1 — Arrow nudge: arrows inside primary/ghost buttons slide right on hover.
   (Most card/CTA arrows already nudge via group-hover in the markup; this
   covers .btn-primary / .btn-ghost arrows that don't.) */

.btn-primary svg,
.btn-ghost svg {
  transition: transform 0.3s ease;
}

.btn-primary:hover svg,
.btn-ghost:hover svg {
  transform: translateX(3px);
}

/* 5 — Shimmer sweep on primary buttons: a slow warm-tan sheen on hover. The
   ::after sits ABOVE the brand fill (z-index:-1 within an isolated context)
   but BELOW the label, so text never tints; overflow-hidden clips it to the
   pill. */

.btn-primary {
  position: relative;
  overflow: hidden;
  isolation: isolate;
}

.btn-primary::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  background: linear-gradient(
    100deg,
    transparent 35%,
    rgba(176, 141, 87, 0.35) 50%,
    transparent 65%
  );
  transform: translateX(-130%);
  transition: transform 0.8s ease;
  pointer-events: none;
}

.btn-primary:hover::after {
  transform: translateX(130%);
}

/* 2 — Phone icon: subtle slow "ring" wobble on hover (header + CTA call). */

@keyframes phone-ring {
  0% {
    transform: rotate(0deg);
  }

  20% {
    transform: rotate(-12deg);
  }

  40% {
    transform: rotate(9deg);
  }

  60% {
    transform: rotate(-5deg);
  }

  80% {
    transform: rotate(2deg);
  }

  100% {
    transform: rotate(0deg);
  }
}

header a[href^="tel:"] svg,
.cta-band__call svg {
  transform-origin: 50% 50%;
}

header a[href^="tel:"]:hover svg,
.cta-band__call:hover svg {
  animation: phone-ring 0.6s ease-in-out;
}

/* 2 — Process step icon: gentle scale + warm border on hover of the step. */

.process-icon {
  transition:
    transform 0.3s ease,
    border-color 0.3s ease;
}

.process-step:hover .process-icon {
  transform: scale(1.08);
  border-color: #6b2d2d;
  /* brand brown */
}

/* 3 — Card inner detail: title lifts a touch + a thin underline grows under
   it on hover (arrow/colour shifts already live in the markup). Project cards
   use a tan underline (legible over the dark image). */

.projects-swiper .swiper-slide h3 {
  position: relative;
  display: inline-block;
  transition: transform 0.3s ease;
}

.projects-swiper .swiper-slide h3::after {
  content: "";
  position: absolute;
  left: 0;
  bottom: -3px;
  height: 1px;
  width: 0;
  background-color: #b08d57;
  /* warm tan, legible over the dark image */
  transition: width 0.3s ease;
}

.projects-swiper .swiper-slide.group:hover h3 {
  transform: translateY(-2px);
}

.projects-swiper .swiper-slide.group:hover h3::after {
  width: 100%;
}

/* 3 — Product-range label lifts slightly on hover (colour shift is in markup). */

.pr-item p {
  transition:
    transform 0.3s ease,
    color 0.3s ease;
}

.pr-item:hover p {
  transform: translateY(-2px);
}

/* 4 — Idle float: ONE slow, barely-there vertical drift on the why-choose-us
   quote badge — used sparingly so it stays premium, like a gentle breath. */

@keyframes idle-float {
  0%,
  100% {
    transform: translateY(0);
  }

  50% {
    transform: translateY(-6px);
  }
}

.idle-float {
  animation: idle-float 6s ease-in-out infinite;
  will-change: transform;
}

/* 6 — Header nav link: underline grows from the left on hover/focus. */

.nav-link {
  position: relative;
}

.nav-link::after {
  content: "";
  position: absolute;
  left: 0;
  bottom: -4px;
  height: 1px;
  width: 0;
  background-color: #6b2d2d;
  /* brand brown */
  transition: width 0.3s ease;
}

.nav-link:hover::after,
.nav-link:focus-visible::after {
  width: 100%;
}

/* 7 — Swiper pagination: active dot grows + colours smoothly (no instant snap). */

.pr-swiper .swiper-pagination-bullet,
.projects-swiper .swiper-pagination-bullet,
.testimonials-swiper .swiper-pagination-bullet {
  transition:
    transform 0.3s ease,
    background-color 0.3s ease,
    opacity 0.3s ease;
}

.pr-swiper .swiper-pagination-bullet-active,
.projects-swiper .swiper-pagination-bullet-active,
.testimonials-swiper .swiper-pagination-bullet-active {
  transform: scale(1.3);
}

/* Reduced motion: kill the looping/animated motion; keep hover END-states
   (they apply instantly here). */

@media (prefers-reduced-motion: reduce) {
  .idle-float {
    animation: none;
  }

  .btn-primary::after {
    display: none;
  }

  header a[href^="tel:"]:hover svg,
  .cta-band__call:hover svg {
    animation: none;
  }

  .btn-primary svg,
  .btn-ghost svg,
  .nav-link::after,
  .process-icon,
  .projects-swiper .swiper-slide h3,
  .projects-swiper .swiper-slide h3::after,
  .pr-item p,
  .pr-swiper .swiper-pagination-bullet,
  .projects-swiper .swiper-pagination-bullet,
  .testimonials-swiper .swiper-pagination-bullet {
    transition: none;
  }
}

/* Reduced motion: keep the colour cues, drop the movement. */

@media (prefers-reduced-motion: reduce) {
  .footer-link,
  .footer-link__bar,
  .footer-social {
    transition:
      color 0.3s ease,
      border-color 0.3s ease,
      background-color 0.3s ease;
  }

  .footer-link:hover {
    transform: none;
  }

  .footer-social:hover,
  .footer-social:focus-visible {
    transform: none;
  }
}

/* ==================================================================
   Nav "Products" dropdown (desktop) + mobile sub-list.
================================================================== */

.nav-dropdown__toggle {
  cursor: pointer;
  background: none;
  border: 0;
}

.nav-chevron {
  transition: transform 0.3s ease;
}

/* Chevron flips when open (hover, focus-within, or JS .is-open). */

.nav-dropdown:hover .nav-chevron,
.nav-dropdown:focus-within .nav-chevron,
.nav-dropdown__toggle[aria-expanded="true"] .nav-chevron,
.mobile-subnav-toggle[aria-expanded="true"] .nav-chevron {
  transform: rotate(180deg);
}

.nav-dropdown__menu {
  position: absolute;
  left: 0;
  top: calc(100% + 0.5rem);
  z-index: 60;
  min-width: 15rem;
  padding: 0.5rem;
  background: #faf7f2;
  /* cream */
  border: 1px solid #e5ddd2;
  /* hairline */
  border-radius: 0.625rem;
  box-shadow: 0 12px 30px -8px rgba(28, 24, 21, 0.18);
  opacity: 0;
  visibility: hidden;
  transform: translateY(-6px);
  transition:
    opacity 0.25s ease,
    transform 0.25s ease,
    visibility 0.25s ease;
}

/* Invisible bridge so moving the cursor from the toggle to the menu keeps hover. */

.nav-dropdown__menu::before {
  content: "";
  position: absolute;
  top: -0.5rem;
  left: 0;
  right: 0;
  height: 0.5rem;
}

.nav-dropdown:hover .nav-dropdown__menu,
.nav-dropdown:focus-within .nav-dropdown__menu,
.nav-dropdown__menu.is-open {
  opacity: 1;
  visibility: visible;
  transform: translateY(0);
}

.nav-dropdown__item {
  display: block;
  padding: 0.55rem 0.75rem;
  border-radius: 0.375rem;
  font-size: 0.875rem;
  color: rgba(28, 24, 21, 0.8);
  /* charcoal/80 */
  transition:
    color 0.2s ease,
    background-color 0.2s ease;
}

.nav-dropdown__item:hover,
.nav-dropdown__item:focus-visible {
  background: #f2ece3;
  /* sand */
  color: #6b2d2d;
  /* brand brown */
  outline: none;
}

/* Mobile sub-list — collapsed by default, expands on toggle. */

.mobile-subnav {
  display: none;
}

.mobile-subnav.is-open {
  display: block;
}

@media (prefers-reduced-motion: reduce) {
  .nav-chevron,
  .nav-dropdown__menu {
    transition: none;
  }
}

/* ==================================================================
   Products page — filter chips + product cards.
================================================================== */

.filter-chip {
  display: inline-flex;
  align-items: center;
  white-space: nowrap;
  border-radius: 9999px;
  border: 1px solid rgba(28, 24, 21, 0.15);
  /* charcoal/15 */
  padding: 0.5rem 1.1rem;
  font-size: 0.875rem;
  color: rgba(28, 24, 21, 0.7);
  background: transparent;
  cursor: pointer;
  transition:
    color 0.25s ease,
    background-color 0.25s ease,
    border-color 0.25s ease;
}

.filter-chip:hover {
  border-color: #6b2d2d;
  color: #6b2d2d;
}

.filter-chip[aria-pressed="true"] {
  background: #6b2d2d;
  /* brand brown */
  border-color: #6b2d2d;
  color: #ffffff;
}

.filter-chip:focus-visible {
  outline: none;
  box-shadow:
    0 0 0 2px #faf7f2,
    0 0 0 4px rgba(107, 45, 45, 0.6);
}

/* Product card — subtle hover lift + a soft fade when revealed by the filter. */

.product-card {
  transition:
    transform 0.3s ease,
    opacity 0.3s ease;
}

.product-card:hover {
  transform: translateY(-4px);
}

.product-card.is-revealing {
  opacity: 0;
}

/* "Added ✓" state — filled brown pill; the plus icon hides. */

.btn-quote.is-added {
  background: #6b2d2d;
  border-color: #6b2d2d;
  color: #ffffff;
}

.btn-quote.is-added svg {
  display: none;
}

/* Loading spinner for load-on-scroll. */

.product-spinner {
  display: inline-block;
  width: 0.9rem;
  height: 0.9rem;
  border: 2px solid rgba(107, 45, 45, 0.25);
  border-top-color: #6b2d2d;
  border-radius: 9999px;
  animation: product-spin 0.7s linear infinite;
}

@keyframes product-spin {
  to {
    transform: rotate(360deg);
  }
}

/* ==================================================================
   Quote — header toggle + count badge, and the slide-in drawer.
================================================================== */

.quote-toggle {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 2.75rem;
  height: 2.75rem;
  border-radius: 0.375rem;
  color: #1c1815;
  /* charcoal */
  background: none;
  border: 0;
  cursor: pointer;
  transition: color 0.3s ease;
}

.quote-toggle:hover {
  color: #6b2d2d;
  /* brand brown */
}

.quote-badge {
  position: absolute;
  top: 0.25rem;
  right: 0.2rem;
  min-width: 1.1rem;
  height: 1.1rem;
  padding: 0 0.3rem;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: 9999px;
  background: #6b2d2d;
  /* brand brown */
  color: #fff;
  font-size: 0.7rem;
  font-weight: 600;
  line-height: 1;
}

.quote-drawer {
  position: fixed;
  inset: 0;
  z-index: 70;
  visibility: hidden;
  pointer-events: none;
}

.quote-drawer.is-open {
  visibility: visible;
  pointer-events: auto;
}

.quote-drawer__overlay {
  position: absolute;
  inset: 0;
  background: rgba(28, 24, 21, 0.45);
  opacity: 0;
  transition: opacity 0.3s ease;
}

.quote-drawer.is-open .quote-drawer__overlay {
  opacity: 1;
}

.quote-drawer__panel {
  position: absolute;
  top: 0;
  right: 0;
  height: 100%;
  width: min(24rem, 100%);
  display: flex;
  flex-direction: column;
  background: #faf7f2;
  /* cream */
  box-shadow: -16px 0 40px -12px rgba(28, 24, 21, 0.25);
  transform: translateX(100%);
  transition: transform 0.35s cubic-bezier(0.4, 0, 0.2, 1);
}

.quote-drawer.is-open .quote-drawer__panel {
  transform: translateX(0);
}

.quote-drawer__head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 1.25rem 1.5rem;
  border-bottom: 1px solid #e5ddd2;
  /* hairline */
}

.quote-drawer__close {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 2.5rem;
  height: 2.5rem;
  margin-right: -0.5rem;
  border-radius: 0.375rem;
  color: #1c1815;
  transition: color 0.3s ease;
}

.quote-drawer__close:hover {
  color: #6b2d2d;
}

.quote-drawer__list {
  flex: 1 1 auto;
  overflow-y: auto;
  padding: 0.75rem 1.5rem;
}

.quote-drawer__empty {
  padding: 2.5rem 0;
  text-align: center;
  font-size: 0.875rem;
  color: #8a7f75;
  /* taupe */
}

.quote-item {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.75rem;
  padding: 0.85rem 0;
  border-bottom: 1px solid #e5ddd2;
}

.quote-item__remove {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 2rem;
  height: 2rem;
  border-radius: 0.375rem;
  color: #8a7f75;
  /* taupe */
  transition:
    color 0.25s ease,
    background-color 0.25s ease;
}

.quote-item__remove:hover,
.quote-item__remove:focus-visible {
  color: #6b2d2d;
  background: #f2ece3;
  /* sand */
  outline: none;
}

.quote-drawer__foot {
  flex: 0 0 auto;
  padding: 1.25rem 1.5rem;
  border-top: 1px solid #e5ddd2;
}

/* Honeypot — present in the DOM for bots, hidden from people + assistive tech. */

.quote-hp {
  position: absolute;
  left: -9999px;
  width: 1px;
  height: 1px;
  overflow: hidden;
}

.quote-toggle:focus-visible,
.quote-drawer__close:focus-visible {
  outline: none;
  box-shadow:
    0 0 0 2px #faf7f2,
    0 0 0 4px rgba(107, 45, 45, 0.6);
}

@media (prefers-reduced-motion: reduce) {
  .product-spinner {
    animation-duration: 1.6s;
  }

  .quote-drawer__overlay,
  .quote-drawer__panel {
    transition: none;
  }
}

/* "Add to Quote" — outline brown that fills on hover (secondary action). */

.btn-quote {
  display: inline-flex;
  width: 100%;
  align-items: center;
  justify-content: center;
  gap: 0.4rem;
  padding: 0.6rem 1rem;
  border-radius: 9999px;
  border: 1px solid rgba(107, 45, 45, 0.3);
  /* brand/30 */
  background: transparent;
  font-size: 0.8125rem;
  font-weight: 600;
  color: #6b2d2d;
  /* brand brown */
  cursor: pointer;
  transition:
    color 0.3s ease,
    background-color 0.3s ease,
    border-color 0.3s ease;
}

.btn-quote:hover,
.btn-quote:focus-visible {
  background: #6b2d2d;
  border-color: #6b2d2d;
  color: #ffffff;
  outline: none;
}

@media (prefers-reduced-motion: reduce) {
  .product-card,
  .filter-chip,
  .btn-quote {
    transition: none;
  }

  .product-card:hover {
    transform: none;
  }
}

/* ==================================================================
   Products page redesign — circular category filters, search, product
   tiles (object-contain on sand), and floating actions. Strictly brown
   (#6B2D2D) / oxblood (#4E1F1F) accents.
================================================================== */

/* Circular category filter row — horizontal scroll on small screens,
   centered when it fits on desktop. */

.cat-filter-row {
  display: flex;
  gap: 1.5rem;
  overflow-x: auto;
  /* overflow-x:auto makes the browser clip the Y axis too, which would cut the
     lifted active/hover ring. This padding keeps the ring inside the scroll
     area so it renders fully around each circle. */
  padding-top: 10px;
  padding-bottom: 0.75rem;
  scrollbar-width: thin;
  -webkit-overflow-scrolling: touch;
}

@media (min-width: 1024px) {
  .cat-filter-row {
    justify-content: center;
  }
}

.cat-filter {
  flex: 0 0 auto;
  width: 8rem;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.6rem;
  background: none;
  border: 0;
  cursor: pointer;
  text-align: center;
}

.cat-filter__thumb {
 width: 7.5rem;
    height: 7.5rem;
  border-radius: 9999px;
  overflow: hidden;
  background: #f2ece3;
  /* sand fallback if the image is missing */
  box-shadow: 0 0 0 1px #e5ddd2;
  /* hairline ring at rest */
  transition:
    box-shadow 0.3s ease,
    transform 0.3s ease;
}

.cat-filter__thumb img {
  width: 100%;
  height: 100%;
  -o-object-fit: cover;
  object-fit: cover;
  display: block;
}

.cat-filter__label {
  max-width: 5.5rem;
  font-size: 0.75rem;
  line-height: 1.2;
  color: rgba(28, 24, 21, 0.7);
  transition: color 0.3s ease;
}

/* Hover: brown ring with a small cream gap so it reads as a clean ring around
   the photo (not touching its edge). box-shadow renders outside the clipped
   image and doesn't affect layout, so the circle never shifts or resizes. */
.cat-filter:hover .cat-filter__thumb {
  transform: translateY(-2px);
  box-shadow:
    0 0 0 2px #faf7f2,
    0 0 0 4px #6b2d2d;
}

.cat-filter:hover .cat-filter__label {
  color: #6b2d2d;
}

/* Active + keyboard focus: same clean ring, a touch more prominent (wider gap)
   so the selected category stands out from a mere hover. */

.cat-filter[aria-pressed="true"] .cat-filter__thumb,
.cat-filter:focus-visible .cat-filter__thumb {
  transform: translateY(-2px);
  box-shadow:
    0 0 0 3px #faf7f2,
    0 0 0 5px #6b2d2d;
}

.cat-filter[aria-pressed="true"] .cat-filter__label {
  color: #6b2d2d;
  font-weight: 600;
}

.cat-filter:focus-visible {
  outline: none;
}

/* Search bar. */

.product-search {
  position: relative;
  width: 100%;
  max-width: 20rem;
}

.product-search__icon {
  position: absolute;
  left: 0.9rem;
  top: 50%;
  transform: translateY(-50%);
  width: 1.1rem;
  height: 1.1rem;
  color: #8a7f75;
  /* taupe */
  pointer-events: none;
}

.product-search__input {
  width: 100%;
  padding: 0.65rem 1rem 0.65rem 2.7rem;
  background: #ffffff;
  border: 1px solid rgba(28, 24, 21, 0.15);
  border-radius: 9999px;
  font-size: 0.875rem;
  color: #1c1815;
  transition:
    border-color 0.3s ease,
    box-shadow 0.3s ease;
}

.product-search__input::-moz-placeholder {
  color: rgba(28, 24, 21, 0.4);
}

.product-search__input::placeholder {
  color: rgba(28, 24, 21, 0.4);
}

.product-search__input:focus {
  outline: none;
  border-color: #6b2d2d;
  /* brown focus */
  box-shadow: 0 0 0 3px rgba(107, 45, 45, 0.15);
}

/* Product tile — image fills the square edge-to-edge (object-cover), rounded
   corners clip it. Background is a neutral cream/sand (NEVER red) so a missing
   image just shows a calm tile. */

.product-tile {
  position: relative;
  aspect-ratio: 1 / 1;
  background: #f2ece3;
  /* sand — neutral fallback colour */
  border-radius: 0.375rem;
  overflow: hidden;
}

.product-tile__img {
  display: block;
  width: 85%;
  height: 85%;
  -o-object-fit: cover;
  object-fit: cover;
  /* fill the frame, no inner gap/letterbox */
  transition: transform 0.5s ease;
  margin: auto;
  margin-top: 1.5rem;
}

.product-card:hover .product-tile__img {
  transform: scale(1.04);
}

/* onerror fallback: neutral placeholder shown contained (it's a sand SVG with a
   centred glyph) so it reads as a calm tile, not a stretched photo. */

.product-tile__img.is-fallback {
  -o-object-fit: contain;
  object-fit: contain;
}

/* Floating actions (bottom-right). WhatsApp keeps its brand green for
   recognisability; Call + Back-to-top use brown / oxblood. */

.fab-stack {
  position: fixed;
  right: 1rem;
  bottom: 1rem;
  z-index: 45;
  display: flex;
  flex-direction: column;
  gap: 0.6rem;
}

@media (min-width: 1024px) {
  .fab-stack {
    right: 1.5rem;
    bottom: 1.5rem;
  }
}

.fab {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 3rem;
  height: 3rem;
  border-radius: 9999px;
  color: #ffffff;
  box-shadow: 0 8px 20px -6px rgba(28, 24, 21, 0.35);
  transition:
    transform 0.3s ease,
    background-color 0.3s ease;
}

.fab:hover {
  transform: translateY(-2px);
}

.fab--whatsapp {
  background: #25d366;
}

.fab--whatsapp:hover {
  background: #1ebe5d;
}

.fab--call {
  background: #6b2d2d;
  /* brand brown */
}

.fab--call:hover {
  background: #4e1f1f;
  /* oxblood */
}

.fab--top {
  background: #4e1f1f;
  /* oxblood */
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  transform: translateY(8px);
  transition:
    opacity 0.3s ease,
    visibility 0.3s ease,
    transform 0.3s ease,
    background-color 0.3s ease;
}

.fab--top.is-visible {
  opacity: 1;
  visibility: visible;
  pointer-events: auto;
  transform: translateY(0);
}

.fab--top.is-visible:hover {
  transform: translateY(-2px);
  background: #6b2d2d;
}

.fab:focus-visible {
  outline: none;
  box-shadow:
    0 0 0 2px #faf7f2,
    0 0 0 4px #6b2d2d;
}

@media (prefers-reduced-motion: reduce) {
  .cat-filter__thumb,
  .product-tile__img,
  .fab,
  .fab--top {
    transition:
      background-color 0.3s ease,
      box-shadow 0.3s ease;
  }

  .cat-filter:hover .cat-filter__thumb,
  .cat-filter[aria-pressed="true"] .cat-filter__thumb,
  .product-card:hover .product-tile__img,
  .fab:hover,
  .fab--top.is-visible:hover {
    transform: none;
  }
}

.products-page-our-range-section {
  .cat-filter-row {
    padding-top: 10px !important;
  }
}
#featured{
  padding-bottom: 0 !important;
  padding-top: 4rem;
}

#projects{
  padding-top: 0rem;
}