/* ==========================================================================
   NileMed theme
   Viora "demo-medical" retinted to NileMed's palette.
   Every colour below is read role-for-role from nilemed-uae.com — see the
   direction document. The template is token-driven (--Primary is referenced
   300× in assets/css/styles.css), so overriding the tokens recolours the
   whole theme without touching the vendor stylesheet.
   ========================================================================== */

:root {
  /* --- template tokens, retinted ------------------------------------- */
  --Primary:        #0D1F6B;   /* was #196E6E teal — NileMed navy        */
  --Secondary:      #E8F4FF;   /* was #E5F2E4 pale green — pale blue     */
  --Bg-light:       #F1F2F4;   /* was #F2F7F7 — neutral shell            */
  --Bg-dark:        #0A1540;   /* was #101010 — deep navy                */
  --Bg-dark-2:      #0A1540;
  --Text-primary:   #111827;   /* body headings — near-black, per UAE    */
  --Text-secondary: #374151;
  --Text-muted:     #565E6C;
  --body-text:      #6B7280;
  --Line:           #E4E7EC;
  --Out-line:       #E4E7EC;
  --Placehover:     #626973;   /* darkened for AA text contrast on light bg */

  /* --- NileMed additions --------------------------------------------- */
  --Accent:         #00AADF;   /* CTAs + hover only. never a wash        */
  --Accent-dk:      #0093C0;
  --Accent-ink:     #00708F;   /* accent as small text on light — AA-safe */
  --Brand-deep:     #0A1540;
  --Tint:           #F0F4FF;
  --Tint-2:         #F0F8FF;
  --Wa:             #25D366;
  --Wa-dk:          #128C7E;

  /* --- type ----------------------------------------------------------- */
  --font-main:  "Poppins", "Plus Jakarta Sans", sans-serif;
  --font-main2: "Poppins", "IBM Plex Sans", sans-serif;
  --font-main3: "Poppins", "Manrope", sans-serif;
  --font-mono:  "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, monospace;
}

/* ==========================================================================
   Buttons — navy at rest, cyan sliding in on hover.

   The template does NOT recolour on hover with background-color: it slides a
   pseudo-element across (`.btn-hover-animate-2::after`, or `span:nth-child(2)`
   for the bordered variant) and sets the label to white. That fill defaults to
   var(--Secondary), which we retinted to pale blue — so it was white text
   sliding onto a pale blue fill, i.e. unreadable. Fix the FILL colour rather
   than overriding background-color, which would fight the animation.
   ========================================================================== */

/* rest state: navy */
.tf-btn,
.tf-btn.btn-bg-primary, .tf-btn.btn-bg-primary-2, .tf-btn.btn-bg-primary-3 {
  background-color: var(--Primary);
  color: #fff;
}
.tf-btn span:first-child { color: inherit; position: relative; z-index: 2; }

