.elementor-kit-9{--e-global-color-primary:#213D2F;--e-global-color-secondary:#4AA854;--e-global-color-text:#3D3D38;--e-global-color-accent:#F2B866;--e-global-color-33de73b:#1A2F24;--e-global-color-7222448:#2B5540;--e-global-color-50c3761:#3D7A4A;--e-global-color-7751f70:#38B465;--e-global-color-709dc48:#7BC67F;--e-global-color-a79ef2a:#C5E6C8;--e-global-color-ab79a3d:#1ABED4;--e-global-color-cb49f28:#3478B8;--e-global-color-ac6b231:#C43B3B;--e-global-color-b79557a:#F07060;--e-global-color-6c58cd4:#1C1C1A;--e-global-color-d8582c1:#6B6B63;--e-global-color-522dcfb:#8A8477;--e-global-color-9a9f71b:#D6CCBA;--e-global-color-8102e16:#E8E1D4;--e-global-color-05f10d6:#F0EBE1;--e-global-color-d9beb05:#FAF7F2;--e-global-typography-primary-font-family:"Plus Jakarta Sans";--e-global-typography-primary-font-size:45px;--e-global-typography-primary-font-weight:700;--e-global-typography-primary-line-height:1.2em;--e-global-typography-secondary-font-family:"Fraunces";--e-global-typography-secondary-font-size:16px;--e-global-typography-secondary-font-weight:400;--e-global-typography-secondary-font-style:italic;--e-global-typography-text-font-family:"Inter";--e-global-typography-text-font-size:16px;--e-global-typography-text-font-weight:400;--e-global-typography-text-line-height:1.4em;--e-global-typography-accent-font-family:"Fraunces";--e-global-typography-accent-font-size:16px;--e-global-typography-accent-font-weight:400;--e-global-typography-accent-font-style:italic;--e-global-typography-accent-line-height:1.2em;background-color:var( --e-global-color-d9beb05 );color:#3D3D38;font-family:"Inter", Sans-serif;font-size:17px;font-weight:400;line-height:1.7px;}.elementor-kit-9 e-page-transition{background-color:#FFBC7D;}.elementor-kit-9 a{color:var( --e-global-color-secondary );font-family:"Inter", Sans-serif;font-size:17px;font-weight:400;}.elementor-kit-9 a:hover{color:var( --e-global-color-50c3761 );}.elementor-kit-9 h1{color:#1C1C1A;font-family:"Plus Jakarta Sans", Sans-serif;font-size:52px;font-weight:600;letter-spacing:-0.01em;}.elementor-kit-9 h2{color:#1C1C1A;font-family:"Plus Jakarta Sans", Sans-serif;font-size:40px;font-weight:600;letter-spacing:-0.01em;}.elementor-kit-9 h3{color:#1C1C1A;font-family:"Plus Jakarta Sans", Sans-serif;font-size:32px;font-weight:600;letter-spacing:-0.01em;}.elementor-kit-9 h4{color:#1C1C1A;font-weight:600;}.elementor-kit-9 h5{color:#1C1C1A;font-family:"Plus Jakarta Sans", Sans-serif;font-size:19px;font-weight:600;}.elementor-kit-9 h6{color:#1C1C1A;font-family:"Plus Jakarta Sans", Sans-serif;font-size:17px;font-weight:600;}.elementor-kit-9 button,.elementor-kit-9 input[type="button"],.elementor-kit-9 input[type="submit"],.elementor-kit-9 .elementor-button{font-family:"Plus Jakarta Sans", Sans-serif;font-size:14px;font-weight:600;color:#FFFFFF;border-radius:100px 100px 100px 100px;padding:14px 28px 14px 18px;}.elementor-kit-9 button:hover,.elementor-kit-9 button:focus,.elementor-kit-9 input[type="button"]:hover,.elementor-kit-9 input[type="button"]:focus,.elementor-kit-9 input[type="submit"]:hover,.elementor-kit-9 input[type="submit"]:focus,.elementor-kit-9 .elementor-button:hover,.elementor-kit-9 .elementor-button:focus{color:#FFFFFF;}.elementor-section.elementor-section-boxed > .elementor-container{max-width:1300px;}.e-con{--container-max-width:1300px;--container-default-padding-top:0px;--container-default-padding-right:10px;--container-default-padding-bottom:0px;--container-default-padding-left:10px;}.elementor-widget:not(:last-child){--kit-widget-spacing:20px;}.elementor-element{--widgets-spacing:20px 20px;--widgets-spacing-row:20px;--widgets-spacing-column:20px;}{}h1.entry-title{display:var(--page-title-display);}.site-header .site-branding{flex-direction:column;align-items:stretch;}.site-header{padding-inline-end:0px;padding-inline-start:0px;}.site-footer .site-branding{flex-direction:column;align-items:stretch;}@media(max-width:1024px){.elementor-kit-9{--e-global-typography-primary-font-size:32px;--e-global-typography-secondary-font-size:18px;--e-global-typography-text-font-size:15px;--e-global-typography-accent-font-size:15px;}.elementor-section.elementor-section-boxed > .elementor-container{max-width:1024px;}.e-con{--container-max-width:1024px;}}@media(max-width:767px){.elementor-kit-9{--e-global-typography-primary-font-size:30px;--e-global-typography-secondary-font-size:16px;--e-global-typography-text-font-size:15px;--e-global-typography-accent-font-size:15px;}.elementor-section.elementor-section-boxed > .elementor-container{max-width:767px;}.e-con{--container-max-width:767px;}}:root { --Green:#2B5540; --Primary:#213D2F; --Secondary:#4AA854; --Text:#3D3D38; --Accent:#F2B866; --ForestDeep:#1A2F24; --GreenMid:#3D7A4A; --BrightGreen:#38B465; --GreenLight:#7BC67F; --GreenPale:#C5E6C8; --Cyan:#1ABED4; --Blue:#3478B8; --Red:#C43B3B; --Coral:#F07060; --TextDark:#1C1C1A; --TextMuted:#6B6B63; --WarmGray:#8A8477; --Tan:#D6CCBA; --TanLight:#E8E1D4; --CreamDark:#F0EBE1; --Cream:#FAF7F2; }
/* Start custom CSS *//* Disable scroll anchoring site-wide. Narrower fixes (just .announcement-bar)
   only stop that one box from being chosen as the anchor — they don't stop
   the browser from anchoring to the sticky header or hero section instead,
   which also move when the bar's margin-top changes. Anchoring to any of
   those still nudges window.scrollY, which re-fires the scroll handler and
   re-triggers the hide/show toggle — a self-sustaining loop that keeps going
   even after the user stops scrolling. This site has no infinite-scroll /
   dynamically-inserted-content use case that needs anchoring, so disabling
   it globally is safe. */
html {
  overflow-anchor: none;
}

/* Header sticks to top when scrolling */
.elementor-location-header {
  position: sticky;
  top: 0;
  z-index: 9999;
}

/* Announcement bar slides up on scroll (via JS) */
.announcement-bar {
  transition: margin-top 0.3s ease;
  overflow-anchor: none;
}

/* Promo bar button — full CSS control */
.promo-btn .elementor-button {
  border: 1px solid rgba(242, 184, 102, 0.5) !important;
  border-radius: 20px !important;
  padding: 4px 18px !important;
  background: rgba(242, 184, 102, 0) !important;
  color: #F2B866 !important;
  font-size: 12px !important;
  font-weight: 600 !important;
  letter-spacing: 0.02em !important;
  transition: background-color 0.2s ease, border-color 0.2s ease !important;
  line-height: 1.4 !important;
}

.promo-btn .elementor-button .elementor-button-text {
  color: #F2B866 !important;
}

.promo-btn .elementor-button:hover {
  background-color: rgba(242, 184, 102, 0.1) !important;
  border-color: #F2B866 !important;
  box-shadow: none !important;
}

/* Kill outer glow on ALL buttons site-wide */
.elementor-button:hover,
.elementor-button:focus,
.elementor-button:active {
  box-shadow: none !important;
  outline: none !important;
}

/* Global button hover — chevron slide */
.elementor-button {
  transition: background-color 0.25s ease, border-color 0.25s ease !important;
}

.elementor-button .elementor-button-icon {
  transition: transform 0.25s ease, opacity 0.25s ease !important;
  opacity: 0.5;
}

.elementor-button:hover .elementor-button-icon {
  transform: translateX(3px) !important;
  opacity: 1;
}

/* Green filled button */
.btn-green .elementor-button {
  background-color: #4AA854 !important;
  color: #ffffff !important;
  border: none !important;
  border-radius: 100px !important;
  transition: background-color 0.25s ease !important;
}

.btn-green .elementor-button:hover {
  background-color: #3D7A4A !important;
}

/* Outline button (forest border on cream bg — v5a hero "Our Services") */
.btn-outline .elementor-button {
  background: transparent !important;
  color: #213D2F !important;
  border: 1.5px solid #213D2F !important;
  border-radius: 100px !important;
  transition: background-color 0.25s ease, color 0.25s ease !important;
}

.btn-outline .elementor-button .elementor-button-text {
  color: #213D2F !important;
}

.btn-outline .elementor-button:hover {
  background-color: #213D2F !important;
  color: #FAF6EE !important;
}

.btn-outline .elementor-button:hover .elementor-button-text {
  color: #FAF6EE !important;
}

.btn-outline .elementor-button:hover .elementor-button-icon {
  color: #FAF6EE !important;
}

/* Outline button (tan border on light bg) */
.btn-outline-light .elementor-button {
  background: transparent !important;
  color: #213D2F !important;
  border: 1.5px solid #D6CCBA !important;
  border-radius: 100px !important;
  transition: background-color 0.25s ease, border-color 0.25s ease, color 0.25s ease !important;
}

.btn-outline-light .elementor-button:hover {
  background-color: #213D2F !important;
  border-color: #213D2F !important;
  color: #ffffff !important;
}

.btn-outline-light .elementor-button:hover .elementor-button-text {
  color: #ffffff !important;
}

.btn-outline-light .elementor-button:hover .elementor-button-icon {
  color: #ffffff !important;
}

/* Forest filled button */
.btn-forest .elementor-button {
  background-color: #213D2F !important;
  color: #ffffff !important;
  border: none !important;
  border-radius: 100px !important;
  transition: background-color 0.25s ease !important;
}

.btn-forest .elementor-button:hover {
  background-color: #1A2F24 !important;
}

/* Gold filled button (v5a CTA) */
.btn-gold .elementor-button {
  background-color: #F2B866 !important;
  color: #213D2F !important;
  border: none !important;
  border-radius: 100px !important;
  transition: background-color 0.25s ease !important;
}

.btn-gold .elementor-button .elementor-button-text {
  color: #213D2F !important;
}

.btn-gold .elementor-button:hover {
  background-color: #D4A843 !important;
}

.btn-gold .elementor-button .elementor-button-icon {
  color: #213D2F !important;
}

/* Navbar Contact CTA button */
.nav-cta .elementor-button {
  background-color: #4AA854 !important;
  color: #ffffff !important;
  border-radius: 100px !important;
  padding: 10px 24px !important;
  font-size: 15px !important;
  font-weight: 600 !important;
  border: none !important;
  transition: background-color 0.25s ease !important;
}

.nav-cta .elementor-button:hover {
  background-color: #3D7A4A !important;
  box-shadow: none !important;
}

/* Navbar max-width and centering */
.floating-navbar {
  max-width: 1300px !important;
  width: 85% !important;
  margin-left: auto !important;
  margin-right: auto !important;
}

/* Nav link styles — off-white to white with gold underline */
.floating-navbar .elementor-nav-menu > ul {
  gap: 8px;
}

.floating-navbar .elementor-nav-menu a {
  color: rgba(255, 255, 255, 0.7) !important;
  transition: color 0.25s ease !important;
  border-radius: 0 !important;
  background: transparent !important;
  position: relative;
  padding: 8px 16px !important;
}

.floating-navbar .elementor-nav-menu a::after {
  content: '';
  position: absolute;
  bottom: 4px;
  left: 16px;
  right: 16px;
  height: 2px;
  background: #F2B866;
  transform: scaleX(0);
  transform-origin: left;
  transition: transform 0.3s ease;
}

.floating-navbar .elementor-nav-menu a:hover {
  color: #ffffff !important;
  background: transparent !important;
}

.floating-navbar .elementor-nav-menu a:hover::after {
  transform: scaleX(1);
}

/* Navbar brandmark pinwheel spin on hover */
.nav-brandmark img {
  transition: transform 0.6s cubic-bezier(0.34, 1.56, 0.64, 1);
}

.nav-brandmark:hover img {
  transform: rotate(360deg);
}

/* Serif accent for italic words in headings */
.elementor-heading-title em {
  font-family: 'Fraunces', serif;
  font-style: italic;
  font-weight: 400;
  font-size: 1.08em;
}

/* ==================== HERO (v5a) ==================== */

/* Cream-soft background + subtle tan tonal washes (grainy gradient hero) */
.hero-section {
  background:
  /* Medium tan wash, upper right (#D6CCBA) */
  radial-gradient(ellipse 700px 600px at 85% 25%, rgba(214, 204, 186, 0.55) 0%, transparent 55%),
  /* Deeper tan wash, lower right (#CBBFAC) */
  radial-gradient(ellipse 600px 500px at 75% 85%, rgba(203, 191, 172, 0.45) 0%, transparent 55%),
  /* Light tan wash, mid-left (#E8E1D4) */
  radial-gradient(ellipse 550px 450px at 15% 60%, rgba(232, 225, 212, 0.55) 0%, transparent 55%),
  #FAF6EE !important;
  position: relative;
  overflow: hidden;
  margin-top: -140px;  /* pull grainy bg up behind floating navbar */
}

/* Grain overlay via SVG feTurbulence noise */
.hero-section::after {
  content: '';
  position: absolute;
  inset: 0;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='320' height='320'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' seed='4'/><feColorMatrix values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.4 0'/></filter><rect width='100%25' height='100%25' filter='url(%23n)'/></svg>");
  background-size: 320px 320px;
  opacity: 0.5;
  mix-blend-mode: multiply;
  pointer-events: none;
  z-index: 1;
}

/* Keep hero content above the grain layer */
.hero-content {
  position: relative;
  z-index: 2;
}

/* ==================== PAGE HERO (reusable, generic) ====================
   Self-contained utility-page hero background: the same grainy cream/tan wash
   and brandmark watermark as the homepage hero and blog-hero, minus the
   homepage's watercolor cluster and minus any text styling — that's page-
   specific and stays out of this class on purpose.

   Not scoped to any one page (unlike .contact-hero::before / .blog-hero::before,
   which stay as-is on their current pages so nothing already live changes).
   Drop .page-hero on any new page's hero container going forward — first use
   is the new contact page, meant to be reused on About / Work / Services /
   Who We Serve, etc.

   Height is intentionally NOT set here — it varies per page (no featured-image
   breakout to plan around like the blog template has), so set padding/min-height
   natively in the Elementor container per page. Something in the ~140–180px top
   / ~80–120px bottom range reads as "shorter than homepage" without feeling
   cramped, but that's a starting point to eyeball per page, not a hard rule.

   Whatever container holds the actual heading/text content inside .page-hero
   needs `position: relative; z-index: 2;` too (same as .hero-content above) —
   otherwise it renders underneath the grain layer and looks washed out. */
/* Only the two right-side washes from .hero-section's original 3-wash background —
   the left-side wash (originally at 15% 60%) is dropped here on purpose. On
   .hero-section's tall homepage box it blends into the overall texture, but on
   .page-hero's shorter box it read as its own distinct shape competing with the
   logo watermark on the right, which is the opposite of the intended effect. */
.page-hero {
  background:
	radial-gradient(ellipse 700px 600px at 85% 25%, rgba(214, 204, 186, 0.55) 0%, transparent 55%),
	radial-gradient(ellipse 600px 500px at 75% 85%, rgba(203, 191, 172, 0.45) 0%, transparent 55%),
	#FAF6EE !important;
  position: relative;
  overflow: hidden;
  margin-top: -140px;  /* pull grainy bg up behind floating navbar, same as .hero-section */
}

.page-hero::after {
  content: '';
  position: absolute;
  inset: 0;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='320' height='320'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' seed='4'/><feColorMatrix values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.4 0'/></filter><rect width='100%25' height='100%25' filter='url(%23n)'/></svg>");
  background-size: 320px 320px;
  opacity: 0.5;
  mix-blend-mode: multiply;
  pointer-events: none;
  z-index: 1;
}

.page-hero::before {
  content: '';
  position: absolute;
  top: 40px !important;
  right: 30px !important;
  left: auto !important;
  bottom: auto !important;
  width: 400px;
  height: 400px;
  background: url('https://stagingandco.wpenginepowered.com/wp-content/uploads/2026/03/brandmark.svg') no-repeat center / contain;
  opacity: 0.05;
  z-index: 0;
  pointer-events: none;
  filter: brightness(0);
  -webkit-mask-image: radial-gradient(ellipse at 60% 40%, black 0%, transparent 70%);
  mask-image: radial-gradient(ellipse at 60% 40%, black 0%, transparent 70%);
}

/* Stat card — white bg always, splotch reveal on hover (v5a/e) */
.stat-card {
  padding: 32px 20px;
  border-radius: 16px;
  cursor: default;
  background: white;
  box-shadow: 0 2px 12px rgba(33, 61, 47, 0.06), 0 1px 3px rgba(33, 61, 47, 0.04);
  position: relative;
  overflow: hidden;
  transition: transform 0.3s ease, box-shadow 0.3s ease;
}

.stat-card:hover {
  transform: translateY(-6px);
  box-shadow: 0 12px 32px rgba(33, 61, 47, 0.1);
}

/* Splotch overlay — fades in on hover, sits behind text */
.stat-card::before {
  content: '';
  position: absolute;
  inset: 0;
  background-position: center;
  background-repeat: no-repeat;
  background-size: cover;
  opacity: 0;
  transition: opacity 0.4s ease;
  pointer-events: none;
  z-index: 1;
}

.stat-card:nth-child(1)::before { background-image: url('https://stagingandco.wpenginepowered.com/wp-content/uploads/2026/05/splotch-blue.png'); }
.stat-card:nth-child(2)::before { background-image: url('https://stagingandco.wpenginepowered.com/wp-content/uploads/2026/05/splotch-green.png'); }
.stat-card:nth-child(3)::before { background-image: url('https://stagingandco.wpenginepowered.com/wp-content/uploads/2026/05/splotch-red.png'); }
.stat-card:nth-child(4)::before { background-image: url('https://stagingandco.wpenginepowered.com/wp-content/uploads/2026/05/splotch-yellow.png'); }

.stat-card:hover::before {
  opacity: 1;
}

/* Keep text above splotch */
.stat-card .elementor-widget-heading,
.stat-card .elementor-widget-text-editor {
  position: relative;
  z-index: 2;
}

/* Number scales + goes white on hover, soft shadow for legibility over splotch */
.stat-card .elementor-heading-title {
  transition: transform 0.3s ease, color 0.3s ease, text-shadow 0.3s ease;
}

.stat-card:hover .elementor-heading-title {
  transform: scale(1.1);
  color: #ffffff !important;
  text-shadow: 0 2px 6px rgba(0, 0, 0, 0.35), 0 0 12px rgba(0, 0, 0, 0.2);
}

/* Label goes white on hover with matching shadow */
.stat-card .elementor-widget-text-editor,
.stat-card .elementor-widget-text-editor p {
  transition: color 0.3s ease, text-shadow 0.3s ease;
}

.stat-card:hover .elementor-widget-text-editor,
.stat-card:hover .elementor-widget-text-editor p {
  color: #ffffff !important;
  text-shadow: 0 1px 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);
}

