@media (min-width: 992px) {
/* ===== Hero estimate form card (column custom class: hero-form-card) ===== */
.hero-form-card {
  background: #ffffff !important;
  border-top: 4px solid #53b3c8;
  border-radius: 4px;
  box-shadow: 0 18px 50px rgba(0, 0, 0, 0.35);
  padding: 30px 28px;
}
/* Form title */
.hero-form-card .zcwf_title,
.hero-form-card h1, .hero-form-card h2, .hero-form-card h3 {
  color: #0d2b4c !important;
  font-family: 'Oswald', sans-serif;
  text-transform: uppercase;
  font-size: 23px;
  line-height: 1.2;
}
/* Field labels */
.hero-form-card label,
.hero-form-card .zcwf_col_lab {
  color: #0d2b4c !important;
  font-family: 'Source Sans 3', sans-serif;
  font-size: 11px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 1px;
}
/* Text inputs */
.hero-form-card input:not([type=submit]):not([type=reset]):not([type=button]) {
  background: #fbfcfd !important;
  border: 1px solid #dde5ec !important;
  border-radius: 3px;
  color: #2b3440 !important;
  padding: 11px 12px;
  font-size: 15px;
  width: 100%;
  box-sizing: border-box;
}
.hero-form-card input:focus { border-color: #53b3c8 !important; background: #ffffff !important; outline: none; }
/* Submit button */
.hero-form-card input[type=submit],
.hero-form-card .zcwf_button {
  background: #53b3c8 !important;
  color: #ffffff !important;
  border: none !important;
  border-radius: 3px;
  padding: 14px 24px;
  font-family: 'Source Sans 3', sans-serif;
  font-size: 14px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 1px;
  width: 100%;
  cursor: pointer;
}
.hero-form-card input[type=submit]:hover,
.hero-form-card .zcwf_button:hover { background: #0d2b4c !important; }
/* Hide secondary Reset button if CRM injects one */
.hero-form-card input[type=reset] { display: none !important; }


/* ===== Header: tighten vertical padding (was 32px/32px) ===== */
.theme-header .zpcontainer { padding-top: 12px !important; padding-bottom: 12px !important; }

/* ===== Hero left-column CTA buttons: force 4px border-radius on all four corners (Noah 2026-06-18 PM). The Zoho builder's "border radius 4" input was producing 0px for REQUEST FREE ESTIMATE (no border-radius written to its per-element style at all) and 2px for CALL NOW (per-element style had border-radius:2px, not 4 as set in the UI). This forces 4px on every CTA in the hero's left column without touching the form's submit button. ===== */
.zpsection:has(.hero-form-card) [class*="zpcol-md"]:not(.hero-form-card) a.zpbutton { border-radius: 4px !important; }

/* ===== Header nav "REQUEST FREE ESTIMATE" CTA — match render (Kacey 2026-06-15 review). Render: Deep Navy bg, white text, uppercase, modest tracking. Current Zoho theme paints it light cyan with dark text. The selector mirrors Zoho's own selector chain so specificity matches, then !important wins. The "* {color}" rule covers Zoho's inner <span class="theme-menu-name"> which holds the text color independently. ===== */
.theme-header .theme-navigation-and-icons .theme-menu-area .theme-menu ul li.menu-highlight-primary > a,
.theme-header li.menu-highlight-primary > a {
  background-color: #0d2b4c !important;
  background: #0d2b4c !important;
  border: 0 !important;
  border-radius: 4px !important;
  padding: 12px 22px !important;
  font-size: 12px !important;
  font-weight: 600 !important;
  letter-spacing: 1.2px !important;
  text-transform: uppercase !important;
  color: #ffffff !important;
  transition: background-color 0.2s ease !important;
}
.theme-header .theme-navigation-and-icons .theme-menu-area .theme-menu ul li.menu-highlight-primary > a *,
.theme-header li.menu-highlight-primary > a * {
  color: #ffffff !important;
}
.theme-header .theme-navigation-and-icons .theme-menu-area .theme-menu ul li.menu-highlight-primary > a:hover,
.theme-header li.menu-highlight-primary > a:hover {
  background-color: #53b3c8 !important;
  background: #53b3c8 !important;
  color: #ffffff !important;
}


/* ===== Hero form: PNG-match refinements (gold CTA, rounded inputs, placeholders) ===== */
.hero-form-card input:not([type=submit]):not([type=reset]):not([type=button]) { border-radius: 6px !important; }
.hero-form-card input::placeholder { color: #9aa7b2; opacity: 1; }
.hero-form-card input[type=submit],
.hero-form-card .zcwf_button { background: #fcc852 !important; color: #0d2b4c !important; }
.hero-form-card input[type=submit]:hover,
.hero-form-card .zcwf_button:hover { background: #0d2b4c !important; color: #ffffff !important; }

.hero-form-card input[type=submit] { width: 100% !important; text-transform: uppercase !important; font-weight: 700 !important; letter-spacing: 1px !important; padding: 14px 24px !important; }

/* ===== CTA color correction: Deep Navy per locked palette (NO gold/orange — Kacey) ===== */
.hero-form-card input[type=submit],
.hero-form-card .zcwf_button { background: #0d2b4c !important; color: #ffffff !important; }
.hero-form-card input[type=submit]:hover,
.hero-form-card .zcwf_button:hover { background: #53b3c8 !important; color: #ffffff !important; }

/* ===== Hero form: labels above inputs (all rows), per PNG ===== */
.hero-form-card ul.zpform-outer li { display: block !important; }
.hero-form-card .zpform-label-container,
.hero-form-card .zpform-field-container { display: block !important; width: 100% !important; max-width: 100% !important; }
.hero-form-card .zpform-label-container { margin-bottom: 5px; }

/* keep the hidden Lead Source row hidden (label-above rule un-hid it) */
.hero-form-card ul.zpform-outer li:has(select) { display: none !important; }

/* ===== Hero form: compact sizing per PNG (2026-06-12) — refined 2026-06-18 PM per Kacey Jun 15 review (compact spacing, larger icon, +icon→heading gap, header divider). ===== */
.hero-form-card { max-width: 370px !important; margin-left: auto !important; margin-top: 20px !important; padding: 20px 24px !important; align-self: flex-start !important; }
/* 2026-06-18 PM (Noah, after Kacey form pass): narrowed 410→370 to match render width; align-self:flex-start + margin-top:20px raises the form so its OUTER (white card) top sits on the same horizontal line as the eyebrow text "BUILT ON 30+ YEARS..." (eyebrow top y=135 = row top 115 + margin 20). Was vertically centered in the hero row, sitting ~95px lower. */
.hero-form-card ul.zpform-outer li { margin-bottom: 0 !important; padding-top: 0 !important; padding-bottom: 6px !important; }
.hero-form-card .zpform-label-container { margin-bottom: 2px !important; line-height: 1.1 !important; }
.hero-form-card label { font-size: 12px !important; font-weight: 700 !important; letter-spacing: 1px !important; color: #0d2b4c !important; line-height: 1.1 !important; margin: 0 !important; padding: 0 !important; display: inline-block !important; }
/* Placeholder color/weight: previously rgba(255,255,255,0.5) so the placeholder text was invisible on the white form bg. Set to a muted Deep Navy (40% alpha) with normal weight so placeholders read as the render's softer hint text. */
.hero-form-card input::placeholder { color: rgba(13,43,76,0.40) !important; opacity: 1 !important; font-weight: 400 !important; }
.hero-form-card input::-webkit-input-placeholder { color: rgba(13,43,76,0.40) !important; opacity: 1 !important; font-weight: 400 !important; }
.hero-form-card input:not([type=submit]):not([type=reset]):not([type=button]) { padding: 9px 12px !important; font-size: 14px !important; }
.hero-form-card input[type=submit] { padding: 12px 20px !important; font-size: 13px !important; margin-top: 10px !important; }
.hero-form-card .zpform-container.zpform-topspace { margin-top: 6px !important; }
/* Header: larger icon, more icon→heading gap, subtle divider beneath header — Kacey 2026-06-15 */
#hfc-head { gap: 18px !important; margin-bottom: 14px !important; padding-bottom: 14px !important; border-bottom: 1px solid rgba(13,43,76,0.15) !important; }
#hfc-head .hfc-icon { width: 64px !important; height: 64px !important; }
#hfc-head .hfc-icon svg,
#hfc-head .hfc-icon img { width: 32px !important; height: 32px !important; }
#hfc-head .hfc-title { font-size: 19px !important; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif !important; }
#hfc-head .hfc-sub { font-size: 13px !important; }
#hfc-note { margin-top: 8px !important; }


/* ===== FOOTER (theme-footer-area) — Deep Navy premium, spec Section 14 ===== */
.theme-footer-area { background: #001931 !important; padding: 7px 0 26px !important; } /* 2026-06-17: darkened from #0d2b4c -> #001931 to match refinedFooter.png render (Design Standards palette specifies #0d2b4c — render is darker; pending Kacey confirmation that the footer is intentionally deeper than the brand Deep Navy). 2026-06-19: padding-top 56 -> 14 -> 7 (Noah: gap between footer section top edge and the top horizontal divider line was too wide; reduced ~75%, then halved again). */
.theme-footer-area, .theme-footer-area p, .theme-footer-area span, .theme-footer-area li {
  color: #aab6c2;
  font-family: 'Source Sans 3', sans-serif;
}
/* Column section headings (placed as H2) -> small uppercase labels. Phase B 2026-06-17: Oswald -> Montserrat SemiBold 600 per Design Standards. 2026-06-17 added white-space:nowrap so headings stay single-line per render. */
.theme-footer-area h2 {
  color: #ffffff !important;
  font-family: 'Montserrat', sans-serif !important;
  font-size: 14px !important;
  font-weight: 600 !important;
  text-transform: uppercase !important;
  letter-spacing: 2px !important;
  line-height: 1.3 !important;
  margin: 0 0 16px !important;
  white-space: nowrap !important;
}
/* Column 1 contact lines placed as H4 (phone, etc.) -> normal body weight */
.theme-footer-area h4 {
  color: #ffffff !important;
 
  font-size: 15px !important;
  font-weight: 600 !important;
  text-transform: none !important;
  letter-spacing: 0 !important;
  margin: 0 0 6px !important;
}
/* Link / text items in columns */
.theme-footer-area a,
.theme-footer-area .zpcol span {
  color: #aab6c2 !important;
  font-size: 15px !important;
  line-height: 2.0;
  text-decoration: none;
  transition: color .15s ease;
}
.theme-footer-area a:hover { color: #ffffff !important; }
/* Column 1 overview blurb */
.theme-footer-area p { font-size: 15px; line-height: 1.7; }
/* Footer logo */
.theme-footer-area img:not(.custom-icon) { width: 160px !important; height: auto !important; margin-bottom: 14px; }


/* ===== RENDER-FIDELITY PASS (Kacey, Jun 11) ===== */
/* Hero: constrain content to centered fixed width (was too wide/stretched) */
.zpsection:has(.hero-form-card) .zpcontainer {
  max-width: 1160px !important;
  margin-left: auto !important;
  margin-right: auto !important;
}
/* Hero: tighten vertical spacing (was 97/99px) */
.zpsection:has(.hero-form-card) { padding-top: 50px !important; padding-bottom: 50px !important; position: relative; }
/* Hero: navy gradient overlay REMOVED 2026-06-17 — gradient is now baked into the approved hero image, overlay was double-darkening */
.zpsection:has(.hero-form-card) > * { position: relative; z-index: 1; }
/* Hero H1: substantially larger */
.zpsection:has(.hero-form-card) h1 { font-size: 75px !important; line-height: 1.02 !important; }
/* Hero trust indicators CSS REMOVED 2026-06-17 — turned over to builder controls (Noah) */
/* Navigation: Atlantic-blue underline on hover (scrap blue background) */
.theme-header .theme-menu a:hover,
.theme-header .theme-menu li:hover > a {
  background: transparent !important;
  color: #0d2b4c !important;
  border-bottom: 2px solid #53b3c8 !important;
}
/* Reserve underline space in the default state so hover/active no longer shifts the line by 2px (Kacey 2026-06-15: "underline space should exist in both default and hover states"). Excludes the CTA pill (.menu-highlight-primary) which has its own border styling above.
   Underline is on .theme-menu-name (the text span) — NOT on the <a> — so the line matches the TEXT width only, not the link's full width (which includes a-padding and the dropdown chevron). */
.theme-header .theme-menu > ul > li:not(.menu-highlight-primary) > a {
  border-bottom: 0 !important;
}
.theme-header .theme-menu > ul > li:not(.menu-highlight-primary) > a .theme-menu-name {
  border-bottom: 2px solid transparent !important;
  display: inline-block !important;
  line-height: 1.2 !important;
  padding-bottom: 2px !important;
}
/* Hover + active overrides — color the .theme-menu-name's bottom border Atlantic Blue. */
.theme-header .theme-menu > ul > li:not(.menu-highlight-primary):hover > a .theme-menu-name,
.theme-header .theme-menu > ul > li:not(.menu-highlight-primary) > a:hover .theme-menu-name,
.theme-header .theme-menu > ul > li.theme-menu-selected:not(.menu-highlight-primary) > a .theme-menu-name {
  border-bottom-color: #53b3c8 !important;
}
/* Also strip the old <a>-level hover and active borders so they don't draw a second full-width line under the text-width line. */
.theme-header .theme-menu > ul > li:not(.menu-highlight-primary):hover > a,
.theme-header .theme-menu > ul > li:not(.menu-highlight-primary) > a:hover,
.theme-header .theme-menu > ul > li.theme-menu-selected:not(.menu-highlight-primary) > a {
  border-bottom: 0 !important;
  background: transparent !important;
  color: #0d2b4c !important;
}
/* Equal-spacing flex rule REMOVED 2026-06-19 — it made the menu wider than Zoho's responsive breakpoint and triggered Zoho's "More..." collapse, hiding the CTA. Spacing is now handled by Zoho's native layout (looks visually uniform in practice); the "More" collapse itself is disabled by the JS hoist in HeaderCode.txt. */
/* Sub-menu (dropdown) items: same underline-reserve pattern as parent, applied to the inner text span .theme-menu-content (Kacey 2026-06-21: "child-level dropdown items still shift slightly on rollover"). The generic .theme-menu a:hover rule above paints a 2px border-bottom on hover — without reserving 2px in the default state of sub-menu links, each hovered item bumps 2px and shifts the items below it. Strip the <a>-level border in all three states (overrides the generic rule), then reserve transparent 2px on the inner span, then color it Atlantic Blue on hover/selected. */
.theme-header .theme-menu .theme-sub-menu > li > a,
.theme-header .theme-menu .theme-sub-menu > li:hover > a,
.theme-header .theme-menu .theme-sub-menu > li > a:hover,
.theme-header .theme-menu .theme-sub-menu > li.theme-menu-selected > a {
  border-bottom: 0 !important;
}
.theme-header .theme-menu .theme-sub-menu > li > a .theme-menu-content {
  display: inline-block !important;
  border-bottom: 2px solid transparent !important;
  line-height: 1.2 !important;
  padding-bottom: 2px !important;
}
.theme-header .theme-menu .theme-sub-menu > li:hover > a .theme-menu-content,
.theme-header .theme-menu .theme-sub-menu > li > a:hover .theme-menu-content,
.theme-header .theme-menu .theme-sub-menu > li.theme-menu-selected > a .theme-menu-content {
  border-bottom-color: #53b3c8 !important;
}
/* Navigation font weight 400 -> 600 (Design Standards doc: Montserrat SemiBold for Navigation; Kacey 2026-06-15 Typography section: "Increase navigation font weight"). Targets top-level nav links + their inner text spans; excludes the CTA pill. */
.theme-header .theme-menu > ul > li:not(.menu-highlight-primary) > a,
.theme-header .theme-menu > ul > li:not(.menu-highlight-primary) > a * {
  font-weight: 600 !important;
}
/* Navigation: larger logo */
.theme-header img { height: 90px !important; width: auto !important; }
/* Hero form header: enlarge house icon (left-aligned layout set in Header Code) */
#hfc-head .hfc-icon { width: 56px !important; height: 56px !important; }
#hfc-head .hfc-icon svg { width: 28px !important; height: 28px !important; }
#hfc-head { text-align: left !important; flex-direction: row !important; align-items: center !important; justify-content: flex-start !important; gap: 14px !important; }
/* Form submit button: GOLD bg, navy text, heavier (Kacey Jun 11 — reverses no-orange) */
.hero-form-card input[type=submit],
.hero-form-card .zcwf_button { background: #fcc852 !important; color: #0d2b4c !important; font-weight: 800 !important; }
.hero-form-card input[type=submit]:hover,
.hero-form-card .zcwf_button:hover { background: #fcc852 !important; color: #0d2b4c !important; }


/* ===== Section-4 trust band ("PROUDLY SERVING") ===== */
.s4-trust { background: #0d2b4c !important; }
.s4-trust, .s4-trust p, .s4-trust span { color: #ffffff !important; }
/* Heading line with flanking Atlantic-blue dividers */
.s4-heading {
  display: flex !important;
  align-items: center;
  justify-content: center;
  gap: 24px;
  flex-wrap: nowrap;
  margin: 0;
}
.s4-heading::before, .s4-heading::after {
  content: "";
  flex: 0 0 auto;
  width: 90px;
  height: 2px;
  background: #53b3c8;
}
.s4-heading, .s4-heading span {
  font-family: 'Oswald', sans-serif !important;
  font-weight: 600 !important;
  text-transform: uppercase !important;
  letter-spacing: 2px !important;
  font-size: 20px !important;
  white-space: nowrap;
}


/* ===== Section-4 heading: match render (cyan text, lighter, thin muted dividers) ===== */
.s4-trust .s4-heading, .s4-trust .s4-heading span {
  color: #53b3c8 !important;
  font-family: 'Source Sans 3', sans-serif !important;
  font-weight: 300 !important;
  letter-spacing: 4px !important;
  font-size: 18px !important;
}
.s4-heading::before, .s4-heading::after {
  width: 110px !important;          /* 70 -> 110 per Kacey 2026-06-15 "lengthen the divider lines slightly" */
  height: 2px !important;
  background: #53b3c8 !important;   /* off-white -> Atlantic Blue per Kacey 2026-06-15 "change the divider lines to Atlantic blue" */
}


/* ===== Section-4 item icons (left of each, per Kacey email) — icon size bumped 18->24 per Kacey 2026-06-15 "slightly larger" =====
   2026-08-03: all five data-URIs REPLACED with the exact footer-strip artwork (Assets/Footer Icons/ftr-trst-*.svg,
   titles stripped, fixed w/h dropped, native viewBoxes kept) per Kacey's icon-consistency item — the homepage band
   under the hero and the footer trust strip now render IDENTICAL glyphs (was: generic award/shield/wrench/pin set).
   ic-storm updated too but that item should be REMOVED from the band in the builder (footer already dropped it).
   Backup: archive/CustomCSS_BACKUP_2026-08-03_1850_pre-s4-icon-swap.txt */
.s4-item { display:flex !important; align-items:center; justify-content:center; gap:10px; }
.s4-item::before { content:""; flex:0 0 auto; width:24px; height:24px; background-repeat:no-repeat; background-position:center; background-size:contain; }
.ic-heritage::before { background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2034%2044%22%20fill%3D%22none%22%20stroke%3D%22%23ffffff%22%20stroke-width%3D%222.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M17%202.5%20C13%205%208%206.5%204%206.5%20L4%2020%20C4%2031%2010%2038%2017%2041.5%20C24%2038%2030%2031%2030%2020%20L30%206.5%20C26%206.5%2021%205%2017%202.5%20Z%22%2F%3E%3Cpath%20d%3D%22M10.5%2021.5%20L15%2026%20L24%2016%22%2F%3E%3C%2Fsvg%3E"); }
.ic-licensed::before { background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2044%2056%22%20fill%3D%22none%22%20stroke%3D%22%23ffffff%22%20stroke-width%3D%222.4%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M11.5%2032%20L8%2053%20L13%2049%20L18%2053%20L21%2034%20Z%22%2F%3E%3Cpath%20d%3D%22M32.5%2032%20L36%2053%20L31%2049%20L26%2053%20L23%2034%20Z%22%2F%3E%3Cpath%20d%3D%22M%2022%207.3%20Q%2026.87%204.4%2029.41%209.47%20Q%2035.07%209.67%2034.46%2015.31%20Q%2039.12%2018.54%2035.56%2022.95%20Q%2037.74%2028.19%2032.35%2029.97%20Q%2031.35%2035.55%2025.86%2034.15%20Q%2022%2038.3%2018.14%2034.15%20Q%2012.65%2035.55%2011.65%2029.97%20Q%206.26%2028.19%208.44%2022.95%20Q%204.88%2018.54%209.54%2015.31%20Q%208.93%209.67%2014.59%209.47%20Q%2017.13%204.4%2022%207.3%20Z%22%2F%3E%3C%2Fsvg%3E"); }
.ic-roof::before { background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2044%2044%22%20fill%3D%22none%22%20stroke%3D%22%23ffffff%22%20stroke-width%3D%222.4%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M4%2022%20L21%205%20L31%2013.9%20L31%206.5%20L35%206.5%20L35%2017.5%20L40%2022%20L40%2039%20L4%2039%20Z%22%2F%3E%3Cpath%20d%3D%22M13.5%2020%20L21%2013%20L28.5%2020%22%2F%3E%3Cpath%20d%3D%22M18%2039%20L18%2027%20L26%2027%20L26%2039%22%2F%3E%3C%2Fsvg%3E"); }
.ic-storm::before { background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2044%2047%22%20fill%3D%22none%22%20stroke%3D%22%23ffffff%22%20stroke-width%3D%222.4%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M12%2031%20C%207%2031%204%2027.5%204%2023.5%20C%204%2019.5%207%2016.5%2011%2016.5%20C%2011%2010.5%2017.5%206.5%2023.5%208.5%20C%2027%205.5%2034%207.5%2035%2013.5%20C%2038.5%2014.5%2040%2017.5%2040%2021.5%20C%2040%2026.5%2036%2031%2031%2031%20Z%22%2F%3E%3Cpath%20d%3D%22M24%2015%20L18%2028%20L23%2028%20L19%2044%22%2F%3E%3C%2Fsvg%3E"); }
.ic-serving::before { background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2032%2045%22%20fill%3D%22none%22%20stroke%3D%22%23ffffff%22%20stroke-width%3D%222.4%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Cpath%20d%3D%22M16%2043%20C%2016%2043%2029.5%2028%2029.5%2015.5%20A%2013.5%2013.5%200%201%200%202.5%2015.5%20C%202.5%2028%2016%2043%2016%2043%20Z%22%2F%3E%3Ccircle%20cx%3D%2216%22%20cy%3D%2215.5%22%20r%3D%226%22%2F%3E%3C%2Fsvg%3E"); }


/* ===== Section-4 items: single-line fit (solution #1) — font-size 12->14 per Kacey 2026-06-15 "slightly larger text" ===== */
.s4-item, .s4-item p, .s4-item span { white-space: nowrap !important; font-size: 14px !important; letter-spacing: 0.8px !important; }
/* Section-4 navy band — symmetric padding to balance the bottom-weighted feel Kacey flagged 2026-06-15 ("less padding beneath the icon row than above the heading"). 16/16 keeps the heading + items centered in the band while tightening the gap below the hero (Noah 2026-06-19; 32/32 felt too tall).
   The zero margin-top below cancels Zoho's default 20px on .zpelem-heading inside this section — without it the visible gap above the heading is 36px (16 padding + 20 wrapper margin) vs 16px below items, making the section look top-heavy. With margin zeroed: 16 above, 16 below = truly centered. */
.s4-trust { padding-top: 16px !important; padding-bottom: 16px !important; }
.s4-trust .zpelem-heading { margin-top: 0 !important; }


/* ===== KERNING PASS + Section-4 heading weight (Jun 13; clamp added 2026-06-23) ===== */
/* Section-4 heading: weight 600, plus FLUID letter-spacing and font-size via clamp() so the long
   "PROUDLY SERVING HOMEOWNERS & BUSINESSES" text breathes correctly across phone -> desktop without
   overflowing the narrow viewport at 5px letter-spacing. Desktop result unchanged (18px / 5px ls). */
.s4-trust .s4-heading, .s4-trust .s4-heading span {
  font-weight: 600 !important;
  font-size: clamp(0.875rem, 1vw + 0.5rem, 1.125rem) !important;
  letter-spacing: clamp(2px, 0.5vw, 5px) !important;
}
/* Top trust bar: wider kerning (Kacey: too tight) */
#trustbar-4b .tb-left span { letter-spacing: 3px !important; }
/* Hero trust indicators letter-spacing REMOVED 2026-06-17 — turned over to builder controls (Noah) */


/* ===== Active (current-page) menu item: underline, not pill (match render) ===== */
.theme-header .theme-menu-selected > a,
.theme-header li.theme-menu-selected > a {
  background: transparent !important;
  color: #0d2b4c !important;
  border-radius: 0 !important;
  border-bottom: 2px solid #53b3c8 !important;
  padding-left: 4px !important;
  padding-right: 4px !important;
}


/* ===== Footer layout fix (Jun 13): even full-width columns + 2-col cities ===== */
.theme-footer-area [class*="zprow"]:has(.foot-areas) {
  display: flex !important;
  flex-wrap: wrap;
  justify-content: space-between;
  align-items: stretch; /* 2026-06-17: was flex-start; stretch so all columns equal row height -> vertical dividers run full length */
  gap: 30px;
}
.theme-footer-area [class*="zprow"]:has(.foot-areas) > [class*="zpcol"] {
  flex: 1 1 0 !important;
  max-width: none !important;
  width: auto !important;
}
.theme-footer-area [class*="zprow"]:has(.foot-areas) > .zpcol-md-3 { flex: 1.6 1 0 !important; }
/* Service Areas: two-column city list */
.foot-areas { column-count: 2; column-gap: 26px; }


/* ===== Footer corrections (Jun 13): tighten item spacing, fix Service Areas ===== */
/* Service Areas is a single comma-separated text block — keep it one column (no mid-word splitting) */
.foot-areas { column-count: 1 !important; }
/* give the Service Areas column extra width so the city text reads cleanly */
.theme-footer-area [class*="zprow"]:has(.foot-areas) > [class*="zpcol"]:has(.foot-areas) { flex: 1.7 1 0 !important; }

/* Footer custom-icon size (overrides Zoho's hard-coded width/height=160 img attrs) */
.theme-footer-area img.custom-icon { width: 24px !important; height: 24px !important; }

/* Hero "Quality Workmanship" house icon nudge REMOVED 2026-06-17 — turned over to builder controls (Noah) */


/* ===== About page headings — scoped to .about-page only (brand Oswald, navy #0d2b4c). Added 2026-06-13. Does NOT affect other pages. ===== */
.about-page h1{font-family:'Oswald',sans-serif!important;font-weight:200!important;font-size:62px!important;text-transform:uppercase!important;line-height:1.1!important;color:#0d2b4c!important;}
.about-page h2{font-family:'Oswald',sans-serif!important;font-weight:400!important;font-size:44px!important;text-transform:uppercase!important;line-height:1.1!important;color:#0d2b4c!important;}
.about-page h3{font-family:'Oswald',sans-serif!important;font-weight:400!important;font-size:22px!important;text-transform:none!important;line-height:1.2!important;color:#0d2b4c!important;}
.about-page h4{font-family:'Oswald',sans-serif!important;font-weight:400!important;font-size:18px!important;text-transform:uppercase!important;line-height:1.25!important;color:#0d2b4c!important;}
.about-page h5{font-family:'Oswald',sans-serif!important;font-weight:400!important;font-size:16px!important;text-transform:none!important;line-height:1.25!important;color:#0d2b4c!important;}
.about-page h6{font-family:'Oswald',sans-serif!important;font-weight:200!important;font-size:14px!important;text-transform:none!important;line-height:1.25!important;color:#0d2b4c!important;}

/* === Hero typography — CSS-locked + fluid via clamp() (2026-06-23) ===
   Single source of truth: CSS. Previously the H1 rule was gated by :not(.font-free) so Noah could swap
   fonts via a Custom class in the builder. Once Rubik was the agreed font that escape stopped helping and
   started confusing the implementation (builder font menu fighting CSS). The H1 rule below locks family,
   weight, and a fluid size — no class-name gate, so the builder's font menu, per-element size, and the
   wrapper's `font-free` class no longer matter for the H1. h1 + h1 * is used so the rule beats Zoho's
   per-span size overrides that the builder writes inside the <h1>.
   `clamp()` makes the H1 scale smoothly from ~30px on a 360px phone to 75px on a desktop without
   breakpoint stair-steps. Same treatment applied to H2 and hero supporting copy so the whole hero
   typography is CSS-owned and responsive. */
.zpsection:has(.hero-form-card) .zpelem-heading h1,
.zpsection:has(.hero-form-card) .zpelem-heading h1 * {
  font-family: 'Rubik', sans-serif !important;
  font-weight: 600 !important;
  font-size: clamp(1.875rem, 5vw + 0.5rem, 3.9375rem) !important;
  line-height: 1.05 !important;
  /* clamp curve: 30px (floor, ≤360px viewport) -> 46px @768 -> 59px @1024 -> 63px (cap, ≥1100px viewports).
     Cap is 63px to match the AS-RENDERED size that Kacey signed off on (the H1 wrapper was 75px but Zoho's
     builder per-span sizing override brought the visible text to 63px). Now CSS-locked so the visible text
     stays at 63px on desktop and scales down smoothly to 30px on a 360px phone. */
}
/* 2026-07-02: MID-DESKTOP BAND FIX — at 992–1300px windows the base clamp above still
   yields ~58–63px while the hero LEFT column shrinks (form card is fixed 370px), so
   "CONSTRUCTION" broke mid-word ("CONSTRUCTIO / N"). This band-scoped rule scales the
   homepage H1 40px@992 → 63px@1300 (meets the base curve's 63px cap at 1300, so no jump).
   :not(.svc-h1) excludes every service/About/Contact hero H1 (they're sized by the
   svc-h1 rule, clamp(28px,3.6vw,45px), which already fits at these widths). Specificity
   0,4,1 beats the base rule's 0,3,1 inside the band only. Desktop-only (≥992) so the
   existing :has() usage is safe (iOS phones never hit this band). */
@media (min-width:992px) and (max-width:1300px){
  .zpsection:has(.hero-form-card) .zpelem-heading:not(.svc-h1) h1,
  .zpsection:has(.hero-form-card) .zpelem-heading:not(.svc-h1) h1 *{
    font-size: clamp(2.5rem, 7.4vw - 33.5px, 3.9375rem) !important;
  }
}
.zpsection:has(.hero-form-card) h2,
.zpsection:has(.hero-form-card) h2 *{font-family:'Montserrat',sans-serif!important;font-weight:700!important;font-size:clamp(1.375rem, 1.8vw + 0.75rem, 1.875rem)!important;line-height:1.15!important;letter-spacing:.3px!important;color:#ffffff!important;}
.zpsection:has(.hero-form-card) .zpelem-text:not(.hero-eyebrow),
.zpsection:has(.hero-form-card) .zpelem-text:not(.hero-eyebrow) *{font-family:'Montserrat',sans-serif!important;font-weight:400!important;font-size:clamp(0.9375rem, 0.6vw + 0.75rem, 1.25rem)!important;color:#ffffff!important;}
.hero-eyebrow,
.hero-eyebrow *{font-family:'Montserrat',sans-serif!important;font-weight:600!important;color:#53B3C8!important;}
/* Hero trust indicators typography + icon-size CSS REMOVED 2026-06-17 — turned over to builder controls (Noah) */

/* === Hero LEFT-COLUMN localized scrim (2026-06-17) ===
   Travels with the content (not the image), so H1 / paragraph / trust icons
   stay legible regardless of where cover-positioned bg image lands across viewport widths.
   Adjustable: alpha values (0.55 / 0.40 / 0.10) — raise/lower for more/less darkening. */
.zpsection:has(.hero-form-card) .zpcolumn:has(h1){position:relative!important;}
.zpsection:has(.hero-form-card) .zpcolumn:has(h1)::before{
  content:"";position:absolute;inset:0;z-index:0;pointer-events:none;
  background:linear-gradient(to right, rgba(13,43,76,0.55) 0%, rgba(13,43,76,0.40) 60%, rgba(13,43,76,0.10) 100%);
}
.zpsection:has(.hero-form-card) .zpcolumn:has(h1) > *{position:relative;z-index:1;}

/* ===== FOOTER Phase A (note 2026-06-17) — heading underline + white body copy + Atlantic-blue contact icons =====
   Note: Phase A was lost once when an upstream comment block was left unclosed and the comment-closer (slash-star) swallowed Phase A + Phase C as a single mega-comment until a later comment-closer ended it. The actual restored Phase A rules now live further down in this file (search "Phase A (RESTORED AGAIN"). Do not place comment-close sequences inside comment text. */

/* ===== FOOTER Top CTA Strip — trust items + button polish (2026-06-17) ===== */
/* Cancel the Phase A custom-icon recolor filter inside the CTA strip (icons stay white per render) */
.foot-cta-strip img.custom-icon,
.foot-cta-strip img { filter: none !important; }
/* Trust icon sizing per render */
.foot-cta-strip img { width: 36px !important; height: 36px !important; margin-bottom: 8px !important; }
/* Trust item label: Montserrat + size + tracking + uppercase + 2-line wrap allowed */
.foot-cta-strip h4,
.foot-cta-strip .zpicon-heading {
  font-family: 'Montserrat', sans-serif !important;
  font-size: 11px !important;
  font-weight: 700 !important;
  letter-spacing: 1.2px !important;
  text-transform: uppercase !important;
  text-align: center !important;
  line-height: 1.3 !important;
  color: #ffffff !important;
}
/* Center the icon + heading vertically as a stack inside each cell */
.foot-cta-strip [class*="zpelem"]:has(> img),
.foot-cta-strip [class*="zpelem-iconheader"],
.foot-cta-strip [class*="zpelem"]:has(h4.zpicon-heading) {
  text-align: center !important;
  display: flex !important;
  flex-direction: column !important;
  align-items: center !important;
}
/* Nested trust row: redistribute 5 cells across the full width */
.foot-cta-strip [class*="zprow"] {
  justify-content: space-between !important;
  align-items: center !important;
  gap: 8px !important;
}
.foot-cta-strip [class*="zprow"] > [class*="zpcol-md-2"] {
  flex: 1 1 0 !important;
  max-width: none !important;
}
/* Button typography: Montserrat */
.foot-cta-strip a.zpbutton { font-family: 'Montserrat', sans-serif !important; }
/* Outline button height fix: box-sizing so the 1px white border doesn't add 2px to the height */
.foot-cta-strip a.zpbutton-outline { box-sizing: border-box !important; }

/* ===== FOOTER Top CTA Strip — trust label width + wrap fix (2026-06-17) =====
   h4 was rendering at 73px wide inside a 127px cell (Zoho default constrains its width),
   forcing 4-5 line wrap. Force the h4 (and its parent wrappers) to full cell width and
   reduce letter-spacing slightly so longer labels (REPLACEMENT, SPECIALISTS) fit on the 2nd line. */
.foot-cta-strip h4,
.foot-cta-strip .zpicon-heading,
.foot-cta-strip [class*="zpelem-iconheader"] {
  width: 100% !important;
  max-width: 100% !important;
}
.foot-cta-strip h4,
.foot-cta-strip .zpicon-heading {
  letter-spacing: 0.5px !important;
}

/* ===== FOOTER Top CTA Strip — fixes v2 (2026-06-17) ===== */
/* Buttons were wrapping: 236px Primary + 138px Outline + 10px gap = 384px > 350px container.
   Force no-wrap and tighten padding/font so both fit on one line. */
.foot-cta-strip .zpbutton-group-container { flex-wrap: nowrap !important; }
.foot-cta-strip a.zpbutton { padding: 8px 16px !important; font-size: 13px !important; }
/* Icon-heading widget structure: .zpicon-container is flex-row by default (icon LEFT of heading).
   Override to flex-column so icon sits ABOVE heading (matches render), and let the inner wrappers
   take the full cell width so the h4 has room to wrap to 2 lines instead of 3-4. */
.foot-cta-strip .zpicon-container {
  flex-direction: column !important;
  align-items: center !important;
}
.foot-cta-strip .zpelem-iconheading,
.foot-cta-strip .zpicon-container {
  width: 100% !important;
  max-width: 100% !important;
}

/* ===== FOOTER Top CTA Strip — fixes v3 (2026-06-17) — REVERT vertical stack, restore icon-LEFT per render =====
   v2 stacked icon ABOVE heading, which is wrong per refinedFooter.png — render shows icon LEFT, text RIGHT.
   Restore horizontal layout, shrink icon, force h4 to flex:1 so it takes the remaining cell width (was 73px in 127px cell, causing 3+ line wrap). */
.foot-cta-strip .zpicon-container {
  flex-direction: row !important;
  align-items: center !important;
  gap: 8px !important;
}
.foot-cta-strip h4.zpicon-heading {
  flex: 1 1 0 !important;
  text-align: left !important;
  width: auto !important;
  max-width: none !important;
}
.foot-cta-strip img { width: 26px !important; height: 26px !important; margin: 0 !important; flex: 0 0 26px !important; }

/* ===== FOOTER Top CTA Strip — WORKING CSS v4 (2026-06-17), supersedes v1/v2/v3 above =====
   Tested live via CSS injection on the published page until visual matched refinedFooter.png.
   Key insights:
   1. Each cell has 15px L/R padding from Zoho default -> ate 30px of the 127px cell. Reduced to 2px each side -> ~123px usable.
   2. Icon-container is flex-row by default (matches render: icon LEFT of heading).
   3. h4 needs min-width:0 inside flex parent or it won't shrink below its content min-content, so flex:1 1 0 has no effect.
   4. At 9px Montserrat 700 / 0px letter-spacing / 22px icon / 4px gap, all 5 labels fit in 2 lines (LICENSED & INSURED stays on 1 line — acceptable per render).
   The earlier rules above are mostly overridden by these but left in place for history. */
.foot-cta-strip [class*="zpelem-col"] { padding-left: 2px !important; padding-right: 2px !important; }
.foot-cta-strip .zpicon-container {
  flex-direction: row !important;
  flex-wrap: nowrap !important;
  align-items: center !important;
  gap: 4px !important;
  width: 100% !important;
}
.foot-cta-strip .zpicon-container .zpicon { flex: 0 0 22px !important; min-width: 22px !important; }
.foot-cta-strip .zpicon-container .zpicon img,
.foot-cta-strip .zpicon-container .zpicon svg { width: 22px !important; height: 22px !important; filter: none !important; }
.foot-cta-strip h4.zpicon-heading {
  flex: 1 1 0 !important;
  min-width: 0 !important;
  width: auto !important;
  max-width: none !important;
  text-align: left !important;
  font-family: 'Montserrat', sans-serif !important;
  font-size: 9px !important;
  font-weight: 700 !important;
  letter-spacing: 0px !important;
  line-height: 1.25 !important;
  color: #ffffff !important;
  text-transform: uppercase !important;
}
.foot-cta-strip .zpelem-iconheading { width: 100% !important; }

/* ===== FOOTER Phase A (RESTORED AGAIN 2026-06-17 18:32 CDT) — heading underline accents =====
   These keep getting eaten when comment blocks above lose their closer (slash-star). Inlined here so future edits do not kill them. */
.theme-footer-area h2 { position: relative !important; padding-bottom: 14px !important; }
.theme-footer-area h2::after {
  content: "" !important;
  position: absolute !important;
  left: 0 !important;
  bottom: 0 !important;
  width: 32px !important;
  height: 2px !important;
  background: #53B3C8 !important; /* Atlantic Blue — Noah 2026-06-18 PM: reverted from off-white back to Atlantic Blue to match the heading text color. Kacey has not written a directive switching to the render's brighter blue, so staying on Atlantic Blue from the Design Standards palette. */
}

/* ===== FOOTER Phase C (RESTORED AGAIN 2026-06-17 18:32 CDT) — vertical column dividers =====
   Scoped to the row containing .foot-areas so it only hits the main columns row, not the top CTA strip or other rows. */
.theme-footer-area [class*="zprow"]:has(.foot-areas) > [class*="zpcol"]:not(:first-child) {
  position: relative !important;
}
.theme-footer-area [class*="zprow"]:has(.foot-areas) > [class*="zpcol"]:not(:first-child)::before {
  content: "" !important;
  position: absolute !important;
  left: -15px !important;
  top: 6px !important;
  bottom: 6px !important;
  width: 1px !important;
  background: rgba(255,255,255,0.3) !important; /* off-white per render (was #53B3C8); render+email+doc-footer-section say match render — flag palette line to Kacey. Noah 2026-06-18 */
}

/* ===== FOOTER Top CTA Strip — icon alignment fix (2026-06-17 18:32 CDT) =====
   Align icons to top so 1-line items (LICENSED & INSURED) and 2-line items (others) all show icons at the same y-position. */
.foot-cta-strip .zpicon-container { align-items: flex-start !important; }
.foot-cta-strip h4.zpicon-heading { padding-top: 2px !important; }

/* ===== FOOTER Top CTA Strip — WORKING CSS v5 (2026-06-17 18:42 CDT), supersedes v1-v4 above =====
   Tested live via injection. Render-matching: 32px icons, 12px text, all 5 labels on 2 lines, icons top-aligned.
   Key: shrank outer buttons cell to 280px (was 380px md-4 default), widened trust cell to fill rest -> each trust cell 132px wide, enough room for 2-line wrap at 12px font. */
/* Reallocate outer split: smaller buttons cell, wider trust cell */
.foot-cta-strip > [class*="zpcol-md-4"] { flex: 0 0 280px !important; max-width: 280px !important; }
.foot-cta-strip > [class*="zpcol-md-7"] { flex: 1 1 auto !important; max-width: none !important; }
/* Compact buttons to fit 280px cell */
.foot-cta-strip a.zpbutton { padding: 8px 12px !important; font-size: 11px !important; letter-spacing: 0.3px !important; }
.foot-cta-strip .zpbutton-group-container { gap: 6px !important; }
/* Trust strip sizes */
.foot-cta-strip [class*="zpelem-col"] { padding-left: 0 !important; padding-right: 0 !important; }
.foot-cta-strip .zpicon-container { align-items: flex-start !important; gap: 8px !important; }
.foot-cta-strip .zpicon-container .zpicon { flex: 0 0 32px !important; min-width: 32px !important; }
.foot-cta-strip .zpicon-container .zpicon img,
.foot-cta-strip .zpicon-container .zpicon svg { width: 32px !important; height: 32px !important; filter: none !important; }
.foot-cta-strip h4.zpicon-heading {
  font-size: 12px !important;
  letter-spacing: 0.3px !important;
  line-height: 1.3 !important;
  padding-top: 0 !important;
}

/* ===== FOOTER Top CTA Strip — WORKING CSS v6 (2026-06-17 18:52 CDT), supersedes v1-v5 above =====
   Tested live via injection. All 5 trust items on 2 lines, buttons sized to render with SVG icons.
   The static LICENSED & INSURED label is forced to wrap via nth-child(3) max-width (style is 1st child so 3rd is 2nd item).
   Button cell widened to 480px to fit larger buttons (52px tall, 14px font, icons). */
.foot-cta-strip > [class*="zpcol-md-4"] { flex: 0 0 480px !important; max-width: 480px !important; }
.foot-cta-strip > [class*="zpcol-md-7"] { flex: 1 1 auto !important; max-width: none !important; }
/* Buttons */
.foot-cta-strip .zpbutton-group-container { gap: 14px !important; flex-wrap: nowrap !important; }
.foot-cta-strip a.zpbutton {
  padding: 14px 26px !important;
  font-size: 14px !important;
  letter-spacing: 0.5px !important;
  min-height: 52px !important;
  box-sizing: border-box !important;
  font-family: 'Montserrat', sans-serif !important;
  font-weight: 700 !important;
  display: inline-flex !important;
  align-items: center !important;
}
.foot-cta-strip a.zpbutton-outline { padding: 13px 26px !important; }
/* Primary button: right chevron SVG */
.foot-cta-strip a.zpbutton-type-primary::after {
  content: "" !important;
  display: inline-block !important;
  width: 16px !important;
  height: 16px !important;
  background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m9 18 6-6-6-6'/%3E%3C/svg%3E") !important;
  background-repeat: no-repeat !important;
  background-size: contain !important;
  background-position: center !important;
  margin-left: 10px !important;
  font-size: 0 !important;
}
/* Outline button (Call Now): left phone SVG */
.foot-cta-strip a.zpbutton-outline::before {
  content: "" !important;
  display: inline-block !important;
  width: 18px !important;
  height: 18px !important;
  background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z'/%3E%3C/svg%3E") !important;
  background-repeat: no-repeat !important;
  background-size: contain !important;
  background-position: center !important;
  margin-right: 6px !important;
  font-size: 0 !important;
}
/* Trust strip cells: zero padding, large icons, 14px text on 2 lines */
.foot-cta-strip [class*="zpelem-col"] { padding-left: 0 !important; padding-right: 0 !important; }
.foot-cta-strip .zpicon-container { flex-direction: row !important; flex-wrap: nowrap !important; align-items: flex-start !important; gap: 8px !important; width: 100% !important; }
.foot-cta-strip .zpicon-container .zpicon { flex: 0 0 32px !important; min-width: 32px !important; }
.foot-cta-strip .zpicon-container .zpicon img,
.foot-cta-strip .zpicon-container .zpicon svg { width: 32px !important; height: 32px !important; filter: none !important; }
.foot-cta-strip h4.zpicon-heading {
  flex: 1 1 0 !important;
  min-width: 0 !important;
  width: auto !important;
  max-width: none !important;
  text-align: left !important;
  font-family: 'Montserrat', sans-serif !important;
  font-size: 14px !important;
  font-weight: 700 !important;
  letter-spacing: 1.2px !important;
  line-height: 1.3 !important;
  padding-top: 0 !important;
  color: #ffffff !important;
  text-transform: uppercase !important;
}
.foot-cta-strip .zpelem-iconheading { width: 100% !important; }
/* LICENSED & INSURED (nth-child(3) — STYLE is 1st child, HERITAGE is 2nd) — force 2-line wrap with max-width */
.foot-cta-strip [class*="zprow"] > [class*="zpelem-col"]:nth-child(3) h4.zpicon-heading { max-width: 130px !important; }

/* ===== FOOTER Top CTA Strip — WORKING CSS v7 (2026-06-17 19:00 CDT), supersedes v1-v6 above =====
   v6 made buttons + trust wrap to separate rows because the outer .foot-cta-strip flex container had flex-wrap:wrap (Zoho default).
   This version forces nowrap and shrinks buttons cell to 400px so trust gets ~700px (5 items at ~140px each). */
.foot-cta-strip { flex-wrap: nowrap !important; }
.foot-cta-strip > [class*="zpcol-md-4"] { flex: 0 0 400px !important; max-width: 400px !important; }
.foot-cta-strip > [class*="zpcol-md-7"] { flex: 1 1 0 !important; max-width: none !important; min-width: 0 !important; }
/* Buttons: 50px hard cap, Montserrat */
.foot-cta-strip .zpbutton-group-container { gap: 10px !important; flex-wrap: nowrap !important; }
.foot-cta-strip a.zpbutton {
  padding: 14px 22px !important;
  font-size: 13px !important;
  letter-spacing: 0.5px !important;
  height: 50px !important;
  min-height: 50px !important;
  max-height: 50px !important;
  box-sizing: border-box !important;
  font-family: 'Montserrat', sans-serif !important;
  font-weight: 700 !important;
  display: inline-flex !important;
  align-items: center !important;
}
.foot-cta-strip a.zpbutton-outline { padding: 13px 22px !important; }
.foot-cta-strip a.zpbutton-type-primary::after {
  content: "" !important;
  display: inline-block !important;
  width: 14px !important;
  height: 14px !important;
  background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m9 18 6-6-6-6'/%3E%3C/svg%3E") !important;
  background-repeat: no-repeat !important;
  background-size: contain !important;
  background-position: center !important;
  margin-left: 8px !important;
  font-size: 0 !important;
}
.foot-cta-strip a.zpbutton-outline::before {
  content: "" !important;
  display: inline-block !important;
  width: 16px !important;
  height: 16px !important;
  background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z'/%3E%3C/svg%3E") !important;
  background-repeat: no-repeat !important;
  background-size: contain !important;
  background-position: center !important;
  margin-right: 6px !important;
  font-size: 0 !important;
}
/* Trust strip: 28px icons, 11px text */
.foot-cta-strip [class*="zpelem-col"] { padding-left: 0 !important; padding-right: 0 !important; }
.foot-cta-strip .zpicon-container { flex-direction: row !important; flex-wrap: nowrap !important; align-items: flex-start !important; gap: 6px !important; width: 100% !important; }
.foot-cta-strip .zpicon-container .zpicon { flex: 0 0 28px !important; min-width: 28px !important; }
.foot-cta-strip .zpicon-container .zpicon img, .foot-cta-strip .zpicon-container .zpicon svg { width: 28px !important; height: 28px !important; filter: none !important; }
.foot-cta-strip h4.zpicon-heading {
  flex: 1 1 0 !important;
  min-width: 0 !important;
  width: auto !important;
  max-width: none !important;
  text-align: left !important;
  font-family: 'Montserrat', sans-serif !important;
  font-size: 11px !important;
  font-weight: 700 !important;
  letter-spacing: 0.5px !important;
  line-height: 1.3 !important;
  padding-top: 0 !important;
  color: #ffffff !important;
  text-transform: uppercase !important;
}
.foot-cta-strip .zpelem-iconheading { width: 100% !important; }
/* LICENSED & INSURED (nth-child 3 — style is 1st) force 2-line wrap */
.foot-cta-strip [class*="zprow"] > [class*="zpelem-col"]:nth-child(3) h4.zpicon-heading { max-width: 90px !important; }

/* ===== FOOTER Top CTA Strip — WORKING CSS v8 (2026-06-17 19:15 CDT), supersedes v1-v7 above =====
   Final state after iteration:
   - Buttons + 5 trust items on same row (flex-wrap:nowrap)
   - All 5 trust labels on 2 lines with proper breaks (flex redistribution per nth-child)
   - HERITAGE label gets <br> inserted via JS in HeaderCode (force "30+ YEARS / ROOFING HERITAGE" break)
   - Button text white (override footer-wide grey)
   - Icon-heading widget vertical alignment fixed (icons at top)
   - Main column links no-wrap (matches render)
   The h4 max-width approach proved unreliable because "30+ YEARS ROOFING" and "ROOFING HERITAGE" are nearly same width. */
.foot-cta-strip { flex-wrap: nowrap !important; align-items: flex-start !important; }
.foot-cta-strip > [class*="zpcol-md-4"] { flex: 0 0 400px !important; max-width: 400px !important; align-self: flex-start !important; }
.foot-cta-strip > [class*="zpcol-md-7"] { flex: 1 1 0 !important; max-width: none !important; min-width: 0 !important; align-self: flex-start !important; }
/* Trust cell flex distribution per item — HERITAGE gets more, others less */
.foot-cta-strip [class*="zprow"] > [class*="zpelem-col"]:nth-child(2) { flex: 1.35 1 0 !important; }
.foot-cta-strip [class*="zprow"] > [class*="zpelem-col"]:nth-child(3) { flex: 0.75 1 0 !important; }
.foot-cta-strip [class*="zprow"] > [class*="zpelem-col"]:nth-child(4) { flex: 0.9 1 0 !important; }
.foot-cta-strip [class*="zprow"] > [class*="zpelem-col"]:nth-child(5) { flex: 0.9 1 0 !important; }
.foot-cta-strip [class*="zprow"] > [class*="zpelem-col"]:nth-child(6) { flex: 1.1 1 0 !important; }
/* Button text WHITE (override inherited grey) */
.foot-cta-strip a.zpbutton,
.foot-cta-strip a.zpbutton *,
.foot-cta-strip a.zpbutton span { color: #ffffff !important; }
/* Trust row alignment - icons at top, all items same y */
.foot-cta-strip [class*="zprow"] { align-items: flex-start !important; }
.foot-cta-strip [class*="zprow"] > [class*="zpelem-col"] { align-self: flex-start !important; padding-top: 0 !important; }
.foot-cta-strip .zpelem-iconheading { margin-top: 0 !important; padding-top: 0 !important; }
/* Main column links no-wrap so "Request Free Estimate" + "Storm Damage Restoration" stay single line per render */
.theme-footer-area [class*="zprow"]:has(.foot-areas) a { white-space: nowrap !important; }

/* ===== FOOTER Top CTA Strip — v9 (2026-06-17 19:35 CDT): vertical alignment + top divider line =====
   1. Buttons and trust items now vertically center-aligned on the strip axis (was flex-start).
   2. Top horizontal Atlantic-blue divider line added via ::before (replaces Noah's builder spacer element — Noah should remove that builder element).
   3. Icon-container changed to align-items: center so icon centers with the 2-line text vertically. */
.foot-cta-strip { align-items: center !important; position: relative !important; padding-top: 20px !important; }
.foot-cta-strip::before {
  content: "" !important;
  position: absolute !important;
  top: 0 !important;
  left: 50% !important;
  right: auto !important;
  transform: translateX(-50%) !important;
  width: 100vw !important;
  max-width: none !important;
  height: 1px !important;
  background: rgba(255,255,255,0.3) !important; /* off-white per render; full viewport width 2026-06-18 PM (Noah) — was left:0 right:0 = 1140px content width */
}
.foot-cta-strip > [class*="zpcol-md-4"] { align-self: center !important; }
.foot-cta-strip > [class*="zpcol-md-7"] { align-self: center !important; }
.foot-cta-strip [class*="zprow"] { align-items: center !important; }
.foot-cta-strip [class*="zprow"] > [class*="zpelem-col"] { align-self: center !important; }
.foot-cta-strip .zpicon-container { align-items: center !important; }

/* ===== FOOTER Top CTA Strip — WORKING CSS v10 (restored 2026-06-18, verified vs live) — white-20% top/bottom strip lines (::before/::after); buttons+items on one center axis (zeroed a Zoho .zpelement margin-top:20px in the buttons cell); labels white 600. Trust-row sizing superseded by v11.3 below. Button color left Atlantic (render brighter — pending Kacey). ===== */
.foot-cta-strip { align-items: center !important; position: relative !important; padding-top: 20px !important; padding-bottom: 20px !important; }
.foot-cta-strip::before { background: rgba(255,255,255,0.20) !important; top: 0 !important; }
.foot-cta-strip::after { content: "" !important; position: absolute !important; left: 50% !important; right: auto !important; transform: translateX(-50%) !important; width: 100vw !important; max-width: none !important; bottom: 0 !important; height: 1px !important; background: rgba(255,255,255,0.20) !important; }
/* 2026-06-18 PM (Noah): top + bottom CTA-strip lines extended to 100vw (was 1140px content width). */
.foot-cta-strip > [class*="zpcol"] { align-self: center !important; }
.foot-cta-strip > [class*="zpcol-md-4"] { display: flex !important; align-items: center !important; }
.foot-cta-strip > [class*="zpcol-md-4"] .zpelement { margin-top: 0 !important; }
.foot-cta-strip [class*="zprow"] { align-items: center !important; }
.foot-cta-strip [class*="zprow"] > [class*="zpelem-col"] { align-self: center !important; position: relative !important; }
.foot-cta-strip h4.zpicon-heading, .foot-cta-strip h4.zpicon-heading * { color: #ffffff !important; font-weight: 600 !important; font-size: 11px !important; letter-spacing: 0.4px !important; line-height: 1.35 !important; }
.foot-cta-strip .zpicon-container { gap: 8px !important; align-items: center !important; }
.foot-cta-strip .zpicon-container .zpicon { flex: 0 0 28px !important; min-width: 28px !important; }
.foot-cta-strip .zpicon-container .zpicon img, .foot-cta-strip .zpicon-container .zpicon svg { width: 28px !important; height: 28px !important; }
.foot-cta-strip [class*="zprow"] > [class*="zpelem-col"]:has(.zpicon-container)::before { content: "" !important; position: absolute !important; left: 0 !important; top: 50% !important; transform: translateY(-50%) !important; height: 42px !important; width: 1px !important; background: rgba(255,255,255,0.20) !important; }

/* ===== FOOTER Top CTA Strip — v11.6 (2026-06-18, verified vs live + render) — FULL-WIDTH spread (justify-content:space-evenly, margin:0); icons 40px (render's ~0.83x button-height ratio; was 32); 2-line labels vertically centered with the icon (h4 align-self:center + margin:0 + container align-items:center) with airy line-height 1.8 to match the render's ~20px line spacing (set in the Oswald block below; was 1.25); the button-group gap was widened to 22px (rule above) to align the inter-button gap with the col1|col2 divider, which narrows the trust cell to ~22px item gaps, so the ::before dividers are re-centered at left:-11px (height 42px); label Oswald weight 400 + letter-spacing 1.3px. Supersedes v11.3/v11.4/v11.5. icon-text gap 4 / font 11px. ===== */
.foot-cta-strip > [class*="zpcol-md-4"] { flex: 0 0 auto !important; max-width: none !important; width: auto !important; }
/* v11.6 (2026-06-18): button-group gap 22px (was 10) so the gap between the two buttons widens and its center lands at x≈348 — directly under the col1|col2 vertical divider below. Pushes Call Now + the trust cell right ~12px. */
.foot-cta-strip .zpbutton-group-container { flex-wrap: nowrap !important; gap: 22px !important; }
.foot-cta-strip a.zpbutton { white-space: nowrap !important; }
.foot-cta-strip > [class*="zpcol-md-7"] { flex: 1 1 0 !important; max-width: none !important; min-width: 0 !important; }
.foot-cta-strip [class*="zprow"] { width: 100% !important; gap: 0 !important; align-items: center !important; justify-content: space-evenly !important; flex-wrap: nowrap !important; }
.foot-cta-strip [class*="zprow"] > [class*="zpelem-col"]:has(.zpicon-container) { flex: 0 0 auto !important; width: auto !important; max-width: none !important; padding: 0 !important; margin: 0 !important; position: relative !important; }
.foot-cta-strip .zpicon-container { display: flex !important; flex-direction: row !important; flex-wrap: nowrap !important; justify-content: flex-start !important; align-items: center !important; gap: 4px !important; width: auto !important; }
.foot-cta-strip .zpicon-container .zpicon { flex: 0 0 40px !important; min-width: 40px !important; }
.foot-cta-strip .zpicon-container .zpicon img, .foot-cta-strip .zpicon-container .zpicon svg { width: 40px !important; height: 40px !important; }
.foot-cta-strip h4.zpicon-heading { flex: 0 0 auto !important; width: auto !important; max-width: none !important; text-align: left !important; color: #ffffff !important; font-weight: 600 !important; font-size: 11px !important; letter-spacing: 0px !important; line-height: 1.25 !important; white-space: normal !important; padding: 0 !important; align-self: center !important; margin: 0 !important; }
.foot-cta-strip h4.zpicon-heading * { color: #ffffff !important; font-weight: 600 !important; font-size: 11px !important; }
.foot-cta-strip [class*="zprow"] > [class*="zpelem-col"]:has(.zpicon-container)::before { content: "" !important; position: absolute !important; left: -11px !important; top: 50% !important; transform: translateY(-50%) !important; width: 1px !important; height: 42px !important; background: rgba(255,255,255,0.25) !important; }

/* ===== FOOTER COLUMNS + LABEL FONT (2026-06-18) ===== */
/* Column headings -> Atlantic blue + underline accent back UNDER the heading. (Fixes the stray blue lines at column bottoms too: the h2 was position:static so its absolute ::after underline anchored to the column and dropped to its bottom; position:relative re-anchors it.) */
.theme-footer-area h2 { color: #53b3c8 !important; position: relative !important; padding-bottom: 12px !important; }
/* heading TEXT blue too: the text sits in a child <span> that inherited footer gray #aab6c2, so the h2 color alone left the visible text gray while only the ::after underline was blue. Force descendants to Atlantic blue so heading text matches its underline (Noah 2026-06-18; render shows blue headings — overrides the Design doc's "white" footer headings). */
.theme-footer-area h2 * { color: #53b3c8 !important; }
/* Trust-strip labels -> Oswald (condensed) 500: lighter + taller. Oswald already loaded in project. (Comes after v11.3 so it overrides the Montserrat there.) */
.foot-cta-strip h4.zpicon-heading, .foot-cta-strip h4.zpicon-heading * { font-family: 'Oswald', sans-serif !important; font-weight: 400 !important; letter-spacing: 1.3px !important; line-height: 1.8 !important; }
/* Service Areas + Company column values: first content had 40px top margin vs 20px on the others; normalize each heading-column's first item to 20px so all columns' values start on the same line. (Overrides builder spacing for those elements.) */
.theme-footer-area [class*="zprow"]:has(.foot-areas) > [class*="zpcol"]:has(h2) > div:nth-of-type(2) { margin-top: 20px !important; }
/* Raise the column heading block to the top of the vertical dividers: each column's ::before divider starts 6px below the column top, but the .zpelem-heading carried a 20px builder margin-top, leaving the heading ~14px below the divider top. Set it to 6px so the heading text sits even with the divider tops, per the render (Noah 2026-06-18). */
.theme-footer-area [class*="zprow"]:has(.foot-areas) [class*="zpcol"] .zpelem-heading { margin-top: 6px !important; }

/* ===== FOOTER COLUMN-1 CONTACT ITEMS — inline icon+text (2026-06-18) =====
   The email (info@4broofing.com) is longer than the phone/location values and was wrapping
   below its envelope icon (icon on line 1, address on line 2). Force the column contact
   .zpicon-container to never wrap and grow to fit its content, and keep the value text on a
   single line — so the email reads icon-BESIDE-text like phone/location and the render.
   Scoped to the columns row (:has(.foot-areas)) so the top trust strip is NOT affected. */
.theme-footer-area [class*="zprow"]:has(.foot-areas) .zpicon-container { flex-wrap: nowrap !important; width: auto !important; max-width: none !important; }
.theme-footer-area [class*="zprow"]:has(.foot-areas) .zpicon-container .zpicon-heading,
.theme-footer-area [class*="zprow"]:has(.foot-areas) .zpicon-container h4,
.theme-footer-area [class*="zprow"]:has(.foot-areas) .zpicon-container p,
.theme-footer-area [class*="zprow"]:has(.foot-areas) .zpicon-container a,
.theme-footer-area [class*="zprow"]:has(.foot-areas) .zpicon-container span { white-space: nowrap !important; }

/* ===== FOOTER Bottom Utility Strip (.foot-util-strip) — 2026-06-18 — copyright (left) + vertical divider + 4 trust badges (icon-beside-label), off-white, social omitted per Noah. Matches render. Grid: copyright = zpcol-md-4, each badge = zpcol-md-2. Reduced col padding + 11px label + flex-wrap:nowrap so the longer labels fit beside the icon (instead of wrapping below). ===== */
/* hide the native authority divider elements in the strip's column (the render's lines are drawn below via border-top instead — the native ones rendered short / mis-ordered below the strip) */
[class*="zpcol"]:has(> .foot-util-strip) > .zpelem-divider { display: none !important; }
/* off-white line ABOVE the supporting paragraph (full content width) */
.zpelem-text:has(+ .foot-util-strip) { border-top: 0 !important; position: relative !important; margin-top: 16px !important; margin-left: -15px !important; margin-right: -15px !important; padding-top: 22px !important; }
.zpelem-text:has(+ .foot-util-strip)::before { content: "" !important; position: absolute !important; top: 0 !important; left: 50% !important; transform: translateX(-50%) !important; width: 100vw !important; max-width: none !important; height: 1px !important; background: rgba(255,255,255,0.3) !important; pointer-events: none !important; }
/* 2026-06-18 PM (Noah): line above authority paragraph extended to 100vw — converted from border-top on the element (1140px content width) to a ::before pseudo so it can span the full viewport. */
/* the strip: vertically center + off-white line BETWEEN the paragraph and the strip (border-top) */
.foot-util-strip { align-items: center !important; border-top: 0 !important; position: relative !important; margin-top: 24px !important; padding-top: 18px !important; }
.foot-util-strip::before { content: "" !important; position: absolute !important; top: 0 !important; left: 50% !important; transform: translateX(-50%) !important; width: 100vw !important; max-width: none !important; height: 1px !important; background: rgba(255,255,255,0.3) !important; pointer-events: none !important; }
/* 2026-06-18 PM (Noah): line above the bottom utility strip extended to 100vw — same conversion (border-top → ::before pseudo). */

/* 2026-06-18 PM (Noah): "Free Estimates Available" link at the bottom of the logo/contact column -> Atlantic Blue. Sibling label "Licensed & Insured" in the same .zptext stays the footer gray. Targeted by structure: a[href="/contact"] whose parent <p> also contains a <br> — this is the only footer link with that shape (the "Contact Us" and "Request Free Estimate" links in the Company column live in <p>s without a <br>). */
.theme-footer-area .zptext p:has(br) a[href="/contact"],
.theme-footer-area .zptext p:has(br) a[href="/contact"] * { color: #53B3C8 !important; }
.foot-util-strip [class*="zpcol"] { padding-left: 5px !important; padding-right: 5px !important; padding-top: 0 !important; padding-bottom: 0 !important; }
/* Strip row alignment (2026-06-18 PM): Zoho applies margin-top:20px to .zpelem-text and .zpelem-iconheading inside the strip's columns, which pushed content 10px below the row's vertical center and left the divider sitting above the icon/text line. Zeroing those margins lets align-items:center on the strip put copyright text + every badge icon/heading at one y. Then pack all columns left as content-width (no social on the right per Noah) so the badges sit beside the copyright rather than spreading across the full strip. */
.foot-util-strip .zpelem-text,
.foot-util-strip .zpelem-iconheading { margin-top: 0 !important; }
.foot-util-strip > [class*="zpcol-md-4"] { flex: 0 0 auto !important; width: auto !important; max-width: none !important; padding-left: 0 !important; padding-right: 0 !important; }
.foot-util-strip > [class*="zpcol-md-2"] { flex: 0 0 auto !important; width: auto !important; max-width: none !important; padding-left: 28px !important; padding-right: 16px !important; }
.foot-util-strip .zptext, .foot-util-strip .zptext * { color: rgba(255,255,255,0.85) !important; font-size: 12px !important; line-height: 1.4 !important; margin: 0 !important; }
.foot-util-strip .zpicon-container { display: flex !important; flex-direction: row !important; flex-wrap: nowrap !important; align-items: center !important; justify-content: center !important; gap: 7px !important; }
.foot-util-strip .zpicon { flex: 0 0 auto !important; min-width: 0 !important; }
.foot-util-strip .zpicon img, .foot-util-strip .zpicon svg { width: 17px !important; height: 17px !important; }
.foot-util-strip h4.zpicon-heading { flex: 0 1 auto !important; min-width: 0 !important; }
.foot-util-strip h4.zpicon-heading, .foot-util-strip h4.zpicon-heading * { color: rgba(255,255,255,0.85) !important; font-size: 11px !important; font-weight: 500 !important; letter-spacing: 0.3px !important; white-space: nowrap !important; margin: 0 !important; line-height: 1.2 !important; }
/* vertical divider between the copyright and the first badge (per render) */
.foot-util-strip > [class*="zpcol-md-4"] + [class*="zpcol-md-2"] { position: relative !important; }
.foot-util-strip > [class*="zpcol-md-4"] + [class*="zpcol-md-2"]::before { content: "" !important; position: absolute !important; left: 14px !important; top: 50% !important; transform: translateY(-50%) !important; width: 1px !important; height: 22px !important; background: rgba(255,255,255,0.3) !important; }
}

/* ============================================================
   PHONE (max-width: 767px) — HERO H1 SIZE OVERRIDE  (2026-06-25)
   The hero H1 "4B Roofing & Construction" has its size baked into
   inline <span style="font-size:63px"> runs, so Zoho's builder
   per-device Typography control cannot resize it (changing the
   heading element does nothing). On phones 63px overflows badly.
   This rule overrides those inline spans for phones only.
     - Intentionally OUTSIDE the main @media(min-width:992px) block
       (it must apply at phone widths).
     - No :has() — iOS Safari safe.
     - .font-free is unique to the hero H1 wrapper site-wide, and the
       homepage has only one H1, so this targets nothing else.
     - Adjust the 30px value to taste.
   ============================================================ */
@media (max-width: 767px) {
  .font-free h1,
  .font-free h1 * {
    font-size: 30px !important;
    line-height: 1.1 !important;
  }
}

/* ============================================================
   PHONE (max-width: 767px) — FOOTER LINK COLOR  (2026-06-25)
   Below 992px the desktop footer-link rule (#aab6c2) is off, so the
   footer text-links fall back to the theme color — dark blue on
   published phones, yellow in the builder. This forces the footer
   nav + contact links to white on phones (matching the desktop look).
     - a:not([style]) excludes the one inline-styled footer link,
       "Free Estimates Available", so its Atlantic-blue accent is kept;
       every other link (and its inner spans) goes white.
     - !important so it holds over the theme color on published iOS.
     - No :has() — iOS Safari safe.
   ============================================================ */
@media (max-width: 767px) {
  .theme-footer-area a:not([style]),
  .theme-footer-area a:not([style]) * {
    color: #ffffff !important;
  }
}

/* ============================================================
   PHONE (max-width: 767px) — HERO FORM (mobile)  (2026-06-25)
   On phones the white-card form styling (>=992 only) is off, so the
   form sits transparent over the dark hero. Three fixes from Noah's
   iPhone screenshot (FormIssueIphone.png):
     1) gap so the CTA buttons (Request Free Estimate / Call Now)
        aren't touching the form  -> margin-top on the card;
     2) the "Get Your Fast & Easy Estimate" title is navy by default
        and unreadable on the dark form  -> white;
     3) a little top breathing room so the title isn't jammed at the
        very top  -> padding-top on the card.
   NOTE: #hfc-head is injected by the Header Code JS (published site
   only), so the title color is NOT previewable in the builder.
   No :has() — iOS Safari safe. Values are easy to tune.
   ============================================================ */
@media (max-width: 767px) {
  .hero-form-card { margin-top: 26px !important; padding-top: 10px !important; }
  #hfc-head .hfc-title { color: #ffffff !important; }
}

/* ============================================================
   RESPONSIVE TEXT ALIGNMENT — make the builder's per-device align
   buttons actually work on phone & tablet.  (2026-06-25)
   Zoho bakes alignment as an inline style on the inner <p>/<span>,
   which overrides the per-device align CLASS the builder writes when
   you set alignment in phone/tablet view — so it silently does
   nothing. These rules re-assert the builder's own per-device align
   classes with !important so your choice wins. Result: pick any
   text/heading, switch to phone (or tablet) view, set the alignment,
   and it sticks — no per-element CSS needed. No :has() — iOS safe.
   ============================================================ */
@media (max-width: 767px) {
  .zptext-align-mobile-left,      .zptext-align-mobile-left *      { text-align: left !important; }
  .zptext-align-mobile-center,    .zptext-align-mobile-center *    { text-align: center !important; }
  .zptext-align-mobile-right,     .zptext-align-mobile-right *     { text-align: right !important; }
  .zptext-align-mobile-justify,   .zptext-align-mobile-justify *   { text-align: justify !important; }
  .zpheading-align-mobile-left,   .zpheading-align-mobile-left *   { text-align: left !important; }
  .zpheading-align-mobile-center, .zpheading-align-mobile-center * { text-align: center !important; }
  .zpheading-align-mobile-right,  .zpheading-align-mobile-right *  { text-align: right !important; }
}
@media (min-width: 768px) and (max-width: 991px) {
  .zptext-align-tablet-left,      .zptext-align-tablet-left *      { text-align: left !important; }
  .zptext-align-tablet-center,    .zptext-align-tablet-center *    { text-align: center !important; }
  .zptext-align-tablet-right,     .zptext-align-tablet-right *     { text-align: right !important; }
  .zptext-align-tablet-justify,   .zptext-align-tablet-justify *   { text-align: justify !important; }
  .zpheading-align-tablet-left,   .zpheading-align-tablet-left *   { text-align: left !important; }
  .zpheading-align-tablet-center, .zpheading-align-tablet-center * { text-align: center !important; }
  .zpheading-align-tablet-right,  .zpheading-align-tablet-right *  { text-align: right !important; }
}

/* ============================================================
   PHONE (max-width: 767px) — HERO TEXT CENTERING  (2026-06-25)
   The eyebrow ("Built on 30+ Years...") and the "Roofing &
   Construction Services" text won't center from the builder's phone
   view because each has an inner <p style="text-align:left"> (inline)
   that beats the per-device align control. Force-center on phones.
     - Eyebrow targeted by its existing .hero-eyebrow class.
     - "Roofing & Construction Services" has no custom class, so it is
       targeted by its Zoho element id. For a cleaner / more durable
       hook, add a custom class "hero-subhead" to that element in the
       builder — this rule already includes it.
   No :has() — iOS Safari safe.
   ============================================================ */
@media (max-width: 767px) {
  .hero-eyebrow, .hero-eyebrow *,
  .hero-subhead, .hero-subhead *,
  [data-element-id="elm_gslW2csJygHBm4HRGGUFsQ"],
  [data-element-id="elm_gslW2csJygHBm4HRGGUFsQ"] * {
    text-align: center !important;
  }
}

/* ============================================================
   SERVICE-PAGE HERO H1 SIZE — custom class `svc-h1`  (2026-06-26)
   Service-page heroes are cloned from the homepage hero, so their H1
   inherits the homepage wordmark's baked Rubik 63px inline spans,
   which the builder Typography panel can't override. Add the custom
   class `svc-h1` to a service hero's H1 (Zoho lands it on the
   .zpelem-heading wrapper) and this rule sizes it correctly at every
   width while keeping Rubik. The homepage H1 has no `svc-h1`, so it
   stays the big wordmark. Universal (NOT inside the 992 block) so it
   fixes phones too. No :has() — iOS Safari safe. Reuse svc-h1 on
   every service-page hero H1.
   NOTE (2026-06-26): selector is intentionally high-specificity
   (.zpsection .zpelem-heading.svc-h1 h1). The homepage hero forces a
   fluid clamp(...,3.9375rem)=63px !important via
   ".zpsection:has(.hero-form-card) .zpelem-heading h1 *" (specificity
   0,3,1). A plain ".svc-h1 h1" (0,1,1) lost to it, so we match its
   specificity and win on source order. Verified live → 44px.
   ============================================================ */
.zpsection .zpelem-heading.svc-h1 h1,
.zpsection .zpelem-heading.svc-h1 h1 * {
  font-size: clamp(28px, 3.6vw, 45px) !important;
  line-height: 1.15 !important;
  font-weight: 600 !important;
}
/* 2026-07-01: added font-weight:600 above. The /about hero H1 was cloned/retyped
   as Rubik 400 (thin) while every service-page hero H1 is Rubik 600. svc-h1 only
   controlled size/line-height, so weights diverged. Forcing 600 makes every svc-h1
   hero match (service pages already 600 → unchanged; About 400 → 600). Verified live. */

/* ============================================================
   SERVICE-PAGE BODY SECTIONS — reusable components (2026-06-26)
   Apply as Custom class names on builder elements inside service-page
   content sections: a heading element -> svc-h2; a text element ->
   svc-body. !important + descendant coverage so they hold over the
   builder's per-element inline styling. Alignment is left to the
   builder (the responsive-align fix already makes that work).
   ============================================================ */
.svc-h2 h1, .svc-h2 h2, .svc-h2 h3, .svc-h2 h4,
.svc-h2 h1 *, .svc-h2 h2 *, .svc-h2 h3 *, .svc-h2 h4 * {
  font-family: 'Montserrat', sans-serif !important;
  font-weight: 700 !important;
  color: #0D2B4C !important;
  font-size: clamp(26px, 3vw, 34px) !important;
  line-height: 1.2 !important;
}
.svc-body, .svc-body * {
  font-family: 'Source Sans 3', sans-serif !important;
  font-size: 18px !important;
  line-height: 1.75 !important;
  color: #42566B !important;
}

/* ============================================================
   CONTACT-PAGE FORM CARD — column custom class `contact-form-card`
   (2026-07-01). Mirrors the hero estimate form (hero-form-card) so the
   Contact page's Zoho CRM form matches it, but WIDENED for the 8 fields
   and with the Service-Needed <select> and Message <textarea> SHOWN and
   styled (the hero form hides its select). Add the custom class
   `contact-form-card` to the COLUMN that holds the Contact CRM form
   (Column settings -> CSS tab), exactly like `hero-form-card` on the hero.
   Desktop-scoped to match the hero form; on phones the form uses Zoho's
   native styling, same as the hero form.
   ============================================================ */
@media (min-width: 992px) {
  /* Card */
  .contact-form-card {
    background: #ffffff !important;
    border-top: 0 !important; /* was 4px solid #53b3c8 — removed 2026-08-05 per Kacey review r3 ("contact form has teal bar at top, none of the other forms do") */
    border-radius: 4px !important;
    box-shadow: 0 18px 50px rgba(0,0,0,0.35) !important;
    padding: 32px 30px !important;
    max-width: 100% !important;
    box-sizing: border-box !important;
  }
  /* Form title (if the CRM form shows one) */
  .contact-form-card .zcwf_title,
  .contact-form-card .zpform-view-title,
  .contact-form-card h1, .contact-form-card h2, .contact-form-card h3 {
    color: #0d2b4c !important;
    font-family: 'Montserrat', sans-serif !important;
    font-weight: 700 !important;
    text-transform: none !important;
    font-size: 22px !important;
    line-height: 1.2 !important;
    margin-bottom: 6px !important;
  }
  /* Rows: label above field, full width */
  .contact-form-card ul.zpform-outer li { display: block !important; margin-bottom: 14px !important; padding: 0 !important; }
  .contact-form-card .zpform-label-container,
  .contact-form-card .zpform-field-container { display: block !important; width: 100% !important; max-width: 100% !important; }
  .contact-form-card .zpform-label-container { margin-bottom: 5px !important; line-height: 1.1 !important; }
  /* Labels */
  .contact-form-card label,
  .contact-form-card .zcwf_col_lab {
    color: #0d2b4c !important;
    font-family: 'Source Sans 3', sans-serif !important;
    font-size: 12px !important;
    font-weight: 700 !important;
    text-transform: uppercase !important;
    letter-spacing: 1px !important;
    line-height: 1.1 !important;
    margin: 0 !important;
  }
  /* Text inputs, select, textarea — identical look */
  .contact-form-card input:not([type=submit]):not([type=reset]):not([type=button]),
  .contact-form-card select,
  .contact-form-card textarea {
    background: #fbfcfd !important;
    border: 1px solid #dde5ec !important;
    border-radius: 6px !important;
    color: #2b3440 !important;
    padding: 11px 12px !important;
    font-size: 15px !important;
    font-family: 'Source Sans 3', sans-serif !important;
    width: 100% !important;
    box-sizing: border-box !important;
  }
  .contact-form-card textarea { min-height: 110px !important; resize: vertical !important; }
  .contact-form-card input:focus,
  .contact-form-card select:focus,
  .contact-form-card textarea:focus { border-color: #53b3c8 !important; background: #ffffff !important; outline: none !important; }
  /* Placeholders */
  .contact-form-card input::placeholder,
  .contact-form-card textarea::placeholder { color: rgba(13,43,76,0.40) !important; opacity: 1 !important; font-weight: 400 !important; }
  /* Submit button — gold, matches the hero form */
  .contact-form-card input[type=submit],
  .contact-form-card .zcwf_button {
    background: #fcc852 !important;
    color: #0d2b4c !important;
    border: none !important;
    border-radius: 6px !important;
    padding: 14px 24px !important;
    font-family: 'Source Sans 3', sans-serif !important;
    font-size: 14px !important;
    font-weight: 800 !important;
    text-transform: uppercase !important;
    letter-spacing: 1px !important;
    width: 100% !important;
    cursor: pointer !important;
    margin-top: 6px !important;
  }
  .contact-form-card input[type=submit]:hover,
  .contact-form-card .zcwf_button:hover { background: #fcc852 !important; color: #0d2b4c !important; }
  /* Hide the Reset button if the CRM injects one */
  .contact-form-card input[type=reset] { display: none !important; }
  /* Hide the CRM form-name title. The polished header (icon + "Request Your Free
     Estimate" + "Fast. Easy. No obligation.") is injected by the Contact form script
     in Header Code (#cfc-head), mirroring the hero form. */
  .contact-form-card .zpform-container h2.zpheading { display: none !important; }
  /* Contact hero: the row is align-items:center, which vertically centers the short
     left column against the tall form. Top-align both columns, then pull the left
     content up so the H1 top lines up with the top edge of the form card
     (verified live 2026-07-01: gap ~0). */
  .zpsection:has(.contact-form-card) [class*="zpcol"] { align-self: flex-start !important; }
  .zpsection:has(.contact-form-card) .cnt-hero { margin-top: -20px !important; padding-top: 0 !important; }
}

/* ============================================================
   CONTACT FORM — VISUAL FOOTPRINT REDUCTION (2026-07-16, Revision
   Guide (S)10: "reduce overall height where practical, improve
   surrounding white space, better balance the form with the page
   content"). APPEND-ONLY block: overrides the 2026-07-01 card rules
   above purely by source order — nothing above was edited. Rollback =
   delete this whole block. Backup:
   archive/CustomCSS_BACKUP_2026-07-16_1455_pre-contact-form-footprint.txt
   Desktop-only ((min-width:992px)) per the mobile-is-builder rule.
   First+Last-name side-by-side pairing is JS in HeaderCode.txt
   (contact-form script), mirroring the hero form's City+ZIP pairing.
   ============================================================ */
@media (min-width: 992px) {
  /* 1. Narrower card, centered in its column -> real white space around it */
  .contact-form-card {
    max-width: 460px !important;
    margin-left: auto !important;
    margin-right: auto !important;
    padding: 24px 26px !important;
  }
  /* 2. Tighter vertical rhythm -> meaningfully shorter form */
  .contact-form-card ul.zpform-outer li { margin-bottom: 10px !important; }
  .contact-form-card .zpform-label-container { margin-bottom: 3px !important; }
  .contact-form-card input:not([type=submit]):not([type=reset]):not([type=button]),
  .contact-form-card select { padding: 9px 12px !important; font-size: 14px !important; }
  .contact-form-card textarea { padding: 9px 12px !important; font-size: 14px !important; min-height: 84px !important; }
  .contact-form-card input[type=submit],
  .contact-form-card .zcwf_button { padding: 12px 22px !important; }
  /* 3. Injected header block ("Let's Start the Conversation") slightly tighter */
  #cfc-head { margin-bottom: 12px !important; padding-bottom: 12px !important; }
}

/* ============================================================
   CONTACT FORM — RE-HIDE THE CRM-HIDDEN FIELDS (2026-07-29)
   BUG: after the Service-Needed field was switched to a picklist and the form was
   re-generated, Lead Status / Entity / Lead Source appeared on the page even though
   they are set HIDDEN in CRM. Cause (confirmed against the webform source pulled from
   the CRM API): Zoho tags hidden rows with class `wfrm_fld_dpNn` and hides them with a
   plain rule `.zcwf_lblLeft .wfrm_fld_dpNn{display:none}` — no !important. Our
   label-above rule `.contact-form-card ul.zpform-outer li{display:block !important}`
   (added 2026-07-01) outranks it, so the hidden rows were forced back into view.
   FIX: re-hide those rows by Zoho's hidden-class AND by their CRM field ids/names —
   Lead_Status, LEADCF2 (Entity), Lead_Source. Service Needed = LEADCF3 and is
   explicitly kept visible below.
   NOT wrapped in a media query on purpose: hidden fields must stay hidden at every
   width. HeaderCode.txt carries an equivalent JS pass for iOS (no :has()).
   ============================================================ */
.contact-form-card .wfrm_fld_dpNn,
.contact-form-card li.wfrm_fld_dpNn,
.contact-form-card ul.zpform-outer li.wfrm_fld_dpNn,
.contact-form-card ul.zpform-outer li:has(.wfrm_fld_dpNn),
.contact-form-card ul.zpform-outer li:has(select#Lead_Status),
.contact-form-card ul.zpform-outer li:has(select#LEADCF2),
.contact-form-card ul.zpform-outer li:has(select#Lead_Source),
.contact-form-card ul.zpform-outer li:has(select[name="Lead Status"]),
.contact-form-card ul.zpform-outer li:has(select[name="LEADCF2"]),
.contact-form-card ul.zpform-outer li:has(select[name="Lead Source"]) {
  display: none !important;
}
/* Service Needed (LEADCF3) must stay visible */
.contact-form-card ul.zpform-outer li:has(select#LEADCF3),
.contact-form-card ul.zpform-outer li:has(select[name="LEADCF3"]) {
  display: block !important;
}

/* ============================================================
   SITEWIDE — WHITE TEXT ON PRIMARY CTA BUTTONS (2026-08-03)
   Noah (Section Updates round): "Make all CTA buttons consistent."
   The snippet-built final-CTA primaries (.svc-final .primary) shipped
   with navy #0D2B4C text on the teal button; heroes/contact hero use
   white. This overrides every snippet's inline <style> so ALL primary
   CTAs read white-on-teal, hover included. NOT media-scoped on purpose:
   a color-only consistency rule that must apply at every width (same
   precedent as the re-hide block above). Rollback = delete this block.
   ============================================================ */
.svc-final .primary,
.svc-final .primary:hover {
  color: #ffffff !important;
}

/* ============================================================
   SITEWIDE — KILL THE HORIZONTAL SCROLLBAR (2026-08-04, Kacey
   review round 2, item 1). MEASURED cause (console, 1688px
   viewport): scrollWidth 1698 = 10px overflow with NO real
   element past the right edge — i.e. the four full-bleed footer
   divider pseudo-lines (.foot-cta-strip::before/::after,
   .zpelem-text:has(+ .foot-util-strip)::before,
   .foot-util-strip::before). They are drawn at width:100vw,
   and 100vw INCLUDES the vertical scrollbar's width, so each
   line overhangs the page edge by ~half a scrollbar and drags a
   horizontal scrollbar into existence at every desktop width.
   FIX: clip horizontal overflow at the footer containers. The
   footer background is already full-bleed, so the lines still
   render edge-to-edge visually — they just can't poke past the
   page anymore. `hidden` line = fallback for old browsers,
   `clip` wins where supported (no scroll-container side
   effects). NOT media-scoped: harmless at all widths.
   Rollback = delete this block.
   ============================================================ */
.theme-footer-area,
.zpsection:has(.foot-cta-strip),
.zpsection:has(.foot-util-strip) {
  overflow-x: hidden;
  overflow-x: clip;
}

/* ============================================================
   HOMEPAGE — KICKER + SECTION-HEADER CONSISTENCY (2026-08-05,
   Kacey review round 3). Two asks:
   (1) "I like the teal instead of the navy for copy headers" —
       the homepage's builder-built kickers (About / Why Choose 4B /
       Our Services / Central Florida Roofing / Our Process /
       Service Areas) were element-styled navy #155370 while every
       snippet-built section uses teal #53B3C8. All six light-section
       kickers → the sitewide kicker standard: teal, 14px, 600,
       4px letter-spacing, uppercase. (Dark-section kickers — hero
       eyebrow + Get Started — stay light-teal #8AD4E6 on navy.)
   (2) "copy headers and subheaders appear to vary in font size,
       kerning, or weight — make them consistent" — the seven
       homepage section H2s carried mixed element styling. All get
       one standard: 34px / 700 / 0.5px letter-spacing / lh 1.25 /
       uppercase (matches the 34px top end of the snippet-section
       H2 scale; font family + colors untouched — navy on light
       sections, white on the navy Get-Started band).
   Element-id-scoped (ids read from the live /home source, Noah
   2026-08-04) so nothing outside the homepage is touched.
   Desktop-scoped per the mobile rule. Rollback = delete block.
   ============================================================ */
@media (min-width: 992px) {
  /* (1) kickers → sitewide teal standard */
  [data-element-id="elm_ZxL6vYMu4-_cfz2_ERE2yg"].zpelem-text, [data-element-id="elm_ZxL6vYMu4-_cfz2_ERE2yg"].zpelem-text *,
  [data-element-id="elm_DskCqy2rsMIVFck9GyRE5w"].zpelem-text, [data-element-id="elm_DskCqy2rsMIVFck9GyRE5w"].zpelem-text *,
  [data-element-id="elm_XTT6GCEvaneoa4BNUXQXAA"].zpelem-text, [data-element-id="elm_XTT6GCEvaneoa4BNUXQXAA"].zpelem-text *,
  [data-element-id="elm_Cr36VbBUZ8CnYaeksXJkkw"].zpelem-text, [data-element-id="elm_Cr36VbBUZ8CnYaeksXJkkw"].zpelem-text *,
  [data-element-id="elm_vN9dgfC_U2iUEDlP69Brzg"].zpelem-text, [data-element-id="elm_vN9dgfC_U2iUEDlP69Brzg"].zpelem-text *,
  [data-element-id="elm_g8ka5Bb8I1al6aEK-PZdYg"].zpelem-text, [data-element-id="elm_g8ka5Bb8I1al6aEK-PZdYg"].zpelem-text * {
    color: #53B3C8 !important;
    font-size: 14px !important;
    font-weight: 600 !important;
    letter-spacing: 4px !important;
    text-transform: uppercase !important;
  }
  /* (2) section H2s → one standard (size/weight/kerning/case only) */
  [data-element-id="elm_zbQ3TwTdPWxCI0KLK_7ywA"] .zpheading, [data-element-id="elm_zbQ3TwTdPWxCI0KLK_7ywA"] .zpheading *,
  [data-element-id="elm_RxSMLlwt50q19auOy6puVw"] .zpheading, [data-element-id="elm_RxSMLlwt50q19auOy6puVw"] .zpheading *,
  [data-element-id="elm_WqSaamvBHIOGCz8kiPG5Yg"] .zpheading, [data-element-id="elm_WqSaamvBHIOGCz8kiPG5Yg"] .zpheading *,
  [data-element-id="elm_N-tdYce9l6I4PEFJpJN9tg"] .zpheading, [data-element-id="elm_N-tdYce9l6I4PEFJpJN9tg"] .zpheading *,
  [data-element-id="elm_7MDKsuSL-4IzttchR32loQ"] .zpheading, [data-element-id="elm_7MDKsuSL-4IzttchR32loQ"] .zpheading *,
  [data-element-id="elm_Ty7ZxajqSrjrRTiVT8XiZQ"] .zpheading, [data-element-id="elm_Ty7ZxajqSrjrRTiVT8XiZQ"] .zpheading *,
  [data-element-id="elm_b6SC11I2PLB1KOhMX5tPUw"] .zpheading, [data-element-id="elm_b6SC11I2PLB1KOhMX5tPUw"] .zpheading * {
    font-size: 34px !important;
    font-weight: 700 !important;
    letter-spacing: 0.5px !important;
    line-height: 1.25 !important;
    text-transform: uppercase !important;
  }
}

/* ============================================================
   BUILDER BOX-CARDS — PIN "LEARN MORE" TO CARD BOTTOM (2026-08-04,
   Kacey review round 2, item 2). The homepage services grid (and any
   builder section built the same way) = Zoho Box elements inside a
   zprow-equalCol row, each box ending in a link-button element. The
   columns already equalize height, but the box stacks its children
   top-down, so short cards leave their "Learn More" floating high and
   the links land at different heights across a row. DOM (measured via
   console on the live homepage):
     .zprow-equalCol > .zpelem-col > .zpelem-box > … > .zpelem-button
   FIX: column + box become flex columns (box fills the equalized
   column) and the trailing button element gets margin-top:auto —
   every "Learn More" sits on the same baseline row. Scoped with
   :has(> .zpelem-box …) so ONLY box-cards that end in a button are
   touched; other equalCol rows are unaffected. Desktop-scoped per the
   mobile-is-builder-native rule (cards stack 1-col on phone anyway).
   The matching snippet-side fix (svc-related cards) lives in the five
   related-services snippet files, same date. Rollback = delete block.
   ============================================================ */
@media (min-width: 992px) {
  .zprow-equalCol > [class*="zpcol"]:has(> .zpelem-box .zpelem-button) { display: flex !important; }
  .zprow-equalCol > [class*="zpcol"] > .zpelem-box:has(.zpelem-button) { display: flex !important; flex-direction: column !important; width: 100% !important; }
  .zprow-equalCol > [class*="zpcol"] > .zpelem-box:has(.zpelem-button) > .zpelem-button:last-child { margin-top: auto !important; }
}

/* ============================================================
   HOMEPAGE LEGACY SECTION — FINAL LAYOUT v5 (2026-08-04, Kacey review
   round 2 item 3, resolved by Noah after Kacey declined a new photo:
   "figure out what looks best"). Layout mirrors the Why-Choose
   treatment: kicker + heading CENTERED across the full section, then
   paragraphs (+ button) down the LEFT half and the WHOLE Apopka photo
   in the RIGHT half — natural 3:2 proportions, no crop (supersedes
   the earlier fill/cover + interim object-position approach), photo
   top level with the first paragraph. Implementation: section row →
   2-col grid, builder columns dissolved (display:contents); kicker
   (first text element) row 1 span-all centered; heading row 2
   span-all centered with its hard <br> hidden so it reads ONE line
   at full width (the break was authored for the old narrow column);
   all other text-col elements auto-flow into grid col 1; image →
   col 2, rows 3+, margin-top 26px (text line-height leading offset —
   pure 20px left the photo sitting visibly higher than the text).
   NOTE selector discipline: the general `> .zpelement` rule and its
   overrides share identical specificity, so the overrides MUST stay
   AFTER it (later-in-file wins). Desktop-only. Iterations v1-v4
   (cover fill / crop slice / specificity trap) superseded.
   Rollback = delete block.
   ============================================================ */
@media (min-width: 992px) {
  .zprow-equalCol:has(img[src*="tile-roofing"]) { display: grid !important; grid-template-columns: 1fr 1fr !important; column-gap: 40px !important; align-items: start !important; }
  .zprow-equalCol:has(img[src*="tile-roofing"]) > [class*="zpcol"] { display: contents !important; }
  .zprow-equalCol:has(img[src*="tile-roofing"]) [class*="zpcol"] > .zpelement { grid-column: 1 !important; }
  .zprow-equalCol:has(img[src*="tile-roofing"]) [class*="zpcol"] > .zpelem-text:first-of-type { grid-column: 1 / -1 !important; grid-row: 1 !important; text-align: center !important; }
  .zprow-equalCol:has(img[src*="tile-roofing"]) [class*="zpcol"] > .zpelem-text:first-of-type * { text-align: center !important; }
  .zprow-equalCol:has(img[src*="tile-roofing"]) [class*="zpcol"] > .zpelem-heading { grid-column: 1 / -1 !important; grid-row: 2 !important; text-align: center !important; }
  .zprow-equalCol:has(img[src*="tile-roofing"]) [class*="zpcol"] > .zpelem-heading .zpheading,
  .zprow-equalCol:has(img[src*="tile-roofing"]) [class*="zpcol"] > .zpelem-heading .zpheading * { text-align: center !important; }
  .zprow-equalCol:has(img[src*="tile-roofing"]) [class*="zpcol"] > .zpelem-heading .zpheading br { display: none !important; }
  .zprow-equalCol:has(img[src*="tile-roofing"]) [class*="zpcol"] > .zpelem-image { grid-column: 2 !important; grid-row: 3 / span 8 !important; margin-top: 26px !important; }
  .zprow-equalCol:has(img[src*="tile-roofing"]) [class*="zpcol"] > .zpelem-image .zpimage-container,
  .zprow-equalCol:has(img[src*="tile-roofing"]) [class*="zpcol"] > .zpelem-image figure.zpimage-data-ref,
  .zprow-equalCol:has(img[src*="tile-roofing"]) [class*="zpcol"] > .zpelem-image span.zpimage-anchor,
  .zprow-equalCol:has(img[src*="tile-roofing"]) [class*="zpcol"] > .zpelem-image picture { display: block !important; width: 100% !important; }
  .zprow-equalCol:has(img[src*="tile-roofing"]) [class*="zpcol"] > .zpelem-image img.zpimage { width: 100% !important; height: auto !important; object-fit: fill !important; object-position: center !important; }
}

/* ============================================================
   HOMEPAGE WHY-CHOOSE-4B SECTION — 3-ZONE BALANCE (2026-08-04, Kacey
   review round 2, item 4). Section stays image-left / content-right,
   but the right md-6 column becomes a 2-sub-column grid so the layout
   reads: [image] | [kicker + heading + intro] | [checklist] — per
   Kacey: better horizontal balance, same content, no redesign, keep
   compact. DOM (console, live homepage): right column children =
   text (kicker, data-element-id elm_DskCqy2rsMIVFck9GyRE5w) →
   heading → text (intro) → text (the whole ✓ checklist as ONE
   element, last child). Column anchored via :has() on that stable
   kicker element id. All children default to sub-column 1; the last
   text element (checklist) is placed in sub-column 2 spanning the
   rows, top-aligned with the kicker. Desktop-only per the mobile
   rule (phone/tablet keep the native stacked order: image → copy →
   checklist). Checklist WORDING (8 items) is builder-side content —
   Noah edits the text element. Rollback = delete block.
   ============================================================ */
@media (min-width: 992px) {
  /* v3 FINAL (2026-08-04, Noah's read of Kacey's intent after v1/v2 misses): kicker + heading
     CENTERED ABOVE everything; below them one row of three equal zones — image | intro paragraph |
     checklist. Implementation: the section row becomes a 3-column grid and both builder columns are
     dissolved with display:contents so their elements place directly: kicker row 1 (span all,
     centered), heading row 2 (span all, centered, natural builder size restored), image r3c1,
     intro r3c2, checklist r3c3, all top-aligned. Desktop-only; phone/tablet keep native stacking. */
  .zprow:has(> [class*="zpcol"] > [data-element-id="elm_DskCqy2rsMIVFck9GyRE5w"]) {
    display: grid !important;
    grid-template-columns: 1fr 1fr 1fr !important;
    column-gap: 34px !important;
    align-items: start !important;
  }
  .zprow:has(> [class*="zpcol"] > [data-element-id="elm_DskCqy2rsMIVFck9GyRE5w"]) > [class*="zpcol"] { display: contents !important; }
  /* row 1: kicker, centered across all three zones */
  .zprow:has(> [class*="zpcol"] > [data-element-id="elm_DskCqy2rsMIVFck9GyRE5w"]) [data-element-id="elm_DskCqy2rsMIVFck9GyRE5w"] {
    grid-column: 1 / -1 !important; grid-row: 1 !important; text-align: center !important;
  }
  .zprow:has(> [class*="zpcol"] > [data-element-id="elm_DskCqy2rsMIVFck9GyRE5w"]) [data-element-id="elm_DskCqy2rsMIVFck9GyRE5w"] * { text-align: center !important; }
  /* row 2: heading, centered across all three zones (natural builder font size) */
  .zprow:has(> [class*="zpcol"] > [data-element-id="elm_DskCqy2rsMIVFck9GyRE5w"]) .zpelem-heading {
    grid-column: 1 / -1 !important; grid-row: 2 !important; text-align: center !important;
  }
  .zprow:has(> [class*="zpcol"] > [data-element-id="elm_DskCqy2rsMIVFck9GyRE5w"]) .zpelem-heading .zpheading,
  .zprow:has(> [class*="zpcol"] > [data-element-id="elm_DskCqy2rsMIVFck9GyRE5w"]) .zpelem-heading .zpheading * { text-align: center !important; }
  /* row 3: image | intro | checklist */
  .zprow:has(> [class*="zpcol"] > [data-element-id="elm_DskCqy2rsMIVFck9GyRE5w"]) .zpelem-image {
    grid-column: 1 !important; grid-row: 3 !important; margin-top: 34px !important; /* 28→34 2026-08-04: +6px text-leading offset so the photo top sits level with the intro's first visible text line (Noah) */
  }
  .zprow:has(> [class*="zpcol"] > [data-element-id="elm_DskCqy2rsMIVFck9GyRE5w"]) [data-element-id="elm_NI-6Qi6ftEcoWVCDu58QpQ"] {
    grid-column: 2 !important; grid-row: 3 !important; margin-top: 28px !important;
  }
  .zprow:has(> [class*="zpcol"] > [data-element-id="elm_DskCqy2rsMIVFck9GyRE5w"]) [class*="zpcol"] > .zpelem-text:last-of-type {
    grid-column: 3 !important; grid-row: 3 !important; margin-top: 28px !important;
  }
}

/* ============================================================
   HOMEPAGE CENTRAL-FLORIDA-ROOFING SECTION BUTTON — STANDARD NAVY
   (2026-08-04, Kacey review round 2, item 6b). Kacey: the button's
   bg is off from the standard dark navy. Confirmed (Noah, element
   inspect): resting color is the theme primary, and it only turns
   navy on HOVER. Standard = Deep Navy #0D2B4C resting, white text
   (same as the nav Request Free Estimate CTA; hover already navy so
   the hover state simply stays navy = no-hover-change precedent).
   Element-scoped via the button's own data-element-id (supplied by
   Noah). Color-only, un-media-scoped per the white-CTA precedent.
   Rollback = delete block.
   ============================================================ */
[data-element-id="elm_P-OIqjPQkGtFHtijzKbWGA"] .zpbutton.zpbutton-type-primary {
  background-color: #0D2B4C !important;
  border-color: #0D2B4C !important;
}
[data-element-id="elm_P-OIqjPQkGtFHtijzKbWGA"] .zpbutton.zpbutton-type-primary,
[data-element-id="elm_P-OIqjPQkGtFHtijzKbWGA"] .zpbutton.zpbutton-type-primary * {
  color: #ffffff !important;
}


/* ============================================================
   ============================================================
   MOBILE + TABLET PASS (max-width: 991px) — appended 2026-08-10
   (Mobile QA workstream; findings in Site Audits\2026-08-10
   Mobile QA - paste ready.md)

   WHY: the theme stylesheet sets h1/h2/h3 at desktop sizes with no
   responsive override, and this file's heading/footer/topbar rules
   all live inside @media (min-width:992px) — so below 992px the
   raw 44px theme sizes win. 991px (not 767px) is used so the
   untreated 768–991 tablet band is covered too.

   DESKTOP (>=992px) IS COMPLETELY UNTOUCHED — every rule below is
   inside a single @media (max-width: 991px) wrapper.

   ROLLBACK: delete from the top of this banner to the end of the
   file, or restore Code\CustomCSS_BACKUP_2026-08-10_pre-mobile-pass.css.
   ============================================================
   ============================================================ */
@media (max-width: 991px) {

  /* ---------------------------------------------------------
     M1. HEADING SCALE — kills the 44px theme fallback.
     Interplay (verified against the rules above):
     - Hero H1 on phones stays 30px: the existing .font-free rule
       (max-width:767) outranks h1/h1 span here. On tablets
       768-991 (previously untreated: the baked 63px inline spans
       won) this rule caps the wordmark at 34px.
     - Service/About hero H1s: svc-h1 clamp outranks this — unchanged.
     - svc-h2 section headings: svc-h2 clamp outranks this — unchanged.
     --------------------------------------------------------- */
  h1, h1 span {
    font-size: clamp(26px, 7.2vw, 34px) !important;
    line-height: 1.15 !important;
  }
  h2, h2 span {
    font-size: clamp(23px, 6.2vw, 30px) !important;
    line-height: 1.2 !important;
  }
  h3, h3 span {
    font-size: clamp(18px, 4.8vw, 21px) !important;
    line-height: 1.3 !important;
  }

  /* ---------------------------------------------------------
     M2. FOOTER — mirror the desktop design below 992px.
     Desktop styles all 44px-fallback problems away inside the
     992 block; these re-create the same look: small teal
     Montserrat label headings with the 32px underline accent
     (centered, because footer columns center on phone), 15px
     contact lines, white links (the existing <=767 white-link
     rule only covered phones; this covers tablets too).
     --------------------------------------------------------- */
  .theme-footer-area h2, .theme-footer-area h2 * {
    color: #53b3c8 !important;
    font-family: 'Montserrat', sans-serif !important;
    font-size: 14px !important;
    font-weight: 600 !important;
    text-transform: uppercase !important;
    letter-spacing: 2px !important;
    line-height: 1.3 !important;
  }
  .theme-footer-area h2 {
    position: relative !important;
    padding-bottom: 12px !important;
    margin: 0 0 14px !important;
  }
  .theme-footer-area h2::after {
    content: "" !important;
    position: absolute !important;
    left: 50% !important;
    transform: translateX(-50%) !important;
    bottom: 0 !important;
    width: 32px !important;
    height: 2px !important;
    background: #53B3C8 !important;
  }
  .theme-footer-area h4, .theme-footer-area h4 * {
    color: #ffffff !important;
    font-size: 15px !important;
    font-weight: 600 !important;
    text-transform: none !important;
    letter-spacing: 0 !important;
  }
  .theme-footer-area a:not([style]),
  .theme-footer-area a:not([style]) * {
    color: #ffffff !important;
  }

  /* ---------------------------------------------------------
     M3. "PROUDLY SERVING" BAND (s4) — its desktop rules (18px
     heading, 14px items) are 992-only, so phones fell back to a
     44px heading and 12px items. Same proportions as desktop.
     (The flanking divider lines and item icons are 992-only
     pseudo-elements; intentionally not duplicated here.)
     --------------------------------------------------------- */
  .s4-heading, .s4-heading span {
    font-size: clamp(15px, 4.2vw, 18px) !important;
    letter-spacing: 2px !important;
    line-height: 1.4 !important;
  }
  .s4-item, .s4-item p, .s4-item span {
    font-size: 14px !important;
    letter-spacing: 0.8px !important;
  }

  /* ---------------------------------------------------------
     M4. TRUST BAR (#trustbar-4b, injected by Header Code) —
     measured 5px right-edge clipping at 390px (letter-spacing 3px
     + 96% width) and 89px of STICKY height. Tighter tracking +
     padding fixes the clip and usually pulls the bar to one line
     (~52px). The phone number becomes a full 44px tap target.
     ID selectors used to outrank the Header Code's own ID rules.
     --------------------------------------------------------- */
  #trustbar-4b .tb-wrap {
    width: 100% !important;
    box-sizing: border-box !important;
    padding: 6px 10px !important;
    gap: 6px 12px !important;
  }
  #trustbar-4b .tb-item {
    font-size: 11px !important;
    letter-spacing: 1.5px !important;
  }
  #trustbar-4b .tb-phone {
    display: inline-flex !important;
    align-items: center !important;
    min-height: 44px !important;
    padding: 0 8px !important;
    font-size: 14px !important;
  }
  /* OPTIONAL — uncomment to hide the tagline(s) on phone/tablet and
     keep ONLY the tappable phone number (recovers ~35px more of
     sticky height; content call — Noah's decision):
  #trustbar-4b .tb-item, #trustbar-4b .tb-sep { display: none !important; }
  */

  /* ---------------------------------------------------------
     M5. HEADER LOGO — 98px tall at 390px made header+trustbar eat
     227px of every 844px screen (both are sticky). 72px keeps the
     stacked wordmark legible and returns ~26px. Tune to taste.
     --------------------------------------------------------- */
  .theme-header img { height: 72px !important; width: auto !important; }

  /* ---------------------------------------------------------
     M6. TAP TARGETS — 44px minimum (Apple HIG / Google guidance).
     Measured: nav rows 370x16, footer links x16, "Learn More"
     89x41, phone icon 24x24, nav CTA 365x35.
     --------------------------------------------------------- */
  .theme-menu a {
    padding-top: 14px !important;
    padding-bottom: 14px !important;
  }
  .theme-footer-area a {
    display: inline-block !important;
    padding: 14px 8px !important;
  }
  a.zpbutton {
    min-height: 44px !important;
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
  }
  .zpbutton-type-link { min-width: 120px !important; }
  li.menu-highlight-primary > a { min-height: 48px !important; }
  .zpicon-anchor {
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
    min-width: 44px !important;
    min-height: 44px !important;
  }

  /* ---------------------------------------------------------
     M7. BODY COPY — 16px floor (below 16px legibility drops and
     iOS zooms form fields). Measured 8-19 sub-16px paragraphs per
     service page (15.5/15/14.5px). Notes:
     - .svc-body (18px, universal) outranks this — unchanged.
     - Spans carrying deliberate small label sizes (kickers, trust
       items, topbar) are untouched (rule targets p/li only; the
       label contexts are re-pinned above/below).
     --------------------------------------------------------- */
  p, li {
    font-size: 16px !important;
    line-height: 1.6 !important;
  }
  /* keep the bottom utility strip (copyright/badges) label-sized */
  .foot-util-strip p, .foot-util-strip li { font-size: 12px !important; }

  /* ---------------------------------------------------------
     M8. HERO FORM — TABLET PARITY. The existing hero-form phone
     fixes (white title, breathing room) are max-width:767 only;
     the white-card styling is 992+ only — so 768-991 showed a
     transparent form with a navy-on-dark title. Extend the phone
     treatment across the whole sub-992 range (duplicate at <=767
     is harmless).
     --------------------------------------------------------- */
  .hero-form-card { margin-top: 26px !important; padding-top: 10px !important; }
  #hfc-head .hfc-title { color: #ffffff !important; }

}

/* ============================================================
   M9. SHORT VIEWPORTS — PHONE LANDSCAPE (added 2026-08-10, v2)
   Noah's iPhone 16 sideways: viewport is only ~393px tall, and the
   STICKY trust bar + STICKY header (Header Code, Revision Guide §2)
   consumed ~2/3 of it permanently. Fix: on any viewport SHORTER
   than 500px (phones held sideways; no portrait phone or tablet is
   that short), the two bars become static — they show at the top
   of the page and simply SCROLL AWAY like normal content — and
   they compress (taglines hidden, phone number kept, smaller logo).
   - Width-gated to <=991px too, so a desktop browser in a squat
     window is untouched (desktop keeps sticky everywhere).
   - position/top get !important: the Header Code sets sticky via
     stylesheet (non-!important) and Zoho's mobile-header JS writes
     inline top:0px — stylesheet !important outranks both.
   - Kacey's directive says sticky across Desktop/Tablet/Mobile;
     landscape-phone was unaddressed. Flag to Kacey if strictness
     matters; behavior at every normal orientation is unchanged.
   Rollback: delete this M9 block.
   ============================================================ */
@media (max-width: 991px) and (max-height: 500px) {
  #trustbar-4b { position: static !important; }
  .zpheader-style-01 { position: static !important; top: auto !important; }
  /* compress: phone number only in the bar, smaller logo */
  #trustbar-4b .tb-item, #trustbar-4b .tb-sep { display: none !important; }
  #trustbar-4b .tb-phone { min-height: 40px !important; }
  #trustbar-4b .tb-wrap { padding: 2px 10px !important; }
  .theme-header img { height: 56px !important; }
}
/* ================= END MOBILE + TABLET PASS (v2) ================= */