/* the sliding fill becomes cyan, on every variant */
.btn-hover-animate-2::after,
.btn-hover-animate-2.btn-bg-primary::after,
.btn-hover-animate-2.btn-bg-primary-2::after,
.btn-hover-animate-2.btn-bg-primary-3::after,
.btn-hover-animate-2.btn-bg-white::after,
.btn-hover-animate-2.btn-bg-white-2::after,
.btn-hover-animate-2.btn-bg-white-3::after,
.btn-hover-animate-2.btn-bg-white-4::after,
.btn-hover-animate-2.btn-bg-secondary::after,
.btn-hover-animate-2.btn-bg-secondary-2::after,
.btn-hover-animate-2.btn-bg-dark-2::after,
.btn-hover-animate-2.btn-bg-stroke-dark::after,
.btn-hover-animate-2.btn-bg-stroke-dark-2::after {
  background: var(--Accent) !important;
}
/* label stays white — readable on both navy and cyan */
.btn-hover-animate-2:hover,
.btn-hover-animate-2.btn-bg-primary:hover,
.btn-hover-animate-2.btn-bg-primary-2:hover,
.btn-hover-animate-2.btn-bg-primary-3:hover,
.btn-hover-animate-2.btn-bg-white:hover,
.btn-hover-animate-2.btn-bg-white-2:hover,
.btn-hover-animate-2.btn-bg-white-3:hover,
.btn-hover-animate-2.btn-bg-white-4:hover,
.btn-hover-animate-2.btn-bg-secondary:hover,
.btn-hover-animate-2.btn-bg-secondary-2:hover,
.btn-hover-animate-2.btn-bg-dark-2:hover { color: #fff !important; }

/* bordered variant: navy outline at rest, cyan sliding up, white label */
.tf-btn.style-border,
.btn-hover-animate-border.style-border {
  background-color: transparent;
  color: var(--Primary);
  border: 1.5px solid var(--Primary);
}
.btn-hover-animate-border span:nth-child(2) { background-color: var(--Accent) !important; }
.btn-hover-animate-border:hover,
.tf-btn.style-border:hover {
  background-color: var(--Accent);
  border-color: var(--Accent);
  color: #fff !important;
}

/* on dark surfaces the outline is white */
.hero-banner-4.nm-bleed .tf-btn.style-border,
.section-service-5 .tf-btn.style-border,
.nm-dark .tf-btn.style-border {
  color: #fff; border-color: rgba(255,255,255,.45);
}

/* solid CTA on the dark hero: white at rest, cyan sliding in */
.hero-banner-4.nm-bleed .tf-btn:not(.style-border) {
  background-color: #fff; color: var(--Primary);
}
.hero-banner-4.nm-bleed .tf-btn:not(.style-border):hover { color: #fff !important; }

/* circular arrow buttons */
.btn-arrow { transition: background-color .3s cubic-bezier(0.63, 0.25, 0.25, 1), color .3s ease, border-color .3s ease; }
.btn-arrow:hover { background-color: var(--Accent) !important; color: #fff !important; border-color: var(--Accent) !important; }

/* links + hovers that were teal */
a:hover, .link:hover { color: var(--Accent); }
.main-menu .navigation > li:hover > a,
.navigation .submenu li:hover > a { color: var(--Primary); }

/* ==========================================================================
   Eyebrow / section label — the KarlStorz editorial device
   ========================================================================== */
.nm-eyebrow {
  display: inline-flex; align-items: center; gap: .62rem;
  font-family: var(--font-main2);
  font-size: .72rem; font-weight: 600; letter-spacing: .17em;
  text-transform: uppercase; color: var(--Accent); margin-bottom: 1rem;
}
.nm-eyebrow::before { content: ""; width: 26px; height: 2px; background: currentColor; }
.nm-eyebrow.on-dark { color: #7FD8F5; }

/* monospace detail — part numbers, counts, labels */
.nm-mono {
  font-family: var(--font-mono);
  font-size: .72rem; letter-spacing: .1em; text-transform: uppercase;
  color: var(--Text-muted);
}

/* ==========================================================================
   Photo slots — placeholders until the principals' media kits arrive.
   Replace the whole .nm-slot block with an <img>; nothing else depends on it.
   ========================================================================== */
.nm-slot {
  position: relative; display: grid; place-items: center; text-align: center;
  min-height: 200px; padding: 1.5rem; border-radius: 20px;
  background:
    repeating-linear-gradient(135deg, transparent, transparent 9px,
      rgba(13,31,107,.035) 9px, rgba(13,31,107,.035) 18px),
    linear-gradient(140deg, var(--Tint-2), var(--Secondary));
  border: 1.5px dashed rgba(13,31,107,.2);
  color: var(--Primary);
}
.nm-slot__k { font-family: var(--font-mono); font-size: .66rem; letter-spacing: .16em; text-transform: uppercase; color: var(--Accent); margin-bottom: .4rem; }
.nm-slot__t { font-size: .9rem; font-weight: 600; max-width: 28ch; line-height: 1.4; margin: 0 auto; }
.nm-slot__d { font-family: var(--font-mono); font-size: .66rem; color: var(--Placehover); margin-top: .5rem; letter-spacing: .06em; }
.nm-slot.is-dark {
  background: repeating-linear-gradient(135deg, transparent, transparent 9px,
      rgba(255,255,255,.03) 9px, rgba(255,255,255,.03) 18px), rgba(255,255,255,.05);
  border-color: rgba(255,255,255,.22); color: #fff;
}
.nm-slot.is-dark .nm-slot__k { color: #7FD8F5; }
.nm-slot.is-dark .nm-slot__d { color: rgba(255,255,255,.45); }

/* ==========================================================================
   Specification table — the density device. A distributor is judged on
   detail, so product blocks carry real specs rather than filler copy.
   ========================================================================== */
.nm-spec { width: 100%; border-collapse: collapse; font-size: .88rem; }
.nm-spec td { padding: .62rem 0; border-bottom: 1px solid var(--Line); }
.nm-spec td:first-child { color: var(--Primary); font-weight: 500; width: 44%; }
.nm-spec td:last-child { color: var(--Text-muted); font-family: var(--font-mono); font-size: .8rem; }
.nm-spec tr:last-child td { border-bottom: 0; }

/* chips */
.nm-chips { display: flex; flex-wrap: wrap; gap: .4rem; }
.nm-chip {
  font-size: .74rem; padding: .26rem .7rem; border-radius: 100px;
  background: var(--Tint); color: var(--Primary);
  border: 1px solid rgba(13,31,107,.07);
}

/* ==========================================================================
   Dark surfaces — the template is light throughout; NileMed needs the
   nav → hero → content contrast ladder the client asked for.
   ========================================================================== */
.nm-dark { background: var(--Bg-dark); color: rgba(255,255,255,.72); }
.nm-dark h1, .nm-dark h2, .nm-dark h3, .nm-dark h4 { color: #fff; }

.nm-hero {
  position: relative; overflow: hidden;
  background: radial-gradient(58% 78% at 80% 14%, rgba(0,170,223,.26), transparent 64%),
              linear-gradient(158deg, var(--Primary), var(--Brand-deep));
}
.nm-hero__mesh {
  position: absolute; inset: 0; opacity: .5;
  background-image:
    linear-gradient(rgba(255,255,255,.045) 1px, transparent 1px),
    linear-gradient(90deg, rgba(255,255,255,.045) 1px, transparent 1px);
  background-size: 68px 68px;
  -webkit-mask-image: radial-gradient(78% 68% at 55% 40%, #000, transparent);
          mask-image: radial-gradient(78% 68% at 55% 40%, #000, transparent);
}
.nm-hero > .tf-container, .nm-hero > .container { position: relative; z-index: 2; }
.nm-hero h1, .nm-hero h2, .nm-hero h3 { color: #fff; }
.nm-hero p { color: rgba(255,255,255,.78); }

/* editorial fact strip — replaces a glassy stat card */
.nm-facts { border-top: 1px solid rgba(255,255,255,.14); display: grid; grid-template-columns: repeat(4,1fr); }
.nm-fact { padding: 1.6rem 1.6rem 1.9rem; border-right: 1px solid rgba(255,255,255,.14); }
.nm-fact:first-child { padding-left: 0; }
.nm-fact:last-child { border-right: 0; }
.nm-fact__n { font-size: 1.9rem; font-weight: 600; color: #fff; letter-spacing: -.028em; line-height: 1; }
.nm-fact__l { font-family: var(--font-mono); font-size: .68rem; letter-spacing: .11em; text-transform: uppercase; color: rgba(255,255,255,.5); margin-top: .5rem; }

/* principals strip */
.nm-principals { background: var(--Bg-dark); border-top: 1px solid rgba(255,255,255,.08); padding: 1.5rem 0; }
.nm-principals__in { display: flex; align-items: center; gap: 2rem; flex-wrap: wrap; }
.nm-principals__k { font-family: var(--font-mono); font-size: .68rem; letter-spacing: .14em; text-transform: uppercase; color: rgba(255,255,255,.42); padding-right: 1.4rem; border-right: 1px solid rgba(255,255,255,.14); }
.nm-principals__l { display: flex; gap: 2rem; flex-wrap: wrap; }
.nm-principals__l a { font-size: 1rem; font-weight: 600; color: rgba(255,255,255,.72); }
.nm-principals__l a:hover { color: #fff; }

/* ==========================================================================
   Partner list — a row table reads more like a distributor's portfolio
   than another grid of identical cards.
   ========================================================================== */
.nm-plist { border-top: 1px solid var(--Line); }
.nm-prow {
  display: grid; grid-template-columns: .9fr .8fr 1.6fr auto; gap: 2rem;
  padding: 1.7rem 0; border-bottom: 1px solid var(--Line); align-items: center;
  transition: background-color 0.3s cubic-bezier(0.63, 0.25, 0.25, 1), padding-left 0.3s ease;
}
.nm-prow:hover { background: #fff; padding-left: .8rem; }
.nm-prow__n { font-size: 1.22rem; font-weight: 600; color: var(--Primary); }
.nm-prow__s { font-family: var(--font-mono); font-size: .7rem; letter-spacing: .1em; text-transform: uppercase; color: var(--Accent); }
.nm-prow__d { font-size: .9rem; color: var(--Text-muted); }
.nm-prow__a { color: var(--Placehover); transition: color 0.4s cubic-bezier(0.63, 0.25, 0.25, 1), transform 0.4s ease; }
.nm-prow:hover .nm-prow__a { color: var(--Accent); transform: translateX(4px); }

/* logo sizing in the template's header + footer */
.header .site-logo img, .site-logo img { height: 40px; width: auto; }
.footer .site-logo { background: #fff; border-radius: 10px; padding: .6rem .8rem; display: inline-block; }

/* WhatsApp float */
.nm-wa {
  position: fixed; right: 24px; bottom: 24px; z-index: 80;
  width: 54px; height: 54px; border-radius: 50%; display: grid; place-items: center;
  background: var(--Wa); color: #fff; box-shadow: 0 8px 24px rgba(37,211,102,.4);
  transition: transform 0.4s cubic-bezier(0.63, 0.25, 0.25, 1), background-color 0.4s ease;
}
.nm-wa:hover { transform: scale(1.08); background: var(--Wa-dk); color: #fff; }
.nm-wa svg { width: 27px; height: 27px; }

@media (max-width: 991px) {
  .nm-facts { grid-template-columns: repeat(2,1fr); }
  .nm-fact { padding-left: 1.2rem; border-bottom: 1px solid rgba(255,255,255,.14); }
  .nm-fact:nth-child(1), .nm-fact:nth-child(3) { padding-left: 0; }
  .nm-prow { grid-template-columns: 1fr; gap: .5rem; }
  .nm-prow__a { display: none; }
}

/* ==========================================================================
   Hero — the template hard-codes a pale-green gradient on .tf-slider-2
   (not a token, so it survives the retint). Override it to NileMed tint.
   ========================================================================== */
.tf-slider-2 {
  background: linear-gradient(86.69deg, var(--Tint-2) 2.25%, rgba(232, 244, 255, .55) 98.6%) !important;
}
.tf-slider-2::before {
  content: ""; position: absolute; inset: 0; pointer-events: none;
  background: radial-gradient(52% 62% at 88% 18%, rgba(0, 170, 223, .10), transparent 62%);
}

/* ==========================================================================
   Partner cards — KARL STORZ-style hover overlay.
   Their teaser darkens the image and slides the copy up over it, with a
   colour wash from the brand accent. Rebuilt here on the template's card.
   ========================================================================== */
.section-team-2 .card-team .wrap { position: relative; overflow: hidden; }

.section-team-2 .card-team .img-style {
  position: relative; display: block; overflow: hidden;
}
.section-team-2 .card-team .img-style img {
  width: 100%; height: 100%; object-fit: cover;
  transition: transform .6s cubic-bezier(.4, 0, .2, 1);
}
.section-team-2 .card-team:hover .img-style img { transform: scale(1.06); }

/* the wash — navy base + accent bloom, revealed on hover */
.section-team-2 .card-team .img-style::after {
  content: ""; position: absolute; inset: 0;
  background:
    radial-gradient(80% 70% at 80% 10%, rgba(0, 170, 223, .55), transparent 60%),
    linear-gradient(to top, rgba(10, 21, 64, .92) 0%, rgba(10, 21, 64, .70) 38%, rgba(10, 21, 64, .12) 100%);
  opacity: 0; transition: opacity .45s cubic-bezier(.4, 0, .2, 1);
}
.section-team-2 .card-team:hover .img-style::after,
.section-team-2 .card-team:focus-within .img-style::after { opacity: 1; }

/* copy sits over the image and slides up, KARL STORZ teaser behaviour */
.section-team-2 .card-team .content {
  position: absolute; left: 0; right: 0; bottom: 0; z-index: 2;
  padding: 1.5rem 1.4rem 1.6rem;
  background: none; text-align: left;
  transform: translateY(14px); opacity: 0;
  transition: transform .45s cubic-bezier(.4, 0, .2, 1), opacity .35s cubic-bezier(0.63, 0.25, 0.25, 1);
}
.section-team-2 .card-team:hover .content,
.section-team-2 .card-team:focus-within .content { transform: none; opacity: 1; }
.section-team-2 .card-team .content .title { color: #fff !important; font-size: 1.2rem; }
.section-team-2 .card-team .content .title:hover { color: #7FD8F5 !important; }
.section-team-2 .card-team .content p { color: rgba(255, 255, 255, .8) !important; }

/* a persistent name strip so the card still reads before hover */
.section-team-2 .card-team .img-style::before {
  content: attr(data-name);
  position: absolute; left: 1.4rem; bottom: 1.4rem; z-index: 3;
  font-family: var(--font-mono); font-size: .72rem; letter-spacing: .14em;
  text-transform: uppercase; color: var(--Primary);
  transition: opacity .3s cubic-bezier(0.63, 0.25, 0.25, 1);
}
.section-team-2 .card-team:hover .img-style::before { opacity: 0; }

/* arrow button picks up the accent on hover */
.section-team-2 .card-team:hover .btn-arrow {
  background: var(--Accent); color: #fff; border-color: var(--Accent);
}

/* ==========================================================================
   HERO — KARL STORZ model: full-bleed photograph, dark wash, copy on top.
   The photo is a background-image on .hero-banner-4 (set inline per slide),
   NOT the template's 40%-wide arch thumbnail — that had no contrast against
   the white nav, which is what the client was reacting to.
   ========================================================================== */
.tf-slider-2 { background: var(--Brand-deep) !important; }
.tf-slider-2 .swiper { padding-top: 0 !important; padding-bottom: 0 !important; }

.hero-banner-4.nm-bleed {
  position: relative;
  min-height: 880px;
  display: flex; align-items: center;
  /* Clear the floating pill nav deterministically.
     Nav = 18px offset + ~84px pill + breathing room. Using a variable so the
     hero and the nav can never drift apart. */
  --nav-clear: 265px;
  padding-top: var(--nav-clear); padding-bottom: 145px;
  background-size: cover;
  background-position: center 30%;
  background-repeat: no-repeat;
}
@media (max-width: 991px) {
  .hero-banner-4.nm-bleed { min-height: 700px; --nav-clear: 200px; padding-bottom: 100px; }
}
@media (max-width: 575px) {
  .hero-banner-4.nm-bleed { min-height: 600px; --nav-clear: 175px; padding-bottom: 80px; }
}

/* dark wash — deepest on the left where the copy sits, accent bloom top-right */
.hero-banner-4.nm-bleed::after {
  content: ""; position: absolute; inset: 0; z-index: 1; pointer-events: none;
  /* Two stacked washes. Product shots on white backgrounds would otherwise
     render the gradient as a washed mid-tone, so a flat base sits underneath
     to guarantee text contrast regardless of how light the photo is. */
  background:
    radial-gradient(58% 76% at 90% 8%, rgba(0,170,223,.26), transparent 60%),
    linear-gradient(90deg, rgba(10,21,64,.96) 0%, rgba(10,21,64,.90) 38%,
                    rgba(10,21,64,.66) 70%, rgba(10,21,64,.48) 100%),
    linear-gradient(rgba(10,21,64,.30), rgba(10,21,64,.30));
}
.hero-banner-4.nm-bleed > .tf-container { position: relative; z-index: 2; width: 100%; }

/* copy on the wash */
.hero-banner-4.nm-bleed .title,
.hero-banner-4.nm-bleed h1, .hero-banner-4.nm-bleed h2 { color: #fff !important; }
.hero-banner-4.nm-bleed p,
.hero-banner-4.nm-bleed .text-body-2 { color: rgba(255,255,255,.84) !important; }
.hero-banner-4.nm-bleed .text-caption-1,
.hero-banner-4.nm-bleed .text-button,
.hero-banner-4.nm-bleed a[href^="mailto"],
.hero-banner-4.nm-bleed a[href^="tel"] { color: rgba(255,255,255,.8) !important; }
.hero-banner-4.nm-bleed .icon-box,
.hero-banner-4.nm-bleed .box-icon { background: rgba(255,255,255,.12) !important; }
.hero-banner-4.nm-bleed .icon-box i,
.hero-banner-4.nm-bleed .box-icon i { color: #fff !important; }

/* CTA on dark: navy fill reads flat on navy, so lift it to white→cyan */
.hero-banner-4.nm-bleed .tf-btn {
  background-color: #fff !important; border-color: #fff !important;
  color: var(--Primary) !important;
}
.hero-banner-4.nm-bleed .tf-btn:hover {
  background-color: var(--Accent) !important; border-color: var(--Accent) !important;
  color: #fff !important;
}

/* pagination on dark */
.tf-slider-2 .swiper-pagination { bottom: 34px !important; }
.tf-slider-2 .swiper-pagination-bullet { background: rgba(255,255,255,.4) !important; opacity: 1; }
.tf-slider-2 .swiper-pagination-bullet-active { background: var(--Accent) !important; }

/* the white pill nav now floats over a dark photograph — this is the
   nav → hero contrast step the client asked for */
.header.header-sticky { background: transparent; }

/* ==========================================================================
   About — rebuilt on KARL STORZ's `textblock` pattern.
   Their signature is that the kicker is part of the heading (a "topline"
   span inside the <h2>), the whole block is centred, and a single primary
   CTA sits beneath. The template's default was a pill tag on the left with
   the copy pushed to a separate right-hand column, which reads as a generic
   two-column intro rather than an editorial statement.
   ========================================================================== */
.nm-textblock { padding: 0 0 3.5rem; }
.nm-textblock__container { max-width: 860px; margin-inline: auto; text-align: center; }

.nm-textblock__headline {
  font-weight: 500;
  margin-bottom: 1.875rem;   /* their value */
  display: flex; flex-direction: column; gap: 1rem;
}
.nm-textblock__topline {
  font-size: .875rem; line-height: 1.25rem; font-weight: 700; letter-spacing: .01em;
  text-transform: uppercase; color: var(--Accent);
}
.nm-textblock__headline-text {
  font-size: clamp(30px, 3.4vw, 46px);
  line-height: 1.16; letter-spacing: -.022em; color: var(--Primary); font-weight: 600;
}
.nm-textblock--big .nm-textblock__headline-text {
  font-size: clamp(32px, 3.6vw, 48px);   /* px: root is 10px in this template */
}
.nm-textblock__description {
  text-align: center; max-width: 68ch; margin-inline: auto;
}
.nm-textblock__description p {
  font-size: clamp(1rem, .95rem + .3vw, 1.15rem);
  line-height: 1.72; color: var(--Text-muted); margin: 0;
}

/* a measured fact row — replaces the "25,000+ happy patients" vanity metric
   with things a distributor is actually judged on */
.nm-textblock__meta {
  display: flex; justify-content: center; flex-wrap: wrap;
  gap: 0; margin: 2.6rem auto 2.4rem; max-width: 720px;
  border-top: 1px solid var(--Line); border-bottom: 1px solid var(--Line);
}
.nm-textblock__stat {
  flex: 1 1 0; min-width: 160px; padding: 1.5rem 1rem;
  display: flex; flex-direction: column; align-items: center; gap: .35rem;
  border-right: 1px solid var(--Line);
}
.nm-textblock__stat:last-child { border-right: 0; }
.nm-textblock__stat .n {
  font-size: 2.1rem; font-weight: 600; color: var(--Primary);
  letter-spacing: -.03em; line-height: 1;
}
.nm-textblock__stat .l {
  font-family: var(--font-mono); font-size: .68rem; letter-spacing: .11em;
  text-transform: uppercase; color: var(--Text-muted);
}

.nm-textblock__cta { display: flex; justify-content: center; gap: .75rem; flex-wrap: wrap; }

@media (max-width: 767px) {
  .nm-textblock__meta { flex-direction: column; }
  .nm-textblock__stat { border-right: 0; border-bottom: 1px solid var(--Line); }
  .nm-textblock__stat:last-child { border-bottom: 0; }
}

/* ==========================================================================
   Why NileMed — numbered reasons.
   Replaced the template's counter pair, which duplicated the fact row in the
   About textblock (same 6 / 5 / 25+ numbers twice on one page) and still had
   leftover template markup rendering "25,000+" and "5%".
   ========================================================================== */
.nm-reasons { display: grid; gap: 0; border-top: 1px solid var(--Line); }
.nm-reason {
  display: grid; grid-template-columns: 58px 1fr; gap: 1.1rem;
  padding: 1.35rem 0; border-bottom: 1px solid var(--Line);
  transition: padding-left 0.3s cubic-bezier(0.63, 0.25, 0.25, 1);
}
.nm-reason:hover { padding-left: .55rem; }
.nm-reason__n {
  font-family: var(--font-mono); font-size: .78rem; letter-spacing: .12em;
  color: var(--Accent-ink); padding-top: .25rem;
}
.nm-reason__t { font-size: 1.12rem; font-weight: 600; color: var(--Primary); margin: 0 0 .3rem; }
.nm-reason__d { font-size: .95rem; color: var(--Text-muted); margin: 0; line-height: 1.65; }

/* media column with a figure badge, echoing KARL STORZ's stat overlays */
.nm-why-media { position: relative; }
.nm-why-img {
  border-radius: 20px; overflow: hidden; position: relative;
  aspect-ratio: 7 / 8; background: #fff;
}
.nm-why-img img { width: 100%; height: 100%; object-fit: cover; display: block; }
.nm-why-badge {
  position: absolute; left: -18px; bottom: 34px;
  background: var(--Primary); color: #fff;
  border-radius: 20px; padding: 1.4rem 1.6rem;
  display: flex; align-items: center; gap: .9rem;
  box-shadow: 0 18px 44px rgba(10,21,64,.22);
}
.nm-why-badge__n { font-size: 2.6rem; font-weight: 600; line-height: 1; letter-spacing: -.03em; }
.nm-why-badge__l {
  font-family: var(--font-mono); font-size: .68rem; letter-spacing: .11em;
  text-transform: uppercase; color: rgba(255,255,255,.72); line-height: 1.5;
}
@media (max-width: 991px) { .nm-why-badge { left: 12px; bottom: 12px; padding: 1.1rem 1.2rem; } }

/* ==========================================================================
   Partners — real principal logos, country and specialty.
   Data (name / country / specialty / logo / product count) comes from
   nilemed-uae.com's own catalogue, so it is already client-approved.
   NOTE: there are FIVE principals, not six. "Neurocare" is part of DEYMED's
   specialty line on the UAE site, not a separate partner.
   ========================================================================== */
.nm-partners { display: grid; grid-template-columns: repeat(3, 1fr); gap: 24px; }
@media (max-width: 1100px) { .nm-partners { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 680px)  { .nm-partners { grid-template-columns: 1fr; } }

.nm-partner {
  display: flex; flex-direction: column;
  background: #fff; border: 1px solid var(--Line); border-radius: 20px;
  overflow: hidden;
  transition: border-color 0.4s cubic-bezier(0.63, 0.25, 0.25, 1), box-shadow 0.4s ease, transform 0.4s ease;
}
.nm-partner:hover {
  border-color: var(--Accent);
  box-shadow: 0 16px 40px rgba(10,21,64,.10);
  transform: translateY(-4px);
}
.nm-partner__logo {
  display: grid; place-items: center; padding: 2rem 2rem 1.4rem;
  background: #fff; border-bottom: 1px solid var(--Line);
}
.nm-partner__logo img { max-height: 74px; width: auto; object-fit: contain; }
.nm-partner__body { padding: 1.5rem 1.6rem 1.6rem; display: flex; flex-direction: column; flex: 1; }
.nm-partner__name { font-size: 1.22rem; font-weight: 600; color: var(--Primary); margin: 0 0 .5rem; }
.nm-partner__meta {
  display: flex; align-items: center; gap: .6rem; flex-wrap: wrap;
  font-family: var(--font-mono); font-size: .68rem; letter-spacing: .1em;
  text-transform: uppercase; color: var(--Accent); margin-bottom: .8rem;
}
.nm-partner__meta .dot { width: 3px; height: 3px; border-radius: 50%; background: currentColor; opacity: .6; }
.nm-partner__desc { font-size: .92rem; line-height: 1.66; color: var(--Text-muted); margin: 0 0 1.2rem; }
.nm-partner__foot {
  margin-top: auto; padding-top: 1rem; border-top: 1px solid var(--Line);
  display: flex; align-items: center; justify-content: space-between; gap: 1rem;
}
.nm-partner__count { font-family: var(--font-mono); font-size: .7rem; letter-spacing: .09em; text-transform: uppercase; color: var(--Placehover); }
.nm-partner__link {
  display: inline-flex; align-items: center; gap: .4rem;
  font-size: .88rem; font-weight: 600; color: var(--Primary);
  transition: color 0.3s cubic-bezier(0.63, 0.25, 0.25, 1), gap 0.3s ease;
}
.nm-partner:hover .nm-partner__link { color: var(--Accent); gap: .6rem; }

/* ==========================================================================
   Category panes — real products from the nilemed-uae catalogue.
   Each card links to the manufacturer's own product page (the UAE data
   carries those links), so nothing points at a dead placeholder.
   ========================================================================== */
.nm-cat { background: #fff; border-radius: 20px; padding: 2rem; }
.nm-cat__head {
  display: flex; align-items: flex-end; justify-content: space-between;
  gap: 2rem; flex-wrap: wrap; padding-bottom: 1.6rem; margin-bottom: 1.8rem;
  border-bottom: 1px solid var(--Line);
}
.nm-cat__count {
  font-family: var(--font-mono); font-size: .7rem; letter-spacing: .12em;
  text-transform: uppercase; color: var(--Accent-ink); margin-bottom: .5rem;
}
.nm-cat__title { font-size: 1.7rem; font-weight: 600; color: var(--Primary); margin: 0 0 .5rem; }
.nm-cat__desc { font-size: .95rem; line-height: 1.66; color: var(--Text-muted); margin: 0; max-width: 62ch; }

.nm-cat__grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; }
@media (max-width: 1100px) { .nm-cat__grid { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 640px)  { .nm-cat__grid { grid-template-columns: 1fr; } .nm-cat { padding: 1.2rem; } }

.nm-pcard {
  display: flex; flex-direction: column;
  border: 1px solid var(--Line); border-radius: 16px; overflow: hidden; background: #fff;
  transition: border-color 0.4s cubic-bezier(0.63, 0.25, 0.25, 1), box-shadow 0.4s ease, transform 0.4s ease;
}
.nm-pcard:hover { border-color: var(--Accent); box-shadow: 0 14px 34px rgba(10,21,64,.10); transform: translateY(-3px); }
.nm-pcard__media { display: block; background: #fff; border-bottom: 1px solid var(--Line); overflow: hidden; }
.nm-pcard__media img { width: 100%; height: 190px; object-fit: contain; padding: .9rem; transition: transform .4s cubic-bezier(0.63, 0.25, 0.25, 1); }
.nm-pcard:hover .nm-pcard__media img { transform: scale(1.05); }
.nm-pcard__body { display: flex; flex-direction: column; padding: 1.1rem 1.2rem 1.3rem; flex: 1; }
.nm-pcard__brand {
  font-family: var(--font-mono); font-size: .64rem; letter-spacing: .13em;
  text-transform: uppercase; color: var(--Accent); margin-bottom: .4rem;
}
.nm-pcard__name { font-size: 1rem; font-weight: 600; color: var(--Primary); line-height: 1.34; margin-bottom: .35rem; }
.nm-pcard__desc { font-size: .84rem; line-height: 1.6; color: var(--Text-muted); margin-bottom: .9rem; }
.nm-pcard__tags { margin-top: auto; display: flex; flex-wrap: wrap; gap: .3rem; }
.nm-pcard__tags .nm-chip { font-size: .68rem; padding: .18rem .55rem; }

/* ==========================================================================
   Footer — NileMed navy, structured after KARL STORZ (card row, link
   columns, disclaimer, legal bar, back-to-top). No social icons: NileMed has
   no confirmed accounts, and linking them to "#" would be worse than absent.
   Type sizes are set explicitly here because the template's footer inherits
   sizes that were tuned for its own layout.
   ========================================================================== */
.nm-footer { background: var(--Bg-dark); color: rgba(255,255,255,.66); padding: 0 0 1.5rem; }

/* card row */
/* ONE cta, not two — the old pair of cards both pointed at contact.html with
   near-identical copy. See _data/gen-footer.py. */
.nm-footer__cta {
  background: var(--Primary); border-radius: 20px; padding: 30px 36px;
  display: flex; align-items: center; justify-content: space-between; gap: 32px;
  transform: translateY(-48px); margin-bottom: -18px;
}
@media (max-width: 820px) {
  .nm-footer__cta { flex-direction: column; align-items: flex-start; gap: 20px; padding: 26px 24px; }
}
.nm-footer__cta > div { flex: 1; }
.nm-footer__card-k {
  font-family: var(--font-mono); font-size: .7rem; letter-spacing: .13em;
  text-transform: uppercase; color: #7FD8F5;
}
.nm-footer__card-t { font-size: 1.02rem; line-height: 1.6; color: #fff; margin: 6px 0 0; max-width: 62ch; }

/* main columns */
.nm-footer__main {
  display: grid; grid-template-columns: 1.8fr 1fr 1fr 1.2fr; gap: 2.4rem;
  padding: 1.5rem 0 3rem; border-bottom: 1px solid rgba(255,255,255,.10);
}
@media (max-width: 1100px) { .nm-footer__main { grid-template-columns: 1fr 1fr; } }
@media (max-width: 700px)  { .nm-footer__main { grid-template-columns: 1fr 1fr; } }
@media (max-width: 520px)  { .nm-footer__main { grid-template-columns: 1fr; } }

.nm-footer__logo { display: inline-block; background: #fff; border-radius: 10px; padding: .55rem .8rem; margin-bottom: 1.1rem; }
.nm-footer__logo img { height: 40px; width: auto; display: block; }
.nm-footer__brand p { font-size: .92rem; line-height: 1.72; color: rgba(255,255,255,.62); margin: 0; max-width: 42ch; }

.nm-footer__col h3 {
  color: #fff; font-size: .74rem; font-weight: 600; letter-spacing: .14em;
  text-transform: uppercase; margin: 0 0 1.1rem;
}
.nm-footer__col ul { list-style: none; margin: 0; padding: 0; }
.nm-footer__col li { margin-bottom: .62rem; }
.nm-footer__col a, .nm-footer__col span {
  font-size: .92rem; line-height: 1.5; color: rgba(255,255,255,.66);
  transition: color 0.3s cubic-bezier(0.63, 0.25, 0.25, 1), padding-left 0.3s ease;
}
.nm-footer__col a:hover { color: var(--Accent); padding-left: 3px; }

.nm-footer__contact li { display: flex; flex-direction: column; gap: .1rem; margin-bottom: .85rem; }
.nm-footer__contact .k {
  font-family: var(--font-mono); font-size: .64rem; letter-spacing: .12em;
  text-transform: uppercase; color: rgba(255,255,255,.66);
}
.nm-footer__wa {
  display: inline-flex; align-items: center; gap: .5rem; margin-top: .9rem;
  padding: .6rem 1rem; border-radius: 100px;
  background: rgba(37,211,102,.14); border: 1px solid rgba(37,211,102,.35);
  color: #4ade80 !important; font-size: .84rem; font-weight: 600;
  transition: background-color 0.3s cubic-bezier(0.63, 0.25, 0.25, 1), color 0.3s ease;
}
.nm-footer__wa:hover { background: var(--Wa); color: #fff !important; }

/* regulatory line — both reference sites carry an equivalent */
.nm-footer__disclaimer {
  font-size: .8rem; line-height: 1.7; color: rgba(255,255,255,.42);
  margin: 1.6rem 0 0; max-width: 96ch;
}

.nm-footer__bar {
  margin-top: 1.4rem; padding-top: 1.3rem; border-top: 1px solid rgba(255,255,255,.10);
  display: flex; align-items: center; justify-content: space-between;
  gap: 1rem 2rem; flex-wrap: wrap; font-size: .84rem; color: rgba(255,255,255,.5);
}
.nm-footer__legal { display: flex; gap: 1.5rem; flex-wrap: wrap; }
.nm-footer__legal a { color: rgba(255,255,255,.5); font-size: .84rem; }
.nm-footer__by a { color: rgba(255,255,255,.92); font-size: .84rem; font-weight: 800; letter-spacing: .01em; }
.nm-footer__legal a:hover,
.nm-footer__by a:hover { color: var(--Accent); }
.nm-footer__top {
  display: inline-flex; align-items: center; gap: .45rem;
  font-size: .82rem; font-weight: 600; color: rgba(255,255,255,.66);
}
.nm-footer__top:hover { color: var(--Accent); }

/* ==========================================================================
   TYPE SCALE — in PIXELS, deliberately.

   The template sets `html { font-size: 62.5% }`, i.e. **1rem = 10px**, not
   16px. Writing rem here silently produced ~40% smaller text than intended
   (1.0625rem rendered as 10.6px, not 17px). Everything below is therefore in
   px so the values mean what they say.

   Targets are karlstorz.com's measured sizes, converted from their 16px root:
     h2 26-38px · h3 20-28px · h4 18-22px
     body / description 18-20px, line-height 30-34px
     cta-button 15-17px · footer link headline 18-22px · nav link 16px
   ========================================================================== */

body { font-size: 17px; line-height: 1.72; }

/* --- section intros / body copy ------------------------------------------ */
.nm-textblock__description p { font-size: clamp(18px, 1.4vw, 21px); line-height: 1.78; font-weight: 400; }
.nm-cat__desc,
.nm-partner__desc,
.nm-reason__d,
.section-why-2 .desc,
.section-about-3 p,
.text-body-2,
.text-body-default { font-size: 17px; line-height: 1.72; }

/* --- headings ------------------------------------------------------------ */
.nm-textblock__headline-text { font-size: clamp(30px, 3.4vw, 46px); line-height: 1.16; }
.nm-cat__title      { font-size: clamp(24px, 2.2vw, 31px); line-height: 1.26; }
.nm-partner__name   { font-size: clamp(20px, 1.7vw, 23px); line-height: 1.3; }
.nm-pcard__name     { font-size: 17px; line-height: 1.42; }
.nm-pcard__desc     { font-size: 15px; line-height: 1.62; }
.nm-reason__t       { font-size: 19px; line-height: 1.4; }
.nm-why-badge__n    { font-size: 42px; }
.nm-textblock__stat .n { font-size: 34px; }

/* --- buttons + nav ------------------------------------------------------- */
.tf-btn { font-size: 16px !important; font-weight: 500 !important; }
.main-menu .navigation > li > a { font-size: 16px; font-weight: 500; }
.nm-partner__link { font-size: 15px; }

/* --- mono labels: small by design, but legible ---------------------------- */
.nm-mono,
.nm-cat__count,
.nm-partner__meta,
.nm-partner__count,
.nm-pcard__brand,
.nm-reason__n,
.nm-textblock__stat .l,
.nm-why-badge__l,
.nm-footer__contact .k { font-size: 12px; letter-spacing: .1em; }
.nm-textblock__topline { font-size: 15px; letter-spacing: .06em; }
.nm-chip, .nm-pcard__tags .nm-chip { font-size: 12px; padding: 3px 10px; }

/* --- footer: this is where the sizing was worst --------------------------- */
.nm-footer__col h3 { font-size: clamp(18px, 1.4vw, 20px); line-height: 1.4; letter-spacing: .02em; text-transform: none; margin-bottom: 18px; }
.nm-footer__col a,
.nm-footer__col span   { font-size: 16px; line-height: 1.6; }
.nm-footer__brand p    { font-size: 16px; line-height: 1.75; }
.nm-footer__card-k     { font-size: 13px; }
.nm-footer__card-t     { font-size: 19px; line-height: 1.6; }
.nm-footer__disclaimer { font-size: 15px; line-height: 1.75; }
.nm-footer__bar,
.nm-footer__legal a,
.nm-footer__by a,
.nm-footer__top,
.nm-footer__wa         { font-size: 15px; }

/* --- template classes that also render too small at a 10px root ---------- */
.tag.text-label { font-size: 13px; letter-spacing: .12em; }
.text-caption-1 { font-size: 15px; }

/* ==========================================================================
   Section labels ("WHY NILEMED", "OUR PARTNERS", "OUR SOLUTIONS").
   These were 13px sitting beneath 56px headings — a 1:4.3 ratio, far thinner
   than KARL STORZ's ~1:2.7 (14px topline under a 38px headline), which is why
   they read as too small. Raised and given more presence.
   ========================================================================== */
.tag.text-label,
.heading-section-5 .tag,
.nm-textblock__topline {
  font-size: 17px !important;
  font-weight: 700 !important;
  letter-spacing: .1em !important;
  line-height: 1.4 !important;
}

/* the pill variant needs a little more room at the larger size */
.tag.text-label { padding: 9px 20px !important; border-radius: 100px; }

/* keep the accent colour consistent across both label styles */
.heading-section-5 .tag.text-label { color: var(--Primary); background: var(--Tint); }
.section-service-5 .tag.text-label { color: var(--Primary); background: #fff; }
.nm-textblock__topline { color: var(--Accent); }

/* ==========================================================================
   Buttons on dark surfaces.
   The global rule puts .tf-btn in navy, which disappears on any navy panel:
   the footer cards rendered a navy button on a navy card (and the outlined
   variant vanished entirely). On dark panels the solid button inverts to
   white with navy text, and the outlined one takes a white border — both
   still filling cyan on hover, so the interaction stays consistent.
   ========================================================================== */
.nm-footer__card .tf-btn:not(.style-border),
.section-banner .tf-btn:not(.style-border),
.nm-dark .tf-btn:not(.style-border) {
  background-color: #fff !important;
  border-color: #fff !important;
  color: var(--Primary) !important;
}
.nm-footer__card .tf-btn:not(.style-border):hover,
.section-banner .tf-btn:not(.style-border):hover,
.nm-dark .tf-btn:not(.style-border):hover {
  color: #fff !important;   /* the cyan fill slides in beneath */
}

.nm-footer__card .tf-btn.style-border,
.section-banner .tf-btn.style-border {
  background-color: transparent !important;
  border-color: rgba(255,255,255,.5) !important;
  color: #fff !important;
}
.nm-footer__card .tf-btn.style-border:hover,
.section-banner .tf-btn.style-border:hover {
  background-color: var(--Accent) !important;
  border-color: var(--Accent) !important;
  color: #fff !important;
}

/* ==========================================================================
   INNER PAGES — page head, filters, catalogue.
   Page head follows KARL STORZ: dark band, breadcrumb, kicker, large heading,
   supporting line, then a measured stat row. Filtering mirrors
   nilemed-uae.com (category + principal, URL-driven).
   ========================================================================== */
.nm-pagehead {
  position: relative; overflow: hidden;
  background: radial-gradient(58% 78% at 86% 10%, rgba(0,170,223,.24), transparent 62%),
              linear-gradient(158deg, var(--Primary), var(--Brand-deep));
  padding: 210px 0 70px;
}
@media (max-width: 991px) { .nm-pagehead { padding: 170px 0 54px; } }
.nm-crumbs { display: flex; align-items: center; gap: 10px; font-size: 15px; color: rgba(255,255,255,.55); margin-bottom: 22px; }
.nm-crumbs a { color: rgba(255,255,255,.72); }
.nm-crumbs a:hover { color: #fff; }
.nm-pagehead__k {
  display: inline-block; font-family: var(--font-mono); font-size: 15px;
  font-weight: 700; letter-spacing: .1em; text-transform: uppercase;
  color: #7FD8F5; margin-bottom: 14px;
}
.nm-pagehead__h { font-size: clamp(34px, 4vw, 56px); line-height: 1.1; color: #fff; margin: 0 0 18px; letter-spacing: -.02em; }
.nm-pagehead__d { font-size: clamp(17px, 1.4vw, 20px); line-height: 1.7; color: rgba(255,255,255,.78); margin: 0; max-width: 72ch; }
.nm-pagehead__stats { display: flex; gap: 0; margin-top: 40px; border-top: 1px solid rgba(255,255,255,.16); max-width: 620px; }
.nm-pagehead__stats > div { flex: 1; padding: 20px 20px 0 0; }
.nm-pagehead__stats b { display: block; font-size: 34px; font-weight: 600; color: #fff; line-height: 1; letter-spacing: -.02em; }
.nm-pagehead__stats span { display: block; margin-top: 8px; font-family: var(--font-mono); font-size: 12px; letter-spacing: .11em; text-transform: uppercase; color: rgba(255,255,255,.52); }

/* filter bar — sticks under the floating nav */
.nm-filter { position: sticky; top: 96px; z-index: 40; background: #fff; border-bottom: 1px solid var(--Line); padding: 20px 0 0; box-shadow: 0 10px 26px rgba(10,21,64,.05); }
.nm-filter__row { display: flex; align-items: baseline; gap: 18px; margin-bottom: 14px; flex-wrap: wrap; }
.nm-filter__label { font-family: var(--font-mono); font-size: 12px; letter-spacing: .12em; text-transform: uppercase; color: var(--Text-muted); min-width: 78px; }
.nm-filter__chips { display: flex; gap: 8px; flex-wrap: wrap; }
.nm-filter__chip {
  border: 1.5px solid var(--Line); background: #fff; color: var(--Text-muted);
  font-size: 15px; font-weight: 500; padding: 9px 18px; border-radius: 100px;
  cursor: pointer; transition: all 0.3s cubic-bezier(0.63, 0.25, 0.25, 1);
}
.nm-filter__chip:hover { border-color: var(--Accent); color: var(--Primary); }
.nm-filter__chip.is-on { background: var(--Primary); border-color: var(--Primary); color: #fff; }
.nm-filter__bar { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 12px 0 14px; border-top: 1px solid var(--Line); }
.nm-filter__count { font-size: 15px; color: var(--Text-muted); }
.nm-filter__reset { border: 0; background: none; color: var(--Accent); font-size: 15px; font-weight: 600; cursor: pointer; }
.nm-filter__reset:hover { text-decoration: underline; }

/* catalogue groups */
.nm-catalogue { padding: 64px 0 24px; background: var(--Bg-light); }
.nm-group { margin-bottom: 64px; }
.nm-group__head { display: flex; align-items: center; gap: 20px; padding-bottom: 20px; margin-bottom: 26px; border-bottom: 1px solid var(--Line); }
.nm-group__logo { width: 116px; height: 62px; background: #fff; border: 1px solid var(--Line); border-radius: 12px; display: grid; place-items: center; padding: 10px; flex-shrink: 0; }
.nm-group__logo img { max-width: 100%; max-height: 100%; object-fit: contain; }
.nm-group__meta { flex: 1; }
.nm-group__name { font-size: clamp(22px, 2vw, 28px); font-weight: 600; color: var(--Primary); margin: 0 0 4px; }
.nm-group__sub { font-family: var(--font-mono); font-size: 12px; letter-spacing: .1em; text-transform: uppercase; color: var(--Accent); margin: 0; }
.nm-group__count { font-family: var(--font-mono); font-size: 13px; letter-spacing: .08em; text-transform: uppercase; color: var(--Placehover); }
.nm-group__count b { color: var(--Primary); font-size: 17px; }

.nm-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 22px; }
@media (max-width: 1100px) { .nm-grid { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 640px)  { .nm-grid { grid-template-columns: 1fr; } }

/* product card on the catalogue (extends the homepage card) */
.nm-catalogue .nm-pcard { background: #fff; }
.nm-pcard__foot { margin-top: 14px; padding-top: 12px; border-top: 1px solid var(--Line); display: flex; align-items: center; justify-content: space-between; gap: 12px; }
.nm-pcard__link { display: inline-flex; align-items: center; gap: 6px; font-size: 14px; font-weight: 600; color: var(--Text-muted); }
.nm-pcard__link:hover { color: var(--Accent); }
.nm-pcard__cta { font-size: 14px; font-weight: 600; color: var(--Primary); padding: 7px 16px; border: 1.5px solid var(--Line); border-radius: 100px; transition: all 0.3s cubic-bezier(0.63, 0.25, 0.25, 1); }
.nm-pcard__cta:hover { background: var(--Accent); border-color: var(--Accent); color: #fff; }

.nm-empty { text-align: center; padding: 70px 20px; }
.nm-empty p { font-size: 19px; color: var(--Text-muted); margin-bottom: 20px; }

/* shared CTA block for inner pages */
.nm-cta { position: relative; overflow: hidden; background: var(--Primary); border-radius: 20px; padding: clamp(32px, 3vw, 56px); display: grid; grid-template-columns: 1.5fr auto; gap: 28px; align-items: center; }
@media (max-width: 900px) { .nm-cta { grid-template-columns: 1fr; } }
.nm-cta::before { content: ""; position: absolute; inset: 0; background: radial-gradient(70% 130% at 88% 15%, rgba(0,170,223,.34), transparent 62%); }
.nm-cta > * { position: relative; z-index: 1; }
.nm-cta__k { font-family: var(--font-mono); font-size: 13px; letter-spacing: .12em; text-transform: uppercase; color: #7FD8F5; }
.nm-cta__h { font-size: clamp(26px, 2.6vw, 38px); color: #fff; margin: 10px 0 12px; line-height: 1.18; }
.nm-cta__d { font-size: 17px; line-height: 1.7; color: rgba(255,255,255,.8); margin: 0; max-width: 66ch; }
.nm-cta__actions { display: flex; gap: 12px; flex-wrap: wrap; }
.nm-cta .tf-btn:not(.style-border) { background-color: #fff !important; border-color: #fff !important; color: var(--Primary) !important; }
.nm-cta .tf-btn:not(.style-border):hover { color: #fff !important; }
.nm-cta .tf-btn.style-border { background: transparent !important; border-color: rgba(255,255,255,.5) !important; color: #fff !important; }
.nm-cta .tf-btn.style-border:hover { background: var(--Accent) !important; border-color: var(--Accent) !important; }

/* ==========================================================================
   Partners page — one block per principal, alternating sides.
   Category chips deep-link into the catalogue with both filters pre-set
   (products.html?category=…&partner=…), matching nilemed-uae's routing.
   ========================================================================== */
.nm-jump { background: #fff; border-bottom: 1px solid var(--Line); padding: 16px 0; position: sticky; top: 96px; z-index: 40; }
.nm-jump .tf-container { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.nm-jump__label { font-family: var(--font-mono); font-size: 12px; letter-spacing: .12em; text-transform: uppercase; color: var(--Placehover); margin-right: 6px; }
.nm-jump a { font-size: 15px; font-weight: 500; color: var(--Text-muted); padding: 8px 16px; border: 1.5px solid var(--Line); border-radius: 100px; transition: all 0.3s cubic-bezier(0.63, 0.25, 0.25, 1); }
.nm-jump a:hover { border-color: var(--Accent); color: var(--Primary); }

.nm-pblocks { background: var(--Bg-light); padding: 70px 0 30px; }
.nm-pblock {
  display: grid; grid-template-columns: 1fr 1fr; gap: 46px; align-items: center;
  background: #fff; border: 1px solid var(--Line); border-radius: 20px;
  padding: 40px; margin-bottom: 30px; scroll-margin-top: 170px;
}
.nm-pblock.is-alt { direction: rtl; }
.nm-pblock.is-alt > * { direction: ltr; }
@media (max-width: 900px) { .nm-pblock, .nm-pblock.is-alt { grid-template-columns: 1fr; direction: ltr; gap: 30px; padding: 26px; } }

.nm-pblock__logo { width: 160px; height: 84px; border: 1px solid var(--Line); border-radius: 12px; display: grid; place-items: center; padding: 12px; margin-bottom: 20px; }
.nm-pblock__logo img { max-width: 100%; max-height: 100%; object-fit: contain; }
.nm-pblock__name { font-size: clamp(26px, 2.4vw, 34px); font-weight: 600; color: var(--Primary); margin: 0 0 16px; }
.nm-pblock__meta { display: flex; gap: 0; border-top: 1px solid var(--Line); border-bottom: 1px solid var(--Line); margin-bottom: 20px; }
.nm-pblock__meta span { flex: 1; padding: 14px 14px 14px 0; font-size: 16px; color: var(--Primary); font-weight: 500; }
.nm-pblock__meta em { display: block; font-family: var(--font-mono); font-size: 11px; font-style: normal; letter-spacing: .12em; text-transform: uppercase; color: var(--Placehover); margin-bottom: 5px; }
.nm-pblock__desc { font-size: 17px; line-height: 1.72; color: var(--Text-muted); margin: 0 0 20px; }
.nm-pblock__cats { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 26px; }
.nm-pblock__cats .nm-chip { transition: all 0.3s cubic-bezier(0.63, 0.25, 0.25, 1); }
.nm-pblock__cats .nm-chip:hover { background: var(--Accent); color: #fff; border-color: var(--Accent); }
.nm-pblock__actions { display: flex; gap: 12px; flex-wrap: wrap; }

.nm-plook { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
.nm-plook__item { display: flex; flex-direction: column; border: 1px solid var(--Line); border-radius: 14px; overflow: hidden; background: #fff; transition: all 0.3s cubic-bezier(0.63, 0.25, 0.25, 1); }
.nm-plook__item:hover { border-color: var(--Accent); box-shadow: 0 12px 28px rgba(10,21,64,.10); transform: translateY(-3px); }
.nm-plook__item img { width: 100%; height: 150px; object-fit: contain; padding: 12px; }
.nm-plook__item span { display: block; padding: 10px 14px 14px; font-size: 14px; font-weight: 600; color: var(--Primary); line-height: 1.4; border-top: 1px solid var(--Line); }

/* ==========================================================================
   SOLUTIONS INDEX + CATEGORY PAGES
   Generated by _data/gen-categories.py — solutions.html and category-*.html.
   Deliberately NOT a uniform card grid: the solutions index is an editorial
   row list, and the category page is an asymmetric overview + a selection
   note + the real range grouped by principal. Matches the density device
   agreed in the direction document.
   Font sizes are in PX on purpose — the template sets html{font-size:62.5%}.
   ========================================================================== */

/* ---------------------------------------------------- category: overview */
.nm-catintro { padding: 78px 0 10px; background: #fff; }
.nm-catintro__grid { display: grid; grid-template-columns: 1.35fr 1fr; gap: 60px; align-items: start; }
@media (max-width: 991px) { .nm-catintro { padding: 52px 0 6px; } .nm-catintro__grid { grid-template-columns: 1fr; gap: 36px; } }

.nm-catintro__copy .nm-mono { display: block; margin-bottom: 16px; }
.nm-catintro__lede { font-size: 19px; line-height: 1.78; color: var(--Text-primary); margin: 0 0 34px; }
@media (max-width: 991px) { .nm-catintro__lede { font-size: 17px; } }

.nm-applist { list-style: none; margin: 0 0 28px; padding: 0; border-top: 1px solid var(--Line); }
.nm-applist__item { display: grid; grid-template-columns: 52px 1fr; gap: 14px; padding: 18px 0; border-bottom: 1px solid var(--Line); }
.nm-applist__n { font-family: var(--font-mono); font-size: 13px; letter-spacing: .08em; color: var(--Accent); padding-top: 3px; }
.nm-applist__b { font-size: 16px; line-height: 1.68; color: var(--Text-muted); }
.nm-applist__b b { display: block; font-size: 17px; font-weight: 600; color: var(--Primary); margin-bottom: 4px; }

.nm-catintro__principals { display: flex; align-items: center; flex-wrap: wrap; gap: 10px; margin: 0; font-size: 16px; }
.nm-catintro__principals .nm-mono { margin-right: 4px; }
.nm-catintro__principals a { color: var(--Primary); font-weight: 600; border-bottom: 1.5px solid var(--Line); padding-bottom: 2px; transition: all 0.3s cubic-bezier(0.63, 0.25, 0.25, 1); }
.nm-catintro__principals a:hover { color: var(--Accent); border-color: var(--Accent); }

.nm-catfig { margin: 0; border: 1px solid var(--Line); border-radius: 18px; overflow: hidden; background: #fff; }
.nm-catfig img { width: 100%; height: auto; aspect-ratio: 4 / 3; object-fit: contain; padding: 22px; display: block; }
.nm-catfig figcaption { border-top: 1px solid var(--Line); padding: 16px 20px; font-size: 15px; font-weight: 600; color: var(--Primary); background: var(--Tint-2); }
.nm-catfig figcaption .nm-mono { display: block; margin-bottom: 5px; }

/* selection note — the editorial "we actually know this market" moment */
.nm-guidance {
  margin: 46px 0 0; padding: 28px 32px; border-left: 3px solid var(--Accent);
  background: var(--Tint-2); border-radius: 0 14px 14px 0;
}
.nm-guidance .nm-mono { display: block; margin-bottom: 10px; }
.nm-guidance p { margin: 0; font-size: 18px; line-height: 1.72; color: var(--Primary); max-width: 88ch; }
@media (max-width: 991px) { .nm-guidance { padding: 22px 24px; } .nm-guidance p { font-size: 16px; } }

.nm-catintro__head { margin-bottom: 40px; }
.nm-catintro__head .nm-mono { display: block; margin-bottom: 12px; }

.nm-catfoot { margin: 8px 0 0; padding-top: 26px; border-top: 1px solid var(--Line); font-size: 16px; color: var(--Text-muted); }
.nm-catfoot a { color: var(--Primary); font-weight: 600; }
.nm-catfoot a:hover { color: var(--Accent); }

/* ------------------------------------------------ category: sibling nav */
.nm-catnav-wrap { padding: 76px 0 84px; background: #fff; border-top: 1px solid var(--Line); }
.nm-catnav__head { margin-bottom: 32px; }
.nm-catnav__head .nm-mono { display: block; margin-bottom: 12px; }
.nm-catnav__h { font-size: clamp(26px, 2.6vw, 38px); font-weight: 600; color: var(--Primary); margin: 0; letter-spacing: -.015em; }

.nm-catnav { display: grid; grid-template-columns: repeat(4, 1fr); gap: 0; border-top: 1px solid var(--Line); }
@media (max-width: 991px) { .nm-catnav { grid-template-columns: repeat(2, 1fr); } .nm-catnav-wrap { padding: 54px 0 60px; } }
@media (max-width: 560px)  { .nm-catnav { grid-template-columns: 1fr; } }

.nm-catnav__item {
  display: block; padding: 26px 24px 30px 0; border-bottom: 1px solid var(--Line);
  border-right: 1px solid var(--Line); transition: all 0.3s cubic-bezier(0.63, 0.25, 0.25, 1); position: relative;
}
.nm-catnav__item:last-child { border-right: 0; }
.nm-catnav__item::after {
  content: ""; position: absolute; left: 0; bottom: -1px; height: 2px; width: 0;
  background: var(--Accent); transition: width .3s cubic-bezier(0.63, 0.25, 0.25, 1);
}
.nm-catnav__item:hover::after { width: calc(100% - 24px); }
.nm-catnav__n { display: block; font-family: var(--font-mono); font-size: 13px; letter-spacing: .1em; color: var(--Accent); margin-bottom: 12px; }
.nm-catnav__t { display: block; font-size: 19px; font-weight: 600; color: var(--Primary); line-height: 1.35; margin-bottom: 8px; }
.nm-catnav__item:hover .nm-catnav__t { color: var(--Accent); }
.nm-catnav__c { display: block; font-size: 15px; color: var(--Text-muted); }

/* ------------------------------------------------------ solutions index */
.nm-solutions { padding: 84px 0 92px; background: #fff; }
@media (max-width: 991px) { .nm-solutions { padding: 56px 0 62px; } }

.nm-solrow {
  display: grid; grid-template-columns: 76px 300px 1fr; gap: 40px; align-items: center;
  padding: 40px 0; border-bottom: 1px solid var(--Line);
}
.nm-solrow:first-child { border-top: 1px solid var(--Line); }
@media (max-width: 1100px) { .nm-solrow { grid-template-columns: 56px 220px 1fr; gap: 28px; } }
@media (max-width: 820px)  { .nm-solrow { grid-template-columns: 1fr; gap: 20px; padding: 32px 0; } }

.nm-solrow__n { font-family: var(--font-mono); font-size: 15px; letter-spacing: .08em; color: var(--Accent); align-self: start; padding-top: 6px; }
.nm-solrow__media { display: block; border: 1px solid var(--Line); border-radius: 16px; overflow: hidden; background: #fff; transition: all 0.3s cubic-bezier(0.63, 0.25, 0.25, 1); }
.nm-solrow__media img { width: 100%; height: auto; aspect-ratio: 4 / 3; object-fit: contain; padding: 16px; display: block; }
.nm-solrow:hover .nm-solrow__media { border-color: var(--Accent); box-shadow: 0 14px 34px rgba(10,21,64,.10); }
@media (max-width: 820px) { .nm-solrow__media { max-width: 320px; } }

.nm-solrow__t { font-size: clamp(24px, 2.4vw, 34px); font-weight: 600; margin: 0 0 12px; letter-spacing: -.015em; }
.nm-solrow__t a { color: var(--Primary); }
.nm-solrow__t a:hover { color: var(--Accent); }
.nm-solrow__d { font-size: 17px; line-height: 1.72; color: var(--Text-muted); margin: 0 0 16px; max-width: 68ch; }
.nm-solrow .nm-chips { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 14px; }
.nm-solrow__meta { font-family: var(--font-mono); font-size: 13px; letter-spacing: .06em; color: var(--Placehover); margin: 0 0 20px; }
.nm-solrow__cta { display: inline-flex; align-items: center; gap: 9px; font-size: 16px; font-weight: 600; color: var(--Primary); }
.nm-solrow__cta svg { transition: transform 0.4s cubic-bezier(0.63, 0.25, 0.25, 1); }
.nm-solrow__cta:hover { color: var(--Accent); }
.nm-solrow__cta:hover svg { transform: translateX(5px); }

/* ==========================================================================
   HERO SLIDER ARROWS
   Template bug: `.sw-button.style-2:hover` swaps the background to --Primary
   (navy) but leaves `color: var(--Text-primary)` — a near-black caret on a
   navy disc, i.e. the icon disappears on hover. Force white, and use the
   brand hover (cyan) so it matches every other interactive element.
   ========================================================================== */
.sw-button.style-2:hover,
.sw-button.style-2:hover i {
  color: #fff !important;
}
.sw-button.style-2:hover {
  background-color: var(--Accent) !important;
  border-color: var(--Accent) !important;
}
.sw-button.style-2.swiper-button-disabled,
.sw-button.style-2.swiper-button-disabled i { color: rgba(255,255,255,.7); }

/* ==========================================================================
   ABOUT + SERVICE PAGES
   Generated by _data/gen-pages.py. Both are TYPE-LED, not photo-led: the only
   real photography available is manufacturer product shots (the three UAE
   facility/people images are AI-generated and banned), and karlstorz.com's own
   about-style pages are type-led too. Font sizes in PX — gotcha 1.
   ========================================================================== */

.nm-lead { font-size: 18px; line-height: 1.72; color: var(--Text-muted); margin: 18px 0 0; max-width: 78ch; }
@media (max-width: 991px) { .nm-lead { font-size: 16px; } }

/* the story column runs several paragraphs, unlike the category overview */
.nm-catintro__copy > p { font-size: 18px; line-height: 1.78; color: var(--Text-primary); margin: 0 0 20px; }
.nm-catintro__copy > p:last-of-type { margin-bottom: 0; }
@media (max-width: 991px) { .nm-catintro__copy > p { font-size: 16px; } }

/* --------------------------------------------- what we do / what we don't */
.nm-contrast-wrap { padding: 82px 0 88px; background: var(--Bg-light); }
@media (max-width: 991px) { .nm-contrast-wrap { padding: 56px 0 60px; } }

.nm-contrast { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; }
@media (max-width: 900px) { .nm-contrast { grid-template-columns: 1fr; } }

.nm-contrast__col { background: #fff; border: 1px solid var(--Line); border-radius: 18px; padding: 34px 34px 12px; }
.nm-contrast__col--do { border-top: 3px solid var(--Accent); }
.nm-contrast__col--dont { border-top: 3px solid var(--Placehover); background: #FBFBFC; }
@media (max-width: 991px) { .nm-contrast__col { padding: 26px 24px 8px; } }

.nm-contrast__label {
  display: block; font-family: var(--font-mono); font-size: 12px; font-weight: 500;
  letter-spacing: .12em; text-transform: uppercase; margin-bottom: 22px;
}
.nm-contrast__col--do .nm-contrast__label { color: var(--Accent-ink); }
.nm-contrast__col--dont .nm-contrast__label { color: var(--Text-muted); }

.nm-contrast__list { list-style: none; margin: 0; padding: 0; }
.nm-contrast__list li { padding: 18px 0; border-top: 1px solid var(--Line); }
.nm-contrast__list li:first-child { border-top: 0; padding-top: 0; }
.nm-contrast__list b { display: block; font-size: 17px; font-weight: 600; color: var(--Primary); margin-bottom: 6px; }
.nm-contrast__col--dont .nm-contrast__list b { color: var(--Text-secondary); }
.nm-contrast__list span { display: block; font-size: 16px; line-height: 1.68; color: var(--Text-muted); }

/* ------------------------------------------------------- principal logos */
.nm-logos-wrap { padding: 82px 0 88px; background: #fff; }
@media (max-width: 991px) { .nm-logos-wrap { padding: 56px 0 60px; } }
.nm-logos { display: grid; grid-template-columns: repeat(5, 1fr); gap: 18px; margin-top: 38px; }
@media (max-width: 1100px) { .nm-logos { grid-template-columns: repeat(3, 1fr); } }
@media (max-width: 640px)  { .nm-logos { grid-template-columns: repeat(2, 1fr); } }

.nm-logos__item {
  display: flex; flex-direction: column; border: 1px solid var(--Line); border-radius: 14px;
  overflow: hidden; background: #fff; transition: all 0.3s cubic-bezier(0.63, 0.25, 0.25, 1);
}
.nm-logos__item:hover { border-color: var(--Accent); box-shadow: 0 12px 28px rgba(10,21,64,.10); transform: translateY(-3px); }
.nm-logos__item img { width: 100%; height: 92px; object-fit: contain; padding: 16px; }
.nm-logos__meta {
  display: block; border-top: 1px solid var(--Line); padding: 14px 16px; background: var(--Tint-2);
  font-family: var(--font-mono); font-size: 11px; letter-spacing: .1em;
  text-transform: uppercase; color: var(--Placehover);
}
.nm-logos__meta b { display: block; font-family: var(--font-main); font-size: 15px; font-weight: 600; letter-spacing: 0; text-transform: none; color: var(--Primary); margin-bottom: 3px; }

/* ---------------------------------------------------------- who we serve */
.nm-serve-wrap { padding: 82px 0 88px; background: var(--Bg-light); }
@media (max-width: 991px) { .nm-serve-wrap { padding: 56px 0 60px; } }
.nm-serve { display: grid; grid-template-columns: repeat(4, 1fr); gap: 0; border-top: 1px solid var(--Line); margin-top: 36px; }
@media (max-width: 991px) { .nm-serve { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 560px)  { .nm-serve { grid-template-columns: 1fr; } }

.nm-serve__item { padding: 28px 26px 32px 0; border-right: 1px solid var(--Line); border-bottom: 1px solid var(--Line); }
.nm-serve__item:last-child { border-right: 0; }
.nm-serve__n { display: block; font-family: var(--font-mono); font-size: 13px; letter-spacing: .1em; color: var(--Accent); margin-bottom: 14px; }
.nm-serve__t { font-size: 19px; font-weight: 600; color: var(--Primary); margin: 0 0 10px; line-height: 1.35; }
.nm-serve__d { font-size: 16px; line-height: 1.68; color: var(--Text-muted); margin: 0; }

/* ------------------------------------------------- service: the 4 stages */
.nm-steps-wrap { padding: 82px 0 88px; background: #fff; }
@media (max-width: 991px) { .nm-steps-wrap { padding: 56px 0 60px; } }
.nm-steps { margin-top: 42px; border-top: 1px solid var(--Line); }

.nm-step { display: grid; grid-template-columns: 120px 1fr; gap: 40px; padding: 42px 0; border-bottom: 1px solid var(--Line); }
@media (max-width: 820px) { .nm-step { grid-template-columns: 1fr; gap: 16px; padding: 32px 0; } }

.nm-step__n { font-family: var(--font-mono); font-size: 46px; font-weight: 500; line-height: 1; color: var(--Line); letter-spacing: -.03em; transition: color 0.3s cubic-bezier(0.63, 0.25, 0.25, 1); }
.nm-step:hover .nm-step__n { color: var(--Accent); }
@media (max-width: 820px) { .nm-step__n { font-size: 30px; } }

.nm-step__t { font-size: clamp(24px, 2.2vw, 32px); font-weight: 600; color: var(--Primary); margin: 0 0 14px; letter-spacing: -.015em; }
.nm-step__d { font-size: 18px; line-height: 1.74; color: var(--Text-primary); margin: 0 0 20px; max-width: 76ch; }
@media (max-width: 991px) { .nm-step__d { font-size: 16px; } }

.nm-step__list { list-style: none; margin: 0; padding: 0; display: grid; gap: 10px; }
.nm-step__list li { position: relative; padding-left: 26px; font-size: 16px; line-height: 1.68; color: var(--Text-muted); }
.nm-step__list li::before {
  content: ""; position: absolute; left: 0; top: 10px; width: 12px; height: 2px; background: var(--Accent);
}

/* five-up variant of the category nav (about/service list all five) */
.nm-catnav--5 { grid-template-columns: repeat(5, 1fr); }
@media (max-width: 1100px) { .nm-catnav--5 { grid-template-columns: repeat(3, 1fr); } }
@media (max-width: 700px)  { .nm-catnav--5 { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 460px)  { .nm-catnav--5 { grid-template-columns: 1fr; } }

/* portrait source (nm-why.jpg is 700x820) — a 4/3 frame letterboxes it badly */
.nm-catfig--tall img { aspect-ratio: 3 / 4; }

/* ==========================================================================
   CONTACT PAGE
   Generated by _data/gen-pages.py. The form is the conversion point of the whole
   site, so it gets real <label>s (the template's contact form is placeholder-only,
   which fails on accessibility and on autofill) and a visible focus ring.
   There is no backend: js/contact.js composes a mailto: instead of pretending to POST.
   ========================================================================== */

.nm-contact { padding: 78px 0 88px; background: #fff; }
@media (max-width: 991px) { .nm-contact { padding: 52px 0 60px; } }

.nm-contact__grid { display: grid; grid-template-columns: 1.5fr 1fr; gap: 60px; align-items: start; }
@media (max-width: 991px) { .nm-contact__grid { grid-template-columns: 1fr; gap: 44px; } }
/* /enquiry reuses the contact layout without the company-info aside, so the form
   column gets the full width (capped so the fields don't stretch to 1200px). */
.nm-contact__grid--single { grid-template-columns: minmax(0, 780px); justify-content: center; }

.nm-contact__form-col > .nm-mono { display: block; margin-bottom: 12px; }
.nm-contact__form-col .nm-lead { margin-bottom: 34px; }

/* ------------------------------------------------------------------- form */
.nm-form__row { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }
@media (max-width: 640px) { .nm-form__row { grid-template-columns: 1fr; gap: 0; } }

.nm-field { margin-bottom: 22px; }
.nm-field label {
  display: block; font-size: 15px; font-weight: 600; color: var(--Primary); margin-bottom: 8px;
}
.nm-field label span { color: var(--Accent); }

.nm-field input,
.nm-field select,
.nm-field textarea {
  width: 100%; font-family: var(--font-main); font-size: 16px; color: var(--Text-primary);
  background: #fff; border: 1.5px solid var(--Line); border-radius: 12px;
  padding: 13px 16px; transition: border-color 0.3s cubic-bezier(0.63, 0.25, 0.25, 1), box-shadow 0.3s ease;
}
.nm-field textarea { resize: vertical; min-height: 130px; line-height: 1.6; }
.nm-field select { appearance: none; -webkit-appearance: none; cursor: pointer;
  background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236B7280' stroke-width='2.4'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-position: right 14px center; background-size: 18px;
  padding-right: 42px;
}
.nm-field input::placeholder, .nm-field textarea::placeholder { color: var(--Placehover); }

.nm-field input:hover, .nm-field select:hover, .nm-field textarea:hover { border-color: #C9D2DE; }
.nm-field input:focus, .nm-field select:focus, .nm-field textarea:focus {
  outline: none; border-color: var(--Accent); box-shadow: 0 0 0 3px rgba(0,170,223,.16);
}
.nm-field.is-invalid input, .nm-field.is-invalid select, .nm-field.is-invalid textarea {
  border-color: #D64545; box-shadow: 0 0 0 3px rgba(214,69,69,.12);
}

.nm-field__hint { font-size: 14px; color: var(--Placehover); margin: 12px 0 6px; }
.nm-field__hints { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: 8px; }
.nm-field__hints li {
  font-size: 13px; color: var(--Text-muted); background: var(--Tint-2);
  border: 1px solid var(--Line); border-radius: 100px; padding: 6px 13px;
}

.nm-form__actions { display: flex; align-items: center; gap: 22px; flex-wrap: wrap; margin-top: 8px; }
.nm-form__alt { font-size: 15px; color: var(--Text-muted); }
.nm-form__alt:hover { color: var(--Accent); }

.nm-form__note { margin: 18px 0 0; font-size: 15px; min-height: 1px; }
.nm-form__note.is-error { color: #D64545; }
.nm-form__note.is-ok { color: var(--Primary); }

/* ------------------------------------------------------------------ aside */
.nm-contact__card {
  border: 1px solid var(--Line); border-radius: 18px; padding: 30px 30px 26px;
  background: #fff; margin-bottom: 20px;
}
.nm-contact__card--next { background: var(--Tint-2); border-color: #D9E9F5; }
.nm-contact__card > .nm-mono { display: block; margin-bottom: 20px; }

.nm-contact__list { list-style: none; margin: 0; padding: 0; }
.nm-contact__list li { padding: 15px 0; border-top: 1px solid var(--Line); }
.nm-contact__list li:first-child { border-top: 0; padding-top: 0; }
.nm-contact__k {
  display: block; font-family: var(--font-mono); font-size: 11px; letter-spacing: .12em;
  text-transform: uppercase; color: var(--Placehover); margin-bottom: 6px;
}
.nm-contact__list a, .nm-contact__v { font-size: 17px; font-weight: 600; color: var(--Primary); }
.nm-contact__list a:hover { color: var(--Accent); }

.nm-next { list-style: none; margin: 0; padding: 0; }
.nm-next__item { display: grid; grid-template-columns: 40px 1fr; gap: 12px; padding: 14px 0; border-top: 1px solid #D9E9F5; }
.nm-next__item:first-child { border-top: 0; padding-top: 0; }
.nm-next__n { font-family: var(--font-mono); font-size: 13px; letter-spacing: .08em; color: var(--Accent); padding-top: 2px; }
.nm-next__b { font-size: 15px; line-height: 1.62; color: var(--Text-muted); }
.nm-next__b b { display: block; font-size: 16px; font-weight: 600; color: var(--Primary); margin-bottom: 3px; }

.nm-contact__legal { font-size: 13px; line-height: 1.7; color: var(--Placehover); margin: 0; padding: 0 4px; }

/* Products and Partners are PLAIN LINKS in the nav — no dropdown, no mega menu.
   The column-mega CSS that briefly lived here was removed with them (see _data/gen-nav.py
   for why). Solutions is the only nav item with children. */

/* Solutions mega-menu cards: the grid already stretches every card in a row to the
   same height, but each <img> kept its own aspect ratio (height:100% resolves to auto
   inside an auto-height flex item), so images, titles and tag lines all landed at
   different offsets. Pin the image box to the theme's 202x233 ratio; the tag line's
   margin-top:auto (inline, in header.blade.php) drops it to the card bottom. */
.mega-menu .demo-item .img-demo { height: auto; }
.mega-menu .demo-item .img-demo img { aspect-ratio: 202 / 233; height: auto; object-fit: contain; }
.mega-menu .demo-item .demo-name { text-align: center; }
.row-demo { grid-auto-rows: 1fr; }

/* Anchor targets must clear the floating pill nav. js/anchor.js does the real work
   (it owns the jump so ScrollSmoother stays in sync); this is the no-JS fallback. */
[id^="partner-"], .nm-group[id], section[id] { scroll-margin-top: 120px; }

/* footer contact rows: the office block now carries an address and opening hours
   (both reference sites publish them), so the label line takes a small inline icon */
.nm-footer__contact .k { display: inline-flex; align-items: center; gap: 6px; }
.nm-footer__contact .k svg { opacity: .6; flex-shrink: 0; }
.nm-footer__contact li span:last-child { line-height: 1.6; }
.nm-footer__brand .nm-footer__wa { margin-top: 18px; }

/* ===================================================================== *
   BODY TEXT COLOUR — root fix for washed-out text
   ---------------------------------------------------------------------
   The template sets `body { color: var(--Secondary) }` (assets/css/styles.css:190).
   In stock Viora --Secondary was #E5F2E4 (pale green); our retint made it #E8F4FF
   (pale blue). Either way it is a near-WHITE value being used as the inherited text
   colour for the whole document, which only ever worked because the template sets an
   explicit colour on most elements. Anything that does NOT — notably `.split-text`
   headings (Splitting.js wraps every character in a <div> that inherits) and
   `.nm-textblock__headline` — rendered pale-on-white and was effectively invisible.
   Symptom Mario reported: "Global brands we represent" not shown correct as coloring.

   Fixed at the root rather than per-heading, so new sections inherit something sane.
   --Secondary is left alone: it is used as a BACKGROUND in ~20 template rules and
   changing the token would repaint those panels.

   Dark panels below re-assert white, because they previously relied on inheriting
   the pale value. Keep that pairing — see gotcha 9.                                    */
body { color: var(--Text-primary, #111827); }

.hero-banner-4.nm-bleed,
.hero-banner-4.nm-bleed .content,
.nm-pagehead,
.nm-footer,
.nm-cta,
.section-banner { color: #fff; }

/* The two homepage section headings that sit on light backgrounds:
   "Global brands we represent" (.section-team-2) and
   "Chosen for what happens after the sale" (.section-why-2).
   Dark blue + bold, at Mario's request (2026-07-19). He first asked for the accent
   (cyan) and then corrected it to dark blue — --Primary is also the better call on
   contrast: #0D1F6B on white is 13.6:1, where #00AADF was 2.69:1 and failed the
   3.0:1 WCAG large-text minimum.

   Scoped to these two sections rather than to .split-text generally, so other
   headings are untouched. The per-character <div>s that Splitting.js injects
   inherit both properties, which is why setting them on the .title is enough. */
.section-team-2 .heading-section-5 .title,
.section-why-2 .heading-section-5 .title {
  color: var(--Primary);
  font-weight: 700;
}

/* ===================================================================== *
   HOVER OVERLAYS — category tiles + partner cards          (2026-07-19)
   ---------------------------------------------------------------------
   Mario: "hover on cards like categories & partners be overlay with blue
   color with opacity and contains text like title or short description".

   Two different mechanics, because the two cards start from different places:

   CATEGORY TILES (.nm-catnav__item) carry only a number, a title and a count,
   so there is nothing to reveal — a real overlay panel (.nm-catnav__ov) is
   injected by the generators, holding the title, a one-line blurb from
   shellkit.CAT_BLURBS and a "View category" cue. It is aria-hidden because the
   title it repeats is already in the accessible name of the link.

   PARTNER CARDS (.nm-partner) already show name, meta and description, so the
   card WASHES blue on hover and its own text inverts to white. No duplicate
   markup, and it works on index.html and partners.html alike.

   Both use --Primary at .94 alpha over the card, which keeps the blue reading
   as brand navy rather than a flat fill.                                       */

/* ---------- category tiles ---------- */
.nm-catnav__item { overflow: hidden; }
.nm-catnav__ov {
  position: absolute; inset: 0; z-index: 3;
  display: flex; flex-direction: column; justify-content: center;
  gap: 10px; padding: 24px 22px;
  background: linear-gradient(160deg, rgba(13,31,107,.94), rgba(10,21,64,.94));
  opacity: 0; visibility: hidden;
  transform: translateY(8px);
  transition: opacity 0.4s cubic-bezier(0.63, 0.25, 0.25, 1), transform 0.4s ease, visibility 0.4s;
}
.nm-catnav__item:hover .nm-catnav__ov,
.nm-catnav__item:focus-visible .nm-catnav__ov {
  opacity: 1; visibility: visible; transform: none;
}
.nm-catnav__ov-t { font-size: 18px; font-weight: 700; color: #fff; line-height: 1.3; }
.nm-catnav__ov-d { font-size: 14px; line-height: 1.6; color: rgba(255,255,255,.82); }
.nm-catnav__ov-c {
  font-family: var(--font-mono); font-size: 12px; letter-spacing: .1em;
  text-transform: uppercase; color: var(--Accent); margin-top: 2px;
}
/* the tile's own underline sweep is redundant once the panel covers it */
.nm-catnav__item:hover::after { width: 0; }

/* ---------- partner cards ---------- */
.nm-partner { position: relative; }
.nm-partner::after {
  content: ""; position: absolute; inset: 0; pointer-events: none;
  background: linear-gradient(160deg, rgba(13,31,107,.94), rgba(10,21,64,.94));
  opacity: 0; transition: opacity 0.4s cubic-bezier(0.63, 0.25, 0.25, 1); z-index: 1;
}
.nm-partner:hover::after { opacity: 1; }
/* lift the card's own content above the wash and invert it */
.nm-partner > * { position: relative; z-index: 2; }
/* The logo files are opaque JPEGs on WHITE (no alpha), so they cannot be knocked
   out with a filter — `brightness(0) invert(1)` turns the whole rectangle solid
   white and erases the mark. Instead the logo keeps a white plate that floats on
   the blue wash, which also keeps each principal's brand colours correct.
   Do not "simplify" this into a filter. */
.nm-partner:hover .nm-partner__logo { background: #fff; border-bottom-color: transparent; }
.nm-partner:hover .nm-partner__name { color: #fff; }
.nm-partner:hover .nm-partner__meta { color: rgba(255,255,255,.72); }
.nm-partner:hover .nm-partner__desc { color: rgba(255,255,255,.82); }
.nm-partner:hover .nm-partner__count { color: rgba(255,255,255,.72); }
.nm-partner:hover .nm-partner__foot { border-top-color: rgba(255,255,255,.18); }
.nm-partner:hover .nm-partner__link { color: var(--Accent); }

/* ===================================================================== *
   .btn-switch-text — hover fix                             (2026-07-19)
   ---------------------------------------------------------------------
   Mario: "hover for this button is incorrect" (the CTA's "Request a
   quotation", and the three hero "Explore solutions" buttons).

   TWO defects, both real:

   1) THE LABEL VANISHED ON HOVER. The dark-panel rule above sets
      `color:#fff` on hover because on our normal buttons a cyan fill
      slides in underneath from `.btn-hover-animate-2::after`. These
      buttons are `btn-switch-text btn-bg-white-2` — they have NO fill
      pseudo-element, so the background stayed white and white-on-white
      erased the label. Fixed by giving them a real cyan background on
      hover, which also puts them in the same visual language as every
      other button on the site (navy/white at rest -> cyan on hover).

   2) THE TEXT ROLL WAS 1px OUT. `.btn-switch-text > span` is a 24px
      window with overflow hidden; inside, `.btn-double-text` holds its
      ::before duplicate plus the text node. With `line-height: normal`
      that content measured 49px, not 2x24, so the -100% hover roll
      landed a pixel low and the label visibly jittered. Pinning both
      halves to `line-height: 24px` makes the roll land exactly.        */
.btn-switch-text .btn-double-text,
.btn-switch-text .btn-double-text::before { line-height: 24px; }

.section-banner .tf-btn.btn-switch-text:hover,
.nm-footer__card .tf-btn.btn-switch-text:hover,
.nm-dark .tf-btn.btn-switch-text:hover,
.tf-btn.btn-switch-text:hover {
  background-color: var(--Accent) !important;
  border-color: var(--Accent) !important;
  color: #fff !important;
}

/* ===================================================================== *
   HERO SLIDER — slow Ken Burns drift on the active slide   (2026-07-19)
   ---------------------------------------------------------------------
   Mario asked for the hero to advance automatically "with beautiful
   animation". This is the second half of that: the background photograph
   drifts and scales gently while the slide is on screen.

   *** THE DRIFT MUST BE ON A BACKGROUND LAYER, NEVER ON THE HERO ITSELF. ***
   The first version scaled `.hero-banner-4.nm-bleed` directly. That scales
   the TEXT too: at a 1440px viewport the hero became 1526px wide and the
   headline was pushed to left:-27px — clipped off-screen at both 1280 and
   1440, the two commonest laptop widths. It only looked fine at 1920,
   where the container has side margins to absorb the overflow.

   So the photo now lives on a dedicated `::before` layer (z-index 0) that
   inherits the inline `background-image` from the element, and only THAT
   layer animates. Stack: ::before photo (0) -> ::after wash (1) -> copy (2).

   Duration is deliberately longer than the 4s autoplay interval so the
   image is still travelling when the slide hands over. Reset on inactive
   slides or it plays once and sits at its end state.                      */
.hero-banner-4.nm-bleed::before {
  content: ""; position: absolute; inset: 0; z-index: 0;
  background-image: inherit;
  background-size: cover;
  background-position: center 30%;
  background-repeat: no-repeat;
  transform: scale(1.06);
  will-change: transform;
}
.tf-slider-2 .swiper-slide-active .hero-banner-4.nm-bleed::before {
  animation: nm-kenburns 11s cubic-bezier(0.24, 0.74, 0.58, 1) forwards;
}
@keyframes nm-kenburns {
  from { transform: scale(1.06) translate3d(0, 0, 0); }
  to   { transform: scale(1.14) translate3d(-1.2%, -1%, 0); }
}
/* the slide is a fixed window; the scaled photo must not spill out of it */
.tf-slider-2 .swiper-slide,
.hero-banner-4.nm-bleed { overflow: hidden; }

@media (prefers-reduced-motion: reduce) {
  .tf-slider-2 .swiper-slide-active .hero-banner-4.nm-bleed::before { animation: none; }
}

/* Sub-groups (child categories) on a parent category page. The stock .nm-catnav
   is a fixed 4-column grid, which leaves dead columns when a category has two
   or three children — size the tracks to the content instead. */
.nm-catnav--auto { grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); }
.nm-catnav-wrap--sub { padding: 60px 0 64px; background: var(--Tint-2); }
@media (max-width: 991px) { .nm-catnav-wrap--sub { padding: 44px 0 48px; } }

/* Second-level filter row on the catalogue; hidden until its parent category is picked */
.nm-filter__row--sub .nm-filter__chip { border-style: dashed; }
.nm-filter__row--sub .nm-filter__chip.is-on { border-style: solid; }

/* Footer social links — moved off inline handlers for CSP/best-practices */
.nm-footer__social { display: grid; grid-auto-flow: column; grid-auto-columns: 40px; justify-content: start; column-gap: 14px; margin-top: 20px; }
.nm-footer__social-link { width: 40px; height: 40px; display: grid; place-items: center; border-radius: 10px; background: rgba(255,255,255,.08); border: 1px solid rgba(255,255,255,.12); color: #fff; transition: .2s; }
.nm-footer__social-link svg { width: 18px; height: 18px; }
.nm-footer__social-link:hover { background: var(--Accent); border-color: var(--Accent); color: var(--Brand-deep); }
.nm-footer__social-link:focus-visible { outline: 2px solid var(--Accent); outline-offset: 2px; }

/* WCAG AA: accent used as small resting text on light backgrounds must use the darker ink.
   Fills, borders, hover states and .is-dark overrides keep the bright --Accent. */
.nm-eyebrow,
.nm-slot__k,
.nm-prow__s,
.nm-textblock__topline,
.nm-partner__meta,
.nm-pcard__brand,
.nm-group__sub,
.nm-applist__n,
.nm-catnav__n,
.nm-solrow__n,
.nm-serve__n,
.nm-next__n,
.nm-filter__reset,
.nm-field label span { color: var(--Accent-ink); }