/* Service list rows — borders, hover, and chevron */
.service-list > .elementor-element {
  border-top: 1px solid #E8E1D4;
  padding: 18px 8px 18px 0;
  transition: all 0.25s ease;
  cursor: pointer;
  position: relative;
}

.service-list > .elementor-element:last-child {
  border-bottom: 1px solid #E8E1D4;
}

.service-list > .elementor-element:hover {
  padding-left: 8px;
  background: rgba(232, 225, 212, 0.5);
}

.service-list > .elementor-element:hover .elementor-heading-title {
  color: #1C1C1A;
}

/* Chevron that slides in on hover */
.service-list > .elementor-element::after {
  content: '›';
  position: absolute;
  right: 8px;
  top: 50%;
  transform: translateY(-50%) translateX(-8px);
  opacity: 0;
  transition: all 0.2s ease;
  font-size: 24px;
  color: #3D3D38;
}

.service-list > .elementor-element:hover::after {
  opacity: 1;
  transform: translateY(-50%) translateX(0);
}

/* Featured posts image — zoom on hover */
.featured-posts .elementor-post__thumbnail {
  overflow: hidden !important;
  border-radius: 10px !important;
}

.featured-posts .elementor-post__thumbnail img {
  transition: transform 0.4s ease !important;
}

.featured-posts .elementor-post:hover .elementor-post__thumbnail img {
  transform: scale(1.05) translate(-50%, -50%) !important;
}

/* Featured posts read more — chevron slides on hover */
.featured-posts .elementor-post__read-more {
  font-size: 14px;
  font-weight: 600;
  color: #4AA854 !important;
  display: inline-flex;
  align-items: center;
  gap: 4px;
}

.featured-posts .elementor-post__read-more::after {
  content: '›';
  display: inline-block;
  transition: transform 0.25s ease, opacity 0.25s ease;
  font-size: 18px;
  opacity: 0.5;
}

.featured-posts .elementor-post:hover .elementor-post__read-more::after {
  transform: translateX(3px);
  opacity: 1;
}

