/* Evergreen Widgets. Structure only: every colour, size and font that the client
   should control is set from the Elementor panel, so nothing here is a hard style
   the panel cannot beat. */

/* The reference self-hosts one variable file per family. Google's static cuts of
   Bricolage Grotesque render about a tenth wider at display sizes, so the same
   files the approved build uses are shipped here and Google Fonts is switched
   off in Elementor. Figtree comes along for the same reason: one source, one
   metric, no swap. */
@font-face{font-family:"Bricolage Grotesque";src:url(fonts/bricolage.woff2) format("woff2");
  font-weight:400 800;font-style:normal;font-display:swap;
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:"Figtree";src:url(fonts/figtree.woff2) format("woff2");
  font-weight:400 700;font-style:normal;font-display:swap;
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}


/* ---------------------------------------------------- before/after compare */
.evg-cmp{margin:0}
/* The frame takes its height from the after photograph, which sits in normal
   flow. A frame sized only by aspect-ratio or percentage padding is cyclic
   inside a flex column, and the wrapper came out short of its own content at
   narrow widths. The before photograph stays absolute, over the top. */
.evg-cmp__frame{position:relative;width:100%}
.evg-cmp__media{position:absolute;inset:0;overflow:hidden}
.evg-cmp__img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block;margin:0}
.evg-cmp__sizer{display:block;width:100%;height:auto;margin:0;
  aspect-ratio:var(--evg-cmp-ratio, 1.6);object-fit:cover;visibility:hidden}
/* any viewport cap on the frame belongs to the page (widget custom CSS), not here:
   the homepage pair keeps its full 1.6 frame, the service pages cap theirs */
.evg-cmp__img--after{z-index:1}
.evg-cmp__img--before{z-index:2;clip-path:inset(0 calc(100% - var(--evg-pos)) 0 0)}
.evg-cmp__lbl{position:absolute;top:.9rem;z-index:3;padding:.34rem .7rem;border-radius:6px;font-size:.8125rem;font-weight:700;letter-spacing:.09em;text-transform:uppercase;pointer-events:none}
.evg-cmp__lbl--a{left:.9rem}
.evg-cmp__lbl--b{right:.9rem}
/* themes style bare <button> elements, so the handle states its own reset */
.evg-cmp .evg-cmp__handle,
.evg-cmp .evg-cmp__handle:hover,
.evg-cmp .evg-cmp__handle:focus{position:absolute;top:0;bottom:0;left:var(--evg-pos);
  transform:translateX(-50%);width:56px;z-index:4;background:transparent;background-image:none;
  border:0;border-radius:0;box-shadow:none;padding:0;margin:0;cursor:ew-resize;touch-action:none;
  /* the theme transitions every button; the line must move with the clip edge, not ease after it */
  transition:none}
