/* =========================================================
   North Texas Lawn & Landscape — site styles
   Edit colors in one place: the :root block below.
   ========================================================= */

:root {
  /* --- BRAND COLORS (change these to restyle the whole site) --- */
  --ink:        #0F2A33;   /* dark slate — headings, footer, header text */
  --ink-soft:   #33454C;   /* body text */
  --muted:      #6B7C83;   /* small print */
  --accent:     #1F7A4D;   /* primary green — buttons, links, icons */
  --accent-dk:  #17603C;   /* green hover */
  --accent-lt:  #E8F3ED;   /* pale green — section tints */
  --sand:       #F6F8F7;   /* light background */
  --line:       #E2E8E6;   /* borders */
  --white:      #FFFFFF;

  --radius:     14px;
  --radius-sm:  8px;
  --shadow:     0 1px 2px rgba(15,42,51,.06), 0 8px 24px rgba(15,42,51,.08);
  --shadow-lg:  0 2px 4px rgba(15,42,51,.06), 0 18px 48px rgba(15,42,51,.14);
  --maxw:       1180px;
  --header-h:   76px;
}

/* ---------- Reset ---------- */
*, *::before, *::after { box-sizing: border-box; }
html { scroll-behavior: smooth; scroll-padding-top: calc(var(--header-h) + 12px); }
body {
  margin: 0;
  font-family: "Open Sans", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
  color: var(--ink-soft);
  background: var(--white);
  font-size: 17px;
  line-height: 1.65;
  -webkit-font-smoothing: antialiased;
}
/* height:auto is REQUIRED, not cosmetic. Every <img> carries width/height
   attributes (added by _dims.py so the browser can reserve space and the page
   does not jump as photos load). Those attributes are presentational hints, so
   any rule that sets width without height - .gallery img and .split img both do
   - leaves the height pinned to the raw pixel value and the photo comes out
   stretched. height:auto restores the aspect ratio while keeping the benefit of
   the attributes. Do not remove it. */
img { max-width: 100%; display: block; height: auto; }
a { color: var(--accent); }

h1, h2, h3, h4 {
  font-family: Poppins, "Open Sans", system-ui, sans-serif;
  color: var(--ink);
  line-height: 1.18;
  margin: 0 0 .5em;
  letter-spacing: -.01em;
}
h1 { font-size: clamp(2.1rem, 5vw, 3.4rem); font-weight: 700; }
h2 { font-size: clamp(1.7rem, 3.4vw, 2.5rem); font-weight: 700; }
h3 { font-size: 1.22rem; font-weight: 600; }
p  { margin: 0 0 1rem; }

.wrap { max-width: var(--maxw); margin: 0 auto; padding: 0 24px; }
.section { padding: 84px 0; }
.section--tint { background: var(--sand); }
.section--green { background: var(--accent-lt); }
.center { text-align: center; }
.lede { font-size: 1.1rem; color: var(--ink-soft); max-width: 62ch; }
.center .lede { margin-left: auto; margin-right: auto; }

.eyebrow {
  display: inline-block;
  font-family: Poppins, sans-serif;
  font-size: .78rem;
  font-weight: 600;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--accent);
  margin-bottom: .6rem;
}