/* Testimonial section — chocolate-brown layered gradient (v5a) */
.testimonials-section {
  position: relative;
  overflow: hidden;
  background:
  radial-gradient(ellipse 1100px 700px at 20% 30%, #5C3E32 0%, transparent 60%),
  radial-gradient(ellipse 900px 600px at 80% 80%, #2A1A14 0%, transparent 55%),
  linear-gradient(135deg, #4A2E24 0%, #34211A 100%) !important;
}

.testimonials-section::before {
  content: '';
  position: absolute;
  bottom: -200px;
  left: -80px;
  width: 700px;
  height: 700px;
  background: url('https://stagingandco.wpenginepowered.com/wp-content/uploads/2026/03/brandmark.svg') no-repeat center / contain;
  opacity: 0.03;
  z-index: 0;
  pointer-events: none;
  -webkit-mask-image: radial-gradient(ellipse at 40% 60%, black 0%, transparent 70%);
  mask-image: radial-gradient(ellipse at 40% 60%, black 0%, transparent 70%);
}

/* Testimonial grid — horizontal scroll (extra bottom padding for splotch peek) */
.testimonial-grid {
  overflow-x: auto;
  flex-wrap: nowrap !important;
  scroll-snap-type: x mandatory;
  -webkit-overflow-scrolling: touch;
  padding-bottom: 80px;
  -ms-overflow-style: none;
  scrollbar-width: none;
  scroll-padding: 0 calc((100% - 700px) / 2);
  padding-left: calc((100% - 700px) / 2);
  padding-right: calc((100% - 700px) / 2);
}

.testimonial-grid::-webkit-scrollbar {
  display: none;
}

/* Testimonial cards — translucent with splotch peek-out (test) */
.testimonial-card {
  min-width: 700px;
  max-width: 700px;
  scroll-snap-align: center;
  background: rgba(255, 255, 255, 0.04) !important;
  border: 1px solid rgba(255, 255, 255, 0.08) !important;
  border-radius: 16px !important;
  padding: 28px 32px !important;
  transition: all 0.3s ease;
  position: relative;
  overflow: visible;
  isolation: isolate;
}

.testimonial-card:hover {
  background: rgba(255, 255, 255, 0.07) !important;
}

/* Splotch peek-out — uses ::after to avoid Elementor's ::before (which is used for container border) */
.testimonial-card::after {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: -15%;
  background-position: calc(100% - 20px) 100%;
  background-repeat: no-repeat;
  background-size: 32% auto;
  pointer-events: none;
  z-index: -1;
}

.testimonial-card:nth-child(1)::after { background-image: url('https://stagingandco.wpenginepowered.com/wp-content/uploads/2026/05/splotch-green.png'); }
.testimonial-card:nth-child(2)::after { background-image: url('https://stagingandco.wpenginepowered.com/wp-content/uploads/2026/05/splotch-red.png'); }
.testimonial-card:nth-child(3)::after { background-image: url('https://stagingandco.wpenginepowered.com/wp-content/uploads/2026/05/splotch-yellow.png'); }

/* ==================== CTA BRANDMARK ==================== */

/* Recolors the green brandmark.svg to gold (#F2B866) via filter chain.
   Add CSS class "cta-brandmark" to the brandmark Image widget in the CTA section. */
.cta-brandmark img {
  filter: brightness(0) saturate(100%) invert(78%) sepia(45%) saturate(450%) hue-rotate(355deg) brightness(96%) contrast(94%);
}

/* ==================== WATERCOLOR HOVER ==================== */

/* Splotches deepen slightly on hover — subtle saturation + darken */
.hero-watercolor img,
.testimonial-card::after {
  transition: filter 0.3s ease;
}

.hero-watercolor:hover img,
.testimonial-card:hover::after {
  filter: saturate(1.15) brightness(0.92);
}

/* Keep card content above splotch */
.testimonial-card > * {
  position: relative;
  z-index: 1;
}

/* Green decorative open-quote */
.testimonial-card > .elementor-widget-text-editor:first-child::before {
  content: '\201C';
  font-family: 'Fraunces', serif;
  font-size: 48px;
  color: #4AA854;
  line-height: 1;
  display: block;
  margin-bottom: -4px;
}

/* Green dash before attribution name */
.testimonial-card > .elementor-widget-heading::before {
  content: '';
  display: block;
  width: 24px;
  height: 2px;
  background: #4AA854;
  margin-bottom: 10px;
  margin-top: 20px;
}

/* Muted org text */
.testimonial-card > .elementor-widget-text-editor:last-child {
  opacity: 0.6;
}

/* Testimonial carousel controls */
.testimonial-controls {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 16px;
  margin-top: 24px;
}

.testimonial-arrow {
  width: 36px;
  height: 36px;
  min-width: 36px;
  min-height: 36px;
  box-sizing: border-box;
  border-radius: 50%;
  border: 1px solid rgba(255, 255, 255, 0.25) !important;
  background: transparent !important;
  color: rgba(255, 255, 255, 0.6) !important;
  cursor: pointer;
  transition: all 0.25s ease;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  margin: 0;
  position: relative;
  overflow: visible !important;
}

.testimonial-arrow:hover {
  border-color: rgba(255, 255, 255, 0.5) !important;
  background: rgba(255, 255, 255, 0.05) !important;
  color: white !important;
}

/* CSS chevrons inside arrow buttons */
.testimonial-arrow::before {
  content: '';
  display: block;
  width: 7px;
  height: 7px;
  border-top: 2px solid currentColor;
  border-right: 2px solid currentColor;
  flex-shrink: 0;
}

.testimonial-prev::before {
  transform: translate(4px, 0.5px) rotate(225deg);
}

.testimonial-next::before {
  transform: rotate(45deg) translateX(1px) translateY(-1px);
}

.testimonial-dots {
  display: flex;
  gap: 8px;
  align-items: center;
}

.testimonial-dot {
  width: 8px;
  height: 8px;
  border-radius: 100px;
  background: rgba(255, 255, 255, 0.2);
  cursor: pointer;
  transition: all 0.3s ease;
}

.testimonial-dot.active {
  width: 24px;
  background: #4AA854;
}

/* ==================== FOOTER ==================== */

.footer-links {
  padding-left: 48px !important;
  box-sizing: border-box !important;
}

.footer-nav .elementor-heading-title {
  color: #7BC67F !important;
  font-size: 12px !important;
  font-weight: 600 !important;
  letter-spacing: 0.1em !important;
  text-transform: uppercase !important;
  margin-bottom: 20px !important;
}

/* Per-column heading colors (v5a) */
.footer-links .elementor-heading-title { color: #1ABED4 !important; }   /* MENU — cyan */
.footer-contact .elementor-heading-title { color: #F07060 !important; } /* CONTACT — coral */
.footer-subscribe .elementor-heading-title { color: #F2B866 !important; } /* STAY UPDATED — gold */

.footer-brand .elementor-widget-text-editor em {
  font-family: 'Fraunces', serif;
  font-style: italic;
  font-weight: 400;
  display: block;
  margin-top: 8px;
  color: #7BC67F !important;
}

.footer-brand .elementor-widget-text-editor,
.footer-contact .elementor-widget-text-editor,
.footer-subscribe .elementor-widget-text-editor {
  color: rgba(255, 255, 255, 0.5) !important;
  font-size: 14px !important;
  line-height: 1.7 !important;
}

.footer-links .elementor-widget-text-editor p a {
  color: rgba(255, 255, 255, 0.65) !important;
  text-decoration: none !important;
  display: inline !important;
  position: relative !important;
  transition: color 0.25s ease !important;
}

.footer-links .elementor-widget-text-editor a::after {
  content: '' !important;
  position: absolute !important;
  bottom: -2px !important;
  left: 0 !important;
  width: 100% !important;
  height: 2px !important;
  background: #1ABED4 !important;
  transform: scaleX(0) !important;
  transform-origin: left !important;
  transition: transform 0.3s ease !important;
}

.footer-links .elementor-widget-text-editor a:hover {
  color: #ffffff !important;
}

.footer-links .elementor-widget-text-editor a:hover::after {
  transform: scaleX(1) !important;
}

.footer-contact .elementor-widget-text-editor a {
  color: rgba(255, 255, 255, 0.5) !important;
  text-decoration: none !important;
  display: inline !important;
  position: relative !important;
  transition: color 0.25s ease !important;
  font-size: 14px !important;
  font-family: 'Inter', sans-serif !important;
  font-weight: 400 !important;
}

.footer-contact .elementor-widget-text-editor a::after {
  content: '' !important;
  position: absolute !important;
  bottom: -2px !important;
  left: 0 !important;
  width: 100% !important;
  height: 2px !important;
  background: #F07060 !important;
  transform: scaleX(0) !important;
  transform-origin: left !important;
  transition: transform 0.3s ease !important;
}

.footer-contact .elementor-widget-text-editor a:hover {
  color: #ffffff !important;
}

.footer-contact .elementor-widget-text-editor a:hover::after {
  transform: scaleX(1) !important;
}

.btn-outline-footer .elementor-button {
  background: transparent !important;
  color: rgba(242, 184, 102, 0.7) !important;
  border: 1px solid rgba(242, 184, 102, 0.35) !important;
  border-radius: 100px !important;
  padding: 8px 20px !important;
  font-size: 13px !important;
  font-weight: 600 !important;
  transition: all 0.25s ease !important;
}

.btn-outline-footer .elementor-button .elementor-button-icon,
.btn-outline-footer .elementor-button .elementor-button-icon i,
.btn-outline-footer .elementor-button .elementor-button-icon svg {
  color: rgba(242, 184, 102, 0.5) !important;
  fill: rgba(242, 184, 102, 0.5) !important;
}

.btn-outline-footer .elementor-button:hover {
  border-color: #F2B866 !important;
  border-width: 1.5px !important;
  color: #F2B866 !important;
  background: rgba(242, 184, 102, 0.08) !important;
}

.footer-bottom .elementor-widget-text-editor {
  color: rgba(255, 255, 255, 0.35) !important;
  font-size: 13px !important;
}

.footer-social {
  opacity: 0.4;
  transition: opacity 0.25s ease;
  display: inline-block;
}

.footer-social:hover {
  opacity: 1;
}

.footer-legal:hover {
  color: rgba(255, 255, 255, 0.7) !important;
}

.footer-bottom .elementor-widget-divider .elementor-divider-separator {
  border-color: rgba(255, 255, 255, 0.08) !important;
}

/* ==================== BLOG TEMPLATES ==================== */

.blog-hero {
  position: relative;
  overflow: hidden;
}

/* Matches .contact-hero::before exactly (size, dark tint, mask fade). Position is
   adjusted from contact-hero's values since contact-hero is a boxed inner container
   (right: 50px from its own ~1200px box) while .blog-hero is the full-width outer
   section itself — 65px is the equivalent inset measured from the actual viewport
   edge on contact/, so the two read as the same visual placement. */
.blog-hero::before {
  content: '';
  position: absolute;
  top: -120px !important;
  right: 65px !important;
  left: auto !important;
  bottom: auto !important;
  width: 700px !important;
  height: 700px !important;
  background: url('https://stagingandco.wpenginepowered.com/wp-content/uploads/2026/03/brandmark.svg') no-repeat center / contain !important;
  opacity: 0.04 !important;
  z-index: 0;
  pointer-events: none;
  filter: brightness(0) !important;
  -webkit-mask-image: radial-gradient(ellipse at 60% 40%, black 0%, transparent 70%);
  mask-image: radial-gradient(ellipse at 60% 40%, black 0%, transparent 70%);
}

.post-category-label .elementor-heading-title {
  display: inline-flex !important;
}

/* Pill treatment — matches .post-tag-btn's shape/weight/case exactly (same family
   of element, metadata not a CTA), but white instead of cream-dark since cream-dark
   would blend into this hero's own grainy tan/cream background. White + a soft
   shadow is the same trick already used to pop the stat cards off this same
   grainy treatment elsewhere on the site. */
.post-category-label .elementor-heading-title a {
  display: inline-flex !important;
  align-items: center !important;
  font-size: 12px !important;
  font-weight: 600 !important;
  letter-spacing: 0.02em !important;
  text-transform: none !important;
  padding: 8px 18px !important;
  border-radius: 100px !important;
  color: #213D2F !important;
  background: #ffffff !important;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06) !important;
  text-decoration: none !important;
  transition: all 0.2s ease !important;
}

.post-category-label .elementor-heading-title a:hover {
  background: #213D2F !important;
  color: #ffffff !important;
}

.post-byline .elementor-widget-container {
  display: flex !important;
  align-items: center !important;
  gap: 16px !important;
  font-size: 14px !important;
  color: rgba(255, 255, 255, 0.5) !important;
}

/* Blog hero title + byline — darkened for the cream hero bg (built for the old dark-green hero).
   Targets the shared template's element IDs directly since the .post-byline class above
   isn't actually applied to the byline widget in the live template. */
.blog-hero .elementor-element-9ad9f22 .elementor-heading-title {
  color: #1C1C1A !important;
}

.blog-hero .elementor-element-061827c,
.blog-hero .elementor-element-061827c * {
  color: rgba(61, 61, 56, 0.6) !important;
}

/* Featured image must render above the hero's grain texture layer (.hero-section::after,
   z-index: 1) in the zone where the image overlaps the hero via negative top margin. */
.post-featured-image {
  position: relative;
  z-index: 2;
  max-width: 1000px !important;
  width: min(1000px, 90vw) !important;
  margin-left: auto !important;
  margin-right: auto !important;
}

.post-featured-image img {
  border-radius: 14px !important;
  box-shadow: 0 16px 48px rgba(0, 0, 0, 0.12), 0 4px 12px rgba(0, 0, 0, 0.06) !important;
  aspect-ratio: 16 / 9 !important;
  object-fit: cover !important;
  width: 100% !important;
}

.blog-post-content h2 {
  font-family: 'Plus Jakarta Sans', sans-serif !important;
  font-size: 28px !important;
  font-weight: 700 !important;
  line-height: 1.2 !important;
  letter-spacing: -0.01em !important;
  color: #1C1C1A !important;
  margin: 40px 0 16px !important;
}

.blog-post-content h3 {
  font-family: 'Plus Jakarta Sans', sans-serif !important;
  font-size: 22px !important;
  font-weight: 600 !important;
  line-height: 1.3 !important;
  letter-spacing: -0.01em !important;
  color: #1C1C1A !important;
  margin: 32px 0 12px !important;
}

.blog-post-content p {
  font-size: 17px !important;
  line-height: 1.7 !important;
  color: #3D3D38 !important;
  margin-bottom: 22px !important;
}

.blog-post-content strong {
  color: #1C1C1A !important;
  font-weight: 600 !important;
}

.blog-post-content a {
  color: #4AA854 !important;
  text-decoration: underline !important;
  text-decoration-color: rgba(74, 168, 84, 0.3) !important;
  text-underline-offset: 3px !important;
  transition: text-decoration-color 0.2s ease !important;
}

.blog-post-content a:hover {
  text-decoration-color: #4AA854 !important;
}

.blog-post-content blockquote {
  margin: 32px 0 !important;
  padding: 24px 32px !important;
  border-left: 3px solid #4AA854 !important;
  background: #F0EBE1 !important;
  border-radius: 0 12px 12px 0 !important;
}

.blog-post-content blockquote p {
  font-family: 'Fraunces', serif !important;
  font-style: italic !important;
  font-size: 19px !important;
  line-height: 1.65 !important;
  color: #213D2F !important;
  margin-bottom: 0 !important;
}

.blog-post-content ul,
.blog-post-content ol {
  margin: 0 0 22px 24px !important;
}

.blog-post-content li {
  font-size: 17px !important;
  line-height: 1.7 !important;
  color: #3D3D38 !important;
  margin-bottom: 8px !important;
}

.blog-post-content li::marker {
  color: #4AA854 !important;
}

.post-tags-row {
  padding-top: 32px !important;
  border-top: 1px solid #E8E1D4 !important;
  width: 100% !important;
}

.post-tag-btn .elementor-button {
  background: #F0EBE1 !important;
  color: #213D2F !important;
  border: 1px solid #E8E1D4 !important;
  border-radius: 100px !important;
  padding: 8px 18px !important;
  font-size: 12px !important;
  font-weight: 600 !important;
  letter-spacing: 0.02em !important;
  box-shadow: none !important;
  text-decoration: none !important;
}

.post-tag-btn .elementor-button-text {
  color: #213D2F !important;
  text-decoration: none !important;
}

.post-tag-btn .elementor-button:hover {
  background: #213D2F !important;
  color: white !important;
  border-color: #213D2F !important;
}

.post-tag-btn .elementor-button:hover .elementor-button-text {
  color: white !important;
}

.post-share-links {
  display: flex !important;
  align-items: center !important;
  gap: 12px !important;
}

.post-share-link {
  display: flex !important;
  align-items: center !important;
  justify-content: center !important;
  width: 36px !important;
  height: 36px !important;
  border-radius: 50% !important;
  border: 1px solid #D6CCBA !important;
  color: #6B6B63 !important;
  transition: all 0.2s ease !important;
}

.post-share-link:hover {
  border-color: #213D2F !important;
  color: #213D2F !important;
  background: #F0EBE1 !important;
}

.btn-back-blog .elementor-button {
  background: transparent !important;
  border: none !important;
  padding: 0 !important;
  font-size: 14px !important;
  font-weight: 600 !important;
  color: #4AA854 !important;
  box-shadow: none !important;
  text-decoration: none !important;
}

.btn-back-blog .elementor-button-text {
  color: #4AA854 !important;
  text-decoration: none !important;
}

.btn-back-blog .elementor-button-icon {
  opacity: 0.5 !important;
  transition: opacity 0.25s ease, transform 0.25s ease !important;
}

.btn-back-blog .elementor-button-icon i { color: #4AA854 !important; }
.btn-back-blog .elementor-button-icon svg { fill: #4AA854 !important; }

.btn-back-blog .elementor-button:hover {
  background: transparent !important;
  color: #3D7A4A !important;
}

.btn-back-blog .elementor-button:hover .elementor-button-text { color: #3D7A4A !important; }

.btn-back-blog .elementor-button:hover .elementor-button-icon {
  opacity: 1 !important;
  transform: translateX(-3px) !important;
}

.btn-back-blog .elementor-button:hover .elementor-button-icon i { color: #3D7A4A !important; }
.btn-back-blog .elementor-button:hover .elementor-button-icon svg { fill: #3D7A4A !important; }

/* ==================== CONTACT PAGE ==================== */

.contact-hero {
  position: relative;
}

.contact-hero::before {
  content: '';
  position: absolute;
  top: -120px !important;
  right: 50px !important;
  left: auto !important;
  bottom: auto !important;
  width: 700px !important;
  height: 700px !important;
  background: url('https://stagingandco.wpenginepowered.com/wp-content/uploads/2026/03/brandmark.svg') no-repeat center / contain !important;
  opacity: 0.04 !important;
  z-index: 0;
  pointer-events: none;
  filter: brightness(0) !important;
  -webkit-mask-image: radial-gradient(ellipse at 60% 40%, black 0%, transparent 70%);
  mask-image: radial-gradient(ellipse at 60% 40%, black 0%, transparent 70%);
}

/* ==================== CONTACT FORM ==================== */

.contact-form .elementor-field-label {
  font-family: 'Plus Jakarta Sans', sans-serif !important;
  font-size: 13px !important;
  font-weight: 600 !important;
  color: #1C1C1A !important;
  letter-spacing: 0.01em !important;
  margin-bottom: 6px !important;
}

.contact-form .elementor-mark-required .elementor-field-label:after {
  color: #C43B3B !important;
}

.contact-form .elementor-field-textual {
  font-family: 'Inter', sans-serif !important;
  font-size: 15px !important;
  color: #3D3D38 !important;
  background: #ffffff !important;
  border: 1.5px solid #D6CCBA !important;
  border-radius: 10px !important;
  padding: 14px 16px !important;
  transition: border-color 0.2s ease, box-shadow 0.2s ease !important;
  box-sizing: border-box !important;
  width: 100% !important;
}

.contact-form .elementor-field-textual::placeholder {
  color: #8A8477 !important;
  font-size: 14px !important;
}

.contact-form .elementor-field-textual:focus {
  border-color: #CBBFAC !important;
  box-shadow: 0 0 0 3px rgba(203, 191, 172, 0.2) !important;
  outline: none !important;
}

.contact-form textarea.elementor-field-textual {
  min-height: 160px !important;
  resize: vertical !important;
  line-height: 1.6 !important;
}

.contact-form .elementor-form-fields-wrapper {
  gap: 20px !important;
  display: flex !important;
  flex-wrap: wrap !important;
}

.contact-form .elementor-field-group.elementor-col-50 {
  width: calc(50% - 10px) !important;
  flex: 0 0 calc(50% - 10px) !important;
}

.contact-form .elementor-field-group.elementor-col-100 {
  width: 100% !important;
  flex: 0 0 100% !important;
}

.contact-form .elementor-field-group {
  margin-bottom: 0 !important;
  box-sizing: border-box !important;
}

.contact-form .elementor-field-type-submit {
  display: flex !important;
  justify-content: flex-start !important;
  margin-top: 20px !important;
}

.contact-form .elementor-button {
  background-color: #4AA854 !important;
  color: #ffffff !important;
  border: none !important;
  border-radius: 100px !important;
  padding: 16px 40px !important;
  font-family: 'Plus Jakarta Sans', sans-serif !important;
  font-size: 16px !important;
  font-weight: 600 !important;
  transition: background-color 0.25s ease !important;
  width: auto !important;
  display: inline-flex !important;
  justify-content: center !important;
  text-align: center !important;
}

.contact-form .elementor-button:hover {
  background-color: #3D7A4A !important;
}

/* ==================== BLOG MEGA MENU ==================== */

/* Outer JetMenu panel wrapper — transparent, gap from navbar.
   No hardcoded width here: JetMenu's own "Mega Container Width Type: Selector
   → .floating-navbar" setting already sizes the parent (.jet-mega-menu-mega-container)
   to match the navbar exactly. width:100% just fills that. The old 85vw/1300px
   hardcode was fighting that JS-driven sizing and made the panel ~13px wider
   than the navbar. */
.jet-mega-menu-mega-container__inner {
  background: transparent !important;
  box-shadow: none !important;
  padding: 30px 0 0 !important;
  width: 100% !important;
}

/* Floating card — cream bg, shadow, rounded corners (kept in sync with the
   current .floating-navbar values — navbar shadow is 0.1 opacity single-layer,
   radius is 10px, since the rounded-rect change) */
.blog-mega-menu {
  position: relative !important;
  overflow: hidden !important;
  box-shadow: 0 8px 40px rgba(0, 0, 0, 0.1) !important;
  border-radius: 10px !important;
  padding: 20px !important;
}

/* Brandmark decoration */
.blog-mega-menu::before {
  content: '' !important;
  position: absolute !important;
  top: -60px !important;
  right: -60px !important;
  width: 320px !important;
  height: 320px !important;
  background: url('https://stagingandco.wpenginepowered.com/wp-content/uploads/2026/03/brandmark.svg') no-repeat center / contain !important;
  opacity: 0.05 !important;
  pointer-events: none !important;
  z-index: 0 !important;
  -webkit-mask-image: radial-gradient(ellipse at 60% 40%, black 0%, transparent 70%) !important;
  mask-image: radial-gradient(ellipse at 60% 40%, black 0%, transparent 70%) !important;
}

/* Post thumbnails */
.blog-mega-menu .elementor-post__thumbnail,
.blog-mega-menu .elementor-post__thumbnail img {
  border-radius: 10px !important;
  overflow: hidden !important;
}

/* Hide read more link */
.blog-mega-menu .elementor-post__read-more {
  display: none !important;
}

/* Mega-menu dropdown: smooth fade + slight slide down, matching v5a's
   "drops down" feel. JetMenu's own Fade preset (Content tab > Animation)
   only transitions opacity/visibility — this adds a translateY on top of
   the exact classes JetMenu already toggles for that setting. Requires
   Animation to be set to "Fade" (not "None") on the Mega Menu widget.

   IMPORTANT: JetMenu itself already applies
   transform: translateX(var(--jmm-submenu-delta-x-offset,0)) to this same
   element to horizontally align the dropdown under the navbar (it measures
   the trigger nav item's position and writes the offset as a CSS custom
   property). transform is a single property — an earlier version of this
   rule set a bare translateY() here, which replaced JetMenu's translateX
   entirely and threw the dropdown's horizontal position way off (looked
   like it was "shifted right"). Combining both in one transform preserves
   JetMenu's alignment while adding the vertical slide. */
.jet-mega-menu.jet-mega-menu--animation-fade .jet-mega-menu-list .jet-mega-menu-mega-container {
  transform: translateX(var(--jmm-submenu-delta-x-offset, 0)) translateY(-8px);
  /* !important is required here: JetMenu's own public.css declares a
	 transition on this identical .elementor-kit-9 too (opacity + visibility only,
	 no transform), same specificity as this rule. Without !important,
	 whichever rule happens to load last wins the ENTIRE transition property
	 (it doesn't merge) — when JetMenu's shorter list won, transform had no
	 transition at all, so the dropdown SNAPPED to position instantly and
	 only opacity faded gradually after, reading as "moves up, then fades." */
  transition: opacity 0.3s cubic-bezier(0.48, 0.01, 0.5, 0.99),
			  transform 0.3s cubic-bezier(0.48, 0.01, 0.5, 0.99),
			  visibility 0.1s linear !important;
}

.jet-mega-menu.jet-mega-menu--animation-fade .jet-mega-menu-list .jet-mega-menu-item--hover.jet-mega-menu-item--mega > .jet-mega-menu-mega-container {
  transform: translateX(var(--jmm-submenu-delta-x-offset, 0)) translateY(0);
}

/* Blog panel positioning bug fix (Aug 27, 2026) — after a JetMenu plugin update, the
   plugin's own JS-computed --jmm-submenu-delta-x-offset value started coming out wildly
   wrong (e.g. -1060px) specifically for items using "Sub Menu Position: Left" (Blog's
   full-width panel). Confirmed live: Services and About, which use "Relative Item"
   position instead (carry the jet-mega-menu-item--relative-item class Blog doesn't),
   were unaffected — isolating the bug to JetMenu's "Left" position math, not our CSS.

   Blog's panel doesn't actually need that dynamic offset at all: its parent
   (.jet-mega-menu-mega-container__inner, see the block above this file's Blog Mega Menu
   section) is already sized/positioned to exactly match .floating-navbar via JetMenu's
   own "Mega Container Width Type: Selector" setting, so the panel should sit flush at
   its parent's origin — translateX(0). Hardcoding that bypasses JetMenu's broken
   variable entirely rather than trying to fix their calculation. Only touches
   non-relative-item mega dropdowns (currently just Blog); Services/About keep using
   the dynamic offset above since theirs is unaffected. */
.jet-mega-menu-item--mega:not(.jet-mega-menu-item--relative-item) .jet-mega-menu-mega-container {
  transform: translateX(0) translateY(-8px) !important;
}

.jet-mega-menu-item--mega:not(.jet-mega-menu-item--relative-item).jet-mega-menu-item--hover .jet-mega-menu-mega-container {
  transform: translateX(0) translateY(0) !important;
}

/* ==================== JET MEGA MENU NAV LINKS ==================== */

/* Base nav link — off-white, tightened padding */
.jet-mega-menu-item__label {
  color: rgba(255, 255, 255, 0.7) !important;
  font-family: 'Plus Jakarta Sans', sans-serif !important;
  font-size: 15px !important;
  font-weight: 600 !important;
  background: transparent !important;
  border-radius: 0 !important;
  padding: 8px 12px !important;
  position: relative !important;
  transition: color 0.25s ease !important;
}

/* Hover — full white */
.jet-mega-menu-item__inner:hover .jet-mega-menu-item__label,
.jet-mega-menu-item__inner:hover > .jet-mega-menu-item__label {
  color: #ffffff !important;
  background: transparent !important;
}

/* NOTE: the underline itself now lives entirely on .jet-mega-menu-item__inner::after
   (added later in this file, in the chevron section) so it can span both the label
   and the chevron. This used to also exist here on .jet-mega-menu-item__label::after
   — that duplicate was removed because both rendered simultaneously (they're
   different pseudo-elements on different real elements, so neither overrides the
   other), producing two visible underlines on hover. Don't re-add a label-scoped
   version of this without removing the __inner one, or the same bug comes back. */

/* Remove JetMenu default hover/active backgrounds */
.jet-mega-menu-item__inner {
  background: transparent !important;
  position: relative !important;
}

/* Dropdown chevron (About/Services/Blog toggle icon) — added when chevrons
   were turned on for all three dropdowns. The uploaded icon has no fill set,
   so it defaults to plain black (browser SVG default) regardless of state —
   these rules make it match the label's own two colors instead, and rotate
   180deg while open (Sub Menu Trigger is Hover, so :hover on the item IS the
   open state here — no need to chase aria-expanded like the mega-menu content
   rows needed to). */
.jet-mega-menu-item__inner {
  /* 0, not a small positive value: the icon's own wrapper box is 18px but the
	 visible chevron glyph inside it is only 14px, centered — that leaves ~2px
	 of "dead space" baked into the icon itself on each side, regardless of
	 this gap. Confirmed live: gap:0 here already lands the visible glyph ~2px
	 from the text, not touching it, thanks to that built-in inset. */
  gap: 0 !important;
}

/* Pull the chevron in past .jet-mega-menu-item__label's OWN padding (8px 12px
   — a native Elementor "Items Horizontal/Vertical Padding" widget setting,
   confirmed via direct inspection). That padding makes the label's box 12px
   wider than the visible word on each side, so gap:0 above was only closing
   the gap between the two BOXES, not between the real visible text and the
   real visible glyph — there was a hidden 12px still baked in. Changing that
   widget setting directly isn't an option: it resizes every label's box,
   which changes the spacing between nav items too (confirmed by testing).
   This negative margin compensates for it in just this one relationship. */
.jet-mega-menu-item__dropdown {
  /* -6px instead of the original -12px — Matt asked for a bit more breathing
     room between the word and the icon now that a real chevron icon is
     assigned again (was blank for a while, see the size override below). */
  margin-left: -6px !important;
}

/* Matt reassigned a real chevron in the Dropdown Icon field (was previously
   cleared/empty, which is why it looked "gone"). The field's own Style-tab
   size slider still works — this just also shrinks it via CSS in case the
   native field gets reset again, and removes the plugin's default 18px
   minimum click-target box which otherwise pads a shrunk icon back out. */
.jet-mega-menu-item__dropdown {
  --jmm-top-item-dropdown-icon-size: 10px !important;
  min-width: 10px !important;
  min-height: 10px !important;
}

.jet-mega-menu-item__dropdown svg,
.jet-mega-menu-item__dropdown path {
  fill: rgba(33, 61, 47, 0.55) !important;
  transition: fill 0.25s ease !important;
}

.jet-mega-menu-item__dropdown {
  transition: transform 0.25s ease !important;
}

.jet-mega-menu-item__inner:hover .jet-mega-menu-item__dropdown svg,
.jet-mega-menu-item__inner:hover .jet-mega-menu-item__dropdown path {
  fill: #213D2F !important;
}

.jet-mega-menu-item__inner:hover .jet-mega-menu-item__dropdown {
  transform: rotate(180deg) !important;
}

/* Underline widened to span the chevron too — previously lived on
   .jet-mega-menu-item__label::after, sized to only the label's own ~58px
   width, so it stopped short of the chevron entirely. Moved to the shared
   __inner wrapper (both label and chevron are its children) so the
   underline spans the whole clickable area. */
.jet-mega-menu-item__inner::after {
  content: '' !important;
  position: absolute !important;
  bottom: -5px !important;
  /* left is 22px, not 12px. Earlier math treated .jet-mega-menu-item__label's
	 own box edge as the start of the visible word — wrong, because that
	 label has its own native Elementor padding (8px 12px), making its box
	 12px wider than the actual word on each side. Verified via
	 Range().getBoundingClientRect() (measures the real rendered text, not
	 the padded box): 10px (__inner's padding) + 12px (label's own padding)
	 = 22px lands exactly on the real first-letter edge, confirmed live. */
  left: 22px !important;
  right: 10px !important;
  height: 2px !important;
  background: #F2B866 !important;
  transform: scaleX(0) !important;
  transform-origin: left !important;
  transition: transform 0.3s ease !important;
}

.jet-mega-menu-item__inner:hover::after {
  transform: scaleX(1) !important;
}

/* Work has no dropdown/chevron, so its __inner box doesn't get the same
   "right:10px" calibration above — that value assumes a chevron sits after
   the text. Without one, right:10px overshoots by 22px instead of 2px
   (verified live). This targets any current or future no-dropdown item
   automatically via :has(), rather than hardcoding "Work" specifically. */
.jet-mega-menu-item__inner:not(:has(.jet-mega-menu-item__dropdown))::after {
  right: 20px !important;
}

/* Remove gap between nav items */
.jet-mega-menu > ul,
.jet-mega-menu-list {
  gap: 0 !important;
}

/* Active/current page — same as normal, not gold */
.jet-mega-menu-item--current .jet-mega-menu-item__label,
.current-menu-item .jet-mega-menu-item__label {
  color: rgba(255, 255, 255, 0.7) !important;
}

/* Remove active pill on Blog when dropdown is open */
.jet-mega-menu-item--open .jet-mega-menu-item__label,
.jet-mega-menu-item--open .jet-mega-menu-item__inner {
  background: transparent !important;
  border-radius: 0 !important;
}

/* Dropdown toggle chevron */
.jet-mega-menu-item__toggle {
  color: rgba(255, 255, 255, 0.7) !important;
  margin-left: 2px !important;
  font-size: 10px !important;
}

.jet-mega-menu-item__inner:hover .jet-mega-menu-item__toggle {
  color: #ffffff !important;
}

/* ==================== WHITE NAVBAR VARIANT ==================== */

/* Nav link colors — dark text on white bg */
.white-navbar .elementor-nav-menu a {
  color: rgba(33, 61, 47, 0.55) !important;
}

.white-navbar .elementor-nav-menu a:hover {
  color: #213D2F !important;
}

/* Gold underline still works — inherited from .floating-navbar rules */

/* ==================== REUSABLE "REFINED" ACCORDION ==================== */
/* Add the CSS class "accordion-refined" (widget's Advanced tab > CSS Classes)
   to any Nested Accordion widget to apply this styling. Verified against the
   live Nested Accordion widget's actual markup (Elementor's <details>/<summary>
   structure) on the Internships page, Aug 30 2026 — class names below are
   real, not guessed. Reuse the same class anywhere else on the site; each
   accordion instance gets its own independent 01/02/03... numbering. */

.accordion-refined .e-n-accordion {
  counter-reset: acc-index;
}

.accordion-refined .e-n-accordion-item {
  position: relative;
  border-top: none !important;
  border-bottom: 1px solid #E8E1D4 !important;
}

.accordion-refined .e-n-accordion-item:first-child {
  border-top: 1px solid #E8E1D4 !important;
}

/* Green accent bar — the one deliberate spot of brand color, only on the open item */
.accordion-refined .e-n-accordion-item[open]::before {
  content: '';
  position: absolute;
  left: 0;
  top: 0;
  bottom: 0;
  width: 3px;
  background: #4AA854;
}

/* Header row (the <summary>) */
.accordion-refined .e-n-accordion-item-title {
  background: transparent !important;
  border: none !important;
  border-radius: 0 !important;
  padding: 22px 4px 22px 24px !important;
  gap: 0 18px !important;
  transition: background 0.2s ease !important;
}

.accordion-refined .e-n-accordion-item-title:focus {
  outline: none !important;
}

.accordion-refined .e-n-accordion-item-title:focus-visible {
  outline: 2px solid #4AA854 !important;
  outline-offset: -2px !important;
}

.accordion-refined .e-n-accordion-item-title:hover {
  background: rgba(33, 61, 47, 0.025) !important;
}

/* Muted auto-number (01, 02, 03...) — pure CSS counter, no manual typing needed.
   Forced flex order below (numeral, title, icon) so this works regardless of
   whatever the widget's own Icon Position setting is set to. */
.accordion-refined .e-n-accordion-item-title::before {
  content: counter(acc-index, decimal-leading-zero);
  counter-increment: acc-index;
  order: 0;
  flex: 0 0 auto;
  font-family: 'Plus Jakarta Sans', sans-serif;
  font-size: 13px;
  font-weight: 600;
  color: #D6CCBA;
  transition: color 0.25s ease;
}

.accordion-refined .e-n-accordion-item[open] .e-n-accordion-item-title::before {
  color: #4AA854;
}

.accordion-refined .e-n-accordion-item-title-header {
  order: 1 !important;
  flex: 1 !important;
}

.accordion-refined .e-n-accordion-item-title-icon {
  order: 2 !important;
  flex: 0 0 auto !important;
  color: #6B6B63;
  width: 16px !important;
  height: 16px !important;
  transition: color 0.25s ease;
}

.accordion-refined .e-n-accordion-item-title:hover .e-n-accordion-item-title-icon {
  color: #213D2F;
}

.accordion-refined .e-n-accordion-item[open] .e-n-accordion-item-title-icon {
  color: #4AA854;
}

/* Title text */
.accordion-refined .e-n-accordion-item-title-text {
  font-family: 'Plus Jakarta Sans', sans-serif !important;
  font-size: 16.5px !important;
  font-weight: 600 !important;
  line-height: 1.4 !important;
  color: #213D2F !important;
  letter-spacing: -0.005em !important;
}

/* Body content — indented to align under the title text (past numeral + gap) */
.accordion-refined .e-n-accordion-item > .e-con {
  padding: 12px 4px 26px 66px !important;
  background: transparent !important;
  border: none !important;
}

.accordion-refined .e-n-accordion-item > .e-con p {
  font-size: 15px !important;
  line-height: 1.7 !important;
  color: #6B6B63 !important;
  max-width: 520px;
  margin: 0 !important;
}

/* ==================== Internships page: icon+label rows ==================== */
/* "We provide flexible internships..." and "Work with clients in a wide range
   of sectors..." — each row is a v3 Icon widget + Text Editor widget inside
   an Elementor flex container. Found 3 real causes of the misalignment via
   live DOM inspection (Aug 30 2026), not guessed:
   1. Row container was `align-items: flex-start` — icon pinned to the top
      instead of centering against the text next to it.
   2. The paragraph had `line-height: 1.7px` — the same unit-mismatch bug
      found on the accordion title (someone entered "1.7" while the field's
      unit was set to px instead of unitless/em). Harmless on a single short
      line, but breaks the moment any label wraps to 2 lines.
   3. The paragraph's own default bottom margin (~14px) was fighting the
      row's flex layout, and the icon widget had no fixed width, so the
      icon column could shrink by a fraction of a pixel differently on
      every row depending on label length — nothing was reliably aligned
      to a shared column.
   Scoped to this page only via the body.page-id-555 WordPress class, and
   matches any icon+text row structurally (no CSS class needed on each row)
   via :has() — if this same icon-row pattern gets reused on another page,
   extend the .elementor-kit-9 list rather than duplicating the block. */
body.page-id-555 .e-con:has(> .elementor-widget-icon):has(> .elementor-widget-text-editor) {
  align-items: center !important;
  padding: 0 !important;
  gap: 14px !important;
}

/* Matt's own icon widgets carry a native white bg + 10px radius + 10px padding
   (set in each widget's own Style tab) — a legit "icon in a box" look. The bug:
   our first pass forced `width: 22px` on this box but left height uncontrolled,
   and with border-box sizing + 10px padding on all sides, height auto-computed
   to ~42px while width stayed pinned at 22px — a tall pill instead of a square.
   Fix: force a true square (36px) and take over the padding with flex centering
   instead, so the box's proportions can't drift again regardless of what's set
   natively. */
body.page-id-555 .e-con:has(> .elementor-widget-icon):has(> .elementor-widget-text-editor) > .elementor-widget-icon {
  flex: 0 0 36px !important;
  width: 36px !important;
  height: 36px !important;
  padding: 0 !important;
  display: flex !important;
  align-items: center !important;
  justify-content: center !important;
}

body.page-id-555 .e-con:has(> .elementor-widget-icon):has(> .elementor-widget-text-editor) .elementor-icon-wrapper,
body.page-id-555 .e-con:has(> .elementor-widget-icon):has(> .elementor-widget-text-editor) .elementor-icon {
  display: flex !important;
  align-items: center !important;
  justify-content: center !important;
  width: 22px !important;
  height: 22px !important;
  padding: 0 !important;
}

body.page-id-555 .e-con:has(> .elementor-widget-icon):has(> .elementor-widget-text-editor) > .elementor-widget-text-editor {
  flex: 1 !important;
}

body.page-id-555 .e-con:has(> .elementor-widget-icon):has(> .elementor-widget-text-editor) .elementor-widget-text-editor p {
  margin: 0 !important;
  line-height: 1.5 !important;
}

/* ==================== Careers: Open Positions list ==================== */
/* Reusable classes, not page-scoped — matches careers.html's .positions-*
   naming 1:1. See the build blueprint (widget tree + class assignments)
   handed to Matt alongside this — one row is built once, then duplicated
   per open position via Elementor's own Duplicate action. */

/* This section's own native gap (20px, applied between ALL its direct flex
   children) was adding extra space between the header and each row, AND
   between rows themselves — since each position lives in its own separate
   "positions-list" wrapper (see note below), that 20px landed between every
   row in addition to the row's own border-bottom, breaking the rhythm between
   border lines and the hover-highlight box. Zeroing it out and letting
   .positions-header's own padding-bottom + border-bottom be the only source
   of spacing before the first row fixes both the "too much space after the
   header" and "borders don't match hover box height" symptoms at once. */
.positions-section {
  gap: 0 !important;
}

.positions-header {
  margin-bottom: 0 !important;
  padding-bottom: 24px !important;
  border-bottom: 1px solid #D6CCBA !important;
}

.positions-header .elementor-heading-title {
  font-family: 'Plus Jakarta Sans', sans-serif !important;
  font-size: 30px !important;
  font-weight: 700 !important;
  color: #1C1C1A !important;
  letter-spacing: -0.01em !important;
}

.positions-header .elementor-widget-text-editor p {
  font-size: 15px !important;
  color: #6B6B63 !important;
  margin: 0 !important;
}

.positions-list {
  gap: 0 !important;
}

/* border-bottom-only on every row, with the "cap" line above the first row
   coming from the header's own border-bottom instead of a border-top on the
   row. This tolerates each position living in its own separate "positions-list"
   wrapper (from duplicating the List Container instead of just the Row
   Container) without needing that restructured — every row still gets exactly
   one hairline below it, so adjacent rows never double up. */
.position-row {
  padding: 24px 8px !important;
  border-top: none !important;
  border-bottom: 1px solid #D6CCBA !important;
  cursor: pointer;
  transition: background 0.2s ease, padding-left 0.2s ease !important;
  text-decoration: none !important;
}

.position-row:hover {
  background: rgba(232, 225, 212, 0.5) !important;
  padding-left: 16px !important;
}

/* flex-grow must stay 0 — a 1 here was making the title expand to fill all
   free space in .position-main, shoving the tags away to the far right
   instead of sitting right next to it. flex-shrink:1 still keeps it safe
   from re-triggering the original wrap-to-2-lines bug on narrow rows. */
.position-title {
  flex: 0 1 auto !important;
}

/* The real cause of the gap: .position-main's own native Justify Content is
   set to Space Between, which spreads title and tags to opposite ends of the
   whole ~990px-wide container regardless of their flex-grow values. Forcing
   flex-start here is what actually pulls tags back next to the title. */
.position-main {
  justify-content: flex-start !important;
}

.position-title .elementor-heading-title {
  font-family: 'Plus Jakarta Sans', sans-serif !important;
  font-size: 17px !important;
  font-weight: 600 !important;
  color: #1C1C1A !important;
}

/* Was stretching to ~1057px (nearly the full row) and squeezing the title
   down to a 66px sliver that wrapped mid-word. Tags should only claim the
   width its 3 small pills actually need. */
.position-tags {
  flex: 0 0 auto !important;
  width: auto !important;
  gap: 8px !important;
}

/* Same recurring line-height unit-mismatch bug as the accordion title and the
   sector-row labels (a field entered as "1.7" with its unit set to px instead
   of unitless/em) — here it squashed the pill down to ~12px tall regardless
   of the 5px/12px padding, which is why it read as a flat bar instead of a
   pill. Guarded explicitly below every time this pattern shows up. */
.position-tag .elementor-heading-title,
.position-tag p {
  font-size: 12px !important;
  font-weight: 600 !important;
  line-height: 1.5 !important;
  letter-spacing: 0.02em !important;
  color: #6B6B63 !important;
  background: #F0EBE1 !important;
  border-radius: 100px !important;
  padding: 5px 12px !important;
  margin: 0 !important;
  display: inline-block !important;
}

/* .position-link actually lives INSIDE .position-main alongside title/tags
   (not as a sibling of it, as the original blueprint assumed) — so with
   .position-main forced to justify-content:flex-start above, this needs its
   own margin-left:auto to consume the remaining space and stay pinned to the
   row's right edge while title+tags stay grouped together on the left. */
.position-link {
  display: inline-flex !important;
  align-items: center !important;
  gap: 4px !important;
  font-size: 14px !important;
  font-weight: 600 !important;
  color: #4AA854 !important;
  white-space: nowrap !important;
  transition: gap 0.2s ease !important;
  margin-left: auto !important;
}

/* Same recurring line-height bug (1.7px instead of unitless 1.7) on this
   widget's own inner text — squashed its content box down to ~2px tall, so
   even though .position-link itself was correctly vertically centered, the
   squashed inner text sat near the TOP of that box instead of centered in
   it, reading as "a little higher" than the title/tags next to it. */
.position-link .elementor-heading-title,
.position-link p {
  line-height: 1.5 !important;
  margin: 0 !important;
  color: inherit !important;
}

.position-row:hover .position-link {
  gap: 8px !important;
}

/* ==================== Services page: sticky rail + color-washed sections ==================== */
/* Confirmed live: only "Service Fund Development" is built so far, with none
   of the CSS classes below on it yet (checked via the live DOM, not the
   screenshots) — add service-section + service-fund-development (both,
   space-separated) to the outer container, service-inner/service-label-col/
   service-content-col to the three inner ones, and a CSS ID matching the
   rail's anchor slug, before this CSS has anything to grab onto. */

/* The sticky rail itself — I'd described this as "I'll add once you've built
   it" back in Phase 1 but never actually followed through with the CSS
   rule, so it was stuck at Elementor's default position:relative this whole
   time. Also forcing align-items here rather than trusting the native
   Elementor setting alone: checked live and it had reverted to "normal"
   (behaves like stretch), which was making the rail's own box ~3200px tall
   — nearly the height of the whole stack — leaving no room for it to
   visibly "travel" even with position:sticky in place. Both are needed
   together for the stick-while-scrolling effect to actually show. */
.services-layout {
  align-items: flex-start !important;
}

.services-rail {
  position: sticky !important;
  top: 164px !important;
  /* align-items: flex-start above wasn't enough on its own — the rail
     container has an explicit computed height (3208px, matching almost the
     entire stack) from somewhere in its native settings, and an explicit
     height always wins over align-items regardless of that value. Forcing
     it back to auto is what actually let the rail shrink to its own natural
     ~410px content height and start truly sticking. */
  height: auto !important;
  min-height: 0 !important;
  align-self: flex-start !important;
}

.services-stack .service-section {
  padding: 48px;
  border-radius: 20px;
  margin-bottom: 20px;
}

.services-stack .service-inner {
  gap: 64px !important;
}

/* 1/3 label column, 2/3 content column — verified live it was rendering as a
   hard 50/50 split (both exactly 436px at 1280px viewport) before this. */
.services-stack .service-label-col {
  position: sticky;
  top: 164px;
  flex: 0 0 32% !important;
}

.services-stack .service-content-col {
  flex: 1 1 auto !important;
}

/* Icon was centering itself within the label column while the heading next
   to it stayed left-aligned — confirmed live, icon's left edge sat at 466px
   vs the heading's 280px at the same viewport. Elementor's native Icon
   widget centers by default; text-align:left on its wrapper pulls it back
   in line with the heading. Also bumped the icon itself up from 26px (too
   small inside a 64px circle) to 30px. */
.services-stack .service-label-col .elementor-widget-icon,
.services-stack .service-label-col .elementor-icon-wrapper {
  text-align: left !important;
}

/* The 60x60 box alone wasn't enough — Elementor's native icon div still
   carries its own leftover padding (25px, sized for a much bigger default
   box) and line-height/text-align centering tricks meant for an icon FONT
   glyph, not an SVG. Left in place, that padding eats unevenly into the 60px
   box and pushes the 30px SVG ~10px off-center toward the bottom-right —
   confirmed by measuring both boxes' centers live. Zeroing the padding and
   switching to real flex centering fixes it regardless of whatever native
   padding/line-height values are still sitting underneath. */
.services-stack .service-label-col .elementor-widget-icon .elementor-icon {
  width: 60px !important;
  height: 60px !important;
  padding: 0 !important;
  line-height: normal !important;
  display: flex !important;
  align-items: center !important;
  justify-content: center !important;
}

.services-stack .service-label-col .elementor-widget-icon .elementor-icon svg {
  width: 30px !important;
  height: 30px !important;
  flex-shrink: 0;
}

.services-stack .service-label-col .elementor-heading-title {
  font-family: 'Plus Jakarta Sans', sans-serif !important;
  font-size: 26px !important;
  font-weight: 700 !important;
  color: #1C1C1A !important;
  letter-spacing: -0.01em !important;
  line-height: 1.25 !important;
  margin-top: 16px !important;
}

.services-stack .service-content-col .elementor-widget-text-editor {
  background: #ffffff;
  border-radius: 14px;
  padding: 40px 44px;
  box-shadow: 0 4px 20px rgba(33, 61, 47, 0.06);
}

.services-stack .service-content-col ul {
  padding-left: 20px !important;
  margin: 0 !important;
}

.services-stack .service-content-col li {
  font-size: 16px !important;
  line-height: 1.7 !important;
  color: #3D3D38 !important;
  margin-bottom: 12px !important;
}

/* Per-service color wash + matching icon-circle tint. Same radial-gradient
   recipe as services.html — soft ellipse anchored top-left, fading by 60%.
   Only fund-development is built and testable right now; the other 6 are
   ready the moment their sections exist with these exact class names. */

.services-stack .service-fund-development {
  background: radial-gradient(ellipse 900px 500px at 10% 0%, rgba(196,59,59,0.07) 0%, transparent 60%), #ffffff;
}
.services-stack .service-fund-development .service-label-col .elementor-icon {
  background: rgba(196,59,59,0.12) !important;
}
.services-stack .service-fund-development .service-content-col li::marker {
  color: #C43B3B !important;
}

.services-stack .service-fund-guidance,
.services-stack .service-fund-management {
  background: radial-gradient(ellipse 900px 500px at 10% 0%, rgba(240,112,96,0.08) 0%, transparent 60%), #ffffff;
}
.services-stack .service-fund-guidance .service-label-col .elementor-icon,
.services-stack .service-fund-management .service-label-col .elementor-icon {
  background: rgba(240,112,96,0.13) !important;
}
.services-stack .service-fund-guidance .service-content-col li::marker,
.services-stack .service-fund-management .service-content-col li::marker {
  color: #F07060 !important;
}

.services-stack .service-impact-evaluation {
  background: radial-gradient(ellipse 900px 500px at 10% 0%, rgba(242,184,102,0.10) 0%, transparent 60%), #ffffff;
}
.services-stack .service-impact-evaluation .service-label-col .elementor-icon {
  background: rgba(242,184,102,0.18) !important;
}
.services-stack .service-impact-evaluation .service-content-col li::marker {
  color: #D89A3F !important;
}

.services-stack .service-visioning-strategy {
  background: radial-gradient(ellipse 900px 500px at 10% 0%, rgba(123,94,167,0.07) 0%, transparent 60%), #ffffff;
}
.services-stack .service-visioning-strategy .service-label-col .elementor-icon {
  background: rgba(123,94,167,0.13) !important;
}
.services-stack .service-visioning-strategy .service-content-col li::marker {
  color: #7B5EA7 !important;
}

.services-stack .service-organizational-capacity {
  background: radial-gradient(ellipse 900px 500px at 10% 0%, rgba(26,190,212,0.07) 0%, transparent 60%), #ffffff;
}
.services-stack .service-organizational-capacity .service-label-col .elementor-icon {
  background: rgba(26,190,212,0.13) !important;
}
.services-stack .service-organizational-capacity .service-content-col li::marker {
  color: #1ABED4 !important;
}

.services-stack .service-communications-design {
  background: radial-gradient(ellipse 900px 500px at 10% 0%, rgba(52,120,184,0.07) 0%, transparent 60%), #ffffff;
}
.services-stack .service-communications-design .service-label-col .elementor-icon {
  background: rgba(52,120,184,0.13) !important;
}
.services-stack .service-communications-design .service-content-col li::marker {
  color: #3478B8 !important;
}

.services-stack .service-disaster-resilience {
  background: radial-gradient(ellipse 900px 500px at 10% 0%, rgba(74,168,84,0.07) 0%, transparent 60%), #ffffff;
}
.services-stack .service-disaster-resilience .service-label-col .elementor-icon {
  background: rgba(74,168,84,0.13) !important;
}
.services-stack .service-disaster-resilience .service-content-col li::marker {
  color: #4AA854 !important;
}

/* ==================== Services page: sticky rail styling ==================== */
/* The rail links are Elementor Icon Box widgets (icon + description + link
   combined) — confirmed live via the real DOM, not the plain Icon widget
   used in the service sections above. Their native structure only wraps the
   ICON in the actual <a href>, leaving the description text as plain
   unlinked <p> text next to it — that's why only the icon was clickable.
   Fixed below with a "stretched link" technique: the wrapper becomes the
   positioning context, and the real <a> is stretched to cover the entire
   row invisibly, so a click anywhere (icon or text) lands on the link,
   without touching Elementor's own markup or requiring a widget change. */

.services-rail {
  padding-top: 24px;
}

.services-rail .elementor-icon-box-wrapper {
  position: relative;
  flex-direction: row !important;
  align-items: center !important;
  gap: 12px !important;
  padding: 10px 14px !important;
  border-radius: 10px;
  text-align: left !important;
  transition: background 0.2s ease;
}

.services-rail .elementor-widget-icon-box:hover .elementor-icon-box-wrapper {
  background: rgba(232, 225, 212, 0.5);
}

.services-rail .elementor-icon-box-icon {
  margin: 0 !important;
}

.services-rail .elementor-icon-box-icon .elementor-icon {
  position: absolute;
  inset: 0;
  width: auto !important;
  height: auto !important;
  display: flex !important;
  align-items: center !important;
  justify-content: flex-start !important;
  padding-left: 14px !important;
  z-index: 2;
}

.services-rail .elementor-icon-box-icon .elementor-icon svg {
  width: 18px !important;
  height: 18px !important;
  flex-shrink: 0;
}

.services-rail .elementor-icon-box-content {
  padding-left: 30px;
}

.services-rail .elementor-icon-box-description {
  font-family: 'Plus Jakarta Sans', sans-serif !important;
  font-size: 13.5px !important;
  font-weight: 600 !important;
  line-height: 1.4 !important;
  color: #6B6B63 !important;
  margin: 0 !important;
  transition: color 0.2s ease;
}

.services-rail .elementor-widget-icon-box:hover .elementor-icon-box-description {
  color: #1C1C1A !important;
}

/* ==================== MOBILE NAV: HAMBURGER TOGGLE ICON ==================== */
/* JetMenu's own public.css hardcodes the toggle icon's SVG to 16px via
   `.jet-mega-menu.jet-mega-menu--layout-dropdown .jet-mega-menu-toggle-icon svg`
   — the widget's Style tab "Dropdown Toggle > Icon Size" field does NOT
   target this element (it appears to control the per-item dropdown chevrons
   instead), so that field has zero visible effect on the hamburger icon.
   Overriding the actual rendered class directly here instead. */
.jet-mega-menu-toggle-icon svg {
  width: 26px !important;
  height: 26px !important;
}

/* ==================== MOBILE NAV: ROLLED-UP DROPDOWN PANEL ==================== */
/* On mobile, Roll Up: Yes stacks the top-level items (About/Services/Blog)
   vertically inside `.jet-mega-menu-container`. The Container widget holding
   the Mega Menu (the one we shrank to hug the collapsed hamburger icon back
   when fixing the navbar row wrap) is only ~40px wide once collapsed — and
   the rolled-up list was rendering TRAPPED inside that same 40px box instead
   of breaking out, which is why it looked clipped/overlapping the navbar
   instead of sitting below it like a normal dropdown.
   Fix: pull `.jet-mega-menu-container` out of that box with
   `position: absolute`, anchored to the pill navbar itself (`.floating-navbar`,
   given `position: relative` here so it becomes the anchor) instead of its
   immediate 40px-wide parent — same approach as the HTML prototype's
   `.mobile-menu`, which was a sibling of the navbar, not nested inside a
   flex item sized by other content. */
@media (max-width: 767px) {
  .floating-navbar {
    position: relative !important;
  }

  /* Found via live inspection: the Container holding the Mega Menu widget
     (elementor-element-18d59f96) is explicitly locked to `--width: 100px` on
     mobile — that's correct and wanted for the COLLAPSED row (snug hamburger
     next to the logo). But `position: absolute` on `.jet-mega-menu-container`
     only escapes that 100px box if nothing narrower BETWEEN it and
     `.floating-navbar` is also positioned (which would make IT the
     containing block instead). Forcing every wrapper in between back to
     `position: static` guarantees `.floating-navbar` is the one that
     actually anchors it. */
  .elementor-widget-jet-mega-menu,
  .elementor-widget-jet-mega-menu > .elementor-widget-container,
  .jet-mega-menu {
    position: static !important;
  }

  /* elementor-element-18d59f96 (the 100px Container itself, directly holding
     the Mega Menu widget) is an .e-con — and Elementor's own base .e-con
     rule sets `position: relative` on every container by default. That's
     almost certainly still the real containing block even with the wrapper
     above neutralized. Flattening it too. */
  .elementor-element-18d59f96 {
    position: static !important;
  }

  .jet-mega-menu-container {
    position: absolute !important;
    top: calc(100% + 10px) !important;
    left: 0 !important;
    right: 0 !important;
    bottom: auto !important;
    width: auto !important;
    max-width: none !important;
    transform: none !important;
    z-index: 10001 !important;
    background: #ffffff !important;
    border-radius: 10px !important;
    box-shadow: 0 12px 48px rgba(0, 0, 0, 0.15), 0 2px 8px rgba(0, 0, 0, 0.08) !important;
    /* Deliberately NOT !important on these two: confirmed via live inspection
       that JetMenu toggles this element via CSS classes only (element.style
       was empty — no inline max-height set by JS). Its own default-closed
       rule (`.jet-mega-menu.jet-mega-menu--layout-dropdown .jet-mega-menu-container`)
       lives in JetMenu's plugin stylesheet, which loads/parses after our
       custom CSS in the page's source order — so on every fresh page load
       there's a real window where OUR background/shadow/shape is already
       painted but THEIR max-height:0 hasn't applied yet, rendering this as
       a full-height white box for a frame or two (the "flash on page load").
       Setting the same closed default here, in our own stylesheet, removes
       the dependency on their load order entirely. Left as plain (non-
       !important) so whatever more-specific rule/class JetMenu adds when
       actually opening the panel still normally wins via specificity. */
    max-height: 0;
    overflow: hidden;
  }

  /* Forcing the container full-width isn't enough on its own — max-width:100%
     only clips things that are too WIDE, it doesn't stretch things that are
     too NARROW. Each row is very likely a flex child that's hugging its own
     content (align-items other than stretch) rather than filling the column,
     so force width explicitly down through every level: the list, each row,
     and each row's inner flex wrapper. */
  .jet-mega-menu-list {
    display: flex !important;
    flex-direction: column !important;
    align-items: stretch !important;
    width: 100% !important;
  }

  .jet-mega-menu-item,
  .jet-mega-menu-item__inner {
    width: 100% !important;
  }

  .jet-mega-menu-container,
  .jet-mega-menu-container * {
    max-width: 100% !important;
  }

  /* The desktop mega-content template's own panel chrome (shadow/radius) is
     redundant once it's living inside the mobile panel above — flatten it. */
  .jet-mega-menu-mega-container {
    position: relative !important;
    width: 100% !important;
    background: #ffffff !important;
    box-shadow: none !important;
    border-radius: 0 !important;
    padding-top: 0 !important;
    margin-top: 0 !important;
  }

  /* This targets the mega-content template's own OUTER Container (a direct
     child of .jet-mega-menu-mega-container) — it carries its own native
     white-bg/shadow/radius, built for floating independently as the
     DESKTOP hover panel. Nested inside our already-white mobile accordion,
     that second layer of chrome is exactly the "two different backgrounds"
     look — flattening it so the whole thing reads as one continuous flat
     white surface, matching the prototype. */
  .jet-mega-menu-mega-container > * {
    margin-top: 0 !important;
    background: transparent !important;
    box-shadow: none !important;
    border-radius: 0 !important;
    padding-top: 4px !important;
  }

  /* Contact button widget stays hidden on mobile — abandoned trying to
     reposition it via CSS (position:fixed pinned to the viewport, then
     position:absolute calc'd against a height-capped panel) since it
     lives outside JetMenu's own generated markup as a sibling of the Mega
     Menu widget, not a real child of the accordion panel. Two attempts
     confirmed CSS can't reliably attach a sibling to another element's
     dynamic content this way. New plan: add "Contact" as an actual menu
     item (Appearance → Menus → Primary Navigation, plain link, no mega
     content, last position) so it's a genuine row in the same <ul> as
     About/Services/Work/Blog on mobile — no positioning math needed. See
     the CLAUDE.md session entry for the follow-up styling/desktop-hiding
     step once that item exists. */
  .elementor-element-73d05171 {
    display: none;
  }

  /* --- Top-level row treatment on mobile: match the HTML prototype's
     accordion rows (inset divider, chevron on the right, darker text)
     instead of the desktop gold-underline-on-hover + shadow treatment,
     which doesn't work as a touch/tap affordance. Desktop keeps its own
     underline + lighter title color untouched — all of this is scoped
     inside the 767px media query. */

  /* Darker top-level text by default (desktop keeps it lighter since it
     relies on :hover to go full-opacity — mobile has no hover, so it
     should just read dark all the time). Redefining the same CSS var
     JetMenu set at the widget root, rather than guessing at whichever
     nested element actually consumes it. */
  .elementor-293 .elementor-element.elementor-element-435aae5c {
    --jmm-top-item-title-color: #213D2F !important;
  }

  .jet-mega-menu-item__inner,
  .jet-mega-menu-item__inner * {
    color: #213D2F !important;
  }

  /* The catch-all above apparently loses to something more specific still
     rendering the text gray — likely JetMenu's own title-span rule using
     the same compound-class pattern seen elsewhere in their CSS
     (`.jet-mega-menu.jet-mega-menu--layout-dropdown .jet-mega-menu-list
     .jet-mega-menu-item__inner ...`). When both sides carry !important,
     specificity breaks the tie, not which declaration is "more" important —
     matching that same compound pattern here instead of guessing again. */
  .jet-mega-menu.jet-mega-menu--layout-dropdown .jet-mega-menu-list .jet-mega-menu-item__inner,
  .jet-mega-menu.jet-mega-menu--layout-dropdown .jet-mega-menu-list .jet-mega-menu-item__inner * {
    color: #213D2F !important;
  }

  /* Found the actual culprit via live inspection: JetMenu auto-generates
     `.elementor-293 .elementor-element.elementor-element-435aae5c
     .jet-mega-menu-item__label { color: rgba(33,61,47,0.55) !important; }`
     — a literal computed color baked directly onto the label div, not
     routed through the CSS variable at all (hence overriding the variable
     did nothing). It's 4 classes deep, identical specificity to the
     catch-alls above, and wins the tie because JetMenu's own generated CSS
     loads after ours on the page. Targeting the exact same element
     (`.jet-mega-menu-item__label`) with a 5-class compound .elementor-kit-9 to
     genuinely outrank it instead of just matching it. */
  .jet-mega-menu.jet-mega-menu--layout-dropdown .jet-mega-menu-list .jet-mega-menu-item__inner .jet-mega-menu-item__label {
    color: #213D2F !important;
  }

  /* Tighter left/right inset on each row, matching the prototype's 12px
     (the rule that actually sets this padding — `.jet-mega-menu.jet-mega-menu--layout-dropdown
     .jet-mega-menu-list .jet-mega-menu-item__inner` — falls back to 20px
     when this var is unset, which is why it read as too much left padding). */
  .elementor-293 .elementor-element.elementor-element-435aae5c {
    --jmm-dropdown-top-items-hor-padding: 12px !important;
  }

  /* The toggle button (hamburger/X) has its own background var
     (`--jmm-dropdown-toggle-bg-color`) that was rendering as a visible gray
     square behind the icon — the prototype's toggle has no background at
     all, just the bare icon. */
  .jet-mega-menu-toggle {
    background: transparent !important;
    background-color: transparent !important;
  }

  /* Kill any native shadow on the row / its states. */
  .jet-mega-menu-item,
  .jet-mega-menu-item__inner,
  .jet-mega-menu-item__inner:hover,
  .jet-mega-menu-item__inner:active,
  .jet-mega-menu-item__inner:focus {
    box-shadow: none !important;
    border-bottom: none !important;
  }

  /* Inset hairline divider (not edge-to-edge, matching the prototype's
     padded look) — drawn as a background gradient rather than a border, so
     it can fade out 20px in from each side without touching the box model
     (padding/margin) that the row's own content alignment depends on. */
  .jet-mega-menu-item {
    background-image: linear-gradient(
      to right,
      transparent 12px,
      rgba(33, 61, 47, 0.08) 12px,
      rgba(33, 61, 47, 0.08) calc(100% - 12px),
      transparent calc(100% - 12px)
    ) !important;
    background-repeat: no-repeat !important;
    background-position: bottom !important;
    background-size: 100% 1px !important;
  }

  .jet-mega-menu-item:last-child {
    background-image: none !important;
  }

  /* Chevron on the right of each row that actually expands (has-children) —
     same glyph as the prototype's .nav-chevron. Using ::after (not
     ::before) so it renders AFTER the label in source order — combined
     with the row's own `justify-content: space-between`, that alone puts
     the label at the far left and the chevron at the far right, no
     margin/order hacks needed. `position: static` overrides desktop's
     absolute positioning for this same ::after (used there for the
     underline bar). Rotates via aria-expanded, same attribute JetMenu
     already toggles. */
  .jet-mega-menu-item-has-children .jet-mega-menu-item__inner::after {
    content: '' !important;
    position: static !important;
    display: block !important;
    width: 14px !important;
    height: 14px !important;
    flex-shrink: 0 !important;
    margin-left: 8px !important;
    opacity: 0.5 !important;
    background: no-repeat center / contain url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23213D2F' stroke-width='2.5'><path stroke-linecap='round' stroke-linejoin='round' d='M19 9l-7 7-7-7'/></svg>") !important;
    transform: none !important;
    /* Found via live inspection: the old desktop underline rule on this
       same ::after sets `transform-origin: left !important`, and we never
       contested that property ourselves, so it was silently still in
       effect — rotating this box around its left edge instead of its
       center, causing it to swing through an arc (and likely clip against
       the row) instead of spinning in place. */
    transform-origin: center !important;
    transition: transform 0.25s ease, opacity 0.25s ease !important;
  }

  .jet-mega-menu-item-has-children .jet-mega-menu-item__inner[aria-expanded="true"]::after {
    transform: rotate(180deg) !important;
    opacity: 1 !important;
  }

  /* Found the cause of the chevron "jumping" mid-rotation (confirmed via
     extracted video frames — it visibly shrinks and shifts up-left only
     during the transition, not at rest in either state): JetMenu's own
     native dropdown-icon element (.jet-mega-menu-item__dropdown, the same
     one this project's desktop chevron rotation is built on) is still
     rendering here too, with its own unscoped rotation/positioning CSS
     from the earlier desktop-only build. Two icons animating slightly out
     of sync on top of each other reads as one icon jumping around. Hiding
     it on mobile so only our custom ::after chevron shows. */
  .jet-mega-menu-item__dropdown {
    display: none !important;
  }

  /* Items with no mega content (e.g. "Work") get no chevron at all — kill
     the underline's ::after for them without adding a replacement. */
  .jet-mega-menu-item:not(.jet-mega-menu-item-has-children) .jet-mega-menu-item__inner::after {
    content: none !important;
  }

  /* Compact the icon/label/subtitle rows inside the expanded panel (Our
     Story, Team, etc.) to match the prototype's tight spacing. Confirmed
     via live inspection: the actual row is an <a> tag (e.g.
     elementor-element-68645d5d, classes `e-con-full e-flex e-con e-child`,
     linking to /about) nested one level deeper than originally guessed —
     .jet-mega-menu-mega-container > [boxed .e-con] > .e-con-inner > [the
     row <a>.e-con] — which is why the previous .elementor-kit-9 (`> * > .e-con`,
     only 2 levels deep) matched nothing at all. Also: the row's own
     --flex-direction was already `row`, not `column` as assumed — the real
     cause of the "stacked" look is --flex-wrap-mobile: wrap on the row,
     which wraps the text column onto its own line below the icon once the
     two don't fit side by side. Using a plain descendant .elementor-kit-9
     (`a.e-con` under the mega-container) instead of hardcoding the exact
     depth, so this holds even if Services' template turns out to nest
     slightly differently than About's. */
  .jet-mega-menu-mega-container a.e-con {
    flex-wrap: nowrap !important;
    --flex-wrap: nowrap !important;
    flex-direction: row !important;
    --flex-direction: row !important;
    align-items: center !important;
    --align-items: center !important;
    gap: 8px !important;
    --gap: 8px !important;
    padding: 4px 6px !important;
    --padding-top: 4px !important;
    --padding-bottom: 4px !important;
    --padding-left: 6px !important;
    --padding-right: 6px !important;
  }

  /* The row's own gap (above) controls icon-to-text spacing, but the
     nested column holding the label + subtitle (e.g.
     elementor-element-8a5e24f, a direct child .e-con of the row) has its
     OWN separate native gap — found via inspection to be 11px — which is
     the actual source of the two lines of text not sitting tight. */
  .jet-mega-menu-mega-container a.e-con > .e-con {
    gap: 2px !important;
    --gap: 2px !important;
    row-gap: 2px !important;
    --row-gap: 2px !important;
  }

  .jet-mega-menu-mega-container .elementor-icon svg,
  .jet-mega-menu-mega-container .e-icon svg {
    width: 22px !important;
    height: 22px !important;
  }

  .jet-mega-menu-mega-container .elementor-heading-title {
    line-height: 1.3 !important;
    margin-bottom: 1px !important;
  }

  .jet-mega-menu-mega-container .elementor-widget-text-editor,
  .jet-mega-menu-mega-container .elementor-widget-text-editor p {
    line-height: 1.3 !important;
    margin: 0 !important;
  }
}

/* ==================== DESKTOP: HIDE THE MOBILE-ONLY "CONTACT" MENU ITEM ==================== */
/* Added "Contact" as a plain 4th top-level item to Primary Navigation so it
   would appear as a genuine row in the mobile Roll Up list (no positioning
   hacks needed, unlike the separate coral Contact button widget, which
   lives outside JetMenu's own markup). That pushed the desktop nav past its
   available width, so JetMenu automatically tucked it behind a "..."
   overflow trigger — confirmed via live inspection that the item's real
   id is `jet-mega-menu-item-961` (nested inside `.jet-mega-menu-sub-menu__list`,
   JetMenu's own overflow wrapper). Hiding it at desktop widths only; mobile
   keeps it as a normal accordion row. This id is tied to the WordPress menu
   item itself, so it stays stable through reordering and Work coming back
   post-launch. If the "..." trigger itself doesn't disappear once this is
   hidden (depends on whether JetMenu recalculates overflow on resize or
   only once on load), that's the next thing to chase — it would need its
   own .elementor-kit-9, since it has no id of its own in the markup. */
@media (min-width: 768px) {
  #jet-mega-menu-item-961 {
    display: none !important;
  }
}

/* ==================== MOBILE: STYLE THE "CONTACT" ROW AS A PILL BUTTON ==================== */
/* Same stable id as above (#jet-mega-menu-item-961) — this one's low-risk
   since it's a real, uniquely-identified row, not fighting a sibling
   widget's layout the way the earlier Contact-button attempt was. An ID
   .elementor-kit-9 outranks the class-based rules from the top-level row styling
   above (e.g. the forest-green label-color rule), so no specificity war
   here. */
@media (max-width: 767px) {
  #jet-mega-menu-item-961 {
    width: calc(100% - 24px) !important;
    margin: 16px 12px 14px 12px !important;
  }

  /* Blog (the row immediately before Contact) was showing its own bottom
     divider right up against the button — using nth-last-child(2) instead
     of Blog's specific id so this stays correct if the row order changes
     (e.g. once Work returns), since it always targets "whatever sits right
     before the last item" rather than a hardcoded id. */
  .jet-mega-menu-item:nth-last-child(2) {
    background-image: none !important;
  }

  #jet-mega-menu-item-961 .jet-mega-menu-item__inner {
    background-color: #F07060 !important;
    border-radius: 100px !important;
    justify-content: center !important;
    padding: 10px 12px !important;
  }

  #jet-mega-menu-item-961 .jet-mega-menu-item__label,
  #jet-mega-menu-item-961 .jet-mega-menu-item__inner,
  #jet-mega-menu-item-961 .jet-mega-menu-item__inner * {
    color: #ffffff !important;
  }
}

/* ==================== MOBILE: HOMEPAGE SERVICES LIST ==================== */
/* Confirmed via live inspection (Sept 3, 2026): each service row is itself
   an <a href="/services/#..."> Container (Elementor's atomic Flexbox), so it
   is already a real link site-wide — no click/JS fix needed here, unlike
   the nav items. The icon-wrapping Container (the row's first child div)
   had no explicit mobile Width override, so it inherited Elementor's own
   default full-width behavior for flex children on mobile and stretched
   edge-to-edge (measured 347px on a 375px-wide viewport) instead of staying
   icon-sized. The desktop-only hover effect (padding shift, background
   tint, chevron reveal — from the `.service-list > .elementor-element`
   rules earlier in this file) still fires on `:hover` here since these rows
   carry the generic `elementor-element` class too — on touch devices this
   reads as an unwanted flash/shift on tap (same underlying mechanism as the
   JetMenu hover/touch conflict documented above), so it's suppressed below
   rather than removed globally, since desktop should keep it. */
@media (max-width: 767px) {
  /* Uses the .service-icon-box class (added directly to each icon
     Container's Advanced > CSS Classes field) rather than the original
     positional :first-child .elementor-kit-9 — purely for resilience going
     forward, not because the DOM actually differed (see next comment). */
  .service-list .service-icon-box {
    --width: 44px !important;
    width: 44px !important;
    max-width: 44px !important;
    flex: 0 0 44px !important;
  }

  /* Confirmed via live inspection (Sept 9, 2026): every row had IDENTICAL
     DOM structure and computed styles — the icon-box width fix above was
     never the actual bug for the icon-above-text stacking. Every row has
     `flex-wrap: wrap` on the row itself; short titles ("Impact Evaluation",
     "Visioning and Strategy") happened to fit icon+heading on one line and
     looked "correct," while longer titles didn't fit and wrapped as a
     WHOLE flex item onto a new line — instead of the heading wrapping its
     own text internally, which is what should happen. Root cause: the
     heading item had no `min-width: 0`, so its default `min-width: auto`
     was preventing it from shrinking to fit the remaining row width.
     Fix: force the row to never break into two flex lines, and let the
     heading shrink/wrap its own text instead. Same underlying bug pattern
     already documented above for the JetMenu mega-menu rows
     (`--flex-wrap-mobile: wrap`, Sept 3 fix). */
  .service-list > a {
    flex-wrap: nowrap !important;
  }

  .service-list > a > div:last-child {
    min-width: 0 !important;
    flex: 1 1 auto !important;
  }

  /* Confirmed via live inspection (Sept 9, 2026): each row's icon is
     correctly centered within its OWN 18px/18px padding (verified — 19px
     above, 18px below). The visual "not centered between the dividers"
     complaint is because `.service-list` has a 20px row-gap (desktop flex
     Gaps setting, inherited on mobile with no override) sitting entirely
     AFTER each row's content and BEFORE the next row's border-top divider
     — so the space a viewer perceives as "inside" one row (divider above
     to divider below) is actually 87px of padded content + 20px of gap,
     all bunched at the bottom, not the symmetric 87px each row's own
     padding already provides. Removing the gap on mobile makes each row's
     own border-box exactly equal to the divider-to-divider band, since
     adjacent rows' padding already supplies matching spacing. */
  .service-list {
    gap: 0 !important;
  }

  .service-list > a:hover,
  .service-list > a:active,
  .service-list > a:focus {
    padding-left: 0 !important;
    background: transparent !important;
  }

  .service-list > a::after {
    display: none !important;
  }
}

/* ==================== MOBILE: TESTIMONIALS CAROUSEL ==================== */
/* Confirmed via live inspection (Sept 3, 2026): `.testimonial-card` has a
   hardcoded `min-width: 700px; max-width: 700px;` (set for the desktop
   horizontal-scroll carousel) with no mobile override, so on a ~375px-wide
   phone each card rendered far wider than the viewport and hung off both
   edges, with `.testimonial-grid`'s side padding/scroll-padding formulas
   (built around that same 700px assumption) compounding the overhang.
   Sized the card to the viewport instead so the full quote is always
   visible. The existing prev/next-arrow and dot-indicator JS (Testimonial
   carousel controls, in Custom Code) reads each card's actual width via
   `getBoundingClientRect()` at scroll time rather than assuming 700px, so
   it keeps working unchanged — manual navigation between cards still
   functions exactly as before. */
@media (max-width: 767px) {
  .testimonial-grid {
    padding-left: 20px !important;
    padding-right: 20px !important;
    scroll-padding: 0 20px !important;
  }

  .testimonial-card {
    min-width: calc(100vw - 40px) !important;
    max-width: calc(100vw - 40px) !important;
  }
}/* End custom CSS */