.evg-cmp__handle::before{content:"";position:absolute;left:50%;top:0;bottom:0;width:2px;transform:translateX(-50%);background:#fff}
.evg-cmp__handle:focus-visible{outline:3px solid currentColor;outline-offset:2px}
.evg-cmp__grip{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:46px;height:46px;border-radius:50%;display:grid;place-items:center;box-shadow:0 6px 18px -6px rgba(0,0,0,.5)}
.evg-cmp__grip svg{width:22px;height:22px;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.evg-cmp .evg-cmp__cap{margin:.9rem 0 0;font-style:normal}
.evg-cmp__empty{margin:0;padding:2rem;text-align:center;border:1px dashed currentColor;opacity:.6}

/* ------------------------------------------------------------ area checker */
.evg-area{display:grid;gap:0}
.evg-area__label{margin-bottom:.9rem}
/* the ring is drawn with a shadow, not a border, so the field keeps the exact
   height the reference gives it whatever colour the panel puts on the edge */
.evg-area__field{display:flex;align-items:center;gap:.65rem;border:0;box-shadow:inset 0 0 0 1px currentColor;border-radius:6px;padding:.2rem .85rem}
.evg-area__ico{width:1.1em;height:1.1em;flex:none;fill:none;stroke:currentColor;stroke-width:1.8}
/* themes style input[type=search] by attribute, which outranks a single class */
.evg-area .evg-area__input{flex:1;min-width:0;font:inherit;line-height:1.5;border:0;
  background:none;padding:.7rem 0;color:inherit;border-radius:0;min-height:0}
.evg-area .evg-area__input:focus{outline:none;box-shadow:none}
.evg-area__result{margin:.9rem 0 0;min-height:2.7em}
.evg-area__note{margin:.35rem 0 0}

/* ---------------------------------------------------------- project gallery */
.evg-gal{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:17.6px}
.evg-gal__item{position:relative;display:block;overflow:hidden;border-radius:12px;
  text-decoration:none;color:inherit}
.evg-gal__item[hidden]{display:none}
.evg-gal__item img{width:100%;aspect-ratio:4/3;object-fit:cover;display:block;
  transition:transform .7s cubic-bezier(.16,1,.3,1)}
.evg-gal__item:hover img{transform:scale(1.045)}
.evg-gal__tag{position:absolute;top:.85rem;left:.85rem;z-index:2;
  background:rgba(255,255,255,.95);color:#0B2416;
  font-size:.8125rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;
  padding:.32rem .65rem;border-radius:6px}
.evg-gal__cap{position:absolute;left:0;right:0;bottom:0;z-index:2;
  padding:1.6rem 1.15rem .95rem;color:#fff;font-size:.9375rem;font-weight:600;
  background:linear-gradient(to top,var(--evg-plate,rgba(10,28,17,.9)),
    rgba(10,28,17,.55) 55%,transparent)}
.evg-gal__cap small{display:block;font-weight:500;font-size:.8125rem;
  color:rgba(255,255,255,.8);margin-top:.15rem}
.evg-gal__filter{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:32px}
.evg-gal__filter button{font:600 .9375rem/1.4 inherit;cursor:pointer;
  border:1.5px solid #DAE0D4;background:#fff;color:#405046;border-radius:6px;
  padding:.55rem 1rem;
  transition:background-color .18s ease,border-color .18s ease,color .18s ease}
.evg-gal__filter button:hover{border-color:#1E7038;color:#17492A}
.evg-gal__filter button[aria-pressed="true"]{background:#10321E;border-color:#10321E;color:#fff}

/* --------------------------------------------------------- long-form article */
/* The privacy policy and any future policy page. These are component styles, so
   they live with the widgets rather than in one page's custom CSS. */
.evg-article h2{border-top:3px solid #111A14;padding-top:1.1rem;margin:2.6rem 0 .5em;
  font-family:"Bricolage Grotesque",sans-serif;font-weight:600;
  /* the reference leaves this h2 on the global --t-h2 clamp and measures it
     in ch of the display font, which is the right context on the element */
  font-size:clamp(1.8rem,1.3rem + 1.8vw,2.5rem);
  line-height:1.06;letter-spacing:-.02em;color:#111A14;max-width:24ch}
.evg-article h2:first-child{margin-top:0}
.evg-article p{max-width:64ch;margin:0 0 1.15em}
.evg-article .evg-lead-p{font-size:19px;line-height:1.6;color:#405046;margin:2rem 0 1.15em}
.evg-article ul{margin:0 0 1.15em;padding-left:1.1rem;list-style:none;display:grid;
  gap:.55rem;max-width:64ch}
.evg-article ul li{position:relative;padding-left:1.2rem}
.evg-article ul li::before{content:"";position:absolute;left:0;top:.62em;
  width:.55em;height:.14em;background:#A67C1F}
.evg-article a{color:#1E7038;text-decoration:underline;text-decoration-thickness:1px;
  text-underline-offset:3px}
[data-evg=aside]{position:sticky;top:96px}
/* Elementor sets min-width:0 on every container, so an fr track can shrink
   below its own content and the content spills out of the grid. The reference
   leaves min-width at auto, which is what holds the footer's contact column
   open around the email address; without this the page scrolls sideways from
   about 880 down to 721. Only the last column: the others size as pure fr on
   the reference too, and releasing them widens the first one to its logo. */
#evgFtrGrid > .e-con:last-child{min-width:auto}

/* the reference's .aside stops sticking here and lays its cards out two up,
   which halves the card and is what wraps its copy to a second line */
@media(max-width:1024px){[data-evg=aside]{position:static;display:grid;
  grid-template-columns:1fr 1fr;align-items:stretch;gap:1.25rem}}
/* the reference's .article gap is a clamp; three stepped values only matched it
   at the three widths they were read off */
#evgArticle{display:grid;grid-template-columns:minmax(0,1fr) 340px;
  gap:clamp(2.5rem,1.5rem + 3vw,4.5rem);align-items:start}
@media(max-width:1024px){#evgArticle{grid-template-columns:1fr}}

/* the compare caption: the reference sets its lead-in a shade darker and lighter
   than the body of the line */
.evg-cmp__cap b{color:#405046;font-weight:650}

/* ------------------------------------------------------------ hover motion */
/* The reference lifts its primary and ghost buttons by a pixel, its cross link
   pills by two, and the figures marked as interactive by four with a shadow.
   Elementor's hover animations start at eight, so these are stated here once
   rather than page by page. */
.elementor-widget-button .elementor-button:hover,
.elementor-widget-form .elementor-button:hover{transform:translateY(-1px)}
.evg-other .elementor-button:hover{transform:translateY(-2px)}
.evg-svc-go .elementor-button:hover,
.evg-ondark .elementor-button:hover,
.evg-tel .elementor-button:hover,
.evg-nav .elementor-button:hover{transform:none}
.evg-mf-hov{transition:transform .22s cubic-bezier(.16,1,.3,1),box-shadow .22s cubic-bezier(.16,1,.3,1)}
.evg-mf-hov:hover{transform:translateY(-4px);box-shadow:0 14px 34px -14px rgba(10,28,17,.25)}

/* ------------------------------------------------- stacked figure captions */
/* a heading widget renders its title inline, so a two line caption takes the
   body line height from the strut rather than its own */
.evg-figs .elementor-heading-title{display:block}

/* --------------------------------------------------------- touch call bar */
/* the bar is fixed over the page, so the document has to end above it */
@media(max-width:767px){body{padding-bottom:calc(5.25rem + env(safe-area-inset-bottom))}}

/* ---------------------------------------------- the ladder below 767 ------ */
/* The reference steps its grids again at 720, 640, 600, 560, 520 and 420, and
   Elementor has no breakpoint under 767 to hang those on. Same widths and the
   same values as the reference; the panel still owns desktop, tablet and mobile.
   Elementor writes a container's own layout from three classes, so these have to
   outrank it. */
@media(max-width:720px){
  [data-evg=covers],[data-evg=pledge],[data-evg=article]{--e-con-grid-template-columns:1fr!important}
  [data-evg=seq]{--e-con-grid-template-columns:3rem 1fr!important;
    --gap:16px 16px!important;--column-gap:16px!important;--row-gap:16px!important;
    --padding-top:20px!important;--padding-bottom:20px!important}
  [data-evg=seq] .evg-seq-n .elementor-heading-title{font-size:1.5rem}
  #evgFtrGrid{--e-con-grid-template-columns:1fr 1fr!important;
    --gap:32px 32px!important;--column-gap:32px!important;--row-gap:32px!important}
  .evg-contact-list .elementor-icon-list-text{grid-template-columns:1fr;gap:.15rem}
  /* the reference drops the header number here, not at Elementor's 767 */
  .evg-tel{display:none}
  /* and its aside comes back to a single column at the same step */
  [data-evg=aside]{grid-template-columns:1fr}
  /* The reference stacks the carousel controls here: the two buttons centred on
     one row, the dots centred under them, 1rem apart. Elementor lays all three
     out as one right-aligned row at every width. The slide count is not set
     from CSS: Elementor's carousel reads it from Swiper's own JS config, which
     evg.js re-keys to the reference's breakpoints. */
  .evg-rev{justify-content:center}
  .evg-rev .elementor-swiper-button{margin-top:2rem}
  .evg-rev .swiper-pagination{order:9;flex:0 0 100%;justify-content:center;margin:1rem 0 0}
}
@media(max-width:640px){
  [data-evg=svcs],[data-evg=gal],[data-evg=towns]{--e-con-grid-template-columns:1fr!important}
  [data-evg=svcs],[data-evg=gal]{--gap:16px 16px!important;--column-gap:16px!important;--row-gap:16px!important}
  .evg-gal{grid-template-columns:1fr!important;gap:16px!important}
  /* the stat captions used to be hidden here, which left a bare "32" under a
     heading about a twenty mile radius and no way to tell what it counted.
     They are one short line now and fit down to 320. */
}
@media(max-width:600px){
  [data-evg=pairs]{--e-con-grid-template-columns:1fr!important}
}
@media(max-width:560px){
  [data-evg=duo]{--e-con-grid-template-columns:1fr!important;
    --gap:14.4px 14.4px!important;--column-gap:14.4px!important;--row-gap:14.4px!important}
}
@media(max-width:520px){
  [data-evg=whys]{--e-con-grid-template-columns:1fr!important;
    --gap:18.4px 18.4px!important;--column-gap:18.4px!important;--row-gap:18.4px!important}
}
@media(max-width:420px){
  /* the reference takes the hero's buttons full width here and lets them stack.
     The row is fit-content so it hugs them; releasing it is what allows the wrap. */
  .e-con:has(> .evg-hero-btn){width:100%!important}
  .evg-hero-btn{width:100%}
  .evg-hero-btn .elementor-button{width:100%;justify-content:center}
  [data-evg=stats]{--e-con-grid-template-columns:1fr!important;
    --gap:12px 12px!important;--column-gap:12px!important;--row-gap:12px!important}
  #evgFtrGrid{--e-con-grid-template-columns:1fr!important}
}

/* ------------------------------------------------------- headline measures */
/* The reference measures its headlines in characters. A width set on the widget
   wrapper would count the body font's character, so the cap goes on the heading
   itself, where ch means what the reference means. */
.evg-h2 .elementor-heading-title{max-width:22ch}
.evg-hero-h1 .elementor-heading-title{max-width:13ch}
.evg-page-h1 .elementor-heading-title{max-width:19ch}
.evg-pledge-h2 .elementor-heading-title{max-width:16ch}
/* the reference measures every paragraph, then narrows the ones that lead */
.elementor-widget-text-editor p{max-width:64ch}
.evg-lead p{max-width:52ch}
.evg-page-sub p{max-width:56ch}
.evg-hero-sub p{max-width:34rem}
.evg-pledge-p p{max-width:58ch}
/* card copy and the sequence run the full track in the reference */
.evg-nomeasure p,.evg-contact-note p{max-width:none}
.evg-cmp__cap{max-width:62ch}


/* The header drawer. These sit here rather than on the header element because
   Elementor's sticky clones the header with a fresh element id, so an
   id-scoped rule only ever reaches one of the two copies. Values read off the
   reference's .nav.is-open. */
.evg-nav .elementor-nav-menu--dropdown a.elementor-item{
  min-height:44px;display:flex;align-items:center;border-bottom:1px solid #DAE0D4}
.evg-nav .elementor-nav-menu--dropdown li:last-child a.elementor-item{border-bottom:0}
/* the reference closes the drawer with a full-width quote button, and hides the
   same item from the desktop row where the header carries its own */
.evg-nav .elementor-nav-menu--main .menu-item.nav-cta{display:none}
.evg-nav .elementor-nav-menu--dropdown .menu-item.nav-cta a.elementor-item{
  justify-content:center;margin-top:.75rem;border-bottom:0;border-radius:6px;
  background:#D9AE45;color:#06180E;font-weight:700}
.evg-nav .elementor-nav-menu--dropdown .menu-item.nav-cta a.elementor-item:hover{
  background:#C29528;color:#06180E}

/* Below the nav breakpoint the nav widget still grows and its toggle renders
   inside it, so the call button and burger swap places unless re-ordered.
   The reference lets the pair follow the brand; at the client's request
   (2026-09-11) they sit flush right instead, the call button first. */
@media(max-width:1024px){
  /* the panel writes both of these on the element itself, so they need the flag */
  /* a boxed container puts its children in .e-con-inner: that is the flex row */
  [data-evg=hdr-inner] > .e-con-inner{justify-content:flex-start!important}
  [data-evg=hdr-cta]{order:2;margin-left:auto}
  .evg-nav{order:3;flex-grow:0!important}
}

/* The reference gives the phone and email in a contact block a real touch
   target below 640, which is also what makes that block two lines taller. */
@media(max-width:640px){
  .evg-napline a,
  .evg-contact-list .elementor-icon-list-text a{display:inline-block;padding-block:.5rem}
}

/* --- the rotating word in the hero -------------------------------------
   Lifted from the reference's .rotw. Every word is in the markup, so a crawler
   reads all six and the first one shows with JS off, with motion turned down,
   or before any animation starts. The words stack in one grid cell, which
   sizes the box to the longest of them: the line never reflows as they change
   and nothing below the headline moves. Only opacity and transform animate. */
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;
  overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
.rotw{display:inline-grid;vertical-align:bottom;overflow:hidden;
  padding-bottom:.14em;margin-bottom:-.14em}
.rotw > span{grid-area:1/1;justify-self:start;position:relative;
  color:#E8C978;white-space:nowrap;opacity:0}
.rotw > span:first-child{opacity:1}
/* the rule sits under the descenders rather than through them */
.rotw > span::after{content:"";position:absolute;left:0;right:0;bottom:-.07em;
  height:.075em;background:#D9AE45;opacity:.85}
@media(prefers-reduced-motion:no-preference){
  /* six words, 2.5s each. Every delay is pulled back by the entry time so the
     first word is already at full opacity on the first painted frame. */
  .rotw > span{opacity:0;animation:rotw 15s cubic-bezier(.16,1,.3,1) infinite both}
  .rotw > span:nth-child(1){animation-delay:-.22s}
  .rotw > span:nth-child(2){animation-delay:2.28s}
  .rotw > span:nth-child(3){animation-delay:4.78s}
  .rotw > span:nth-child(4){animation-delay:7.28s}
  .rotw > span:nth-child(5){animation-delay:9.78s}
  .rotw > span:nth-child(6){animation-delay:12.28s}
}
@keyframes rotw{
  0%{opacity:0;transform:translateY(.42em)}
  1.5%{opacity:1;transform:none}
  15%{opacity:1;transform:none}
  16.6667%{opacity:0;transform:translateY(-.42em)}
  100%{opacity:0;transform:translateY(.42em)}
}

/* ==========================================================================
   Motion and hover (15 Sep, client: "the site has no feel")
   Nothing here can hide content on its own. Reveals only apply once evg.js
   has added .evg-motion to <html> and marked an element .evg-rv, so a page
   whose script is late (BerqWP delays scripts on live) simply renders static.
   Everything moving is transform or opacity. Reduced-motion visitors get none.
   ========================================================================== */
html{scroll-padding-top:96px}
@media (prefers-reduced-motion:no-preference){
  html{scroll-behavior:smooth}

  /* scroll reveal, added and removed by evg.js */
  .evg-motion .evg-rv{opacity:0;transform:translate3d(0,24px,0);
    transition:opacity .75s cubic-bezier(.16,1,.3,1) var(--evg-d,0ms),transform .9s cubic-bezier(.16,1,.3,1) var(--evg-d,0ms)}
  .evg-motion .evg-rv.evg-in{opacity:1;transform:none}

  /* the kicker's gold rule draws in as its heading arrives */
  .evg-motion .evg-kicker.evg-rv .elementor-heading-title::before{width:0;transition:width .7s cubic-bezier(.16,1,.3,1) calc(var(--evg-d,0ms) + .25s)}
  .evg-motion .evg-kicker.evg-rv.evg-in .elementor-heading-title::before{width:26px}

  /* page hero: rises in on load, CSS only, so it runs even when scripts are late */
  body:not(.elementor-editor-active) [data-elementor-type="wp-page"] > .e-con:first-child .elementor-widget{
    animation:evgRise .9s cubic-bezier(.16,1,.3,1) both}
  body:not(.elementor-editor-active) [data-elementor-type="wp-page"] > .e-con:first-child .elementor-widget:nth-child(2){animation-delay:.08s}
  body:not(.elementor-editor-active) [data-elementor-type="wp-page"] > .e-con:first-child .elementor-widget:nth-child(3){animation-delay:.16s}
  body:not(.elementor-editor-active) [data-elementor-type="wp-page"] > .e-con:first-child .elementor-widget:nth-child(4){animation-delay:.24s}
  body:not(.elementor-editor-active) [data-elementor-type="wp-page"] > .e-con:first-child .elementor-widget:nth-child(n+5){animation-delay:.32s}
  @keyframes evgRise{from{opacity:0;transform:translate3d(0,18px,0)}to{opacity:1;transform:none}}
  /* the homepage video drifts slowly, as in the reference */
  body:not(.elementor-editor-active) .elementor-background-video-hosted{animation:evgDrift 38s ease-in-out infinite alternate;transform-origin:50% 62%}
  /* the keyframes must carry Elementor's centring translate: an animated transform replaces the base one, and scale() alone parked the video at the hero's centre point */
  @keyframes evgDrift{from{transform:translate(-50%,-50%) scale(1)}to{transform:translate(-50%,-50%) scale(1.07)}}

  /* the five stars fill in one after another when the card comes into view */
  .evg-motion .evg-stars .elementor-star-rating i{transition:transform .5s cubic-bezier(.34,1.56,.64,1),opacity .4s ease;display:inline-block}
  .evg-motion .evg-stars:not(.evg-stars-on) .elementor-star-rating i{opacity:.15;transform:scale(.4)}
  .evg-motion .evg-stars .elementor-star-rating i:nth-child(2){transition-delay:.09s}
  .evg-motion .evg-stars .elementor-star-rating i:nth-child(3){transition-delay:.18s}
  .evg-motion .evg-stars .elementor-star-rating i:nth-child(4){transition-delay:.27s}
  .evg-motion .evg-stars .elementor-star-rating i:nth-child(5){transition-delay:.36s}
}
.evg-stat-n .elementor-heading-title{font-variant-numeric:tabular-nums}

/* header: a soft shadow once it sticks */
[data-elementor-type="header"] .elementor-sticky{transition:box-shadow .3s ease,background-color .3s ease}
[data-elementor-type="header"] .elementor-sticky--effects{box-shadow:0 8px 28px -18px rgba(10,28,17,.45)}

/* hover: only on devices that really hover, so taps never leave a card lifted */
@media (hover:hover){
  /* stat cards lift, and the icon tile fills */
  [data-evg=stats] > .e-con{transition:transform .35s cubic-bezier(.16,1,.3,1),box-shadow .35s cubic-bezier(.16,1,.3,1),border-color .35s ease}
  /* doubled class: Elementor's per-element border rule has the same weight and loads later */
  [data-evg=stats] > .e-con.e-con:hover{transform:translateY(-5px);box-shadow:0 22px 44px -26px rgba(10,28,17,.38);border-color:#D9AE45}
  [data-evg=stats] .evg-stat-icon .elementor-icon{transition:background-color .3s ease,transform .45s cubic-bezier(.34,1.56,.64,1)}
  [data-evg=stats] .evg-stat-icon .elementor-icon svg{transition:fill .3s ease}
  [data-evg=stats] > .e-con:hover .evg-stat-icon.elementor-view-stacked .elementor-icon{background-color:#17492A;transform:scale(1.06)}
  [data-evg=stats] > .e-con:hover .evg-stat-icon.elementor-view-stacked .elementor-icon svg{fill:#FFFFFF}

  /* service and cover cards lift; their photos already zoom */
  [data-evg=svc],[data-evg=covers] > .e-con{transition:transform .35s cubic-bezier(.16,1,.3,1),box-shadow .35s cubic-bezier(.16,1,.3,1),border-color .35s ease}
  [data-evg=svc]:hover,[data-evg=covers] > .e-con:hover{transform:translateY(-5px)}
  [data-evg=covers] > .e-con.e-con:hover{box-shadow:0 22px 44px -26px rgba(10,28,17,.38);border-color:#D9AE45}
  [data-evg=covers] > .e-con .elementor-widget-image{overflow:hidden}
  [data-evg=covers] > .e-con .elementor-widget-image img{transition:transform .7s cubic-bezier(.16,1,.3,1)}
  [data-evg=covers] > .e-con:hover .elementor-widget-image img{transform:scale(1.045)}

  /* the feature card's outline button fills with the card */
  [data-evg=feature] .evg-ondark .elementor-button{transition:background-color .25s ease,border-color .25s ease}
  [data-evg=feature]:hover .evg-ondark .elementor-button{background-color:rgba(255,255,255,.12);border-color:#FFFFFF}

  /* arrows lean the way they point */
  .elementor-button .e-fas-arrow-right{transition:transform .3s cubic-bezier(.16,1,.3,1)}
  .elementor-button:hover .e-fas-arrow-right,
  [data-evg=svc]:hover .e-fas-arrow-right,[data-evg=feature]:hover .e-fas-arrow-right,
  [data-evg=covers] > .e-con:hover .e-fas-arrow-right{transform:translateX(4px)}

  /* the portrait breathes a little */
  [data-evg=portrait] img{transition:transform 1.2s cubic-bezier(.16,1,.3,1)}
  [data-evg=portrait]:hover img{transform:scale(1.03)}

  /* FAQ titles and links in body copy */
  .elementor-toggle .elementor-tab-title,.elementor-toggle .elementor-toggle-title{transition:color .2s ease}
  .elementor-toggle .elementor-tab-title:hover .elementor-toggle-title{color:#1E7038}
  .elementor-widget-text-editor a{transition:color .2s ease,text-decoration-color .2s ease}
}
@media (prefers-reduced-motion:reduce){
  [data-evg=stats] > .e-con:hover,[data-evg=svc]:hover,[data-evg=covers] > .e-con:hover{transform:none}
}
@media print{.evg-rv{opacity:1!important;transform:none!important}}

/* ------------------------------------------------ service area map (1.35.0) */
.evg-amap{--m-land:transparent;--m-water:#9FC3D4;--m-road:#8C968F;--m-ring:#1E7038;--m-zone:#27664A;
  --m-dot:#17492A;--m-base:#A67C1F;--m-hi:#A67C1F;--m-lbl:#405046;--m-strong:#111A14;--m-cap:#405046;--m-rcap:#44738C;
  --m-tip-bg:#0B2416;--m-tip-fg:#fff;--m-tip-acc:#E8C978;--m-tip-btn:#D9AE45;--m-tip-btn-fg:#06180E;
  --m-leg-fg:#405046;--m-leg-bd:#DAE0D4;--m-leg-bg:#fff;--m-leg-on:#E8EDE2;--m-hint:#63736A;
  --m-ease:cubic-bezier(.16,1,.3,1);
  position:relative;container-type:inline-size;font-family:inherit;-webkit-tap-highlight-color:transparent}
.evg-amap__stage{position:relative;background:var(--m-land);border-radius:10px}
.evg-amap__svg{display:block;width:100%;height:auto;overflow:visible;font-family:inherit;user-select:none;-webkit-user-select:none}
.evg-amap__svg--p{display:none}
@container (max-width:560px){.evg-amap__svg--l{display:none}.evg-amap__svg--p{display:block}}

.evg-amap__band{fill:none;stroke:var(--m-zone);stroke-opacity:.07;stroke-linecap:round;transition:stroke-opacity .35s}
.evg-amap__core{fill:var(--m-zone);fill-opacity:.07;transition:fill-opacity .35s}
.evg-amap__ring{fill:none;stroke:var(--m-ring);transition:stroke-width .35s}
.evg-amap__zone{transform-box:fill-box;transform-origin:center}
.evg-amap__river{fill:none;stroke:var(--m-water);stroke-linecap:round;stroke-linejoin:round;opacity:.7}
.evg-amap__road{fill:none;stroke:var(--m-road);stroke-linecap:round;stroke-linejoin:round;opacity:.55}
.evg-amap__cap{fill:var(--m-cap);font-weight:600;letter-spacing:.07em;text-transform:uppercase}
.evg-amap__cap--water{fill:var(--m-rcap)}
.evg-amap__cap--ring{fill:var(--m-ring)}
.evg-amap__shield{fill:#fff;stroke:var(--m-road);stroke-width:1.2}
.evg-amap__shield-t{fill:var(--m-lbl);font-weight:700}
.evg-amap__lbl{fill:var(--m-lbl);font-weight:500;paint-order:stroke;stroke:#F6F7F2;stroke-width:3px;stroke-linejoin:round;transition:fill .2s}
.evg-amap__lbl--base{fill:var(--m-strong);font-weight:700}
.evg-amap__leg{stroke:var(--m-hi);stroke-linecap:round;fill:none;opacity:0;pointer-events:none;transition:opacity .2s}
.evg-amap.has-leg .evg-amap__leg{opacity:.85}

.evg-amap__town{outline:none;transition:opacity .3s}
.evg-amap__town.is-dim{opacity:.2}
.evg-amap__hit{fill:transparent;pointer-events:none}
.evg-amap__dot{fill:var(--m-dot);transform-box:fill-box;transform-origin:center;transition:transform .3s var(--m-ease),fill .2s}
.evg-amap__town.is-minor .evg-amap__dot{fill-opacity:.45}
.evg-amap__dot--base{fill:var(--m-base);stroke:var(--m-tip-bg)}
.evg-amap__halo,.evg-amap__pulse{fill:var(--m-hi);opacity:0;pointer-events:none;transform-box:fill-box;transform-origin:center}
.evg-amap__focus{fill:none;stroke:var(--m-strong);opacity:0;pointer-events:none}
.evg-amap__town:focus-visible .evg-amap__focus{opacity:1}
.evg-amap__town.is-on .evg-amap__dot{transform:scale(1.55);fill:var(--m-hi);fill-opacity:1}
.evg-amap__town.is-base.is-on .evg-amap__dot{transform:scale(1.2)}
.evg-amap__town.is-on .evg-amap__lbl{fill:var(--m-strong);font-weight:700}
.evg-amap.is-key-core .evg-amap__core{fill-opacity:.16}
.evg-amap.is-key-core .evg-amap__ring{stroke-width:2.5}
.evg-amap.is-key-cowlitz .evg-amap__band{stroke-opacity:.2}

/* tooltip */
.evg-amap__tip{position:absolute;left:0;top:0;z-index:5;width:max-content;max-width:min(250px,80%);padding:12px 14px 13px;border-radius:10px;
  background:var(--m-tip-bg);color:var(--m-tip-fg);box-shadow:0 14px 34px -14px rgba(6,24,14,.55);
  pointer-events:none;opacity:0;visibility:hidden;transform:translate(-50%,calc(-100% - 16px)) scale(.94);transform-origin:var(--ax,50%) 100%;
  transition:opacity .16s,transform .24s var(--m-ease),visibility 0s .24s}
.evg-amap__tip.is-below{transform:translate(-50%,16px) scale(.94);transform-origin:var(--ax,50%) 0}
.evg-amap__tip.is-on{opacity:1;visibility:visible;transform:translate(-50%,calc(-100% - 16px));transition:opacity .16s,transform .24s var(--m-ease),visibility 0s}
.evg-amap__tip.is-on.is-below{transform:translate(-50%,16px)}
.evg-amap__tip.is-right{transform:translate(16px,-50%) scale(.94);transform-origin:0 var(--ay,50%)}
.evg-amap__tip.is-left{transform:translate(calc(-100% - 16px),-50%) scale(.94);transform-origin:100% var(--ay,50%)}
.evg-amap__tip.is-on.is-right{transform:translate(16px,-50%)}
.evg-amap__tip.is-on.is-left{transform:translate(calc(-100% - 16px),-50%)}
.evg-amap__tip.is-right::after{left:0;top:var(--ay,50%);transform:translate(-6px,-50%) rotate(45deg);border-radius:0 0 0 3px}
.evg-amap__tip.is-left::after{left:auto;right:0;top:var(--ay,50%);transform:translate(6px,-50%) rotate(45deg);border-radius:0 3px 0 0}
/* phones: a pinned card docks under the map instead of covering it */
@container (max-width:560px){
  .evg-amap__tip.is-pinned{position:static;transform:none!important;max-width:none;width:auto;margin-top:12px}
  .evg-amap__tip.is-pinned::after{display:none}
}
.evg-amap__tip.is-pinned{pointer-events:auto}
.evg-amap__tip::after{content:"";position:absolute;left:var(--ax,50%);top:100%;width:12px;height:12px;background:inherit;
  transform:translate(-50%,-6px) rotate(45deg);border-radius:0 0 3px 0}
.evg-amap__tip.is-below::after{top:0;transform:translate(-50%,-6px) rotate(45deg);border-radius:3px 0 0 0}
.evg-amap__tip p{margin:0;line-height:1.4}
.evg-amap__tip-t{font-weight:700;font-size:17px;letter-spacing:-.01em}
.evg-amap__tip-m{font-size:13px;opacity:.72;margin-top:1px!important}
.evg-amap__tip-d{font-size:14px;margin-top:8px!important}
.evg-amap__tip-d b{color:var(--m-tip-acc);font-size:20px;font-weight:700;margin-right:3px;font-variant-numeric:tabular-nums}
.evg-amap__tip-s{font-size:13px;margin-top:6px!important;display:flex;align-items:center;gap:6px}
.evg-amap__tip-s::before{content:"";width:7px;height:7px;border-radius:50%;background:var(--m-tip-acc);flex:none}
.evg-amap__tip-s.is-out::before{background:transparent;box-shadow:inset 0 0 0 1.5px var(--m-tip-acc)}
.evg-amap__tip-s:empty,.evg-amap__tip-d:empty{display:none}
.evg-amap__tip-a{display:none;margin-top:10px;padding:8px 12px;border-radius:6px;background:var(--m-tip-btn);color:var(--m-tip-btn-fg)!important;
  font-weight:700;font-size:14px;line-height:1.2;text-decoration:none!important;text-align:center}
.evg-amap__tip.is-pinned .evg-amap__tip-a{display:block}
.evg-amap__tip-a:hover{filter:brightness(1.06)}
.evg-amap__tip-a:focus-visible{outline:2px solid var(--m-tip-fg);outline-offset:2px}

/* legend */
.evg-amap__legend{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-top:14px}
.evg-amap__key{display:inline-flex;align-items:center;gap:8px;min-height:40px;padding:6px 12px;border:1px solid var(--m-leg-bd);border-radius:6px;
  background:var(--m-leg-bg);color:var(--m-leg-fg);font:inherit;font-size:14px;font-weight:500;line-height:1.3;cursor:default;margin:0}
button.evg-amap__key{text-align:left;cursor:pointer;transition:background .2s,border-color .2s,color .2s}
button.evg-amap__key:hover,button.evg-amap__key[aria-pressed="true"]{background:var(--m-leg-on);border-color:var(--m-ring);color:var(--m-strong)}
button.evg-amap__key:focus-visible{outline:2px solid var(--m-strong);outline-offset:2px}
.evg-amap__key i{flex:none;display:block;width:12px;height:12px;border-radius:50%}
.evg-amap__key--base{border-color:transparent;background:transparent;padding-left:4px}
.evg-amap__key--base i{background:var(--m-base);box-shadow:0 0 0 2px var(--m-tip-bg) inset}
.evg-amap__key--core i{border:1.5px dashed var(--m-ring);background:rgba(39,102,74,.1)}
.evg-amap__key--cowlitz i{width:18px;border-radius:6px;background:var(--m-zone);opacity:.3}
.evg-amap__key--oregon i{width:8px;height:8px;margin:0 2px;background:var(--m-dot)}
.evg-amap__hint{flex-basis:100%;font-size:13px;color:var(--m-hint);margin-top:2px}
@container (max-width:560px){.evg-amap__key{font-size:13px;padding:6px 10px}
  .evg-amap__legend{display:grid;grid-template-columns:1fr 1fr;gap:6px}.evg-amap__hint{grid-column:1/-1}}
/* wide: the legend sits in the empty west side of the map instead of under it */
@container (min-width:640px){
  .evg-amap__legend{position:absolute;left:0;bottom:4px;z-index:2;flex-direction:column;align-items:flex-start;max-width:37%;margin:0}
  .evg-amap__hint{flex-basis:auto;margin:4px 0 0 2px}
}

@media (prefers-reduced-motion:no-preference){
  .evg-amap__town.is-on:not(.is-base) .evg-amap__halo{animation:evgMapPing 1.1s ease-out 2}
  .evg-amap.is-in .evg-amap__pulse{animation:evgMapPing 1.4s ease-out .3s 2}
  .evg-amap.is-armed .evg-amap__zone{opacity:0;transform:scale(.82)}
  .evg-amap.is-armed .evg-amap__town,.evg-amap.is-armed .evg-amap__band{opacity:0}
  .evg-amap.is-armed.is-in .evg-amap__zone{opacity:1;transform:none;transition:opacity .5s var(--m-ease),transform .6s var(--m-ease)}
  .evg-amap.is-armed.is-in .evg-amap__town{opacity:1;transition:opacity .35s var(--m-ease) var(--d,0ms)}
  .evg-amap.is-armed.is-in .evg-amap__band{opacity:1;transition:opacity .5s .3s}
}
@keyframes evgMapPing{0%{opacity:.4;transform:scale(1)}100%{opacity:0;transform:scale(2.6)}}

/* 1.35.1: legend buttons restated against the Elementor kit; portrait type in wider columns */
.evg-amap .evg-amap__key{background:var(--m-leg-bg);color:var(--m-leg-fg);border:1px solid var(--m-leg-bd);border-radius:6px;font-family:inherit;font-size:14px;font-weight:500;line-height:1.3;letter-spacing:normal;text-transform:none;padding:6px 12px;min-height:40px;box-shadow:none;width:auto;text-align:left}
.evg-amap .evg-amap__key--base{background:transparent;border-color:transparent;padding-left:4px}
.evg-amap button.evg-amap__key:hover,.evg-amap button.evg-amap__key:focus,.evg-amap button.evg-amap__key[aria-pressed="true"]{background:var(--m-leg-on);border-color:var(--m-ring);color:var(--m-strong)}
.evg-amap button.evg-amap__key:focus:not(:focus-visible){outline:none}
@container (max-width:560px){.evg-amap .evg-amap__key{font-size:13px;padding:6px 10px}}
@container (min-width:440px){.evg-amap__svg--p .evg-amap__lbl{font-size:18px}}
@container (min-width:440px){.evg-amap__svg--p .evg-amap__lbl--base{font-size:21px}}
@container (min-width:440px){.evg-amap__svg--p .evg-amap__cap{font-size:17px}}

/* ------------------------------------------ before/after showcase (1.36.0) --
   Phones get an accordion: the open project's slider and story sit right under
   its title. From 820px of widget width the list and the slider split into two
   columns, every slider stacked in the right-hand cell and cross-faded. The
   last grid row is 1fr so the slider's height lands there and the list keeps
   its own spacing. */
.evg-bas-root{container-type:inline-size}
.evg-bas .evg-cmp__frame{--evg-cmp-ratio:1}
.evg-bas .evg-cmp__sizer{max-height:none}
.evg-bas .evg-cmp__grip{background:#fff}.evg-bas .evg-cmp__grip svg{stroke:#06180E}
.evg-bas .evg-cmp__lbl--a{background:#06180E;color:#E8C978}.evg-bas .evg-cmp__lbl--b{background:#D9AE45;color:#06180E}
/* a full-width square is taller than a tablet screen; the accordion shows 4:3 there */
@container (min-width:560px) and (max-width:819.98px){.evg-bas-root .evg-bas .evg-cmp__frame{--evg-cmp-ratio:1.3333}}
.evg-bas{--bas-line:#DAE0D4;--bas-num-on:#06180E;--bas-num-on-fg:#E8C978;--bas-svc:#8A6A18;
  --bas-title:#111A14;--bas-title-on:#17492A;--bas-story:#405046;--bas-link:#17492A;
  border-top:1px solid var(--bas-line)}
.evg-bas__item{display:flex;flex-direction:column;border-bottom:1px solid var(--bas-line)}
.evg-bas .evg-bas__q{margin:0;padding:0;font-size:inherit;line-height:inherit;font-weight:inherit;letter-spacing:normal;text-transform:none}
.evg-bas .evg-bas__btn,.evg-bas .evg-bas__btn:hover,.evg-bas .evg-bas__btn:focus{display:flex;align-items:center;gap:16px;width:100%;
  margin:0;padding:18px 0;background:none;border:0;border-radius:0;box-shadow:none;color:inherit;text-align:left;cursor:pointer;
  font-family:'Figtree',system-ui,sans-serif;font-size:16px;font-weight:400;line-height:1.3;letter-spacing:normal;text-transform:none;min-height:0;white-space:normal}
.evg-bas .evg-bas__btn:focus:not(:focus-visible){outline:none}
.evg-bas .evg-bas__btn:focus-visible{outline:3px solid var(--bas-title-on);outline-offset:2px;border-radius:4px}
.evg-bas__num{flex:none;display:inline-grid;place-items:center;width:36px;height:36px;border:1px solid var(--bas-line);border-radius:6px;
  font-size:13px;font-weight:700;color:#63736A;font-variant-numeric:tabular-nums;transition:background .25s,border-color .25s,color .25s}
.evg-bas__btn:hover .evg-bas__num{border-color:#D9AE45}
.evg-bas__item.is-open .evg-bas__num{background:var(--bas-num-on);border-color:var(--bas-num-on);color:var(--bas-num-on-fg)}
.evg-bas__txt{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px}
.evg-bas .evg-bas__svc{font-size:12px;font-weight:700;line-height:1.5;letter-spacing:.12em;text-transform:uppercase;color:var(--bas-svc)}
.evg-bas .evg-bas__title{font-family:'Bricolage Grotesque','Figtree',sans-serif;font-size:19px;font-weight:600;line-height:1.3;color:var(--bas-title);transition:color .2s}
.evg-bas__btn:hover .evg-bas__title,.evg-bas__item.is-open .evg-bas__title{color:var(--bas-title-on)}
.evg-bas__chev{flex:none;width:20px;height:20px;fill:none;stroke:#63736A;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;transition:transform .25s}
.evg-bas__item.is-open .evg-bas__chev{transform:rotate(180deg)}
.evg-bas__story,.evg-bas__fig{display:none}
.evg-bas__item.is-open .evg-bas__story,.evg-bas__item.is-open .evg-bas__fig{display:block}
.evg-bas__fig{order:2}
.evg-bas__story{order:3;padding:18px 0 26px}
.evg-bas .evg-bas__story p{margin:0 0 14px;max-width:54ch;color:var(--bas-story);font-size:16px;line-height:1.7}
.evg-bas .evg-bas__link{display:inline-flex;align-items:center;gap:6px;font-size:15px;font-weight:700;color:var(--bas-link);
  text-decoration:underline;text-decoration-color:transparent;text-underline-offset:4px;transition:text-decoration-color .2s;min-height:44px}
.evg-bas .evg-bas__link:hover,.evg-bas .evg-bas__link:focus-visible{color:var(--bas-link);text-decoration-color:currentColor}
.evg-bas__link svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;transition:transform .2s}
.evg-bas__link:hover svg{transform:translateX(3px)}
.evg-bas .evg-bas__hint{margin:10px 0 0;font-size:13px;line-height:1.5;color:#63736A;text-align:center}
.evg-bas__item.is-open .evg-bas__fig{animation:evgBasIn .25s ease both}
@keyframes evgBasIn{from{opacity:0}to{opacity:1}}
@container (min-width:820px){
  .evg-bas{display:grid;grid-template-columns:minmax(0,var(--bas-split,42%)) minmax(0,1fr);
    grid-template-rows:repeat(var(--bas-rows),auto) 1fr;column-gap:var(--bas-gap,64px);border-top:0}
  .evg-bas__item{display:contents}
  .evg-bas .evg-bas__q{grid-column:1;grid-row:var(--bas-r);border-top:1px solid var(--bas-line)}
  .evg-bas__item:last-child .evg-bas__q,.evg-bas__item.is-open:last-child .evg-bas__story{border-bottom:1px solid var(--bas-line)}
  .evg-bas__item.is-open:last-child .evg-bas__q{border-bottom:0}
  .evg-bas .evg-bas__btn,.evg-bas .evg-bas__btn:hover,.evg-bas .evg-bas__btn:focus{padding:20px 0}
  .evg-bas .evg-bas__title{font-size:21px}
  .evg-bas__chev{display:none}
  .evg-bas__story{grid-column:1;grid-row:var(--bas-rs);padding:0 0 26px 52px}
  .evg-bas__fig,.evg-bas__item.is-open .evg-bas__fig{display:block;grid-column:2;grid-row:1 / -1;align-self:start;
    position:sticky;top:var(--bas-top,112px);animation:none;width:100%;max-width:calc(100svh - 160px);justify-self:end}
  .evg-bas__fig{opacity:0;visibility:hidden;transition:opacity .28s ease,visibility 0s linear .28s}
  .evg-bas__item.is-open .evg-bas__fig{opacity:1;visibility:visible;z-index:1;transition:opacity .28s ease}
}
@media (prefers-reduced-motion:reduce){
  .evg-bas__fig,.evg-bas__item.is-open .evg-bas__fig,.evg-bas__num,.evg-bas__title,.evg-bas__chev,.evg-bas__link svg{transition:none;animation:none}
}