/* ---------- Buttons ---------- */
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: .5rem;
  font-family: Poppins, sans-serif; font-weight: 600; font-size: .97rem;
  padding: .82rem 1.5rem; border-radius: 999px; border: 2px solid transparent;
  text-decoration: none; cursor: pointer; transition: .18s ease;
  white-space: nowrap;
}
.btn--primary { background: var(--accent); color: #fff; }
.btn--primary:hover { background: var(--accent-dk); transform: translateY(-1px); }
.btn--ghost { background: transparent; color: var(--ink); border-color: var(--line); }
.btn--ghost:hover { border-color: var(--accent); color: var(--accent); }
.btn--light { background: #fff; color: var(--ink); }
.btn--light:hover { background: var(--accent-lt); }
.btn--outline-light { background: transparent; color: #fff; border-color: rgba(255,255,255,.6); }
.btn--outline-light:hover { background: rgba(255,255,255,.14); border-color: #fff; }
.btn--lg { padding: 1rem 2rem; font-size: 1.05rem; }

/* ---------- Header ---------- */
.site-header {
  position: sticky; top: 0; z-index: 60;
  background: rgba(255,255,255,.96);
  backdrop-filter: saturate(180%) blur(10px);
  border-bottom: 1px solid var(--line);
}
.header-inner {
  height: var(--header-h);
  display: flex; align-items: center; gap: 28px;
  max-width: var(--maxw); margin: 0 auto; padding: 0 24px;
}
.logo img { height: 46px; width: auto; }
.nav { display: flex; align-items: center; gap: 4px; margin-left: 4px; }
.nav a {
  font-family: Poppins, sans-serif; font-size: .95rem; font-weight: 500;
  color: var(--ink); text-decoration: none; padding: .5rem .8rem; border-radius: var(--radius-sm);
}
.nav a:hover { background: var(--accent-lt); color: var(--accent-dk); }
.nav a[aria-current="page"] { color: var(--accent); }

.dropdown { position: relative; }
.dropdown > button {
  font-family: Poppins, sans-serif; font-size: .95rem; font-weight: 500;
  color: var(--ink); background: none; border: 0; cursor: pointer;
  padding: .5rem .8rem; border-radius: var(--radius-sm);
  display: inline-flex; align-items: center; gap: .35rem;
}
.dropdown > button:hover { background: var(--accent-lt); color: var(--accent-dk); }
.dropdown-menu {
  position: absolute; top: calc(100% + 8px); left: 0; min-width: 240px;
  background: #fff; border: 1px solid var(--line); border-radius: var(--radius);
  box-shadow: var(--shadow-lg); padding: 8px; display: none;
}
.dropdown.open .dropdown-menu { display: block; }
.dropdown-menu a { display: block; padding: .6rem .8rem; }

.header-right { margin-left: auto; display: flex; align-items: center; gap: 14px; }
.phone-link {
  font-family: Poppins, sans-serif; font-weight: 600; font-size: .95rem;
  color: var(--ink); text-decoration: none; display: inline-flex; align-items: center; gap: .45rem;
}
.phone-link:hover { color: var(--accent); }
.header-right .txt-link {
  font-family: Poppins, sans-serif; font-size: .93rem; font-weight: 500;
  color: var(--ink); text-decoration: none;
}
.header-right .txt-link:hover { color: var(--accent); }

.burger {
  display: none; background: none; border: 1px solid var(--line);
  border-radius: var(--radius-sm); padding: .5rem .6rem; cursor: pointer; margin-left: auto;
}
.burger span { display: block; width: 20px; height: 2px; background: var(--ink); margin: 4px 0; }

.mobile-nav { display: none; border-top: 1px solid var(--line); background: #fff; padding: 12px 24px 22px; }
/* The menu sits INSIDE a position:sticky header. Once its content is taller than
   the screen, a sticky box taller than the viewport pins at top:0 and its bottom
   can never be scrolled to - so the menu has to scroll itself, not the page. */
.mobile-nav.open {
  display: block;
  max-height: calc(100vh - var(--header-h));
  max-height: calc(100dvh - var(--header-h));
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
  overscroll-behavior: contain;
  padding-bottom: calc(22px + env(safe-area-inset-bottom, 0px));
}
/* Stop the page behind scrolling while the menu is open. Without this a swipe
   that starts on the menu can end up scrolling the document instead, which
   looks exactly like a menu that refuses to move. It also stops Android
   Chrome collapsing its URL bar mid-gesture and changing 100dvh underneath us. */
html.menu-open, body.menu-open { overflow: hidden; }
.mobile-nav a {
  display: block; padding: .7rem 0; font-family: Poppins, sans-serif; font-weight: 500;
  color: var(--ink); text-decoration: none; border-bottom: 1px solid var(--line);
}
.mobile-nav .btn { margin-top: 16px; width: 100%; }

/* ---------- Hero ---------- */
.hero {
  position: relative; min-height: 560px;
  display: flex; align-items: center;
  background-size: cover; background-position: center;
  color: #fff; text-align: center;
}
.hero::after {
  content: ""; position: absolute; inset: 0;
  background: linear-gradient(180deg, rgba(15,42,51,.55) 0%, rgba(15,42,51,.42) 45%, rgba(15,42,51,.72) 100%);
}
.hero__inner { position: relative; z-index: 2; width: 100%; padding: 96px 24px; }
.hero h1 { color: #fff; text-shadow: 0 2px 24px rgba(0,0,0,.35); max-width: 20ch; margin-inline: auto; }
.hero p {
  font-family: Poppins, sans-serif; font-weight: 500; font-size: 1.12rem;
  letter-spacing: .04em; margin: 1rem auto 2rem;
}
.hero__cta { display: flex; gap: 12px; justify-content: center; flex-wrap: wrap; }

.hero--sub { min-height: 420px; }
.hero--sub h1 { max-width: 24ch; }

/* ---------- Trust bar ---------- */
.trustbar { background: var(--ink); color: #fff; }
.trustbar .wrap {
  display: grid; grid-template-columns: repeat(4, 1fr);
  gap: 8px; padding-top: 26px; padding-bottom: 26px;
}
.trustbar div { text-align: center; }
.trustbar strong {
  display: block; font-family: Poppins, sans-serif; font-size: 1.35rem; color: #fff;
}
.trustbar span { font-size: .88rem; color: rgba(255,255,255,.72); }

/* ---------- Split (image + text) ---------- */
.split { display: grid; grid-template-columns: 1fr 1fr; gap: 64px; align-items: center; }
.split img { border-radius: var(--radius); box-shadow: var(--shadow); width: 100%; object-fit: cover; }
.split--reverse .split__media { order: 2; }

/* ---------- Specialty list ---------- */
.spec { display: grid; gap: 26px; }
.spec__item { display: flex; gap: 16px; }
.spec__icon {
  flex: 0 0 44px; height: 44px; border-radius: 12px; background: var(--accent-lt);
  display: grid; place-items: center; color: var(--accent-dk);
}
.spec__item h3 { margin-bottom: .15em; }
.spec__item p { margin: 0; color: var(--muted); font-size: .97rem; }

/* ---------- Checklist ---------- */
.checklist {
  list-style: none; margin: 0; padding: 0;
  display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px 32px;
}
.checklist li {
  display: flex; align-items: center; gap: .65rem;
  font-family: Poppins, sans-serif; font-weight: 500; font-size: .98rem; color: var(--ink);
}
.checklist svg { flex: 0 0 22px; color: var(--accent); }

/* ---------- Cards ---------- */
.cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 22px; }
.card {
  background: #fff; border: 1px solid var(--line); border-radius: var(--radius);
  padding: 28px; box-shadow: var(--shadow); transition: .2s ease;
}
.card:hover { transform: translateY(-3px); box-shadow: var(--shadow-lg); }
.card p { margin: 0; color: var(--muted); font-size: .97rem; }
.card__icon {
  width: 46px; height: 46px; border-radius: 12px; background: var(--accent-lt);
  display: grid; place-items: center; color: var(--accent-dk); margin-bottom: 16px;
}
a.card { text-decoration: none; display: block; }
a.card .more { display: inline-block; margin-top: 14px; font-family: Poppins, sans-serif; font-weight: 600; font-size: .93rem; color: var(--accent); }

/* ---------- Support portals ---------- */
.support-grid {
  display: grid; grid-template-columns: repeat(3, 1fr); gap: 24px; align-items: stretch;
}
.support-card {
  display: flex; flex-direction: column;
  background: #fff; border: 1px solid var(--line); border-radius: var(--radius);
  padding: 32px 28px 28px; box-shadow: var(--shadow); transition: .2s ease;
}
.support-card:hover { transform: translateY(-3px); box-shadow: var(--shadow-lg); }
.support-card h3 { font-size: 1.3rem; margin-bottom: .35em; }
.support-card__blurb { color: var(--muted); font-size: .97rem; }
.support-card .btn { margin-top: auto; width: 100%; }
.support-card__domain {
  display: block; text-align: center; margin-top: 12px;
  font-size: .82rem; color: var(--muted); word-break: break-all;
}
.support-list { list-style: none; margin: 0 0 24px; padding: 0; }
.support-list li {
  display: flex; gap: .6rem; align-items: flex-start;
  font-size: .95rem; margin-bottom: .6rem; color: var(--ink-soft);
}
.support-list svg { flex: 0 0 18px; margin-top: .3rem; color: var(--accent); }

@media (max-width: 980px) {
  .support-grid { grid-template-columns: 1fr; max-width: 520px; margin: 0 auto; }
}

/* ---------- Support department pages ---------- */
.notice {
  background: var(--accent-lt); border-left: 4px solid var(--accent);
  border-radius: var(--radius-sm); padding: 1rem 1.2rem; margin: 1.2rem 0;
}
.notice p:last-child { margin-bottom: 0; }
.notice--warn { background: #FFF6E5; border-left-color: #D9922B; }
.notice--urgent { background: #FDECEA; border-left-color: #C0392B; }

.plain-list { margin: 0 0 1.2rem; padding-left: 1.3rem; }
.plain-list li { margin-bottom: .5rem; }
.plain-list--num { list-style: decimal; }

.faq-body { padding: 0 24px 22px; }
.faq-body p { margin-bottom: .9rem; }
.faq-body .plain-list { margin-bottom: 1rem; }

/* Request-type switcher */
.form-picker {
  display: flex; flex-wrap: wrap; gap: 10px; justify-content: center;
  max-width: 860px; margin: 0 auto 22px;
}
.form-tab {
  font-family: Poppins, sans-serif; font-weight: 600; font-size: .93rem;
  padding: .7rem 1.3rem; border-radius: 999px; cursor: pointer;
  background: #fff; color: var(--ink); border: 2px solid var(--line);
  transition: .18s ease;
}
.form-tab:hover { border-color: var(--accent); color: var(--accent-dk); }
.form-tab.is-active {
  background: var(--accent); border-color: var(--accent); color: #fff;
}

.action-row {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  gap: 22px; margin-top: 1.8rem;
}
.action-note {
  display: block; margin-top: .6rem; font-size: .87rem; color: var(--muted);
}

/* ---------- Gallery ---------- */
.gallery { columns: 3; column-gap: 18px; }
.gallery img {
  width: 100%; margin-bottom: 18px; border-radius: var(--radius);
  break-inside: avoid; box-shadow: var(--shadow); cursor: zoom-in; transition: .2s ease;
}
.gallery img:hover { transform: scale(1.015); box-shadow: var(--shadow-lg); }

.lightbox {
  position: fixed; inset: 0; z-index: 200; background: rgba(15,42,51,.92);
  display: none; align-items: center; justify-content: center; padding: 32px;
}
.lightbox.open { display: flex; }
.lightbox img { max-width: 92vw; max-height: 88vh; border-radius: var(--radius); width: auto; }
.lightbox button {
  position: absolute; top: 20px; right: 24px; background: none; border: 0;
  color: #fff; font-size: 2.4rem; line-height: 1; cursor: pointer;
}

/* ---------- Steps ---------- */
.steps { display: grid; gap: 20px; counter-reset: step; }
.step {
  background: #fff; border: 1px solid var(--line); border-left: 4px solid var(--accent);
  border-radius: var(--radius); padding: 26px 28px; box-shadow: var(--shadow);
}
.step h3 { display: flex; gap: .7rem; align-items: baseline; }
.step h3 .num {
  font-size: .8rem; font-weight: 700; letter-spacing: .08em; color: var(--accent);
  text-transform: uppercase;
}
.step p:last-child { margin-bottom: 0; }
.step ul { margin: 0 0 1rem; padding-left: 1.2rem; }
.step li { margin-bottom: .4rem; }
.callout {
  background: var(--accent-lt); border-radius: var(--radius-sm);
  padding: .9rem 1.1rem; font-size: .95rem; color: var(--ink);
}
.callout strong { color: var(--accent-dk); }

/* ---------- FAQ ---------- */
.faq { max-width: 820px; margin: 0 auto; }
.faq details {
  border: 1px solid var(--line); border-radius: var(--radius);
  background: #fff; margin-bottom: 12px; overflow: hidden;
}
.faq summary {
  cursor: pointer; list-style: none; padding: 20px 56px 20px 24px; position: relative;
  font-family: Poppins, sans-serif; font-weight: 600; font-size: 1.03rem; color: var(--ink);
}
.faq summary::-webkit-details-marker { display: none; }
.faq summary::after {
  content: "+"; position: absolute; right: 24px; top: 50%; transform: translateY(-50%);
  font-size: 1.5rem; font-weight: 400; color: var(--accent); line-height: 1;
}
.faq details[open] summary::after { content: "\2013"; }
.faq details p { padding: 0 24px 22px; margin: 0; color: var(--ink-soft); }

/* ---------- CTA band ---------- */
.cta-band { background: var(--ink); color: #fff; text-align: center; }
.cta-band h2 { color: #fff; }
.cta-band p { color: rgba(255,255,255,.78); max-width: 60ch; margin-inline: auto; }
.cta-band .btn-row { display: flex; gap: 12px; justify-content: center; flex-wrap: wrap; margin-top: 26px; }

/* ---------- Estimate / Jobber embed ---------- */
.embed-shell {
  max-width: 860px; margin: 0 auto; background: #fff;
  border: 1px solid var(--line); border-radius: var(--radius);
  box-shadow: var(--shadow); overflow: hidden;
}
/* Each embedded form carries its own height as --fh (desktop) and --fh-sm
   (narrow screens), set inline on the iframe. The iframe is deliberately
   TALLER than the form needs, and the bottom 190px is clipped by the negative
   margin (the shell has overflow:hidden). That hides ClickUp's "Report Abuse"
   line, which sits below the Submit button and has no setting to turn it off.

   The numbers were measured per form: height = (bottom of Submit) + 230.
   If you add or remove fields in a ClickUp form, its --fh needs re-measuring. */
.embed-shell iframe {
  width: 100%; min-height: var(--fh, 1200px); border: 0; display: block;
  margin-bottom: -190px;
}

/* ---------- Footer ---------- */
.site-footer { background: var(--ink); color: rgba(255,255,255,.78); padding: 66px 0 28px; font-size: .95rem; }
.site-footer h4 {
  color: #fff; font-size: .82rem; letter-spacing: .12em; text-transform: uppercase;
  margin-bottom: 1.1rem;
}
.footer-grid { display: grid; grid-template-columns: 1.4fr 1fr 1.1fr 1fr; gap: 44px; }
.site-footer a { color: rgba(255,255,255,.78); text-decoration: none; }
.site-footer a:hover { color: #fff; text-decoration: underline; }
.site-footer ul { list-style: none; margin: 0; padding: 0; }
.site-footer li { margin-bottom: .5rem; }
.footer-logo { background: #fff; border-radius: 10px; padding: 10px 12px; display: inline-block; margin-bottom: 16px; }
.footer-logo img { height: 44px; width: auto; }
.hours { display: grid; grid-template-columns: auto 1fr; gap: .35rem 1.2rem; font-size: .92rem; }
.hours span:nth-child(even) { text-align: right; color: rgba(255,255,255,.62); }
.footer-bottom {
  border-top: 1px solid rgba(255,255,255,.14); margin-top: 44px; padding-top: 22px;
  display: flex; justify-content: space-between; gap: 16px; flex-wrap: wrap;
  font-size: .87rem; color: rgba(255,255,255,.55);
}

/* ---------- Responsive ---------- */
@media (max-width: 980px) {
  .nav, .header-right .txt-link { display: none; }
  .header-right { display: none; }
  .burger { display: block; }
  .split { grid-template-columns: 1fr; gap: 36px; }
  .split--reverse .split__media { order: 0; }
  .checklist { grid-template-columns: repeat(2, 1fr); }
  .gallery { columns: 2; }
  .footer-grid { grid-template-columns: 1fr 1fr; gap: 34px; }
  .trustbar .wrap { grid-template-columns: repeat(2, 1fr); gap: 20px; }
}
@media (max-width: 640px) {
  body { font-size: 16px; }
  .section { padding: 60px 0; }
  .hero { min-height: 480px; }
  .checklist { grid-template-columns: 1fr; }
  .gallery { columns: 1; }
  .footer-grid { grid-template-columns: 1fr; }
  .embed-shell iframe { min-height: var(--fh-sm, var(--fh, 1700px)); }
}

/* =========================================================
   Local pages — credentials, service areas, watering guide
   (added for the city / builder / resource pages)
   ========================================================= */

/* --- Credentials strip --- */
.creds { display: grid; grid-template-columns: repeat(4, 1fr); gap: 18px; }
.cred {
  background: var(--white); border: 1px solid var(--line); border-radius: var(--radius);
  padding: 22px 20px; box-shadow: var(--shadow); display: flex; gap: 14px; align-items: flex-start;
}
.cred svg { flex: none; color: var(--accent); margin-top: 2px; }
.cred h3 { font-size: 1.02rem; margin: 0 0 .25em; }
.cred p { margin: 0; font-size: .93rem; color: var(--muted); line-height: 1.5; }

/* --- Breadcrumbs --- */
.crumbs { font-size: .87rem; color: var(--muted); padding: 18px 0 0; }
.crumbs a { color: var(--muted); text-decoration: none; }
.crumbs a:hover { color: var(--accent); text-decoration: underline; }
.crumbs span { margin: 0 6px; opacity: .5; }

/* --- Service-area link grid --- */
.area-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 14px; }
.area-grid a {
  display: block; background: var(--white); border: 1px solid var(--line);
  border-radius: var(--radius-sm); padding: 16px 18px; text-decoration: none;
  color: var(--ink); font-weight: 600; transition: .16s;
}
.area-grid a:hover { border-color: var(--accent); box-shadow: var(--shadow); transform: translateY(-1px); }
.area-grid a small { display: block; font-weight: 400; color: var(--muted); font-size: .82rem; margin-top: 2px; }

/* --- Fact list (city pages) --- */
.factlist {
  display: grid; grid-template-columns: max-content 1fr; gap: 10px 22px;
  background: var(--white); border: 1px solid var(--line); border-radius: var(--radius);
  padding: 26px 28px; margin: 0 0 8px; box-shadow: var(--shadow);
}
.factlist dt { font-weight: 600; color: var(--ink); }
.factlist dd { margin: 0; color: var(--ink-soft); }

/* --- Simple data table (watering guide) --- */
.wtable-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; }
.wtable { width: 100%; border-collapse: collapse; font-size: .95rem; min-width: 520px; background: var(--white); }
.wtable th, .wtable td { text-align: left; padding: 13px 16px; border-bottom: 1px solid var(--line); vertical-align: top; }
.wtable thead th { background: var(--accent-lt); color: var(--ink); font-family: Poppins, sans-serif; font-weight: 600; font-size: .9rem; }
.wtable tbody tr:last-child td { border-bottom: 0; }
.wtable caption { caption-side: bottom; padding-top: 12px; font-size: .85rem; color: var(--muted); text-align: left; }

/* --- Two-column prose --- */
.prose-cols { display: grid; grid-template-columns: 1fr 1fr; gap: 20px 48px; }
.prose-cols h3 { margin-top: 0; }

@media (max-width: 980px) {
  .creds { grid-template-columns: repeat(2, 1fr); }
  .area-grid { grid-template-columns: repeat(3, 1fr); }
  .prose-cols { grid-template-columns: 1fr; gap: 4px; }
}
@media (max-width: 640px) {
  .creds { grid-template-columns: 1fr; }
  .area-grid { grid-template-columns: repeat(2, 1fr); }
  .factlist { grid-template-columns: 1fr; gap: 2px 0; padding: 22px; }
  .factlist dt { margin-top: 12px; }
  .factlist dt:first-child { margin-top: 0; }
}

/* --- Nav breakpoint ---------------------------------------------------
   The top navigation gained "Service Areas" and "For Builders", which no
   longer fit between roughly 980px and 1100px wide. Switch to the burger
   menu a little earlier so the header never wraps onto two lines.
   ------------------------------------------------------------------- */
.nav a, .dropdown > button, .phone-link { white-space: nowrap; }
@media (max-width: 1180px) {
  .nav, .header-right { display: none; }
  .burger { display: block; }
}

/* Section label inside the mobile menu (e.g. "Commercial") - not a link. */
/* Section headings inside the mobile menu. These were <a> elements with no
   href, which a screen reader announces as four more links on every page and
   which the keyboard cannot reach - so they are plain <div>s now and this rule
   no longer selects an anchor. */
.mobile-nav .mobile-nav__label {
  display: block; font-family: Poppins, sans-serif;
  padding: 18px 0 6px; border-bottom: 0; color: var(--muted);
  font-size: .74rem; font-weight: 600; letter-spacing: .1em; text-transform: uppercase;
}

/* Force a 3-up grid where a 6-card section would otherwise land 4 + 2. */
.cards--3 { grid-template-columns: repeat(3, 1fr); }
@media (max-width: 980px) { .cards--3 { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 640px) { .cards--3 { grid-template-columns: 1fr; } }

/* --- Footer refinements -------------------------------------------------
   Four balanced columns instead of one very long link list, hours condensed
   to the two lines they actually need, and the phone number given weight.
   ---------------------------------------------------------------------- */
.footer-grid { grid-template-columns: 1.5fr 1fr 1.15fr 1.05fr; }
.footer-meta { font-size: .86rem; color: rgba(255,255,255,.5); margin-top: -.35rem; }
.footer-logo { padding: 11px 15px; }
.footer-phone {
  display: inline-block; font-family: Poppins, sans-serif; font-weight: 600;
  font-size: 1.16rem; color: #fff !important; text-decoration: none; margin-bottom: 1rem;
}
.footer-phone:hover { text-decoration: underline; }
/* Sits directly under the phone in the footer Contact column. Deliberately a
   step down in weight from the phone: calling still gets someone the fastest
   answer, and the address is the alternative for people who would rather not. */
.footer-email {
  display: block; font-size: .95rem; color: rgba(255,255,255,.82) !important;
  text-decoration: none; margin: -.55rem 0 1rem;
  /* No break-word: that split the domain mid-name. The <wbr> in the markup
     sits after the @, so a narrow phone breaks there instead. */
  overflow-wrap: normal;
}
.footer-email:hover { text-decoration: underline; color: #fff !important; }
/* On a narrow phone the footer is two columns, leaving each about 170px, and
   the address wrapped mid-word as "info@ntllandscape.co / m". A step down in
   size keeps it on one line; break-word above stays only as a last resort. */
@media (max-width: 560px) { .footer-email { font-size: .84rem; } }
.site-footer .hours { margin-bottom: 1.15rem; }
.footer-actions { border-top: 1px solid rgba(255,255,255,.14); padding-top: 1rem !important; }
.footer-bottom a { color: rgba(255,255,255,.55); }
@media (max-width: 980px) {
  .footer-grid { grid-template-columns: 1fr 1fr; }
}

/* Contact column is narrow, so stack each hours row instead of letting
   "8:00 AM - 5:00 PM" wrap across three lines. */
.site-footer .hours { display: block; }
.site-footer .hours span:nth-child(odd) {
  display: block; font-size: .78rem; letter-spacing: .04em;
  color: rgba(255,255,255,.5); text-transform: uppercase;
}
.site-footer .hours span:nth-child(even) {
  display: block; text-align: left; white-space: nowrap;
  color: rgba(255,255,255,.85); margin-bottom: .6rem;
}

/* Keep the footer two columns even on a phone. Four stacked columns made it
   about 1300px tall; two keeps it readable and roughly a third shorter. */
@media (max-width: 640px) {
  .footer-grid { grid-template-columns: 1fr 1fr; gap: 30px 22px; }
  .footer-bottom { flex-direction: column; gap: 8px; }
}

/* The logo must never be squeezed out of the header by a long nav.
   (Adding a seventh nav item once shrank it to zero width.) */
.logo, .logo img, .header-right { flex: none; }

/* Subheadings inside the Services dropdown (Residential / Commercial). */
.dropdown-menu__label {
  display: block; padding: 12px 13px 5px; font-family: Poppins, sans-serif;
  font-size: .68rem; font-weight: 600; letter-spacing: .12em; text-transform: uppercase;
  color: var(--muted); pointer-events: none; user-select: none;
}
.dropdown-menu__label ~ .dropdown-menu__label {
  border-top: 1px solid var(--line); margin-top: 8px; padding-top: 14px;
}

/* =========================================================
   Mobile fixes
   Found by auditing every page at 390px and 360px wide.
   ========================================================= */

/* 1. Buttons ------------------------------------------------------------
   .btn is white-space:nowrap, which is right on a desktop but pushed
   several pages sideways on a phone whenever a label was long. Let them
   wrap on small screens and never exceed their container. */
.btn { max-width: 100%; }
@media (max-width: 720px) {
  .btn { white-space: normal; text-align: center; line-height: 1.35; }
  .btn--lg { padding: .95rem 1.5rem; font-size: 1rem; }
}

/* 2. Wide tables become stacked cards ------------------------------------
   Six columns cannot be read in a 342px scroll box. Below 720px each row
   becomes its own card and every cell is labelled from its column heading
   (the data-label attribute), so nothing scrolls sideways at all. */
@media (max-width: 720px) {
  .wtable-wrap { overflow: visible; }
  .wtable { min-width: 0; border-collapse: separate; border-spacing: 0; background: none; }
  .wtable thead { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); }
  .wtable tbody tr {
    display: block; background: var(--white); border: 1px solid var(--line);
    border-radius: var(--radius); padding: 16px 18px; margin-bottom: 14px;
    box-shadow: var(--shadow);
  }
  .wtable tbody th[scope="row"] {
    display: block; border: 0; padding: 0 0 10px;
    font-family: Poppins, sans-serif; font-size: 1.06rem; color: var(--ink);
  }
  .wtable td { display: block; border: 0; padding: 7px 0 0; }
  .wtable td::before {
    content: attr(data-label); display: block; margin-bottom: 1px;
    font-family: Poppins, sans-serif; font-size: .7rem; font-weight: 600;
    letter-spacing: .09em; text-transform: uppercase; color: var(--muted);
  }
  .wtable td:empty { display: none; }
  /* group heading rows inside the plant palette */
  .wtable tbody tr.wtable__group {
    background: none; border: 0; box-shadow: none; padding: 0;
    margin: 26px 0 12px;
  }
  .wtable tbody tr.wtable__group th {
    display: block; padding: 9px 14px; border: 0; border-radius: var(--radius-sm);
    font-family: Poppins, sans-serif; font-size: .78rem; font-weight: 600;
    letter-spacing: .1em; text-transform: uppercase; color: var(--ink);
  }
  .wtable caption { padding-top: 4px; }
}

/* 3. Footer links were 17px tall - too small to tap reliably. */
@media (max-width: 640px) {
  .site-footer li { margin-bottom: 0; }
  .site-footer li a { display: block; padding: .48rem 0; }
  .footer-actions { padding-top: .6rem !important; }
}

/* 4. Grid children default to min-width:auto, so a single wide child can push
   its whole track past the viewport. This is what made the winterization
   steps overflow on a phone. */
.steps > *, .cards > *, .split > *, .footer-grid > *, .area-grid > *, .creds > * { min-width: 0; }

@media (max-width: 720px) {
  .step { padding: 20px 18px; }
  /* the flex row forced a wide min-content; stacking reads better anyway */
  .step h3 { display: block; }
  .step h3 .num { display: block; margin-bottom: 3px; }
  .callout { padding: .85rem 1rem; }
  .wtable thead { display: none; }
}

/* 5. On a phone the phone number is the most important thing to be able to
   hit. Inline tel: links were 16-19px tall. Breadcrumbs got the same
   treatment. (Ordinary links inside prose are left alone - they should
   sit on the text baseline, not become buttons.) */
@media (max-width: 720px) {
  a[href^="tel:"] { display: inline-block; padding: .34rem 0; }
  .crumbs a { display: inline-block; padding: .3rem 0; }
  .footer-bottom a[href^="tel:"] { padding: .2rem 0; }
}

/* 6. On a phone, paired buttons should be full width and equal rather than
   each sized to its own label - a narrow "Call" next to a wide "Get an
   Estimate" looks accidental. */
@media (max-width: 640px) {
  .hero__cta, .cta-band .btn-row, .btn-row { flex-direction: column; align-items: stretch; }
  .hero__cta .btn, .cta-band .btn-row .btn, .btn-row .btn { width: 100%; }
}

/* =========================================================
   Sticky call bar (phones) + seasonal strip
   ========================================================= */
.callbar { display: none; }
/* while the menu is open it would sit on top of the menu, and the menu already
   ends with a phone number and an estimate button */
body.menu-open .callbar { display: none !important; }
@media (max-width: 720px) {
  .callbar {
    display: grid; grid-template-columns: 1fr 1fr; gap: 8px;
    position: fixed; left: 0; right: 0; bottom: 0; z-index: 70;
    padding: 9px 10px calc(9px + env(safe-area-inset-bottom, 0px));
    background: rgba(255,255,255,.97);
    border-top: 1px solid var(--line);
    box-shadow: 0 -4px 18px rgba(15,42,51,.10);
  }
  .callbar a {
    display: flex; align-items: center; justify-content: center; gap: .45rem;
    font-family: Poppins, sans-serif; font-weight: 600; font-size: .95rem;
    padding: .8rem .6rem; border-radius: 999px; text-decoration: none;
    border: 2px solid transparent; line-height: 1;
  }
  .callbar__call  { background: var(--accent); color: #fff; }
  .callbar__quote { background: transparent; color: var(--ink); border-color: var(--line); }
  /* keep the footer clear of the bar */
  body { padding-bottom: 74px; }
}

/* Seasonal strip - hidden until site.js fills it, so it never shows empty. */
.seasonal { background: var(--ink); color: rgba(255,255,255,.85); font-size: .95rem; }
.seasonal[hidden] { display: none; }
.seasonal .wrap {
  padding-top: 14px; padding-bottom: 14px;
  display: flex; align-items: center; justify-content: center;
  gap: 10px 14px; flex-wrap: wrap; text-align: center;
}
.seasonal__tag {
  font-family: Poppins, sans-serif; font-size: .7rem; font-weight: 700;
  letter-spacing: .12em; text-transform: uppercase;
  color: var(--ink); background: #fff; border-radius: 999px; padding: .3rem .7rem;
}
.seasonal__link { color: #fff; font-weight: 600; white-space: nowrap; }
.seasonal__link:hover { text-decoration: underline; }
@media (max-width: 640px) {
  .seasonal .wrap { flex-direction: column; gap: 8px; }
}

/* ---------------------------------------------------------------------------
   Games (Yard Smarts "just for fun" section)
   Each game is a self-contained full-viewport app in games/, so it is iframed.
   Do NOT reuse .embed-shell here - its negative margin exists only to crop
   ClickUp's "Report Abuse" link and would chop the bottom off a game.
   --------------------------------------------------------------------------- */
.games { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 24px; }
.game {
  background: var(--white); border: 1px solid var(--line);
  border-radius: var(--radius); padding: 22px 22px 18px;
  display: flex; flex-direction: column; min-width: 0;
}
.game h3 { margin: 0 0 .4rem; }
.game p { margin: 0 0 16px; }
.game > p:first-of-type { flex: 1 1 auto; }
.game__stage, .game__frame {
  display: block; width: 100%; max-width: 440px; height: 600px;
  margin: 0 auto; border: 0; border-radius: var(--radius-sm);
  background: #123b0c; overflow: hidden;
}
/* the unplayed poster is shorter than the frame it holds once played - it only
   has to fit a button, and three tall empty panels would dominate the section.
   site.js puts the iframe INSIDE the poster, so the poster must give up its own
   height and its overflow clip at that point or it crops the game. */
.game__stage { height: 420px; }
.game__stage.is-playing {
  display: block; height: auto; overflow: visible;
  background: none; border-radius: 0; max-width: none;
}
/* the poster the visitor clicks to start - the iframe replaces it in site.js */
.game__stage {
  display: flex; align-items: center; justify-content: center;
  background:
    radial-gradient(circle at 50% 34%, rgba(143,212,92,.20), transparent 62%),
    repeating-linear-gradient(0deg, #16490f 0 22px, #123b0c 22px 44px);
}
.game__play {
  font-family: Poppins, sans-serif; font-weight: 600; font-size: 1rem;
  color: #123b0c; background: #fff; border: 0; border-radius: 999px;
  padding: .85rem 1.6rem; cursor: pointer; box-shadow: 0 6px 18px rgba(0,0,0,.28);
  display: inline-flex; align-items: center; gap: .5rem; line-height: 1;
  max-width: 86%; text-align: center;
}
.game__play::before { content: "\25B6"; font-size: .8em; }
.game__play:hover { background: var(--accent); color: #fff; }
.game__more { margin: 14px auto 0; }
.game__note { display: none; margin: 10px 0 0; font-size: .85rem; text-align: center; }
@media (max-width: 1080px) {
  .games { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 760px) {
  .games { grid-template-columns: 1fr; }
}
@media (max-width: 720px) {
  .game { padding: 18px 14px 14px; }
  .game__frame { height: 600px; }
  /* stacked on a phone, so the unplayed poster does not need to fill a column */
  .game__stage { height: 320px; }
  .game__note { display: block; }
}
@media (max-width: 380px) {
  .game__frame { height: 560px; }
}

/* ---------------------------------------------------------------------------
   City-limits map (city pages). SVGs are generated by _genmaps.py from Census
   boundary data - see the README. They are plain <img>, so no script runs.
   --------------------------------------------------------------------------- */
.citymap { margin: 40px 0 0; }
.citymap img {
  display: block; width: 100%; max-width: 900px; margin: 0 auto;
  border: 1px solid var(--line); border-radius: var(--radius); background: #F6F9F8;
  cursor: zoom-in;
}
/* the lightbox sizes gallery photos to fit; a map wants the full width it can get */
/* An SVG has no intrinsic pixel size, so max-width alone leaves the map tiny
   in the lightbox. Give it an explicit width and let the height follow. */
.lightbox img[src*="/maps/"] {
  width: 96vw; max-width: 96vw; height: auto; background: #F6F9F8;
  flex: none;   /* .lightbox is a flex container - without this the map is shrunk
                   to share the row with the close button instead of filling it */
}
.citymap figcaption {
  max-width: 900px; margin: 12px auto 0; font-size: .88rem; color: var(--muted);
  text-align: center; line-height: 1.6;
}
@media (max-width: 720px) {
  .citymap { margin-top: 28px; }
  .citymap figcaption { font-size: .82rem; text-align: left; }
}

/* ---------------------------------------------------------------------------
   Satellite view (city pages). Google's iframe is only created on click - see
   site.js - so no third-party request happens for visitors who never ask.
   --------------------------------------------------------------------------- */
.satmap { max-width: 900px; margin: 22px auto 0; }
.satmap__stage {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 10px; padding: 26px 18px;
  border: 1px dashed var(--line); border-radius: var(--radius); background: var(--white);
}
.satmap__stage.is-loaded { display: block; padding: 0; border-style: solid; overflow: hidden; }
.satmap__play {
  font-family: Poppins, sans-serif; font-weight: 600; font-size: .98rem;
  color: var(--ink); background: #fff; border: 1px solid var(--line);
  border-radius: 999px; padding: .75rem 1.4rem; cursor: pointer; line-height: 1;
}
.satmap__play:hover { background: var(--accent); color: #fff; border-color: var(--accent); }
.satmap__note { margin: 0; font-size: .82rem; color: var(--muted); text-align: center; }
.satmap__frame { display: block; width: 100%; height: 460px; border: 0; }
@media (max-width: 720px) {
  .satmap__frame { height: 340px; }
}

/* =========================================================
   NTL-Ai assistant
   Layering: header 60, call bar 70, launcher 75, panel 150,
   lightbox 200. The panel deliberately sits below the lightbox
   so a map opened behind it still wins.
   ========================================================= */
.ntlai-launch {
  position: fixed; right: 18px; bottom: 18px; z-index: 75;
  display: inline-flex; align-items: center; gap: .5rem;
  font-family: Poppins, sans-serif; font-weight: 600; font-size: .95rem;
  padding: .78rem 1.15rem; border: 0; border-radius: 999px; cursor: pointer;
  background: var(--accent); color: #fff; box-shadow: var(--shadow-lg);
  transition: transform .15s ease, background .15s ease;
}
.ntlai-launch:hover { background: var(--accent-dk); transform: translateY(-1px); }
.ntlai-launch:focus-visible { outline: 3px solid var(--ink); outline-offset: 2px; }
.ntlai-launch svg { flex: none; }
.ntlai-launch[hidden] { display: none; }

/* Above the sticky call bar, not under it. The call bar is 62px plus its own
   safe-area padding, and body already carries 74px of bottom padding. */
@media (max-width: 720px) {
  .ntlai-launch {
    right: 12px; bottom: calc(84px + env(safe-area-inset-bottom, 0px));
    padding: .7rem 1rem; font-size: .9rem;
  }
}

.ntlai {
  position: fixed; z-index: 150; right: 18px; bottom: 18px;
  width: 396px; max-width: calc(100vw - 36px);
  height: 580px; max-height: calc(100vh - 120px); max-height: calc(100dvh - 120px);
  display: none; flex-direction: column; overflow: hidden;
  background: var(--white); border: 1px solid var(--line);
  border-radius: var(--radius); box-shadow: var(--shadow-lg);
}
.ntlai.open { display: flex; }

/* Full screen on phones. A 396px panel floating over a 360px viewport is
   unusable, and the call bar would poke through the bottom of it. */
@media (max-width: 720px) {
  .ntlai {
    right: 0; bottom: 0; left: 0; top: 0;
    width: 100%; max-width: none; height: 100%; max-height: none;
    border-radius: 0; border: 0;
  }
  body.ntlai-open .callbar { display: none !important; }
}
html.ntlai-open, body.ntlai-open { overflow: hidden; }
@media (min-width: 721px) { html.ntlai-open, body.ntlai-open { overflow: auto; } }

.ntlai__top {
  display: flex; align-items: center; gap: .7rem; flex: none;
  padding: 13px 14px; background: var(--ink); color: #fff;
}
.ntlai__mark {
  width: 34px; height: 34px; flex: none; border-radius: 9px;
  background: var(--accent); display: grid; place-items: center;
}
.ntlai__who { flex: 1; min-width: 0; line-height: 1.25; }
.ntlai__who b { font-family: Poppins, sans-serif; font-size: .98rem; display: block; }
.ntlai__who span { font-size: .78rem; color: rgba(255,255,255,.72); }
.ntlai__x {
  flex: none; width: 34px; height: 34px; border: 0; border-radius: 8px; cursor: pointer;
  background: rgba(255,255,255,.12); color: #fff; font-size: 1.15rem; line-height: 1;
}
.ntlai__x:hover { background: rgba(255,255,255,.22); }

.ntlai__log {
  flex: 1; min-height: 0; overflow-y: auto; -webkit-overflow-scrolling: touch;
  overscroll-behavior: contain; padding: 16px 14px; background: var(--sand);
  display: flex; flex-direction: column; gap: 12px;
}
.ntlai__msg { max-width: 88%; font-size: .94rem; line-height: 1.5; }
.ntlai__msg p { margin: 0 0 .55rem; }
.ntlai__msg p:last-child { margin-bottom: 0; }
.ntlai__msg ul { margin: .3rem 0 .55rem; padding-left: 1.1rem; }
.ntlai__msg li { margin-bottom: .2rem; }
.ntlai__msg a { color: inherit; }
.ntlai__msg--bot {
  align-self: flex-start; background: var(--white); color: var(--ink-soft);
  border: 1px solid var(--line); border-radius: 14px 14px 14px 4px; padding: 11px 13px;
}
.ntlai__msg--bot a { color: var(--accent-dk); }
.ntlai__msg--me {
  align-self: flex-end; background: var(--accent); color: #fff;
  border-radius: 14px 14px 4px 14px; padding: 11px 13px;
}
.ntlai__msg--sys {
  align-self: center; max-width: 100%; text-align: center;
  font-size: .82rem; color: var(--muted);
}

.ntlai__status {
  align-self: flex-start; display: flex; align-items: center; gap: .45rem;
  font-size: .84rem; color: var(--muted);
}
.ntlai__dots { display: inline-flex; gap: 3px; }
.ntlai__dots i {
  width: 5px; height: 5px; border-radius: 50%; background: var(--muted);
  animation: ntlai-b 1.2s infinite ease-in-out;
}
.ntlai__dots i:nth-child(2) { animation-delay: .18s; }
.ntlai__dots i:nth-child(3) { animation-delay: .36s; }
@keyframes ntlai-b { 0%,60%,100% { opacity:.25; transform:translateY(0); } 30% { opacity:1; transform:translateY(-3px); } }
@media (prefers-reduced-motion: reduce) { .ntlai__dots i { animation: none; opacity: .5; } }

.ntlai__chips { display: flex; flex-wrap: wrap; gap: 7px; margin-top: 2px; }
.ntlai__chips button {
  font: inherit; font-size: .84rem; cursor: pointer; padding: .42rem .7rem;
  background: var(--white); color: var(--accent-dk);
  border: 1px solid var(--line); border-radius: 999px;
}
.ntlai__chips button:hover { border-color: var(--accent); background: var(--accent-lt); }

.ntlai__foot { flex: none; border-top: 1px solid var(--line); background: var(--white); }
.ntlai__row { display: flex; gap: 8px; align-items: flex-end; padding: 10px 10px 6px; }

/* Photo attachment. The clip sits at the same 40px as the send button so the
   composer keeps a single baseline whether or not anything is attached. */
.ntlai__clip {
  flex: none; width: 40px; height: 40px; border: 1px solid var(--line);
  border-radius: 10px; cursor: pointer; background: var(--sand);
  color: var(--muted); display: grid; place-items: center;
}
.ntlai__clip:hover { color: var(--accent); border-color: var(--accent); background: var(--white); }
.ntlai__clip:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
.ntlai__thumbs { display: flex; gap: 8px; flex-wrap: wrap; padding: 10px 10px 0; }
.ntlai__thumb { position: relative; width: 56px; height: 56px; }
.ntlai__thumb img {
  width: 100%; height: 100%; object-fit: cover;
  border-radius: 8px; border: 1px solid var(--line); display: block;
}
.ntlai__thumb button {
  position: absolute; top: -6px; right: -6px; width: 20px; height: 20px; padding: 0;
  border: 0; border-radius: 50%; cursor: pointer; background: var(--ink); color: #fff;
  font-size: 14px; line-height: 18px; display: grid; place-items: center;
}
.ntlai__thumb button:hover { background: #b3261e; }
.ntlai__in {
  flex: 1; min-width: 0; font: inherit; font-size: .94rem; resize: none;
  max-height: 110px; padding: .6rem .7rem; color: var(--ink-soft);
  border: 1px solid var(--line); border-radius: 10px; background: var(--sand);
}
.ntlai__in:focus { outline: 2px solid var(--accent); outline-offset: -1px; background: var(--white); }
.ntlai__send {
  flex: none; width: 40px; height: 40px; border: 0; border-radius: 10px; cursor: pointer;
  background: var(--accent); color: #fff; display: grid; place-items: center;
}
.ntlai__send:hover:not(:disabled) { background: var(--accent-dk); }
.ntlai__send:disabled { opacity: .45; cursor: default; }
.ntlai__fine {
  margin: 0; padding: 0 12px 10px; font-size: .74rem; color: var(--muted); text-align: center;
}
.ntlai__fine a { color: var(--muted); }
