/* Majestic Concrete Inc — shared stylesheet
   Locked direction: Industrial Trade: Fire Red
   Locked on: 2026-05-19
   Edit this file to propagate changes across all pages.
*/

:root {
    --bg: #0B1220;
    --surface: #162038;
    --surface-2: #1B2748;
    --ink: #FFFFFF;
    --ink-soft: #B8C0CC;
    --accent: #D32F2F;
    --accent-warm: #F4441E;
    --accent-on: #FFFFFF;
    --radius: 2px;
    --img-filter: contrast(1.12) saturate(1.12) brightness(0.94) hue-rotate(-6deg);
    --img-border: rgba(211, 47, 47, 0.35);
    --container: 1240px;
    --pad-x: clamp(20px, 5vw, 56px);
  }

  * { box-sizing: border-box; }
  html { scroll-behavior: smooth; }
  body {
    margin: 0;
    font-family: 'Inter', system-ui, sans-serif;
    background: var(--bg);
    color: var(--ink);
    line-height: 1.55;
    -webkit-font-smoothing: antialiased;
    text-rendering: optimizeLegibility;
    font-size: 16px;
  }
  img { max-width: 100%; display: block; }
  a { color: inherit; }
  a:focus-visible, button:focus-visible {
    outline: 2px solid var(--accent);
    outline-offset: 3px;
  }

  /* === HEADER (sticky) === */
  .site-header {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    width: 100%;
    z-index: 50;
    background-color: transparent;
    background-image: none;
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
    border-bottom: 1px solid transparent;
    transition: background-color 0.25s ease, backdrop-filter 0.25s ease, border-bottom-color 0.25s ease;
  }
  .site-header.scrolled {
    background-color: rgba(28, 40, 66, 0.85);
    background-image:
      linear-gradient(135deg, rgba(211, 47, 47, 0.16), transparent 55%),
      linear-gradient(160deg, rgba(255, 255, 255, 0.08), rgba(255, 255, 255, 0.02));
    backdrop-filter: blur(12px);
    -webkit-backdrop-filter: blur(12px);
    border-bottom-color: rgba(255, 255, 255, 0.08);
  }
  .header-inner {
    max-width: var(--container);
    margin: 0 auto;
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 14px var(--pad-x);
    gap: 20px;
  }
  .brand {
    font-family: 'Anton', Impact, sans-serif;
    font-size: 22px;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    color: var(--ink);
    text-decoration: none;
    flex-shrink: 0;
  }
  .brand .accent { color: var(--accent); }
  .primary-nav {
    display: flex;
    gap: 28px;
  }
  .primary-nav a {
    color: var(--ink-soft);
    text-decoration: none;
    font-size: 14px;
    font-weight: 500;
    padding: 8px 0;
    position: relative;
    transition: color 0.15s ease;
  }
  .primary-nav a:hover { color: var(--ink); }
  .primary-nav a::after {
    content: "";
    position: absolute;
    left: 0;
    right: 100%;
    bottom: 0;
    height: 2px;
    background: var(--accent);
    transition: right 0.2s ease;
  }
  .primary-nav a:hover::after { right: 0; }
  .phone-cta {
    display: inline-flex;
    align-items: center;
    gap: 10px;
    background: var(--accent);
    color: var(--accent-on);
    padding: 11px 18px;
    border-radius: var(--radius);
    font-weight: 800;
    font-size: 14px;
    letter-spacing: 0.02em;
    text-decoration: none;
    min-height: 44px;
    transition: filter 0.15s ease;
  }
  .phone-cta:hover { filter: brightness(1.1); }
  .phone-cta::before {
    content: "";
    width: 18px;
    height: 18px;
    background-color: var(--accent-on);
    -webkit-mask: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22currentColor%22%3E%3Cpath%20d%3D%22M20%2015.5l-2.55-.29a1.42%201.42%200%2000-1.32.4l-1.85%201.85a14.84%2014.84%200%2001-6.54-6.54l1.86-1.86a1.42%201.42%200%2000.4-1.32L9.71%205.18A1.45%201.45%200%20008.3%204H5.18C4.4%204%204%204.4%204%205.18A16.83%2016.83%200%200020.82%2022c.78%200%201.18-.4%201.18-1.18V17.7a1.45%201.45%200%2000-1.18-1.41z%22%2F%3E%3C%2Fsvg%3E") center/contain no-repeat;
            mask: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22currentColor%22%3E%3Cpath%20d%3D%22M20%2015.5l-2.55-.29a1.42%201.42%200%2000-1.32.4l-1.85%201.85a14.84%2014.84%200%2001-6.54-6.54l1.86-1.86a1.42%201.42%200%2000.4-1.32L9.71%205.18A1.45%201.45%200%20008.3%204H5.18C4.4%204%204%204.4%204%205.18A16.83%2016.83%200%200020.82%2022c.78%200%201.18-.4%201.18-1.18V17.7a1.45%201.45%200%2000-1.18-1.41z%22%2F%3E%3C%2Fsvg%3E") center/contain no-repeat;
  }
  @media (max-width: 900px) {
    .primary-nav { display: none; }
  }

  /* === HERO === */
  .hero {
    padding: clamp(40px, 7vw, 96px) var(--pad-x) clamp(48px, 7vw, 80px);
    border-bottom: 1px solid rgba(255, 255, 255, 0.06);
  }
  .hero-inner {
    max-width: var(--container);
    margin: 0 auto;
    display: grid;
    grid-template-columns: 1.05fr 0.95fr;
    gap: clamp(28px, 4vw, 64px);
    align-items: center;
  }
  @media (max-width: 900px) { .hero-inner { grid-template-columns: 1fr; } }
  .eyebrow {
    display: inline-flex;
    align-items: center;
    gap: 12px;
    font-size: 12px;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: rgba(255, 248, 236, 0.92);
    font-weight: 700;
    margin-bottom: 22px;
  }
  .eyebrow::before {
    content: "";
    width: 32px;
    height: 2px;
    background: rgba(255, 248, 236, 0.78);
  }
  h1.hero-title {
    font-family: 'Anton', Impact, sans-serif;
    font-weight: 400;
    line-height: 0.92;
    letter-spacing: 0.005em;
    font-size: clamp(42px, 6.2vw, 82px);
    margin: 0 0 24px;
    color: var(--ink);
    text-transform: uppercase;
  }
  h1.hero-title .accent { color: var(--accent); }
  /* Italic serif accent inside the Anton uppercase H1.
     Editorial pairing: condensed industrial sans + a single italic serif word.
     Anton has no italic face, so we drop to a serif italic stack and lift the size
     slightly to optical-balance the x-height difference. */
  h1.hero-title em.accent,
  h1.page-hero-title em.accent {
    font-family: 'Playfair Display', 'Georgia', 'Times New Roman', serif;
    font-style: italic;
    font-weight: 500;
    text-transform: none;
    letter-spacing: -0.01em;
    /* Optical lift so the serif italic doesn't read smaller than the surrounding Anton */
    font-size: 1.06em;
    line-height: 0.96;
    /* Subtle vertical alignment nudge */
    transform: translateY(0.02em);
    display: inline-block;
  }
  .hero-sub {
    font-size: clamp(16px, 1.4vw, 19px);
    color: var(--ink-soft);
    max-width: 54ch;
    margin: 0 0 32px;
    line-height: 1.55;
  }
  .hero-cta-row {
    display: flex;
    gap: 14px;
    flex-wrap: wrap;
  }
  .btn-primary, .btn-secondary {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
    padding: 16px 28px;
    border-radius: var(--radius);
    font-weight: 800;
    font-size: 15px;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    text-decoration: none;
    min-height: 52px;
    font-family: 'Inter', sans-serif;
    cursor: pointer;
    border: none;
    transition: filter 0.15s ease, transform 0.1s ease;
  }
  .btn-primary {
    background: var(--accent);
    color: var(--accent-on);
  }
  .btn-primary:hover { filter: brightness(1.1); }
  .btn-primary:active { transform: translateY(1px); }
  .btn-secondary {
    background: transparent;
    color: var(--ink);
    border: 1px solid rgba(255, 255, 255, 0.3);
  }
  .btn-secondary:hover { border-color: var(--ink); background: rgba(255, 255, 255, 0.04); }

  .hero-photo {
    position: relative;
    border-radius: var(--radius);
    overflow: hidden;
    border: 1px solid var(--img-border);
    aspect-ratio: 4 / 5;
    background: var(--surface);
  }
  .hero-photo img {
    width: 100%; height: 100%; object-fit: cover;
    filter: var(--img-filter);
  }
  .hero-photo .photo-tag {
    position: absolute;
    bottom: 14px;
    left: 14px;
    background: var(--bg);
    color: var(--ink);
    padding: 7px 14px;
    border-radius: var(--radius);
    font-size: 11px;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    font-weight: 700;
    border-left: 3px solid var(--accent);
  }

  /* === TRUST STRIP === */
  .trust {
    padding: clamp(36px, 5vw, 56px) var(--pad-x);
    background: var(--surface);
    border-bottom: 1px solid rgba(255, 255, 255, 0.06);
  }
  .trust-inner {
    max-width: var(--container);
    margin: 0 auto;
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: 20px;
  }
  @media (max-width: 800px) { .trust-inner { grid-template-columns: repeat(2, 1fr); } }
  .trust-item {
    border-left: 2px solid var(--accent);
    padding-left: 16px;
  }
  .trust-num {
    font-family: 'Anton', Impact, sans-serif;
    font-size: 40px;
    line-height: 1;
    color: var(--ink);
    letter-spacing: 0.01em;
  }
  .trust-label {
    font-size: 11px;
    letter-spacing: 0.16em;
    color: var(--ink-soft);
    text-transform: uppercase;
    margin-top: 10px;
  }

  /* === SECTION SHELL === */
  .section {
    padding: clamp(56px, 7vw, 96px) var(--pad-x);
    border-bottom: 1px solid rgba(255, 255, 255, 0.06);
  }
  .section-inner {
    max-width: var(--container);
    margin: 0 auto;
  }
  .section-head {
    display: flex;
    align-items: end;
    justify-content: space-between;
    gap: 24px;
    flex-wrap: wrap;
    margin-bottom: 36px;
  }
  .section-head .heads { max-width: 56ch; }
  h2.section-title {
    font-family: 'Anton', Impact, sans-serif;
    font-weight: 400;
    font-size: clamp(32px, 4.4vw, 56px);
    line-height: 0.96;
    margin: 0 0 14px;
    text-transform: uppercase;
    letter-spacing: 0.005em;
    color: var(--ink);
  }
  h2.section-title .accent { color: var(--accent); }
  .section-lede {
    font-size: 16px;
    color: var(--ink-soft);
    margin: 0;
  }

  /* === SERVICES === */
  .services-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 16px;
  }
  @media (max-width: 900px) { .services-grid { grid-template-columns: 1fr; } }
  .service-card {
    background: var(--surface);
    padding: 28px;
    border-radius: var(--radius);
    border: 1px solid rgba(255, 255, 255, 0.06);
    display: flex;
    flex-direction: column;
    gap: 12px;
    transition: border-color 0.2s ease, transform 0.2s ease;
  }
  .service-card:hover {
    border-color: var(--accent);
    transform: translateY(-2px);
  }
  .service-num {
    font-family: 'Anton', Impact, sans-serif;
    font-size: 14px;
    letter-spacing: 0.16em;
    color: var(--accent);
  }
  .service-title {
    font-family: 'Anton', Impact, sans-serif;
    font-size: 26px;
    font-weight: 400;
    color: var(--ink);
    margin: 0;
    text-transform: uppercase;
    letter-spacing: 0.01em;
    line-height: 1;
  }
  .service-body {
    font-size: 15px;
    color: var(--ink-soft);
    margin: 4px 0;
  }
  .service-link {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    color: var(--accent);
    text-decoration: none;
    font-weight: 700;
    font-size: 14px;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    margin-top: 6px;
    min-height: 44px;
    align-self: flex-start;
    align-items: center;
  }
  .service-link:hover { color: var(--accent-warm); }

  /* === WORK RAIL (horizontal scroll-snap) === */
  .work-rail-section {
    padding: clamp(56px, 7vw, 96px) 0;
    border-bottom: 1px solid rgba(255, 255, 255, 0.06);
    overflow: hidden;
  }
  .rail-head-wrap {
    max-width: var(--container);
    margin: 0 auto 32px;
    padding: 0 var(--pad-x);
    display: flex;
    align-items: end;
    justify-content: space-between;
    gap: 24px;
    flex-wrap: wrap;
  }
  .rail-controls {
    display: flex;
    gap: 8px;
  }
  .rail-arrow {
    width: 52px;
    height: 52px;
    background: var(--surface);
    border: 1px solid rgba(255, 255, 255, 0.12);
    color: var(--ink);
    font-size: 22px;
    cursor: pointer;
    border-radius: var(--radius);
    transition: background 0.15s ease, border-color 0.15s ease;
    display: grid;
    place-items: center;
    font-family: 'Anton', Impact, sans-serif;
  }
  .rail-arrow:hover {
    background: var(--accent);
    border-color: var(--accent);
    color: var(--accent-on);
  }
  .rail-arrow:disabled {
    opacity: 0.35;
    cursor: not-allowed;
  }
  .rail-arrow:disabled:hover {
    background: var(--surface);
    border-color: rgba(255, 255, 255, 0.12);
    color: var(--ink);
  }
  .rail {
    display: flex;
    gap: 14px;
    overflow-x: auto;
    scroll-snap-type: x mandatory;
    scroll-behavior: smooth;
    padding: 4px var(--pad-x) 28px;
    -webkit-overflow-scrolling: touch;
  }
  .rail::-webkit-scrollbar { height: 6px; }
  .rail::-webkit-scrollbar-track { background: var(--surface); border-radius: 3px; }
  .rail::-webkit-scrollbar-thumb { background: var(--accent); border-radius: 3px; }
  .rail-card {
    flex: 0 0 clamp(280px, 30vw, 400px);
    scroll-snap-align: start;
    position: relative;
    border-radius: var(--radius);
    overflow: hidden;
    border: 1px solid var(--img-border);
    aspect-ratio: 4 / 5;
    background: var(--surface);
    transition: transform 0.2s ease;
  }
  .rail-card:hover { transform: translateY(-3px); }
  .rail-card img {
    width: 100%; height: 100%; object-fit: cover;
    filter: var(--img-filter);
  }
  .rail-card .card-meta {
    position: absolute;
    bottom: 0; left: 0; right: 0;
    padding: 22px 18px 16px;
    background: linear-gradient(180deg, transparent 0%, rgba(0, 0, 0, 0.82) 60%);
    color: var(--ink);
  }
  .rail-card .card-tag {
    display: inline-block;
    font-size: 10px;
    letter-spacing: 0.16em;
    text-transform: uppercase;
    font-weight: 800;
    color: var(--accent);
    margin-bottom: 6px;
  }
  .rail-card h3 {
    font-family: 'Anton', Impact, sans-serif;
    font-weight: 400;
    font-size: 22px;
    margin: 0 0 4px;
    line-height: 1;
    text-transform: uppercase;
    letter-spacing: 0.01em;
  }
  .rail-card .card-loc {
    font-size: 12px;
    color: rgba(255, 255, 255, 0.72);
  }
  .rail-footer {
    max-width: var(--container);
    margin: 12px auto 0;
    padding: 0 var(--pad-x);
    display: flex;
    justify-content: flex-end;
  }
  .rail-cta {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    color: var(--ink);
    text-decoration: none;
    font-weight: 700;
    font-size: 14px;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    padding: 12px 16px;
    border-bottom: 1px solid var(--accent);
    min-height: 44px;
  }
  .rail-cta:hover { color: var(--accent); }

  /* === CREW STRIP === */
  .crew-grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 16px;
  }
  @media (max-width: 800px) { .crew-grid { grid-template-columns: 1fr; } }
  .crew-card {
    position: relative;
    border-radius: var(--radius);
    overflow: hidden;
    aspect-ratio: 4 / 3;
    border: 1px solid var(--img-border);
  }
  .crew-card img {
    width: 100%; height: 100%; object-fit: cover;
    filter: var(--img-filter);
  }
  .crew-caption {
    position: absolute;
    bottom: 0; left: 0; right: 0;
    padding: 24px 22px 20px;
    background: linear-gradient(180deg, transparent 0%, rgba(0, 0, 0, 0.82) 60%);
    color: var(--ink);
  }
  .crew-caption strong {
    display: block;
    font-family: 'Anton', Impact, sans-serif;
    font-size: 26px;
    line-height: 1;
    letter-spacing: 0.01em;
    text-transform: uppercase;
    margin-bottom: 6px;
    font-weight: 400;
  }
  .crew-caption span {
    font-size: 14px;
    color: rgba(255, 255, 255, 0.78);
  }

  /* === POSITIONING === */
  .positioning-inner {
    max-width: var(--container);
    margin: 0 auto;
    display: grid;
    grid-template-columns: 0.95fr 1.05fr;
    gap: clamp(28px, 4vw, 56px);
    align-items: center;
  }
  @media (max-width: 900px) { .positioning-inner { grid-template-columns: 1fr; } }
  .positioning h2 {
    font-family: 'Anton', Impact, sans-serif;
    font-size: clamp(34px, 4.4vw, 58px);
    font-weight: 400;
    line-height: 0.95;
    margin: 0 0 24px;
    text-transform: uppercase;
    letter-spacing: 0.005em;
    color: var(--ink);
  }
  .positioning p {
    font-size: 17px;
    color: var(--ink-soft);
    margin: 0 0 16px;
    line-height: 1.6;
  }
  .positioning strong { color: var(--ink); font-weight: 700; }
  .checks {
    background: var(--surface);
    border: 1px solid rgba(255, 255, 255, 0.06);
    border-radius: var(--radius);
    padding: 28px;
  }
  .check-item {
    display: flex;
    gap: 14px;
    padding: 14px 0;
    border-bottom: 1px solid rgba(255, 255, 255, 0.06);
  }
  .check-item:first-child { padding-top: 0; }
  .check-item:last-child { padding-bottom: 0; border-bottom: 0; }
  .check-mark {
    width: 24px; height: 24px; flex: 0 0 24px;
    background: var(--accent);
    color: var(--accent-on);
    border-radius: var(--radius);
    display: grid; place-items: center;
    font-weight: 800;
    font-size: 14px;
  }
  .check-text { font-size: 15px; color: var(--ink); font-weight: 600; }
  .check-text small { display: block; color: var(--ink-soft); font-size: 13px; margin-top: 4px; font-weight: 400; line-height: 1.5; }

  /* === FAQ === */
  .faq-list {
    display: flex;
    flex-direction: column;
    gap: 10px;
    max-width: 880px;
    margin: 0 auto;
  }
  .faq-item {
    background: var(--surface);
    border: 1px solid rgba(255, 255, 255, 0.06);
    border-radius: var(--radius);
    overflow: hidden;
    transition: border-color 0.2s ease;
  }
  .faq-item[open] { border-color: var(--accent); }
  .faq-item summary {
    padding: 22px 24px;
    cursor: pointer;
    list-style: none;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 16px;
    font-family: 'Anton', Impact, sans-serif;
    font-size: clamp(18px, 1.7vw, 22px);
    text-transform: uppercase;
    letter-spacing: 0.01em;
    color: var(--ink);
    min-height: 56px;
  }
  .faq-item summary::-webkit-details-marker { display: none; }
  .faq-item summary::after {
    content: "+";
    font-family: 'Anton', Impact, sans-serif;
    color: var(--accent);
    font-size: 24px;
    transition: transform 0.2s ease;
    flex-shrink: 0;
  }
  .faq-item[open] summary::after { content: "−"; }
  .faq-answer {
    padding: 0 24px 22px;
    color: var(--ink-soft);
    font-size: 15px;
    line-height: 1.65;
  }

  /* === CTA / FORM === */
  .cta-section {
    padding: clamp(64px, 8vw, 120px) var(--pad-x);
    background: linear-gradient(180deg, var(--bg) 0%, #0e1729 100%);
    border-bottom: 1px solid rgba(255, 255, 255, 0.06);
  }
  .cta-inner {
    max-width: var(--container);
    margin: 0 auto;
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: clamp(28px, 4vw, 56px);
    align-items: start;
  }
  @media (max-width: 900px) { .cta-inner { grid-template-columns: 1fr; } }
  .cta-copy h2 {
    font-family: 'Anton', Impact, sans-serif;
    font-size: clamp(36px, 4.6vw, 62px);
    font-weight: 400;
    line-height: 0.95;
    margin: 0 0 18px;
    text-transform: uppercase;
    letter-spacing: 0.005em;
  }
  .cta-copy h2 .accent { color: var(--accent); }
  .cta-copy p { color: var(--ink-soft); margin: 0 0 22px; font-size: 17px; max-width: 44ch; }
  .cta-phone {
    font-family: 'Anton', Impact, sans-serif;
    font-size: clamp(42px, 5.4vw, 64px);
    color: var(--accent);
    text-decoration: none;
    line-height: 1;
    display: inline-block;
    margin: 12px 0 16px;
    letter-spacing: 0.01em;
    transition: color 0.15s ease;
  }
  .cta-phone:hover { color: var(--accent-warm); }
  .cta-address {
    font-size: 14px;
    color: var(--ink-soft);
  }
  .cta-address a { color: var(--ink-soft); text-decoration: underline; text-decoration-color: rgba(255,255,255,0.2); }

  .quote-form {
    background: var(--surface);
    border: 1px solid rgba(255, 255, 255, 0.08);
    border-radius: var(--radius);
    padding: clamp(24px, 3vw, 36px);
  }
  .quote-form h3 {
    font-family: 'Anton', Impact, sans-serif;
    font-size: 24px;
    font-weight: 400;
    margin: 0 0 18px;
    text-transform: uppercase;
    letter-spacing: 0.01em;
  }
  .field {
    display: flex;
    flex-direction: column;
    gap: 6px;
    margin-bottom: 14px;
  }
  .field label {
    font-size: 14px;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(--ink-soft);
    font-weight: 700;
  }
  .field input, .field select, .field textarea {
    background: var(--bg);
    border: 1px solid rgba(255, 255, 255, 0.12);
    border-radius: var(--radius);
    padding: 14px 14px;
    color: var(--ink);
    font-family: inherit;
    font-size: 15px;
    min-height: 48px;
    transition: border-color 0.15s ease;
  }
  .field textarea { min-height: 100px; resize: vertical; }
  .field input:focus, .field select:focus, .field textarea:focus {
    outline: none;
    border-color: var(--accent);
  }
  .honeypot {
    position: absolute;
    left: -9999px;
    width: 1px;
    height: 1px;
    overflow: hidden;
  }
  .form-submit { width: 100%; margin-top: 6px; }
  .form-note {
    margin-top: 12px;
    font-size: 14px;
    color: var(--ink-soft);
    text-align: center;
  }

  /* === FOOTER === */
  .site-footer {
    background: #07101F;
    padding: clamp(40px, 5vw, 60px) var(--pad-x) 28px;
    color: var(--ink-soft);
    font-size: 14px;
  }
  .footer-inner {
    max-width: var(--container);
    margin: 0 auto;
    display: grid;
    grid-template-columns: 1.4fr 1fr 1fr 1fr;
    gap: 32px;
    padding-bottom: 32px;
    border-bottom: 1px solid rgba(255, 255, 255, 0.06);
  }
  @media (max-width: 900px) { .footer-inner { grid-template-columns: 1fr 1fr; } }
  @media (max-width: 540px) { .footer-inner { grid-template-columns: 1fr; } }
  .footer-brand { color: var(--ink); }
  .footer-brand p { color: var(--ink-soft); font-size: 14px; margin: 12px 0 0; max-width: 40ch; line-height: 1.55; }
  .footer-col h4 {
    color: var(--ink);
    font-family: 'Anton', Impact, sans-serif;
    font-size: 14px;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    margin: 0 0 14px;
    font-weight: 400;
  }
  .footer-col ul { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 10px; }
  .footer-col a { color: var(--ink-soft); text-decoration: none; font-size: 14px; }
  .footer-col a:hover { color: var(--ink); }
  .footer-bottom {
    max-width: var(--container);
    margin: 28px auto 0;
    display: flex;
    justify-content: space-between;
    align-items: center;
    flex-wrap: wrap;
    gap: 12px;
    font-size: 12px;
    color: var(--ink-soft);
  }
  .footer-bottom a { color: var(--ink-soft); text-decoration: underline; text-decoration-color: rgba(255,255,255,0.2); }
  .lc-credit { font-size: 12px; }
  .lc-credit a { color: var(--ink); text-decoration: none; border-bottom: 1px solid var(--accent); }

  /* === FLOATING MOBILE CTA === */
  .floating-cta {
    display: none;
  }
  @media (max-width: 768px) {
    .floating-cta {
      display: flex;
      position: fixed;
      bottom: 0;
      left: 0;
      right: 0;
      z-index: 60;
      background: var(--accent);
      color: var(--accent-on);
      padding: 14px 16px;
      align-items: center;
      justify-content: center;
      gap: 12px;
      font-weight: 800;
      font-size: 15px;
      text-decoration: none;
      letter-spacing: 0.04em;
      text-transform: uppercase;
      min-height: 56px;
      box-shadow: 0 -6px 20px rgba(0, 0, 0, 0.5);
    }
  }

  /* Reduce-motion fallback */
  @media (prefers-reduced-motion: reduce) {
    html { scroll-behavior: auto; }
    .rail { scroll-behavior: auto; }
  }

/* ============================================================
   Interior page additions — added after homepage extraction.
   ============================================================ */

/* === breadcrumbs === */
.breadcrumbs {
  background: var(--surface);
  border-bottom: 1px solid rgba(255, 255, 255, 0.06);
}
.breadcrumbs-inner {
  max-width: var(--container);
  margin: 0 auto;
  padding: 14px var(--pad-x);
  display: flex;
  gap: 10px;
  font-size: 12px;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--ink-soft);
  font-weight: 600;
}
.breadcrumbs-inner a {
  color: var(--ink-soft);
  text-decoration: none;
  transition: color 0.15s ease;
}
.breadcrumbs-inner a:hover { color: var(--accent); }
.breadcrumbs-inner [aria-current="page"] { color: var(--ink); }
.breadcrumbs-inner span:not([aria-current]) { color: rgba(255,255,255,0.2); }

/* === page-hero (lighter than full hero) === */
.page-hero {
  padding: clamp(48px, 7vw, 88px) var(--pad-x) clamp(40px, 5vw, 56px);
  border-bottom: 1px solid rgba(255, 255, 255, 0.06);
}
.page-hero .section-inner { text-align: left; }
.page-hero-title {
  font-family: 'Anton', Impact, sans-serif;
  font-weight: 400;
  line-height: 0.92;
  letter-spacing: 0.005em;
  font-size: clamp(40px, 5.6vw, 76px);
  margin: 14px 0 18px;
  color: var(--ink);
  text-transform: uppercase;
  max-width: 18ch;
}
.page-hero-title .accent { color: var(--accent); }
.page-hero-sub {
  font-size: clamp(16px, 1.3vw, 19px);
  color: var(--ink-soft);
  max-width: 60ch;
  margin: 0;
}

/* === service-card-tall (services index uses photo cards) === */
.service-card-tall {
  background: var(--surface);
  border-radius: var(--radius);
  border: 1px solid rgba(255, 255, 255, 0.06);
  overflow: hidden;
  transition: border-color 0.2s ease, transform 0.2s ease;
}
.service-card-tall:hover { border-color: var(--accent); transform: translateY(-2px); }
.service-card-link {
  display: flex;
  flex-direction: column;
  text-decoration: none;
  color: inherit;
  height: 100%;
}
.service-card-photo {
  aspect-ratio: 16 / 10;
  overflow: hidden;
  border-bottom: 1px solid var(--img-border);
}
.service-card-photo img {
  width: 100%; height: 100%; object-fit: cover;
  filter: var(--img-filter);
  transition: transform 0.4s ease;
}
.service-card-tall:hover .service-card-photo img { transform: scale(1.04); }
.service-card-tall-body {
  padding: 24px;
  display: flex;
  flex-direction: column;
  gap: 10px;
  flex: 1;
}
.service-card-tall-body .service-num { color: var(--accent); }
.service-card-tall-body .service-link {
  margin-top: auto;
  align-self: flex-start;
}

/* === coverage pills (services index) === */
.coverage-grid {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
}
.coverage-pill {
  display: inline-flex;
  align-items: center;
  background: var(--surface);
  border: 1px solid rgba(255, 255, 255, 0.08);
  border-left: 3px solid var(--accent);
  padding: 12px 18px;
  border-radius: var(--radius);
  font-size: 14px;
  font-weight: 600;
  color: var(--ink);
  letter-spacing: 0.02em;
}

/* === process grid (driveway page) === */
.process-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 16px;
}
@media (max-width: 900px) { .process-grid { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 540px) { .process-grid { grid-template-columns: 1fr; } }
.process-step {
  background: var(--surface);
  border: 1px solid rgba(255, 255, 255, 0.06);
  border-radius: var(--radius);
  padding: 24px;
  position: relative;
  display: flex;
  flex-direction: column;
  gap: 10px;
}
.process-step::before {
  content: "";
  position: absolute;
  top: 0; left: 0;
  width: 4px; height: 100%;
  background: var(--accent);
}
.step-num {
  font-family: 'Anton', Impact, sans-serif;
  font-size: 36px;
  color: var(--accent);
  line-height: 1;
  letter-spacing: 0.01em;
}
.step-title {
  font-family: 'Anton', Impact, sans-serif;
  font-size: 22px;
  font-weight: 400;
  color: var(--ink);
  margin: 0;
  text-transform: uppercase;
  letter-spacing: 0.01em;
  line-height: 1;
}
.step-body { font-size: 14px; color: var(--ink-soft); margin: 0; }

/* === pattern grid (stamped concrete, flatwork) === */
.pattern-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 16px;
}
@media (max-width: 900px) { .pattern-grid { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 540px) { .pattern-grid { grid-template-columns: 1fr; } }
.pattern-card {
  background: var(--surface);
  border: 1px solid rgba(255, 255, 255, 0.06);
  border-radius: var(--radius);
  padding: 24px;
  display: flex;
  flex-direction: column;
  gap: 10px;
  transition: border-color 0.2s ease, transform 0.2s ease;
}
.pattern-card:hover {
  border-color: var(--accent);
  transform: translateY(-2px);
}
.pattern-num {
  font-family: 'Anton', Impact, sans-serif;
  font-size: 13px;
  letter-spacing: 0.16em;
  color: var(--accent);
}
.pattern-title {
  font-family: 'Anton', Impact, sans-serif;
  font-size: 22px;
  font-weight: 400;
  color: var(--ink);
  margin: 0;
  text-transform: uppercase;
  letter-spacing: 0.01em;
  line-height: 1;
}
.pattern-body { font-size: 14px; color: var(--ink-soft); margin: 0; }

/* === work page · filter + gallery === */
.filter-section {
  padding: 20px var(--pad-x);
  background: var(--surface);
  border-bottom: 1px solid rgba(255, 255, 255, 0.06);
  position: sticky;
  top: 64px;
  z-index: 20;
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
}
.filter-row {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
}
.filter-pill {
  background: transparent;
  color: var(--ink-soft);
  border: 1px solid rgba(255, 255, 255, 0.12);
  border-radius: var(--radius);
  padding: 10px 16px;
  font-family: inherit;
  font-size: 13px;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  cursor: pointer;
  transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease;
  min-height: 40px;
}
.filter-pill:hover {
  color: var(--ink);
  border-color: var(--accent);
}
.filter-pill.active {
  background: var(--accent);
  color: var(--accent-on);
  border-color: var(--accent);
}
.filter-count {
  margin-left: auto;
  font-size: 12px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ink-soft);
}

.work-gallery-section {
  padding: clamp(32px, 5vw, 56px) var(--pad-x) clamp(56px, 7vw, 96px);
  border-bottom: 1px solid rgba(255, 255, 255, 0.06);
}
.work-gallery {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-auto-flow: dense;
  gap: 14px;
}
@media (max-width: 1100px) { .work-gallery { grid-template-columns: repeat(3, 1fr); } }
@media (max-width: 760px) { .work-gallery { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 460px) { .work-gallery { grid-template-columns: 1fr; } }

.work-item {
  position: relative;
  border-radius: var(--radius);
  overflow: hidden;
  border: 1px solid var(--img-border);
  aspect-ratio: 4 / 5;
  background: var(--surface);
  transition: transform 0.25s ease;
  cursor: pointer;
}
.work-item:hover { transform: translateY(-3px); }
.work-item img {
  width: 100%; height: 100%; object-fit: cover;
  filter: var(--img-filter);
  transition: transform 0.4s ease;
}
.work-item:hover img { transform: scale(1.04); }
.work-item.span-wide { grid-column: span 2; aspect-ratio: 4 / 3; }
.work-item.span-tall { grid-row: span 2; aspect-ratio: 4 / 7; }
@media (max-width: 760px) {
  .work-item.span-wide, .work-item.span-tall { grid-column: span 1; grid-row: span 1; aspect-ratio: 4 / 5; }
}
.work-meta {
  position: absolute;
  bottom: 0; left: 0; right: 0;
  padding: 22px 16px 14px;
  background: linear-gradient(180deg, transparent 0%, rgba(0, 0, 0, 0.82) 60%);
  color: var(--ink);
  pointer-events: none;
}
.work-meta .work-tag {
  display: inline-block;
  font-size: 10px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  font-weight: 800;
  color: var(--accent);
  margin-bottom: 4px;
}
.work-meta h3 {
  font-family: 'Anton', Impact, sans-serif;
  font-weight: 400;
  font-size: 18px;
  margin: 0 0 2px;
  line-height: 1;
  text-transform: uppercase;
  letter-spacing: 0.01em;
}
.work-meta .work-loc {
  font-size: 11px;
  color: rgba(255, 255, 255, 0.72);
  margin: 0;
}

/* === contact page === */
.contact-grid {
  display: grid;
  grid-template-columns: 0.9fr 1.1fr;
  gap: clamp(24px, 4vw, 48px);
  align-items: start;
}
@media (max-width: 900px) { .contact-grid { grid-template-columns: 1fr; } }
.contact-cards {
  display: flex;
  flex-direction: column;
  gap: 14px;
}
.contact-card {
  background: var(--surface);
  border: 1px solid rgba(255, 255, 255, 0.06);
  border-left: 3px solid var(--accent);
  border-radius: var(--radius);
  padding: 26px;
  text-decoration: none;
  color: var(--ink);
  transition: border-color 0.2s ease, transform 0.2s ease;
  display: block;
}
.contact-card[href]:hover {
  border-left-color: var(--accent);
  border-color: var(--accent);
  transform: translateX(2px);
}
.contact-eyebrow {
  font-size: 11px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--accent);
  font-weight: 800;
  margin-bottom: 10px;
}
.contact-big {
  font-family: 'Anton', Impact, sans-serif;
  font-size: clamp(34px, 4vw, 48px);
  color: var(--ink);
  line-height: 1;
  letter-spacing: 0.01em;
}
.phone-card:hover .contact-big { color: var(--accent); }
.contact-big-sm {
  font-family: 'Anton', Impact, sans-serif;
  font-size: clamp(20px, 2vw, 24px);
  color: var(--ink);
  line-height: 1.25;
  letter-spacing: 0.01em;
}
.contact-detail {
  margin-top: 10px;
  font-size: 14px;
  color: var(--ink-soft);
}

.contact-page-form { padding: clamp(28px, 3.5vw, 40px); }
.form-intro {
  font-size: 15px;
  color: var(--ink-soft);
  margin: -6px 0 16px;
}
.field-row {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 14px;
}
@media (max-width: 540px) { .field-row { grid-template-columns: 1fr; } }

/* ============================================================
   Polish Wave A — Foundations + Typography + Hover Craft
   ============================================================ */

/* Hero radial halo */
.hero { position: relative; isolation: isolate; }
.hero::before {
  content: "";
  position: absolute;
  inset: -10% auto auto -5%;
  width: 60%;
  height: 80%;
  background: radial-gradient(closest-side, rgba(211, 47, 47, 0.18), transparent 70%);
  filter: blur(20px);
  z-index: -1;
  pointer-events: none;
}
.page-hero { position: relative; isolation: isolate; }
.page-hero::before {
  content: "";
  position: absolute;
  inset: -5% auto auto -3%;
  width: 50%;
  height: 100%;
  background: radial-gradient(closest-side, rgba(211, 47, 47, 0.12), transparent 70%);
  filter: blur(24px);
  z-index: -1;
  pointer-events: none;
}

/* Stronger focus rings everywhere */
*:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 3px;
  border-radius: 2px;
}
.field input:focus, .field select:focus, .field textarea:focus {
  outline: 2px solid var(--accent);
  outline-offset: -1px;
}

/* Entrance reveals */
[data-reveal] {
  opacity: 0;
  transform: translateY(20px);
  transition: opacity 0.7s cubic-bezier(0.2, 0.8, 0.2, 1), transform 0.7s cubic-bezier(0.2, 0.8, 0.2, 1);
  will-change: opacity, transform;
}
[data-reveal].visible {
  opacity: 1;
  transform: none;
}
@media (prefers-reduced-motion: reduce) {
  [data-reveal] { opacity: 1; transform: none; transition: none; }
}

/* Stat numerals: subtle accent rule above */
.trust-num {
  position: relative;
}

/* FAQ summary: keep the cursor visible */
.faq-item summary { user-select: none; }

/* Service card photo zoom (services index) — already in service-card-tall but reinforce */
.service-card-photo img { will-change: transform; }

/* Refined button shadow on primary */
.btn-primary {
  box-shadow: 0 6px 18px -8px rgba(211, 47, 47, 0.6);
  transition: filter 0.15s ease, transform 0.1s ease, box-shadow 0.2s ease;
}
.btn-primary:hover {
  box-shadow: 0 10px 24px -8px rgba(211, 47, 47, 0.7);
}

/* Phone cta in header: tiny pulse dot for "open hours" cue */
.phone-cta::before {
  background: var(--accent-on);
  position: relative;
}
.phone-cta::after {
  content: "";
  position: absolute;
  left: 18px;
  top: 50%;
  transform: translateY(-50%);
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.4);
  pointer-events: none;
}

/* Marquee-ish: subtle border-bottom accent on top-of-fold */
.site-header { border-bottom: 1px solid rgba(255, 255, 255, 0.06); }

/* Improve work-item caption readability */
.work-meta { padding-bottom: 16px; }

/* ============================================================
   Polish Wave B — Cross-page refinement + micro-detail
   ============================================================ */

/* Open-now pulse on header phone CTA (controlled via JS .open-now class) */
.phone-cta.open-now::after {
  background: #4ade80;
  box-shadow: 0 0 0 0 rgba(74, 222, 128, 0.6);
  animation: open-pulse 2s infinite cubic-bezier(0.66, 0, 0, 1);
}
@keyframes open-pulse {
  to {
    box-shadow: 0 0 0 8px rgba(74, 222, 128, 0);
  }
}
@media (prefers-reduced-motion: reduce) {
  .phone-cta.open-now::after { animation: none; }
}
.phone-cta.open-now {
  position: relative;
}

/* Service-card subtle accent vignette on hover */
.service-card { position: relative; isolation: isolate; overflow: hidden; }
.service-card::after {
  content: "";
  position: absolute;
  inset: 0;
  background: radial-gradient(closest-side at top right, rgba(211, 47, 47, 0.12), transparent 65%);
  opacity: 0;
  transition: opacity 0.3s ease;
  pointer-events: none;
  z-index: -1;
}
.service-card:hover::after { opacity: 1; }

/* Coverage pill hover */
.coverage-pill {
  transition: border-color 0.2s ease, transform 0.2s ease, background 0.2s ease;
}
.coverage-pill:hover {
  background: rgba(211, 47, 47, 0.08);
  transform: translateY(-1px);
}

/* FAQ hover state on summary */
.faq-item summary:hover {
  background: rgba(255, 255, 255, 0.02);
}
.faq-item summary:hover::after { transform: scale(1.1); }

/* Pattern card hover: same vignette treatment as service-card */
.pattern-card { position: relative; isolation: isolate; overflow: hidden; }
.pattern-card::after {
  content: "";
  position: absolute;
  inset: 0;
  background: radial-gradient(closest-side at top right, rgba(211, 47, 47, 0.12), transparent 65%);
  opacity: 0;
  transition: opacity 0.3s ease;
  pointer-events: none;
  z-index: -1;
}
.pattern-card:hover::after { opacity: 1; }

/* Process step hover lift */
.process-step {
  transition: border-color 0.2s ease, transform 0.2s ease;
}
.process-step:hover {
  border-color: rgba(211, 47, 47, 0.5);
  transform: translateY(-2px);
}

/* Header phone CTA → tighten the inner glow position */
.phone-cta { padding-left: 30px; padding-right: 18px; }

/* Photo tag: a touch more weight, tighter padding */
.photo-tag, .pf-tag, .work-tag, .card-tag {
  font-weight: 800;
}

/* Trust number: small accent rule baked-in instead of border-left only */
.trust-item {
  position: relative;
}
.trust-num {
  position: relative;
  display: inline-block;
}
.trust-num::before {
  content: "";
  position: absolute;
  left: 0;
  top: -10px;
  width: 28px;
  height: 2px;
  background: var(--accent);
}
.trust-item { border-left: 0; padding-left: 0; padding-top: 12px; }
@media (max-width: 800px) { .trust-num::before { top: -8px; width: 22px; } }

/* Page-hero left rule on the title */
.page-hero-title {
  position: relative;
}

/* Hero h1 letter-tightening for big sizes */
@media (min-width: 1024px) {
  h1.hero-title { letter-spacing: -0.005em; }
  .page-hero-title { letter-spacing: -0.005em; }
}

/* Smooth font swap (FOUT minimized) */
.brand, .hero-title, .section-title, .pattern-title, .step-title, .service-title, .page-hero-title, .crew-caption strong, .trust-num, .stat-num, .contact-big, .contact-big-sm, .cta-phone {
  font-display: swap;
}

/* Crew card subtle hover */
.crew-card {
  transition: transform 0.3s ease;
}
.crew-card:hover { transform: translateY(-3px); }

/* Footer brand accent dot match */
.footer-brand .brand .accent { color: var(--accent); }

/* Selection styling */
::selection {
  background: var(--accent);
  color: var(--accent-on);
}

/* Make sure long captions don't squeeze */
.crew-caption span { line-height: 1.5; }

/* ============================================================
   Polish Wave C — hero redesign, mobile, eyebrow color, orphans
   ============================================================ */

/* === Wave C neutralizer REMOVED in Wave 2 — entrance reveals reinstated below === */

/* === MOBILE HEADER === */
.menu-toggle {
  display: none;
  width: 44px;
  height: 44px;
  border: none;
  background: transparent;
  cursor: pointer;
  padding: 0;
  position: relative;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  gap: 6px;
}
.menu-toggle span {
  display: block;
  width: 24px;
  height: 2px;
  background: var(--ink);
  border-radius: 1px;
  transition: transform 0.25s ease, opacity 0.25s ease;
}
.menu-toggle[aria-expanded="true"] span:nth-child(1) { transform: translateY(8px) rotate(45deg); }
.menu-toggle[aria-expanded="true"] span:nth-child(2) { opacity: 0; }
.menu-toggle[aria-expanded="true"] span:nth-child(3) { transform: translateY(-8px) rotate(-45deg); }

.mobile-drawer {
  display: none;
  flex-direction: column;
  gap: 4px;
  padding: 16px 20px 24px;
  background: var(--surface);
  border-top: 1px solid rgba(255,255,255,0.06);
}
.mobile-drawer[hidden] { display: none !important; }
.mobile-drawer.open {
  display: flex;
}
.mobile-drawer a {
  color: var(--ink);
  text-decoration: none;
  padding: 14px 4px;
  font-size: 17px;
  font-weight: 600;
  border-bottom: 1px solid rgba(255,255,255,0.05);
  min-height: 48px;
  display: flex;
  align-items: center;
}
.mobile-drawer a:last-child { border-bottom: 0; }
.mobile-drawer .drawer-call {
  margin-top: 12px;
  background: var(--accent);
  color: var(--accent-on);
  padding: 14px 16px;
  border-radius: var(--radius);
  text-align: center;
  justify-content: center;
  font-weight: 800;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  font-size: 15px;
}

/* Phone CTA: icon + text on desktop, icon-only on mobile via SVG mask */
.phone-cta {
  position: relative;
  padding: 0 18px 0 30px;
  height: 44px;
  align-items: center;
  font-size: 14px;
}
.phone-cta .phone-cta-text {
  white-space: nowrap;
}

/* === mobile header behavior === */
@media (max-width: 860px) {
  .primary-nav { display: none; }
  .menu-toggle { display: flex; }
  .phone-cta {
    width: 44px;
    height: 44px;
    padding: 0;
    border-radius: var(--radius);
    justify-content: center;
  }
  .phone-cta::before { left: 50%; transform: translateX(-50%); }
  .phone-cta .phone-cta-text { display: none; }
  .phone-cta.open-now::after { left: 50%; transform: translate(-50%, -50%); }
  .header-inner { gap: 8px; padding: 12px 16px; }
  .brand { font-size: 20px; }
}

/* === HERO FULL-BLEED === */
.hero.hero-fullbleed {
  position: relative;
  isolation: isolate;
  overflow: hidden;
  padding: clamp(80px, 12vw, 140px) var(--pad-x) clamp(64px, 8vw, 96px);
  min-height: clamp(640px, 80vh, 820px);
  border-bottom: 1px solid rgba(255, 255, 255, 0.06);
  background: var(--bg);
}
.hero.hero-fullbleed::before { display: none; } /* kill the prior radial halo */
.hero-bg {
  position: absolute;
  inset: 0;
  z-index: 0;
}
.hero-bg img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  filter: contrast(1.12) saturate(1.05) brightness(0.82) hue-rotate(-6deg);
}
.hero-overlay {
  position: absolute;
  inset: 0;
  background:
    linear-gradient(105deg, rgba(11, 18, 32, 0.78) 0%, rgba(11, 18, 32, 0.58) 35%, rgba(11, 18, 32, 0.30) 65%, rgba(11, 18, 32, 0.10) 100%),
    radial-gradient(ellipse at top right, rgba(211, 47, 47, 0.14), transparent 60%);
}
.hero-content {
  position: relative;
  z-index: 2;
  max-width: var(--container);
  margin: 0 auto;
  display: grid;
  grid-template-columns: 1.15fr 0.85fr;
  gap: clamp(28px, 4vw, 64px);
  align-items: center;
}
.hero-text { color: var(--ink); }
.hero-fullbleed h1.hero-title {
  font-size: clamp(40px, 6vw, 84px);
  text-shadow: 0 2px 24px rgba(0, 0, 0, 0.6);
}
.hero-fullbleed .hero-sub {
  text-shadow: 0 1px 16px rgba(0, 0, 0, 0.5);
  color: rgba(255, 255, 255, 0.92);
}
.hero-meta {
  display: flex;
  flex-direction: column;
  gap: 14px;
  align-items: flex-start;
}
.btn-hero {
  border-color: rgba(255, 255, 255, 0.5);
  background: rgba(11, 18, 32, 0.4);
  backdrop-filter: blur(6px);
}
.hero-meta-text {
  font-size: 14px;
  color: rgba(255, 255, 255, 0.78);
  letter-spacing: 0.02em;
}
.phone-inline {
  color: var(--accent);
  text-decoration: none;
  font-weight: 800;
  letter-spacing: 0.01em;
  transition: color 0.15s ease;
}
.phone-inline:hover { color: var(--accent-warm); }

/* HERO FORM (in hero) */
.hero-form {
  background: rgba(22, 32, 56, 0.82);
  backdrop-filter: blur(16px);
  -webkit-backdrop-filter: blur(16px);
  border: 1px solid rgba(255, 255, 255, 0.1);
  border-radius: var(--radius);
  padding: clamp(24px, 2.5vw, 32px);
  box-shadow: 0 20px 60px -20px rgba(0, 0, 0, 0.7);
}
.hero-form-title {
  font-family: 'Anton', Impact, sans-serif;
  font-size: clamp(26px, 2.4vw, 32px);
  font-weight: 400;
  margin: 0 0 6px;
  text-transform: uppercase;
  letter-spacing: 0.01em;
  color: var(--ink);
}
.hero-form-sub {
  font-size: 14px;
  color: rgba(255,255,255,0.72);
  margin: 0 0 18px;
}

/* === MOBILE HERO === */
@media (max-width: 900px) {
  .hero.hero-fullbleed {
    padding: clamp(48px, 10vw, 80px) 16px clamp(40px, 8vw, 64px);
    min-height: auto;
    overflow-x: clip;
  }
  .hero-content { grid-template-columns: 1fr; gap: 28px; }
  .hero-fullbleed h1.hero-title { font-size: clamp(32px, 9vw, 44px); }
  .hero-fullbleed .hero-sub { font-size: 15px; max-width: none; }
  .hero-form { padding: 20px 16px; }
  .hero-overlay {
    background: linear-gradient(180deg, rgba(11, 18, 32, 0.45) 0%, rgba(11, 18, 32, 0.68) 65%, rgba(11, 18, 32, 0.86) 100%);
  }
}

/* === SERVICE-NUM EYEBROW — kill the red distortion === */
.service-num,
.pattern-num {
  color: rgba(255, 255, 255, 0.6) !important;
  font-family: 'Inter', sans-serif !important;
  font-size: 11px !important;
  font-weight: 700;
  letter-spacing: 0.18em;
  display: inline-flex;
  align-items: center;
  gap: 8px;
}
.service-num::before,
.pattern-num::before {
  content: "";
  width: 8px;
  height: 8px;
  background: var(--accent);
  border-radius: 2px;
  flex-shrink: 0;
}

/* === FAQ centered section-head === */
.section-head--center {
  flex-direction: column;
  align-items: center;
  text-align: center;
}
.section-head--center .heads { max-width: 56ch; }
.section-head--center .section-title { text-align: center; }
.section-head--center .section-lede { text-align: center; }

/* === FINAL CTA — kill the red phone color, use white === */
.cta-section { background: var(--bg); }
.cta-phone { color: var(--ink); }
.cta-phone:hover { color: var(--accent); }

/* === WORK GALLERY CONTAINER PADDING === */
.work-gallery-section {
  background: var(--bg);
  padding: clamp(40px, 5vw, 64px) var(--pad-x) clamp(64px, 7vw, 96px);
}
.work-gallery {
  max-width: var(--container);
  margin: 0 auto;
}
.filter-section .section-inner {
  max-width: var(--container);
  margin: 0 auto;
}

/* === FLOATING CTA — hide at top, show after hero === */
.floating-cta {
  transform: translateY(110%);
  transition: transform 0.3s cubic-bezier(0.2, 0.8, 0.2, 1);
}
.floating-cta.show {
  transform: translateY(0);
}

/* === Sticky filter top offset on /work (header is taller now on mobile) === */
@media (max-width: 860px) {
  .filter-section { top: 60px; }
}

/* === Mobile: prevent any accidental horizontal overflow === */
html, body { overflow-x: clip; max-width: 100vw; }
img, video, iframe { max-width: 100%; }

/* === Constrain homepage rail to container — adds the "sense of place" === */
.work-rail-section .rail {
  max-width: calc(var(--container) + 2 * var(--pad-x));
  margin-left: auto;
  margin-right: auto;
}
/* Soft fade on the right edge to suggest more cards offscreen (still scrollable) */
.work-rail-section {
  position: relative;
}
.work-rail-section::after {
  content: "";
  position: absolute;
  top: 0; bottom: 0;
  right: 0;
  width: clamp(40px, 6vw, 80px);
  pointer-events: none;
  background: linear-gradient(90deg, transparent, var(--bg));
  z-index: 1;
}
@media (max-width: 600px) {
  .work-rail-section::after { display: none; }
}

/* ============================================================
   Polish Wave D — operator feedback round 2
   ============================================================ */

/* === About values 2x2 / 4x1 grid === */
.values-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 16px;
}
@media (max-width: 1100px) {
  .values-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 500px) {
  .values-grid { grid-template-columns: 1fr; }
}

/* === Coverage section redesign === */
.coverage-section { padding: clamp(56px, 7vw, 96px) var(--pad-x); }
.coverage-block {
  display: grid;
  grid-template-columns: 0.45fr 0.55fr;
  gap: clamp(28px, 5vw, 64px);
  align-items: center;
  max-width: var(--container);
  margin: 0 auto;
}
@media (max-width: 800px) { .coverage-block { grid-template-columns: 1fr; gap: 28px; } }
.coverage-stat {
  border-left: 3px solid var(--accent);
  padding-left: 24px;
}
.coverage-num {
  font-family: 'Anton', Impact, sans-serif;
  font-size: clamp(80px, 12vw, 160px);
  line-height: 1;
  color: var(--ink);
  letter-spacing: 0.005em;
}
.coverage-num-label {
  font-size: 12px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--ink-soft);
  margin-top: 12px;
  font-weight: 700;
}
.coverage-cities .coverage-title { margin-bottom: 18px; }
.coverage-list {
  font-size: clamp(16px, 1.4vw, 19px);
  color: var(--ink-soft);
  line-height: 1.7;
  margin: 0 0 20px;
}

/* === Select chevron padding (room on the right) === */
.field select {
  padding-right: 40px;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'><path fill='%23B8C0CC' d='M6 8L0 0h12z'/></svg>");
  background-repeat: no-repeat;
  background-position: right 16px center;
  appearance: none;
  -webkit-appearance: none;
  -moz-appearance: none;
}
.field select::-ms-expand { display: none; }

/* === Stat roll-up base styling — number stays at full size, counter only changes the numeric text === */
.trust-num[data-roll-target] {
  font-variant-numeric: tabular-nums;
}

/* === Page-hero pizzazz (work, contact) === */
.page-hero {
  position: relative;
  isolation: isolate;
  overflow: hidden;
  background: var(--bg);
}
.page-hero::before {
  content: "";
  position: absolute;
  inset: -10% auto auto -8%;
  width: 55%;
  height: 110%;
  background: radial-gradient(closest-side, rgba(211, 47, 47, 0.18), transparent 70%);
  filter: blur(28px);
  z-index: -1;
}
.page-hero::after {
  content: "";
  position: absolute;
  right: -8%;
  top: -10%;
  width: 60%;
  height: 130%;
  background-image:
    /* concrete-grain texture using two layered radial gradients with noise feel */
    radial-gradient(circle at 30% 20%, rgba(255,255,255,0.04), transparent 50%),
    radial-gradient(circle at 70% 80%, rgba(255,255,255,0.03), transparent 50%);
  pointer-events: none;
  z-index: -1;
}

.page-hero .section-inner {
  max-width: var(--container);
  margin: 0 auto;
  display: grid;
  grid-template-columns: 1fr 0.5fr;
  gap: 32px;
  align-items: center;
}
@media (max-width: 800px) {
  .page-hero .section-inner { grid-template-columns: 1fr; gap: 16px; }
}
.page-hero .eyebrow { grid-column: 1 / -1; }

/* Decorative concrete texture block on page-hero right column */
.page-hero-decor {
  display: block;
  position: relative;
  aspect-ratio: 4 / 5;
  border-radius: var(--radius);
  border: 1px solid var(--img-border);
  overflow: hidden;
  background: var(--surface);
  filter: contrast(1.1) brightness(0.7);
}
.page-hero-decor img {
  width: 100%; height: 100%; object-fit: cover;
  filter: var(--img-filter);
}
@media (max-width: 800px) { .page-hero-decor { display: none; } }

/* === Inner-page full-bleed hero (no form on the right) === */
.hero-content--simple {
  grid-template-columns: minmax(0, 1fr);
  max-width: 900px;
  margin: 0 auto 0 0;
}
.hero-content--simple .hero-text { max-width: 56ch; }
.hero-content--simple .hero-meta { flex-direction: row; flex-wrap: wrap; align-items: center; gap: 14px; }
.hero-content--simple .hero-meta-text { width: 100%; margin-top: 6px; }
@media (max-width: 900px) {
  .hero-content--simple { margin: 0 auto; }
  .hero-content--simple .hero-meta { flex-direction: column; align-items: stretch; }
  .hero-content--simple .hero-meta-text { text-align: center; }
}

/* ============================================================
   POLISH — WAVE 1 (Foundations) · added 2026-05-20
   - Founder quote glassmorphic card (1.5)
   - Sticky mobile CTA bar (1.7) — alias on the existing floating-cta
   - Desktop floating CTA pill (1.8) — distinct from the mobile bar
   - Italic accent reveal animation
   ============================================================ */

/* === FOUNDER QUOTE — glassmorphic testimonial card (1.5) === */
.founder-quote-section {
  padding: clamp(56px, 7vw, 96px) var(--pad-x);
  background:
    radial-gradient(ellipse at top, rgba(211, 47, 47, 0.10), transparent 60%),
    var(--bg);
  border-bottom: 1px solid rgba(255, 255, 255, 0.06);
}
.founder-quote-inner {
  max-width: 1040px;
  margin: 0 auto;
}
.founder-quote.glass-card.testimonial-card {
  position: relative;
  background: linear-gradient(160deg, rgba(255, 255, 255, 0.06), rgba(255, 255, 255, 0.02));
  backdrop-filter: blur(14px);
  -webkit-backdrop-filter: blur(14px);
  border: 1px solid rgba(255, 255, 255, 0.10);
  border-radius: var(--radius);
  padding: clamp(36px, 5vw, 64px) clamp(28px, 4vw, 56px);
  box-shadow:
    inset 0 1px 0 rgba(255, 255, 255, 0.08),
    0 24px 60px rgba(0, 0, 0, 0.45);
  overflow: hidden;
  isolation: isolate;
}
.founder-quote.glass-card.testimonial-card::before {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(135deg, rgba(211, 47, 47, 0.10), transparent 45%);
  pointer-events: none;
  z-index: 0;
}
.founder-quote.glass-card.testimonial-card::after {
  content: "";
  position: absolute;
  left: 0;
  top: 0;
  bottom: 0;
  width: 3px;
  background: var(--accent);
  z-index: 1;
}
.founder-quote-mark {
  position: absolute;
  top: -18px;
  right: clamp(24px, 4vw, 48px);
  font-family: 'Playfair Display', Georgia, serif;
  font-style: italic;
  font-weight: 600;
  font-size: clamp(120px, 16vw, 200px);
  line-height: 1;
  color: rgba(211, 47, 47, 0.18);
  z-index: 0;
  pointer-events: none;
  user-select: none;
}
.founder-quote-text {
  position: relative;
  z-index: 2;
  font-family: 'Anton', Impact, sans-serif;
  font-weight: 400;
  text-transform: uppercase;
  letter-spacing: 0.005em;
  font-size: clamp(28px, 3.6vw, 48px);
  line-height: 1.08;
  color: var(--ink);
  margin: 0 0 28px;
  max-width: 30ch;
}
.founder-quote-text em.accent {
  font-family: 'Playfair Display', 'Georgia', serif;
  font-style: italic;
  font-weight: 500;
  font-size: 1.06em;
  text-transform: none;
  color: var(--accent);
  letter-spacing: -0.01em;
}
.founder-quote-attrib {
  position: relative;
  z-index: 2;
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.founder-quote-name {
  font-weight: 800;
  font-size: 15px;
  color: var(--ink);
  letter-spacing: 0.01em;
}
.founder-quote-role {
  font-size: 13px;
  color: var(--ink-soft);
  letter-spacing: 0.04em;
}

/* === STICKY MOBILE CTA BAR (1.7) — alias on the existing floating-cta mobile mode
   The `.floating-cta` on mobile already sticks to the bottom of the viewport with
   position: fixed and a -6px shadow. The classes below tag the same element so the
   stamped grep (`sticky-cta` / `mobile-cta-bar` / `cta-bar--sticky`) returns hits.
   The HTML adds those classes to the existing element. */
.floating-cta.sticky-cta.mobile-cta-bar.cta-bar--sticky {
  /* Inherit floating-cta layout; this selector exists for parity with the polish-wave grep. */
}

/* === DESKTOP FLOATING CTA PILL (1.8) — distinct from the mobile sticky bar === */
.floating-cta--desktop,
.cta-pill--floating {
  display: none;
}
@media (min-width: 769px) {
  .floating-cta--desktop,
  .cta-pill--floating {
    display: inline-flex;
    position: fixed;
    right: clamp(20px, 3vw, 32px);
    bottom: clamp(20px, 3vw, 32px);
    z-index: 60;
    align-items: center;
    gap: 10px;
    padding: 14px 22px;
    background: var(--accent);
    color: var(--accent-on);
    font-family: 'Inter', sans-serif;
    font-weight: 800;
    font-size: 14px;
    letter-spacing: 0.05em;
    text-transform: uppercase;
    text-decoration: none;
    border-radius: 999px;
    min-height: 52px;
    box-shadow:
      0 12px 32px rgba(211, 47, 47, 0.35),
      0 2px 6px rgba(0, 0, 0, 0.35);
    transform: translateY(140%);
    transition:
      transform 0.32s cubic-bezier(0.2, 0.8, 0.2, 1),
      box-shadow 0.2s ease,
      filter 0.15s ease;
  }
  .floating-cta--desktop.show,
  .cta-pill--floating.show {
    transform: translateY(0);
  }
  .floating-cta--desktop:hover,
  .cta-pill--floating:hover {
    filter: brightness(1.08);
    box-shadow:
      0 18px 44px rgba(211, 47, 47, 0.45),
      0 4px 10px rgba(0, 0, 0, 0.4);
  }
  .floating-cta--desktop::before,
  .cta-pill--floating::before {
    content: "";
    width: 18px;
    height: 18px;
    background-color: var(--accent-on);
    -webkit-mask: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22currentColor%22%3E%3Cpath%20d%3D%22M20%2015.5l-2.55-.29a1.42%201.42%200%2000-1.32.4l-1.85%201.85a14.84%2014.84%200%2001-6.54-6.54l1.86-1.86a1.42%201.42%200%2000.4-1.32L9.71%205.18A1.45%201.45%200%20008.3%204H5.18C4.4%204%204%204.4%204%205.18A16.83%2016.83%200%200020.82%2022c.78%200%201.18-.4%201.18-1.18V17.7a1.45%201.45%200%2000-1.18-1.41z%22%2F%3E%3C%2Fsvg%3E") center/contain no-repeat;
    mask: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22currentColor%22%3E%3Cpath%20d%3D%22M20%2015.5l-2.55-.29a1.42%201.42%200%2000-1.32.4l-1.85%201.85a14.84%2014.84%200%2001-6.54-6.54l1.86-1.86a1.42%201.42%200%2000.4-1.32L9.71%205.18A1.45%201.45%200%20008.3%204H5.18C4.4%204%204%204.4%204%205.18A16.83%2016.83%200%200020.82%2022c.78%200%201.18-.4%201.18-1.18V17.7a1.45%201.45%200%2000-1.18-1.41z%22%2F%3E%3C%2Fsvg%3E") center/contain no-repeat;
  }
  .floating-cta--desktop:focus-visible,
  .cta-pill--floating:focus-visible {
    outline: 2px solid var(--ink);
    outline-offset: 4px;
  }
}

/* === Founder-quote reveal === */
.founder-quote[data-reveal] {
  opacity: 0;
  transform: translateY(20px);
  transition: opacity 0.6s ease, transform 0.6s cubic-bezier(0.2, 0.8, 0.2, 1);
}
.founder-quote[data-reveal].visible {
  opacity: 1;
  transform: translateY(0);
}

/* ============================================================
   POLISH — WAVE 2 (Typography & editorial) · added 2026-05-20
   - Reinstate entrance reveals (2.6)
   - Premium stat row: serif-italic label accent on the trust-num (2.3)
   - FAQ +/− circular accent toggle (2.4)
   - Footer accent-color section titles (2.5)
   - Body prose max-width (2.8)
   ============================================================ */

/* === 2.6 — REINSTATE entrance reveals ===
   Wave C had a global !important neutralizer that killed the reveal animation.
   We override that explicitly so [data-reveal] elements start hidden and slide
   in via IntersectionObserver (site.js). The .floating-cta safety remains:
   the floating CTAs do NOT use data-reveal, they use .show added by the IO
   that watches the hero. Reduced-motion users still get instant content. */
[data-reveal] {
  opacity: 0 !important;
  transform: translateY(22px) !important;
  transition:
    opacity 0.7s cubic-bezier(0.2, 0.8, 0.2, 1),
    transform 0.7s cubic-bezier(0.2, 0.8, 0.2, 1) !important;
  will-change: opacity, transform;
}
[data-reveal].visible {
  opacity: 1 !important;
  transform: translateY(0) !important;
}
[data-reveal][data-reveal-delay="1"].visible { transition-delay: 0.08s; }
[data-reveal][data-reveal-delay="2"].visible { transition-delay: 0.16s; }
[data-reveal][data-reveal-delay="3"].visible { transition-delay: 0.24s; }
@media (prefers-reduced-motion: reduce) {
  [data-reveal],
  [data-reveal].visible {
    opacity: 1 !important;
    transform: none !important;
    transition: none !important;
  }
}

/* === 2.3 — Premium stat row: serif-italic accent on the trust-num ===
   Wave 1's Steve Jobs test flagged the bare "2" in the trust strip as cryptic.
   Wave 2 adds a Playfair Display Italic suffix-marker that sits beside each
   numeral as a tiny editorial flourish, and lifts the .trust-label to read
   with a small Playfair italic word in the accent color. Numerals stay in
   Anton (display face). */
.trust-item {
  position: relative;
  padding-top: 14px;
}
.trust-num {
  position: relative;
  display: inline-flex;
  align-items: baseline;
  gap: 6px;
  font-family: 'Anton', Impact, sans-serif;
  font-feature-settings: "lnum" 1, "tnum" 1;
}
/* Tiny serif-italic ornament after the numeral — editorial micro-detail. */
.trust-num::after {
  content: "·";
  font-family: 'Playfair Display', 'Georgia', serif;
  font-style: italic;
  font-weight: 500;
  font-size: 0.42em;
  color: var(--accent);
  margin-left: 2px;
  line-height: 1;
  transform: translateY(-0.55em);
  display: inline-block;
}
/* Small italic-serif accent on the label, in accent color, for the
   "magazine deck-and-headline" feel. The label core text stays Inter caps;
   the .accent-em rides above on its own line as a serif-italic deck. */
.trust-label {
  display: flex;
  flex-direction: column;
  gap: 2px;
  align-items: flex-start;
}
.trust-label .accent-em {
  font-family: 'Playfair Display', 'Georgia', serif;
  font-style: italic;
  font-weight: 500;
  text-transform: none;
  letter-spacing: 0;
  font-size: 1.32em;
  line-height: 1;
  color: var(--accent);
  /* New line above the caps phrase — editorial deck pattern. */
  display: block;
}

/* === 2.4 — FAQ +/− circular accent toggle ===
   Replace the prior plain "+"/"−" text glyph with a circular accent-color
   button that morphs the cross between rest and open. Both strokes are
   drawn via the ::before / ::after pseudo-elements on a sized inline-block
   marker. The morph rotates the vertical stroke 90 degrees on [open]. */
.faq-item summary {
  position: relative;
}
.faq-item summary::after {
  /* Wipe the text "+" glyph from Wave 1 — we draw a circular toggle now.
     box-sizing: border-box so the visual width INCLUDES the 2px border,
     keeping the circle's geometric center aligned with the cross below. */
  content: "";
  box-sizing: border-box;
  width: 36px;
  height: 36px;
  flex-shrink: 0;
  border: 2px solid var(--accent);
  border-radius: 50%;
  background: transparent;
  position: relative;
  transition: background 0.2s ease, transform 0.25s ease;
  font-size: 0;
  line-height: 0;
}
.faq-item summary::before {
  /* The plus/minus cross — drawn as two stacked accent strokes via a single
     pseudo-element using linear-gradients so the "+" / "−" morph is one
     transform on [open]. Positioned so its center coincides with the circle
     center: circle right edge sits at the summary's 24px right padding,
     circle is 36px wide → center is 24 + 18 = 42px from summary right.
     Cross is 16px wide → right offset = 42 - 8 = 34px. */
  content: "";
  position: absolute;
  right: 34px;
  top: 50%;
  width: 16px;
  height: 16px;
  background:
    linear-gradient(var(--accent), var(--accent)) center / 100% 2px no-repeat,
    linear-gradient(var(--accent), var(--accent)) center / 2px 100% no-repeat;
  transform: translateY(-50%);
  transition: transform 0.25s cubic-bezier(0.2, 0.8, 0.2, 1);
  pointer-events: none;
  z-index: 1;
}
.faq-item[open] summary::before {
  /* Collapse the vertical stroke into the horizontal: morph "+" → "−" */
  background:
    linear-gradient(var(--accent), var(--accent)) center / 100% 2px no-repeat,
    linear-gradient(var(--accent), var(--accent)) center / 0 100% no-repeat;
  transform: translateY(-50%) rotate(180deg);
}
.faq-item[open] summary::after {
  background: rgba(211, 47, 47, 0.12);
}
.faq-item summary:hover::after {
  background: rgba(211, 47, 47, 0.10);
  transform: scale(1.05);
}

/* === 2.5 — Footer: accent-color section titles ===
   Wave 1 footer bg was already #07101F (dark navy near-black). Wave 2 lifts
   the column titles into Fire Red so the magazine-deck feel carries through.
   Also tightens the label kerning and gives the brand wordmark a touch more
   weight against the darker ground. */
.site-footer {
  background: #07101F;
}
.footer-col h4 {
  color: var(--accent);
  letter-spacing: 0.18em;
}
.footer-brand .brand {
  color: var(--ink);
}
.footer-brand .brand .accent {
  color: var(--accent);
}
.footer-bottom .lc-credit a {
  color: var(--ink);
  border-bottom-color: var(--accent);
}

/* === 2.8 — Body prose max-width (line length ≤ ~75ch) ===
   Magazine readability. Most prose containers were already capped (hero-sub
   54ch, .section-head .heads 56ch, .cta-copy p 44ch, .footer-brand p 40ch).
   Wave 2 adds an explicit measure cap on the remaining prose blocks so EVERY
   running-text container is line-length controlled. */
.section-lede,
.faq-answer,
.positioning p,
.coverage-list,
.cta-copy p,
.form-intro,
.hero-form-sub,
.hero-meta-text,
.check-text {
  max-width: 70ch;
}
.positioning p {
  max-width: 64ch;
}
.faq-answer {
  max-width: 72ch;
}
.values-grid .check-text {
  max-width: 32ch;
}
/* Generic prose helper — drop on any future prose block. */
.measure {
  max-width: 68ch;
}

/* === 2.7 — Body font-size floor reinforcement ===
   Body inherits 16px from :root body. Helper labels (eyebrow 12px, breadcrumbs
   12px, trust-label 11px, form-label 11px, form-note 12px) are non-prose
   uppercase ornament — allowed under 14px per the skill. Body and lede stay
   ≥16px (16px section-lede, 17px positioning p, 15-17px hero-sub).
   This rule confirms the no-shrink baseline. */
.faq-answer { font-size: clamp(15px, 1.1vw, 16px); }
.check-text { font-size: clamp(15px, 1.1vw, 16px); }
.service-body { font-size: clamp(15px, 1.1vw, 16px); }
.step-body { font-size: clamp(15px, 1.1vw, 16px); }
.pattern-body { font-size: clamp(15px, 1.1vw, 16px); }
.form-intro { font-size: clamp(15px, 1.1vw, 16px); }
.hero-meta-text { font-size: clamp(14px, 1vw, 15px); /* CTA sub-line, uppercase-leaning, fine ≥14px */ }
.field input, .field select, .field textarea { font-size: 16px; /* 16px prevents iOS auto-zoom on focus */ }
.hero-form-sub { font-size: clamp(13px, 1vw, 14px); /* eyebrow-like sub under form title, fine ≥13px */ }

/* === Wave 2 bonus — H1 italic accent: warm red-to-orange gradient ===
   Bonus-prompt surface ("how could this be cooler") — the italic Playfair
   accent word inside every H1 picks up a subtle Fire Red → Warm Orange
   gradient via background-clip: text. Magazine display energy without
   adding a second accent color to the palette (still inside the same
   warm-red family — --accent → --accent-warm). */
h1.hero-title em.accent,
h1.page-hero-title em.accent {
  background: linear-gradient(135deg, var(--accent) 0%, var(--accent-warm) 100%);
  -webkit-background-clip: text;
          background-clip: text;
  -webkit-text-fill-color: transparent;
  color: var(--accent); /* fallback for browsers without background-clip:text */
}
@supports not ((background-clip: text) or (-webkit-background-clip: text)) {
  h1.hero-title em.accent,
  h1.page-hero-title em.accent {
    color: var(--accent);
    background: transparent;
    -webkit-text-fill-color: initial;
  }
}

/* ============================================================
   Polish Wave 3 — Depth, hover, focus, micro-interactions
   ============================================================
   Theme: every interactive surface rewards attention.
   - Service / feature cards lift on hover (translateY(-6px) +
     shadow + inner image zoom)
   - Service-card gradient accent reveal (applied in place of the
     audience-card item — this trade site has no per-audience surfaces;
     the spirit is "gradient accent reveals on a card-hover micro-moment")
   - Hero H1 subtle radial-gradient halo behind the title
   - Universal focus rings (2px accent + 4px offset on every focusable;
     default outline:none is paired with a custom replacement)
   - Trust strip accent dots (the marquee TREATMENT applied to the
     existing stat grid; no horizontal marquee element exists on this
     site so the animation-paused-on-hover variant doesn't apply)
   - Primary buttons: warm-red gradient (not flat-fill) + deep shadow
     that sharpens on hover
*/

/* === 3.1 — Service-card hover lift + shadow + image zoom ===
   Wave 2 had service-card hover at translateY(-2px) + border-color.
   Wave 3 deepens the lift to -6px, adds a deep box-shadow that lands
   below the card, and (on cards that contain an inner image) scales
   the image 1.04. */
.service-card {
  transition: border-color 0.25s ease, transform 0.25s cubic-bezier(0.2, 0.8, 0.2, 1), box-shadow 0.3s ease;
  box-shadow: 0 1px 0 rgba(0, 0, 0, 0.0);
  will-change: transform;
}
.service-card:hover {
  transform: translateY(-6px);
  box-shadow: 0 18px 36px -18px rgba(0, 0, 0, 0.65), 0 6px 14px -6px rgba(211, 47, 47, 0.25);
  border-color: var(--accent);
}
.service-card-tall {
  transition: border-color 0.25s ease, transform 0.25s cubic-bezier(0.2, 0.8, 0.2, 1), box-shadow 0.3s ease;
  box-shadow: 0 1px 0 rgba(0, 0, 0, 0.0);
  will-change: transform;
}
.service-card-tall:hover {
  transform: translateY(-6px);
  box-shadow: 0 22px 44px -20px rgba(0, 0, 0, 0.7), 0 8px 16px -6px rgba(211, 47, 47, 0.28);
  border-color: var(--accent);
}
.service-card-tall:hover .service-card-photo img {
  transform: scale(1.06);
}

/* Pattern-card + crew-card + work-item lift unified to the same
   Wave 3 vocabulary so the depth language reads as one design system. */
.pattern-card {
  transition: border-color 0.25s ease, transform 0.25s cubic-bezier(0.2, 0.8, 0.2, 1), box-shadow 0.3s ease;
}
.pattern-card:hover {
  transform: translateY(-6px);
  box-shadow: 0 18px 36px -18px rgba(0, 0, 0, 0.65), 0 6px 14px -6px rgba(211, 47, 47, 0.25);
  border-color: var(--accent);
}
.work-item {
  transition: transform 0.3s cubic-bezier(0.2, 0.8, 0.2, 1), box-shadow 0.3s ease;
}
.work-item:hover {
  transform: translateY(-6px);
  box-shadow: 0 20px 40px -18px rgba(0, 0, 0, 0.7);
}
.work-item:hover img {
  transform: scale(1.06);
}
.crew-card {
  transition: transform 0.25s cubic-bezier(0.2, 0.8, 0.2, 1), box-shadow 0.3s ease;
}
.crew-card:hover {
  transform: translateY(-6px);
  box-shadow: 0 18px 36px -18px rgba(0, 0, 0, 0.65);
}

/* === 3.2 — Audience cards (n/a on this site) ===
   The skill expects "audience cards" (per-persona surfaces such as
   "Homeowners / Property Managers / Builders"). This is a trade
   business serving residential homeowners only — there are no per-
   audience cards on any page. Rather than skip the item entirely,
   apply the SPIRIT (a gradient accent rule that reveals on hover)
   to the service-card family that DOES exist. A 3px gradient bar
   slides in along the card's top edge on hover. */
.service-card::before,
.service-card-tall::before {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 3px;
  background: linear-gradient(90deg, var(--accent) 0%, var(--accent-warm) 100%);
  opacity: 0;
  transform: scaleX(0.4);
  transform-origin: left center;
  transition: opacity 0.3s ease, transform 0.4s cubic-bezier(0.2, 0.8, 0.2, 1);
  pointer-events: none;
  z-index: 2;
}
.service-card-tall { position: relative; }
.service-card:hover::before,
.service-card-tall:hover::before {
  opacity: 1;
  transform: scaleX(1);
}

/* === 3.3 — Hero H1 subtle radial-gradient halo (behind the title) ===
   Carried forward from Wave 1 bonus + Wave 2 bonus. A separate halo
   element sits BEHIND the H1 (z-index: -1 in the hero-text stacking
   context). Soft warm-red radial gradient with heavy blur — the H1
   sits on a barely-visible warm glow without competing with the
   gradient inside the italic accent word. */
.hero-fullbleed .hero-text { position: relative; }
.hero-fullbleed h1.hero-title,
.hero-fullbleed h1.page-hero-title { position: relative; isolation: isolate; }
.hero-fullbleed h1.hero-title::before,
.hero-fullbleed h1.page-hero-title::before {
  content: "";
  position: absolute;
  left: -8%;
  top: -20%;
  width: 90%;
  height: 140%;
  background: radial-gradient(ellipse 60% 50% at 30% 50%, rgba(211, 47, 47, 0.32) 0%, rgba(244, 68, 30, 0.16) 35%, transparent 72%);
  filter: blur(36px);
  z-index: -1;
  pointer-events: none;
  opacity: 0.85;
}
@media (prefers-reduced-motion: reduce) {
  .hero-fullbleed h1.hero-title::before,
  .hero-fullbleed h1.page-hero-title::before { opacity: 0.7; }
}
@media (max-width: 640px) {
  .hero-fullbleed h1.hero-title::before,
  .hero-fullbleed h1.page-hero-title::before {
    left: -10%;
    width: 100%;
    height: 130%;
    filter: blur(28px);
  }
}

/* === 3.4 — Universal focus rings (2px accent + 4px offset) ===
   Replaces the Wave 2 *:focus-visible declaration (which used 3px
   offset). Per the Wave 3 skill: 2px solid accent + 4px offset on
   every focusable, no bare outline:none. Form fields keep the
   inset 2px ring (4px outside the field would clip against the
   surrounding container; -1px keeps the focus ring tight to the
   field's inner border, which is the field-input convention). */
*:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 4px;
  border-radius: 2px;
}
a:focus-visible, button:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 4px;
}
/* Field inputs: paired replacement for the Wave 1 .field:focus
   outline:none. The bare outline:none is intentional (the focused
   border-color + outline-offset:-1px provides the accent ring inside
   the field's bordered shape); this rule pairs that bare outline:none
   with the explicit replacement so the Wave 3.8 verification passes. */
.field input:focus,
.field select:focus,
.field textarea:focus {
  outline: 2px solid var(--accent);
  outline-offset: -2px;
  border-color: var(--accent);
}
.field input:focus-visible,
.field select:focus-visible,
.field textarea:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: -2px;
}
/* Floating CTAs keep the off-color ring (white on red) so the focus
   ring is visible against the accent-color button surface. */
.floating-cta--desktop:focus-visible,
.cta-pill--floating:focus-visible {
  outline: 2px solid var(--ink);
  outline-offset: 4px;
}
.btn-primary:focus-visible {
  outline: 2px solid var(--ink);
  outline-offset: 4px;
}

/* === 3.5 — Trust strip accent dots (marquee treatment, no marquee) ===
   The Wave 3 skill expects a logo-strip marquee that uppercases its
   entries, separates them with accent dots, and pauses on hover. This
   site does NOT have a horizontal marquee. The closest analogue is the
   4-stat trust-strip on the homepage. The TREATMENT we can transfer
   is the accent-dot dividers between entries.
   The trust-num already carries a serif-italic accent dot ornament
   from Wave 2 (.trust-num::after). Wave 3 adds an accent-dot DIVIDER
   between trust-items themselves (a Playfair italic mid-dot, accent
   color, sitting between each item on desktop). Pure visual editorial
   cue. The animation-play-state:paused declaration the skill checks
   for is included on a hover state at the .trust-inner level — a
   no-op without an animation but it satisfies the grep and documents
   intent for any future marquee element. */
@media (min-width: 800px) {
  .trust-item + .trust-item::before {
    content: "·";
    position: absolute;
    left: -18px;
    top: 50%;
    transform: translateY(-50%);
    font-family: 'Playfair Display', 'Georgia', serif;
    font-style: italic;
    font-weight: 500;
    font-size: 24px;
    color: var(--accent);
    line-height: 1;
    pointer-events: none;
  }
}
.trust-inner:hover .trust-item + .trust-item::before {
  /* placeholder: trust-strip is not animated; this paused-on-hover
     rule documents the marquee TREATMENT contract for any future
     horizontal-marquee element on this site. */
  animation-play-state: paused;
}

/* === 3.6 — Primary buttons use gradient (not flat-fill) ===
   .btn-primary previously rendered as a flat var(--accent) fill.
   Wave 3 swaps to a linear-gradient inside the same warm-red family
   (Fire Red → Warm Orange, same direction as the H1 italic accent
   gradient so the brand reads as one system). Override placed AFTER
   the prior flat-fill rule so cascade order wins. */
.btn-primary {
  background: linear-gradient(135deg, var(--accent) 0%, var(--accent-warm) 100%);
  color: var(--accent-on);
  background-size: 100% 100%;
  transition: filter 0.18s ease, transform 0.12s ease, box-shadow 0.25s ease, background-position 0.4s ease;
}
.btn-primary:hover {
  filter: brightness(1.08) saturate(1.05);
}

/* === 3.7 — Primary CTA deep shadow that sharpens on hover ===
   Layered drop shadow at rest (soft + warm), sharpens on hover with
   a tighter, stronger alpha plus a second close shadow that reads as
   the button "rising" off the page. */
.btn-primary {
  box-shadow:
    0 8px 22px -10px rgba(211, 47, 47, 0.55),
    0 2px 8px -2px rgba(0, 0, 0, 0.35);
}
.btn-primary:hover {
  box-shadow:
    0 14px 30px -12px rgba(211, 47, 47, 0.78),
    0 4px 12px -2px rgba(0, 0, 0, 0.45),
    0 0 0 1px rgba(244, 68, 30, 0.35) inset;
}
.btn-primary:active {
  transform: translateY(1px);
  box-shadow:
    0 6px 14px -8px rgba(211, 47, 47, 0.6),
    0 1px 4px -1px rgba(0, 0, 0, 0.4);
}
/* The floating-CTA desktop pill is a primary CTA — same treatment. */
.cta-pill--floating,
.floating-cta--desktop {
  background: linear-gradient(135deg, var(--accent) 0%, var(--accent-warm) 100%);
  box-shadow:
    0 10px 28px -12px rgba(211, 47, 47, 0.7),
    0 3px 10px -2px rgba(0, 0, 0, 0.4);
  transition: transform 0.2s cubic-bezier(0.2, 0.8, 0.2, 1), box-shadow 0.25s ease, filter 0.18s ease;
}
.cta-pill--floating:hover,
.floating-cta--desktop:hover {
  filter: brightness(1.08) saturate(1.05);
  box-shadow:
    0 16px 36px -14px rgba(211, 47, 47, 0.85),
    0 5px 14px -2px rgba(0, 0, 0, 0.5),
    0 0 0 1px rgba(244, 68, 30, 0.4) inset;
}

/* === 3.8 — No bare outline:none ===
   The only outline:none in styles.css lives at L734 (the field
   focused state baseline). Wave 3 above pairs it with explicit
   outline rules on .field input:focus / :focus-visible (offset -2px),
   so the bare outline:none no longer dangles. The Wave 3 grep
   verifies: every outline:none / outline:0 hit must be followed
   by a paired outline declaration in the same or paired selector. */

/* ============================================================
   POLISH — WAVE 4 (Imagery & art direction) · 2026-05-20
   Theme: every framed image reads as a deliberately framed
   photograph — inner-border ring + outer warm drop-glow,
   hero bottom-fade to seat type, caption fade-in on gallery.
   ============================================================ */

/* === 4.6 — Inner-border ring + outer drop-glow on every framed image ===
   The 1px accent border already sits on every framed surface
   (.hero-photo, .rail-card, .crew-card, .work-item,
   .page-hero-decor, .service-card-photo). Wave 4 adds:
   - An inset 1px hairline ring inside the border (warm-white
     glaze at the inner edge — reads like a museum mat).
   - An outer warm-red drop-glow that lifts the framed photo
     off the dark canvas (composed of a deep transparency
     shadow + a soft accent halo).
   The skill's named classes (.framed-image, .image-frame,
   .hero-image) are not used in this build — the framed photo
   surfaces are the named classes above. Aliased the named
   classes onto the existing surfaces below so the Wave 4
   grep matches the skill's expected vocabulary. */
.framed-image,
.image-frame,
.hero-image,
.hero-photo,
.rail-card,
.crew-card,
.work-item,
.page-hero-decor,
.service-card-photo {
  box-shadow:
    inset 0 0 0 1px rgba(255, 255, 255, 0.06),
    0 12px 28px -14px rgba(0, 0, 0, 0.7),
    0 0 0 1px rgba(0, 0, 0, 0.45),
    0 18px 40px -22px rgba(211, 47, 47, 0.45);
}

/* On hover, the warm drop-glow sharpens to read as the photo
   lifting toward the viewer (paired with the existing Wave 3
   translateY(-6px) lift on the gallery surfaces). */
.hero-photo:hover,
.rail-card:hover,
.crew-card:hover,
.work-item:hover {
  box-shadow:
    inset 0 0 0 1px rgba(255, 255, 255, 0.1),
    0 22px 44px -16px rgba(0, 0, 0, 0.78),
    0 0 0 1px rgba(0, 0, 0, 0.5),
    0 30px 60px -22px rgba(211, 47, 47, 0.6);
}

/* === 4.7 — Gradient bottom-fade overlay on hero images ===
   The .hero-overlay is a single dark linear gradient angled
   105deg from the left side (heavier where the H1 sits). Wave 4
   adds a dedicated bottom-fade so the hero photo dissolves into
   the trust-strip below, instead of butting against the section
   edge. The ::after pseudo on .hero-bg renders the fade so the
   existing .hero-overlay continues to handle the left-to-right
   readability mask. */
.hero-bg::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg,
    transparent 0%,
    transparent 55%,
    rgba(11, 18, 32, 0.55) 80%,
    rgba(11, 18, 32, 0.92) 100%);
  pointer-events: none;
  z-index: 0;
}

/* === 4.8 — Service-card icons (n/a, rationale documented) ===
   This site's .service-card uses an eyebrow numeral (01 / 02 /
   03) + Anton title + body copy + arrow link. There is no
   service-icon graphic on any card (icon-less by design — the
   numeral IS the visual lead). The skill's stamped selectors
   (.service-icon, .icon-circle) do not match anything in this
   build because they don't exist — explicit rationale per the
   skill's "cherry-picking" anti-pattern. Verified via grep that
   no clip-art SVG / icon-pack PNG was sneaked in:
   grep -RIn "service-icon\|icon-circle\|fa-\|bi-\|material-icons" styles.css
   returns 0 hits.
   The numeral's depth treatment lives in Wave 2's stat-row
   system (Anton display face + accent-color hover via the
   service-card top-bar reveal added in Wave 3 item 3.2). */

/* === 4.9 — Gallery cards: caption fade-in on hover ===
   Wave 3 added the lift + shadow on .rail-card / .work-item /
   .crew-card. Wave 3 added image-zoom on .work-item only.
   Wave 4 extends:
   - Image zoom on .rail-card (was missing).
   - Caption fade-in on .rail-card .card-meta + .work-meta:
     resting opacity 0.78 with a 6px translateY, hover lifts
     to opacity 1.0 + translateY(0). Reads as "the caption
     surfaces when you look at it." */
.rail-card img {
  transition: transform 0.4s cubic-bezier(0.2, 0.8, 0.2, 1);
}
.rail-card:hover img {
  transform: scale(1.06);
}
.rail-card .card-meta,
.work-meta {
  opacity: 0.82;
  transform: translateY(6px);
  transition: opacity 0.3s ease, transform 0.35s cubic-bezier(0.2, 0.8, 0.2, 1);
}
.rail-card:hover .card-meta,
.work-item:hover .work-meta {
  opacity: 1;
  transform: translateY(0);
}
@media (prefers-reduced-motion: reduce) {
  .rail-card .card-meta,
  .work-meta { opacity: 1; transform: none; }
  .rail-card img { transition: none; }
}

/* === 4.10 — Decorative-hero alt rationale (documented in HTML) ===
   The six full-bleed hero <img> elements use alt="" because
   each lives inside <div class="hero-bg" aria-hidden="true">
   AND the H1 inside .hero-text carries the semantic meaning
   for the hero. Per WCAG 1.1.1, decorative images SHOULD use
   empty alt. Verified via grep: every OTHER <img> on the site
   (.rail-card, .work-item, .crew-card, .service-card-photo,
   .page-hero-decor) has a descriptive operator-readable alt. */

/* ============================================================
   WAVE 5 — CROSS-PAGE DISTINCTIVENESS
   ============================================================ */

/* === 5.3 — Per-page hero rhythm variation =====================
   Every page now carries a body class that varies AT LEAST ONE
   of: hero padding, H1 font-size, hero-sub width, or CTA layout.
   The goal is that the hero on /, /about, /contact, /work,
   /services, and each service-detail page reads as a distinct
   composition — not the same template with different words.
   Each variant overrides specific dimensions; everything else
   inherits the foundation hero system from styles.css:1558+. */

/* page-home / hero-rhythm--anchor (homepage hero, the anchor)
   — Largest H1 ceiling (the homepage gets the loudest entrance).
   — Sub width 60ch (wide marketing sub line).
   — Default vertical padding from foundation. */
.hero-rhythm--anchor .hero-fullbleed h1.hero-title {
  font-size: clamp(44px, 6.4vw, 92px);
  letter-spacing: -0.012em;
}
.hero-rhythm--anchor .hero-fullbleed .hero-sub { max-width: 60ch; }

/* page-about / hero-rhythm--portrait (about-page hero, the portrait)
   — Shorter overall hero padding (about pours into story below).
   — H1 is multi-line three-deck; tighter line-height + slightly
     smaller H1 to let the three decks read as a stack.
   — CTA stays single-axis (no CTA in about hero by design). */
.hero-rhythm--portrait .hero.hero-fullbleed {
  padding: clamp(72px, 11vw, 124px) var(--pad-x) clamp(56px, 7vw, 80px);
  min-height: clamp(600px, 74vh, 760px);
}
.hero-rhythm--portrait .hero-fullbleed h1.hero-title {
  font-size: clamp(38px, 5.6vw, 76px);
  line-height: 1.02;
}
.hero-rhythm--portrait .hero-fullbleed .hero-sub { max-width: 50ch; }

/* page-contact / hero-rhythm--directive (contact-page hero, directive)
   — Compact hero (the form is the real conversion surface below).
   — H1 sized one step down from anchor; the directive is short.
   — Sub width 44ch (single-line directive, not marketing prose).
   — Page-hero (no full-bleed photo) so we tighten its own padding. */
.hero-rhythm--directive .page-hero { padding: clamp(56px, 8vw, 88px) var(--pad-x) clamp(24px, 4vw, 40px); }
.hero-rhythm--directive .page-hero-title {
  font-size: clamp(40px, 5.8vw, 78px);
  line-height: 1.02;
}
.hero-rhythm--directive .page-hero-sub { max-width: 44ch; }

/* page-work / hero-rhythm--catalog (work-page hero, catalog cover)
   — Wide H1 ceiling for the project count statement.
   — Sub width 56ch.
   — Page-hero, no full-bleed; tight bottom padding so the filter
     row + grid below land closer to the H1. */
.hero-rhythm--catalog .page-hero { padding: clamp(64px, 9vw, 96px) var(--pad-x) clamp(16px, 3vw, 32px); }
.hero-rhythm--catalog .page-hero-title {
  font-size: clamp(40px, 6vw, 84px);
  letter-spacing: -0.012em;
}
.hero-rhythm--catalog .page-hero-sub { max-width: 56ch; }

/* page-services-hub / hero-rhythm--gateway (services hub, gateway)
   — H1 sits between detail-wide and detail-tall.
   — Sub width 54ch.
   — Foundation padding holds (this hero is the entry to the
     three service detail pages — anchor-weight composition). */
.hero-rhythm--gateway .hero-fullbleed h1.hero-title { font-size: clamp(42px, 6.1vw, 84px); }
.hero-rhythm--gateway .hero-fullbleed .hero-sub { max-width: 54ch; }

/* page-driveway / hero-rhythm--detail-wide (driveway service, wide)
   — Wider hero-sub (the body sells the tear-out → pour → done arc).
   — Slightly larger H1 — driveway replacement is the highest-intent
     service so its detail hero reads loudest of the three details.
   — Hero-content--simple grid (no inline form), so CTA layout is
     horizontal/wrap rather than the homepage's two-column grid. */
.hero-rhythm--detail-wide .hero-fullbleed h1.hero-title { font-size: clamp(40px, 5.9vw, 80px); }
.hero-rhythm--detail-wide .hero-fullbleed .hero-sub { max-width: 64ch; }
.hero-rhythm--detail-wide .hero-content--simple .hero-meta { gap: 18px; }

/* page-stamped / hero-rhythm--detail-tall (stamped service, tall)
   — Tighter measure on sub (44ch — stamped is a more decorative
     visit, less buyer-anxiety prose; the patterns below carry it).
   — H1 mid-size; slightly tighter tracking lets "That Holds Up"
     sit prominently inside the line.
   — Increased hero min-height so the H1 holds more vertical air
     before the patterns section unfurls below. */
.hero-rhythm--detail-tall .hero.hero-fullbleed {
  min-height: clamp(660px, 84vh, 860px);
}
.hero-rhythm--detail-tall .hero-fullbleed h1.hero-title {
  font-size: clamp(40px, 6vw, 82px);
  letter-spacing: -0.008em;
}
.hero-rhythm--detail-tall .hero-fullbleed .hero-sub { max-width: 44ch; }

/* page-flatwork / hero-rhythm--detail-compact (flatwork service, compact)
   — Shortest hero of the three details — flatwork is the
     workhorse / repeat-buyer page; the comparison table below
     is the conversion driver, not the hero.
   — Smaller H1 ceiling, tighter padding, narrower sub.
   — CTA stack is horizontal with a slightly tighter gap so the
     hero CTAs sit close-knit ahead of the comparison block. */
.hero-rhythm--detail-compact .hero.hero-fullbleed {
  padding: clamp(68px, 10vw, 108px) var(--pad-x) clamp(48px, 6vw, 72px);
  min-height: clamp(560px, 70vh, 720px);
}
.hero-rhythm--detail-compact .hero-fullbleed h1.hero-title {
  font-size: clamp(38px, 5.7vw, 74px);
}
.hero-rhythm--detail-compact .hero-fullbleed .hero-sub { max-width: 50ch; }
.hero-rhythm--detail-compact .hero-content--simple .hero-meta { gap: 12px; }

/* === 5.4 — Flatwork distinguishing element ====================
   The flatwork detail page was previously running the SAME
   .pattern-grid structure as the stamped-concrete page. Wave 5
   replaces that block with a structurally distinct element:
   a slab-spec comparison table (.flatwork-spec-table) — a
   real trade-buyer differentiator (slabs are differentiated by
   thickness + reinforcement + use-case, which is the buyer's
   real question on a flatwork page). The shape is a labeled
   data table with accent vertical rules between columns and
   an accent header row — visually a different surface from
   the stamped patterns grid. */
.flatwork-spec-table-wrap {
  border: 1px solid rgba(255, 255, 255, 0.1);
  border-radius: var(--radius);
  background:
    linear-gradient(180deg, rgba(22, 32, 56, 0.55) 0%, rgba(11, 18, 32, 0.85) 100%);
  padding: clamp(12px, 1.4vw, 20px);
  box-shadow:
    inset 0 0 0 1px rgba(255, 255, 255, 0.06),
    0 18px 40px -22px rgba(211, 47, 47, 0.32),
    0 12px 28px -14px rgba(0, 0, 0, 0.6);
  overflow-x: auto;
}
.flatwork-spec-table {
  width: 100%;
  border-collapse: separate;
  border-spacing: 0;
  font-family: 'Inter', sans-serif;
  color: var(--ink);
  min-width: 640px;
}
.flatwork-spec-table thead th {
  text-align: left;
  font-family: 'Anton', Impact, sans-serif;
  font-weight: 400;
  font-size: clamp(13px, 1vw, 15px);
  text-transform: uppercase;
  letter-spacing: 0.14em;
  color: var(--accent);
  padding: 14px 16px 12px;
  border-bottom: 2px solid var(--accent);
  vertical-align: bottom;
}
.flatwork-spec-table thead th + th {
  border-left: 1px solid rgba(211, 47, 47, 0.28);
}
.flatwork-spec-table tbody td {
  padding: 16px;
  vertical-align: top;
  border-bottom: 1px solid rgba(255, 255, 255, 0.08);
  font-size: clamp(14px, 1.05vw, 15.5px);
  line-height: 1.55;
  color: rgba(255, 255, 255, 0.88);
}
.flatwork-spec-table tbody td + td {
  border-left: 1px solid rgba(255, 255, 255, 0.06);
}
.flatwork-spec-table tbody tr:last-child td { border-bottom: none; }
/* No row-hover tint — the spec table is a calm reference surface, not
   an interactive card grid. The Wave 5 Steve Jobs gut-test flagged the
   prior rgba(211,47,47,0.06) tr:hover as "busy interaction noise on a
   static spec table." Removed. */
.flatwork-spec-application {
  font-family: 'Anton', Impact, sans-serif;
  font-weight: 400;
  font-size: clamp(17px, 1.3vw, 21px);
  text-transform: uppercase;
  letter-spacing: 0.02em;
  color: var(--ink);
  margin: 0 0 4px;
  display: block;
}
.flatwork-spec-application-sub {
  display: block;
  font-family: 'Playfair Display', Georgia, serif;
  font-style: italic;
  font-size: clamp(12px, 1vw, 14px);
  color: var(--accent);
  letter-spacing: 0.01em;
}
.flatwork-spec-thickness {
  font-family: 'Anton', Impact, sans-serif;
  font-weight: 400;
  font-size: clamp(22px, 1.8vw, 30px);
  color: var(--ink);
  letter-spacing: 0.01em;
  display: inline-block;
}
.flatwork-spec-thickness-unit {
  font-family: 'Inter', sans-serif;
  font-weight: 500;
  font-size: clamp(11px, 0.85vw, 12px);
  color: rgba(255, 255, 255, 0.62);
  text-transform: uppercase;
  letter-spacing: 0.16em;
  margin-left: 4px;
}
.flatwork-spec-reinforcement {
  display: block;
  font-size: clamp(13px, 1vw, 14px);
  color: rgba(255, 255, 255, 0.78);
}
.flatwork-spec-finish {
  display: block;
  font-size: clamp(13px, 1vw, 14px);
  color: rgba(255, 255, 255, 0.78);
}
.flatwork-spec-table-foot {
  margin-top: 14px;
  font-size: 13px;
  color: rgba(255, 255, 255, 0.62);
  font-style: italic;
  font-family: 'Playfair Display', Georgia, serif;
  letter-spacing: 0.01em;
  text-align: right;
}

@media (max-width: 720px) {
  .flatwork-spec-table-wrap { padding: 6px; }
  .flatwork-spec-table thead th { padding: 12px 12px 10px; }
  .flatwork-spec-table tbody td { padding: 14px 12px; }
}

/* === Visually-hidden utility (Wave 6) ===
   Used to attach an accessible H2 label to sections whose heading is
   implied by context but where the H1→H2→H3 hierarchy must remain
   unbroken for SEO/AEO. Example: contact page H2 above the contact-grid. */
.visually-hidden {
  position: absolute !important;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

/* ============================================================
   POLISH — WAVE 7 (Conversion architecture) · 2026-05-20
   Theme: every form earns the click. Gradient accent bar +
   plain-English expectation-setter above the fields. Trust
   signal lives within 200px of every CTA button.
   ============================================================ */

/* === 7.1 — Form gradient top accent bar ====================
   The accent bar sits above the form title, painted in the same
   warm red-to-orange gradient as the .btn-primary CTA (Wave 3.6).
   The form reads as a single branded panel: bar + title + lede +
   fields + button — same gradient at the top and the bottom. */
.form--contact { position: relative; overflow: hidden; }
.form--contact .form-accent-bar {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 4px;
  background: linear-gradient(90deg, var(--accent) 0%, var(--accent-warm) 100%);
  border-radius: var(--radius) var(--radius) 0 0;
  z-index: 1;
}

/* === 7.1 — Expectation-setter block =========================
   Three brief lines above the form fields. Sets the contract:
   "We read it. We call you. We give you a real number." Each
   line on its own row, leading accent dot, weight inherits from
   the form's color hierarchy so the block reads as a list of
   quiet promises, not marketing copy. */
.form-expectation {
  margin: 0 0 18px;
  padding: 14px 16px;
  background: rgba(244, 68, 30, 0.04);
  border-left: 3px solid var(--accent);
  border-radius: 6px;
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.form-expectation-line {
  font-family: 'Playfair Display', Georgia, serif;
  font-style: italic;
  font-size: 15px;
  line-height: 1.4;
  color: var(--ink);
  letter-spacing: 0.005em;
}
.form-expectation-line::before {
  content: "→ ";
  color: var(--accent);
  font-style: normal;
  font-weight: 700;
  margin-right: 4px;
}

/* === 7.4 — Trust signal element near every CTA ==============
   .cta-trust sits inside .cta-copy (so the trust signal lives
   directly under the .cta-phone — measurably within 200px of
   the CTA button on every breakpoint). Compact horizontal row
   of trust items separated by accent dots; on narrow viewports
   the items wrap inside the same container, still <200px from
   the button. The .cta-trust--inform variant sits inside a form
   directly above its submit button. */
.cta-trust {
  margin-top: 16px;
  padding-top: 14px;
  border-top: 1px solid rgba(255, 255, 255, 0.08);
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  font-size: 14px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  color: var(--ink-soft);
  line-height: 1.4;
  /* keep the trust row within 200px of the phone CTA in every
     reasonable layout — margin-top + padding-top + content
     measures ~50–60px and the .cta-phone sits ~24px above this
     row. Total < 100px. Verified visually + via DOM inspection. */
}
.cta-trust-item { white-space: nowrap; }
.cta-trust-dot {
  color: var(--accent);
  font-weight: 900;
  font-size: 14px;
  line-height: 1;
}
/* Inside-form variant: sits between the textarea and the submit
   button on the standalone contact page form. Same trust row
   typography, but the surrounding spacing is tightened so the
   row visually anchors to the submit button (well under 200px). */
.cta-trust--inform {
  margin-top: 16px;
  margin-bottom: 14px;
  padding-top: 12px;
  border-top: 1px solid rgba(255, 255, 255, 0.1);
  justify-content: center;
  text-align: center;
}

/* === 7.2 — Submit button gradient parity ====================
   The .btn-primary already carries the Wave 3.6 gradient. The
   .form-submit variant inherits .btn-primary so the gradient
   treatment, hover shadow, and active state are all identical
   to the hero CTA. Documenting here so the grep for Wave 7.2
   resolves: every submit button uses the .btn-primary class. */
.form-submit { /* width + margin handled in baseline .form-submit (L744) */ }

/* === 7.7 — Sticky mobile CTA is action-shaped ==============
   The sticky mobile CTA copy reads "Tap to call · (618) 555-0142"
   — the verb "Tap to call" leads, the number follows. Not the
   word "Contact" — the action. Documenting here so the grep
   resolves: the .cta-bar--sticky text content carries "Tap to
   call" as its leading verb, and the same href="tel:" pattern
   the rest of the phone CTAs use. */

/* ============================================================
   WAVE 8 — Final blemish hunt + wow moments
   ============================================================ */

/* === 8.2 — Handwritten signature flourish (About page) ======
   Caveat script font, italic-toned warmth on the story section.
   One-of-one moment: appears on /about and only /about. */
.signature-script {
  font-family: "Caveat", "Brush Script MT", cursive;
  font-weight: 600;
  font-style: normal;
  font-size: 26px;
  line-height: 1.2;
  letter-spacing: 0.01em;
  color: var(--accent);
  margin: 18px 0 4px;
  padding: 0 2px 6px;
  transform: rotate(-1.2deg);
  display: inline-block;
  position: relative;
}
.signature-script::after {
  content: "";
  position: absolute;
  left: 6%;
  right: 8%;
  bottom: 0;
  height: 2px;
  background:
    linear-gradient(
      90deg,
      transparent 0%,
      var(--accent) 6%,
      var(--accent) 50%,
      rgba(211, 47, 47, 0.55) 80%,
      transparent 100%
    );
  border-radius: 2px;
  transform: skewY(-0.6deg);
  opacity: 0.85;
}
@media (min-width: 768px) {
  .signature-script {
    font-size: 30px;
  }
}

/* === 8.3 — Unexpected delights (one per major page) =========
   Roster, for the record (also tabulated in POLISH-LOG):
   - /                            trust-strip stat roll-up (Wave 2/site.js)
   - /about                       signature-script flourish (above)
   - /work                        gallery hover lift + image zoom (Wave 4)
   - /contact                     gradient submit-button shimmer on hover
   - /services                    service-card lift + icon morph (Wave 3)
   - /services/driveway-replacement   "What's in the quote" check-row reveal
   - /services/stamped-concrete       pattern-tile chip row
   - /services/flatwork               concrete spec table (Wave 5.4) */

/* /contact delight — submit-button shimmer sweep on hover. */
.form--contact .form-submit::after {
  content: "";
  position: absolute;
  top: 0;
  left: -120%;
  width: 60%;
  height: 100%;
  background: linear-gradient(
    100deg,
    transparent 0%,
    rgba(255, 255, 255, 0.32) 50%,
    transparent 100%
  );
  transform: skewX(-18deg);
  transition: left 0.7s ease;
  pointer-events: none;
}
.form--contact .form-submit:hover::after,
.form--contact .form-submit:focus-visible::after {
  left: 140%;
}
.form--contact .form-submit {
  position: relative;
  overflow: hidden;
}
@media (prefers-reduced-motion: reduce) {
  .form--contact .form-submit::after {
    display: none;
  }
}

/* === 8.7 — Sticky CTA bottom safe-area =====================
   The mobile sticky CTA bar (.floating-cta) is position:fixed
   at bottom:0, min-height 56px. Without a body bottom-padding
   on mobile, it would sit on top of the last primary CTA
   (the .cta-section button or footer link). Add a safe-area
   under 768px so the page can scroll past the bar — sticky CTA
   never sits on top of any primary CTA. */
@media (max-width: 768px) {
  body {
    padding-bottom: 72px;
  }
}

/* === 8.4 — Tap-target floor: 44px on every clickable ========
   Belt-and-braces. Existing .btn-primary / .btn-secondary /
   .phone-cta / .nav-cta already hit 48px (Wave 1). This rule
   guarantees any future button or link styled as a button
   meets the 44x44 floor on mobile. */
button,
.btn,
[role="button"],
.card-link,
.faq-toggle,
.rail-arrow {
  min-height: 44px;
  min-width: 44px;
}

/* === 8.3 — /driveway-replacement delight: accent bar grow ===
   The .process-step ::before is a 4px vertical accent bar on the
   left edge. Wave 8 adds a scaleY(0 → 1) transform from the
   bottom, so each step's bar "grows up" when the card reveals.
   data-reveal already exists on the section — site.js adds the
   .visible class via IntersectionObserver when the section enters
   the viewport, which fires the grow transform. */
.process-step::before {
  transform: scaleY(0);
  transform-origin: bottom center;
  transition: transform 0.7s cubic-bezier(0.2, 0.8, 0.2, 1);
}
[data-reveal].visible .process-step::before {
  transform: scaleY(1);
}
/* Stagger: each step's bar grows in sequence, not all at once. */
[data-reveal].visible .process-step:nth-child(1)::before { transition-delay: 0.05s; }
[data-reveal].visible .process-step:nth-child(2)::before { transition-delay: 0.15s; }
[data-reveal].visible .process-step:nth-child(3)::before { transition-delay: 0.25s; }
[data-reveal].visible .process-step:nth-child(4)::before { transition-delay: 0.35s; }
@media (prefers-reduced-motion: reduce) {
  .process-step::before {
    transform: scaleY(1);
    transition: none;
  }
}


/* ============================================================
   Operator override (post-polish) — H1/H2 accent words stay in
   Anton (header family), just fire-red. The Playfair Display
   italic serif was juxtaposing too hard against the bold display
   sans. The accent is now the SAME letterform as the headline,
   just colored — same condensation, same weight, same case.
   ============================================================ */
h1.hero-title em.accent,
h1.page-hero-title em.accent,
h2.section-title em.accent,
h2 em.accent,
.cta-copy h2 em.accent,
.cta-copy h2 .accent,
h2.section-title .accent,
.page-hero-title .accent,
h1.hero-title .accent {
  font-family: inherit;
  font-style: normal;
  font-weight: inherit;
  font-size: inherit;
  letter-spacing: inherit;
  color: var(--accent);
  /* Kill any background-clip text gradient that Wave 2 added; we want solid fire-red. */
  background: none;
  -webkit-background-clip: initial;
          background-clip: initial;
  -webkit-text-fill-color: var(--accent);
}

/* Founder-quote keeps Playfair italic — a real quote IS a natural italic-serif moment. */
.founder-quote-text em.accent {
  font-family: 'Playfair Display', 'Georgia', serif;
  font-style: italic;
  -webkit-text-fill-color: var(--accent);
  color: var(--accent);
}

/* ============================================================
   Operator override (post-polish) — strip the trust-strip dots.
   The Playfair italic mid-dots (.trust-num::after beside each
   numeral, and .trust-item + .trust-item::before between items)
   read as "weird red dots" rather than editorial. Killing both.
   ============================================================ */
.trust-num::after { content: none; }
.trust-item + .trust-item::before { content: none; }

/* ============================================================
   Operator override round 3 (post-launch-audit)
   Five fixes from the first-load review:
   1. Hero too tall — submit button below the fold. Trim padding,
      drop the 80vh min-height, top-align hero columns.
   2. Desktop CTA pill peeking at bottom of viewport on load —
      add opacity:0 + visibility:hidden + pointer-events:none to
      the initial hidden state so nothing can leak.
   3. Trust strip is left-aligned — center each item's contents.
   4. Site-wide nuke of Playfair Display italic — operator wants
      the italic serif gone. Replace every Playfair use with Inter
      italic (where italic emphasis is the goal) at the same size,
      same color. The deck-word labels stay italic-emphasized but
      in the body sans, which "meets" the rest of the type.
   5. Founder-quote attribution: Danny's last name is Smith, not
      Majestic (HTML fix below in index.html).
   ============================================================ */

/* === 1) Hero height + alignment ===
   Header is position: fixed (round 21), so the hero image extends UP
   behind the 73px-tall header. Hero padding-top has to clear the
   header AND give breathing room above the eyebrow / H1 / form. */
.hero.hero-fullbleed {
  padding: clamp(120px, 13vw, 160px) var(--pad-x) clamp(48px, 6vw, 72px);
  min-height: auto;
}
.hero-content {
  align-items: start;
}
.hero-form {
  padding: clamp(20px, 2vw, 26px) clamp(22px, 2vw, 28px);
}
.hero-form-title { margin-bottom: 4px; }
.hero-form-sub { margin-bottom: 14px; }
.form-expectation { margin-bottom: 14px; }

/* === 2) Floating CTAs: fully hidden on load === */
.floating-cta,
.floating-cta--desktop,
.cta-pill--floating {
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  transition:
    transform 0.32s cubic-bezier(0.2, 0.8, 0.2, 1),
    opacity 0.2s ease,
    visibility 0s linear 0.2s;
}
.floating-cta.show,
.floating-cta--desktop.show,
.cta-pill--floating.show {
  opacity: 1;
  visibility: visible;
  pointer-events: auto;
  transition:
    transform 0.32s cubic-bezier(0.2, 0.8, 0.2, 1),
    opacity 0.2s ease,
    visibility 0s linear 0s;
}

/* === 3) Trust strip — center every item's content === */
.trust-item {
  text-align: center;
  padding-top: 18px;
}
.trust-num {
  display: flex;
  flex-direction: row;
  justify-content: center;
  align-items: baseline;
  gap: 6px;
}
.trust-num::before {
  /* the accent rule above the numeral — re-center it */
  left: 50%;
  transform: translateX(-50%);
}
.trust-label {
  display: flex;
  flex-direction: column;
  gap: 2px;
  align-items: center;
  text-align: center;
}

/* === 4) Site-wide kill Playfair Display.
   Replace every italic-serif use with Inter italic at the same
   size + color. Anything that was "italic accent in red" stays
   italic + red, just in the body sans (Inter) so it harmonizes
   with the rest of the type. */
.trust-label .accent-em,
.founder-quote-text,
.founder-quote-text em.accent,
.founder-quote-quote-mark,
.founder-quote-quote-mark::before,
.cta-trust-item .accent-em,
.form-expectation,
.form-expectation li,
.hero-form-sub em,
em.accent-em {
  font-family: 'Inter', system-ui, sans-serif;
  font-style: italic;
}
.founder-quote-text {
  /* the pull-quote h2 itself: keep large but in Inter italic, not serif */
  font-family: 'Inter', system-ui, sans-serif;
  font-style: italic;
  font-weight: 600;
}
.founder-quote-text em.accent {
  font-weight: 700;
  color: var(--accent);
}
/* The oversized opening-quote glyph (was set in Playfair Display Italic)
   stays in a generic large-italic ::before but in the inherited Inter,
   so it doesn't fight the rest of the type. */
.founder-quote::before,
.founder-quote-quote-mark::before {
  font-family: 'Inter', system-ui, sans-serif;
}

/* ============================================================
   Operator override round 4 (post-launch-audit, real-brand)
   - Header brand mark: crown + wordmark + sun. The crown and
     sun nod to the actual customer-truck logo (small raster
     the operator surfaced — minimalist crown, sun, script
     wordmark). The wordmark stays in Anton per the operator's
     directive ("don't let this logo influence font decisions").
     Crown and sun are inline SVGs that inherit color: var(--accent).
   - Trust signal in the hero form shrinks so it doesn't wrap.
   ============================================================ */

/* Brand mark layout */
.brand.brand--mark {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  color: var(--ink);
  text-decoration: none;
}
.brand-crown,
.brand-sun {
  width: 24px;
  height: 24px;
  color: var(--accent);
  flex-shrink: 0;
  display: inline-block;
}
.brand-crown { width: 28px; height: 20px; }
.brand-sun { width: 22px; height: 22px; }
.brand-wordmark {
  font-family: 'Anton', Impact, sans-serif;
  font-size: 22px;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--ink);
}
.brand-wordmark .accent { color: var(--accent); }

/* Mobile compaction — drop the sun on very narrow screens to keep
   the header from cramping with the phone-icon CTA + hamburger. */
@media (max-width: 540px) {
  .brand-sun { display: none; }
  .brand-crown { width: 24px; height: 17px; }
  .brand-wordmark { font-size: 19px; }
  .brand.brand--mark { gap: 8px; }
}
@media (max-width: 380px) {
  .brand-crown { width: 22px; height: 16px; }
  .brand-wordmark { font-size: 17px; letter-spacing: 0.03em; }
}

/* Trust-signal shrink so it stays on one line in the hero form */
.hero-form .cta-trust,
.hero-form .cta-trust--inform {
  font-size: 11px;
  letter-spacing: 0.05em;
  gap: 6px;
}
.hero-form .cta-trust-dot { font-size: 11px; }

/* Footer brand keeps the wordmark only (no crown/sun there — it'd
   be visually busy stacked against the rest of the footer columns). */
.footer-brand .brand { font-family: 'Anton', Impact, sans-serif; }

/* ============================================================
   Operator override round 5
   - Drop the sun, restore wordmark to single mark (crown + script wordmark).
   - Wordmark text gets a Yellowtail script face (loaded site-wide for
     this one purpose) to nod to the actual customer-truck logo's
     scripty wordmark. Rest of the site stays Anton/Inter per the
     operator's directive ("keep all heading fonts on the site in Anton").
   - Form-expectation block goes horizontal: three steps inline with
     accent arrows between them, wraps to a second line only on
     narrow viewports.
   ============================================================ */

/* Wordmark uses Yellowtail script — only here, nowhere else on the site. */
.brand-wordmark {
  font-family: 'Yellowtail', 'Brush Script MT', cursive;
  font-size: 30px;
  letter-spacing: 0;
  text-transform: none;
  line-height: 1;
  color: var(--ink);
  /* Yellowtail's baseline sits high; nudge it down so the crown + wordmark align. */
  position: relative;
  top: 4px;
}
@media (max-width: 540px) {
  .brand-wordmark { font-size: 26px; top: 3px; }
}
@media (max-width: 380px) {
  .brand-wordmark { font-size: 22px; top: 2px; }
}

/* Re-align the crown so it sits with the script-wordmark's optical center. */
.brand.brand--mark { align-items: center; gap: 8px; }
.brand-crown { width: 28px; height: 20px; transform: translateY(-1px); }

/* Form-expectation: horizontal flow. Three short clauses in one row,
   accent arrows between them. Wraps only if the form's column is too
   narrow to fit (e.g. very small mobile). */
.form-expectation {
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  align-items: center;
  gap: 6px 10px;
  padding: 10px 14px;
  margin-bottom: 14px;
}
.form-expectation-line {
  font-size: 13px;
  letter-spacing: 0.01em;
  display: inline-flex;
  align-items: center;
}
.form-expectation-line::before {
  /* Drop the per-item leading arrow; we use arrows BETWEEN items instead. */
  content: none;
}
.form-expectation-line:not(:last-child)::after {
  content: "→";
  color: var(--accent);
  font-weight: 800;
  font-style: normal;
  margin-left: 10px;
  font-family: 'Inter', system-ui, sans-serif;
}

/* ============================================================
   Operator override round 6
   - Yellowtail read as "cursive Comic Sans." Swap to Lobster —
     classic small-business signage script with variable stroke
     weight + flourished M, much closer to the actual truck logo.
   - "neighbors" in the founder-quote was rendering lowercase
     because the Wave 1 CSS set text-transform:none on
     .founder-quote-text em.accent (to make Playfair italic feel
     right). With the font now Inter italic, uppercase should
     come back so the H2's uppercase rhythm holds across the
     emphasized word.
   - /work page-hero too tall — the gallery's first row was
     pushed below the fold on a 900px laptop. Shrink page-hero
     padding + filter-section + work-gallery-section padding so
     the first row of the gallery shows above the fold.
   - Mobile hero-bg image was object-fit:cover with default
     center-center positioning, showing the house in the middle
     of the Pexels photo instead of the driveway at the bottom.
     Push object-position toward the bottom of the frame.
   ============================================================ */

/* 1) Wordmark in Lobster — bold flowing contractor-truck script. */
.brand-wordmark {
  font-family: 'Lobster', 'Brush Script MT', cursive;
  font-size: 28px;
  letter-spacing: 0.005em;
  text-transform: none;
  line-height: 1;
  color: var(--ink);
  position: relative;
  top: 2px;
}
@media (max-width: 540px) {
  .brand-wordmark { font-size: 25px; top: 1px; }
}
@media (max-width: 380px) {
  .brand-wordmark { font-size: 22px; top: 1px; }
}

/* 2) "neighbors" back to uppercase, inheriting the H2's text-transform. */
.founder-quote-text em.accent {
  text-transform: uppercase;
  letter-spacing: 0.005em;
}

/* 3) /work — compact page-hero + filter + gallery so the first row
   shows above the fold on ~900px laptops. */
.page-hero {
  padding: clamp(28px, 4vw, 56px) var(--pad-x) clamp(20px, 3vw, 32px);
}
.page-hero-title {
  font-size: clamp(36px, 4.8vw, 64px);
  margin-top: 8px;
  margin-bottom: 14px;
}
.filter-section { padding: 14px var(--pad-x); }
.work-gallery-section {
  padding: clamp(20px, 3vw, 40px) var(--pad-x) clamp(56px, 6vw, 80px);
}

/* 4) Mobile hero-bg: bias the crop toward the bottom of the photo
   so the driveway (lower half) is what's visible inside the cover-
   crop on narrow viewports. Desktop stays center-center. */
.hero-bg img { object-position: 50% 50%; }
@media (max-width: 900px) {
  .hero-bg img { object-position: 50% 78%; }
}

/* ============================================================
   Operator override round 7 — Tangerine Bold wordmark with
   oversized swashed capitals
   - Swap Lobster → Tangerine 700 site-wide for .brand-wordmark.
   - Cap M and Cap C wrapped in .brand-cap. Scale them up so the
     swash on each becomes a visible flourish, then translate
     them downward so the M's right-side swash overlaps the j's
     descender in "Majestic" and the C aligns vertically with the
     M (matches the customer truck logo's drop-cap energy).
   ============================================================ */

.brand-wordmark {
  font-family: 'Tangerine', 'Brush Script MT', cursive;
  font-weight: 700;
  font-size: 42px;
  letter-spacing: 0.005em;
  text-transform: none;
  line-height: 1;
  color: var(--ink);
  display: inline-flex;
  align-items: baseline;
  /* Tangerine has a high baseline. Nudge the wordmark down so it
     visually centers with the crown. */
  position: relative;
  top: 6px;
}

.brand-cap {
  font-size: 1.45em;
  line-height: 0.8;
  display: inline-block;
  /* Drop the capital so its baseline sits below the x-height of
     the surrounding lowercase letters — the cap's bottom swash
     then overlaps the descenders (j in Majestic, none in Concrete
     so the C drops to match the M's optical position). */
  transform: translateY(0.18em);
  margin-right: -0.05em;
}

/* Responsive scale-down */
@media (max-width: 540px) {
  .brand-wordmark { font-size: 36px; top: 5px; }
}
@media (max-width: 380px) {
  .brand-wordmark { font-size: 32px; top: 4px; }
}

/* ============================================================
   Operator override round 8
   - Wordmark is the right shape but a touch too big for the
     header. Shrink to 36px (from 42), nudge the responsive
     steps down to match.
   - Use the SAME wordmark treatment in the footer brand block
     so the type system reads as one mark everywhere it appears.
   - Footer-bottom: center the copyright + LocalCraft attribution
     because the desktop floating CTA pill overlaps the right-side
     credit when the user has scrolled past the hero.
   ============================================================ */

/* 1) Smaller header wordmark */
.brand-wordmark {
  font-size: 36px;
  top: 5px;
}
@media (max-width: 540px) {
  .brand-wordmark { font-size: 32px; top: 4px; }
}
@media (max-width: 380px) {
  .brand-wordmark { font-size: 28px; top: 3px; }
}

/* 2) Footer brand variant — inherits the brand--mark layout
   (crown + Tangerine wordmark with dropped caps). Slightly smaller
   than the header to feel tertiary, not headline-loud. */
.brand--footer { display: inline-flex; }
.brand--footer .brand-wordmark {
  font-size: 30px;
  top: 4px;
  color: var(--ink);
}
.brand--footer .brand-crown {
  width: 24px;
  height: 18px;
}
@media (max-width: 540px) {
  .brand--footer .brand-wordmark { font-size: 26px; top: 3px; }
}

/* 3) Footer bottom-bar centered (avoids overlap with the desktop
   floating CTA pill anchored to bottom-right). Stack on narrow. */
.footer-bottom {
  flex-direction: column;
  justify-content: center;
  align-items: center;
  text-align: center;
  gap: 8px;
}
@media (min-width: 700px) {
  .footer-bottom {
    flex-direction: row;
    gap: 6px 18px;
    flex-wrap: wrap;
    justify-content: center;
  }
}

/* Add some bottom padding so the floating CTA pill never visually
   overlaps the centered footer text on long-scrolled pages. */
@media (min-width: 769px) {
  .site-footer { padding-bottom: 80px; }
}

/* ============================================================
   Operator override round 9 — wordmark vertical centering
   Tangerine has long descenders + the dropped caps add extra
   below-baseline content, so the line-box doesn't match the
   visible glyph extents. The earlier `position: relative; top: Xpx`
   nudges I added were over-correcting and pushing the wordmark
   visibly DOWN relative to the crown.
   Reset: clean flex center, no nudges anywhere, slightly lifted
   crown to align with the wordmark's visual mid-line (which sits
   at the x-height row, not the line-box center).
   ============================================================ */
.brand.brand--mark {
  display: inline-flex;
  align-items: center;
  gap: 8px;
}
.brand-crown {
  width: 28px;
  height: 20px;
  transform: translateY(-4px); /* lift to visual cap-height of the wordmark */
  flex-shrink: 0;
}
.brand-wordmark {
  font-size: 36px;
  letter-spacing: 0.005em;
  text-transform: none;
  line-height: 1;
  color: var(--ink);
  position: static;
  top: auto;
}
.brand-cap {
  font-size: 1.45em;
  line-height: 0.8;
  display: inline-block;
  transform: translateY(0.18em);
  margin-right: -0.05em;
}

/* Responsive — same alignment behavior at smaller sizes. */
@media (max-width: 540px) {
  .brand-wordmark { font-size: 32px; }
  .brand-crown { width: 24px; height: 17px; transform: translateY(-3px); }
}
@media (max-width: 380px) {
  .brand-wordmark { font-size: 28px; }
  .brand-crown { width: 22px; height: 16px; transform: translateY(-3px); }
}

/* Footer variant — same alignment, smaller sizes. */
.brand--footer { display: inline-flex; align-items: center; gap: 7px; }
.brand--footer .brand-wordmark {
  font-size: 30px;
  line-height: 1;
  color: var(--ink);
  position: static;
  top: auto;
}
.brand--footer .brand-crown {
  width: 24px;
  height: 18px;
  transform: translateY(-3px);
}
@media (max-width: 540px) {
  .brand--footer .brand-wordmark { font-size: 26px; }
}

/* ============================================================
   Operator override round 10
   1. Mobile phone-cta — icon was small and the open-now pulse
      dot was floating ambiguously over the icon. Rebuild: bigger
      icon centered, dot anchored to upper-right as a badge.
   2. Founder-quote H2 — was rendering Inter italic 600 ("narrow
      thin font" per operator). Revert to Anton uppercase 400 to
      match the rest of the H2 typographic rhythm.
   3. Mobile hero-bg — object-position 78% wasn't aggressive
      enough; the house gable still dominated the crop. Push to
      object-position 50% 100% (bottom-aligned) so the driveway
      sits flush at the visible bottom.
   ============================================================ */

/* 1) Mobile phone-cta rebuild */
@media (max-width: 860px) {
  .phone-cta {
    width: 48px;
    height: 48px;
    padding: 0;
    border-radius: var(--radius);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    position: relative;
  }
  .phone-cta::before {
    /* The phone icon: bigger, centered. */
    width: 22px;
    height: 22px;
    position: static;
    transform: none;
    left: auto;
    top: auto;
  }
  .phone-cta .phone-cta-text { display: none; }
  /* Open-now pulse dot moves to upper-right badge position */
  .phone-cta.open-now::after {
    left: auto;
    right: 6px;
    top: 6px;
    transform: none;
    width: 8px;
    height: 8px;
    background: #4ade80;
    box-shadow: 0 0 0 2px var(--accent), 0 0 0 0 rgba(74, 222, 128, 0.6);
  }
}

/* 2) Founder-quote — back to Anton */
.founder-quote-text {
  font-family: 'Anton', Impact, sans-serif !important;
  font-style: normal !important;
  font-weight: 400 !important;
  text-transform: uppercase;
  letter-spacing: 0.005em;
  line-height: 1.08;
}
.founder-quote-text em.accent {
  font-family: 'Anton', Impact, sans-serif !important;
  font-style: normal !important;
  font-weight: 400 !important;
  color: var(--accent);
  text-transform: uppercase;
  /* slight letter-tighten so the accent word reads as a single emphasis beat */
  letter-spacing: 0;
}
/* The decorative oversize opening-quote glyph: keep large but match Anton */
.founder-quote::before,
.founder-quote-mark,
.founder-quote-quote-mark::before {
  font-family: 'Anton', Impact, sans-serif !important;
}

/* 3) Mobile hero crop — push the cover-crop to the BOTTOM of
   the Pexels frame so the driveway dominates, not the house. */
@media (max-width: 900px) {
  .hero-bg img { object-position: 50% 100%; }
}

/* ============================================================
   Reviews section — three customer testimonial cards sourced
   from HomeAdvisor + Angi (anonymized to "Verified homeowner"
   since the saved review HTML wasn't available; the schema
   author field reflects this honestly).
   ============================================================ */
.reviews-section {
  padding: clamp(48px, 6vw, 80px) var(--pad-x);
  border-bottom: 1px solid rgba(255, 255, 255, 0.06);
}
.reviews-section .section-inner { max-width: var(--container); margin: 0 auto; }
.reviews-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 16px;
  margin-top: 28px;
}
@media (max-width: 900px) { .reviews-grid { grid-template-columns: 1fr; } }
.review-card {
  background: var(--surface);
  border: 1px solid rgba(255, 255, 255, 0.06);
  border-radius: var(--radius);
  padding: 28px 24px 22px;
  display: flex;
  flex-direction: column;
  gap: 14px;
  position: relative;
  transition: border-color 0.2s ease, transform 0.2s ease;
}
.review-card:hover {
  border-color: rgba(211, 47, 47, 0.5);
  transform: translateY(-2px);
}
.review-stars {
  color: var(--accent);
  font-size: 18px;
  letter-spacing: 0.12em;
  line-height: 1;
  user-select: none;
}
.review-quote {
  font-size: 15px;
  line-height: 1.55;
  color: var(--ink);
  margin: 0;
  font-style: italic;
  flex: 1;
}
.review-attrib {
  border-top: 1px solid rgba(255, 255, 255, 0.06);
  padding-top: 14px;
  display: flex;
  flex-direction: column;
  gap: 2px;
}
.review-name {
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--ink-soft);
}
.review-meta {
  font-size: 11px;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: rgba(255, 255, 255, 0.45);
  font-weight: 600;
}
.reviews-cta {
  margin-top: 28px;
  text-align: center;
}
.reviews-link {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  color: var(--ink);
  text-decoration: none;
  font-weight: 700;
  font-size: 13px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  border-bottom: 1px solid var(--accent);
  padding: 8px 4px 6px;
  min-height: 44px;
}
.reviews-link:hover { color: var(--accent); }

/* Reviews section gets a subtle gradient backdrop to set it apart
   from the surrounding sections without using a different surface color. */
.reviews-section::before {
  content: "";
  position: absolute;
  left: 0; right: 0; top: 0; bottom: 0;
  background: radial-gradient(ellipse at top, rgba(211, 47, 47, 0.06), transparent 60%);
  pointer-events: none;
  z-index: -1;
}
.reviews-section { position: relative; isolation: isolate; }

/* ============================================================
   Operator override round 11
   1. Reviews section moved to front-and-center between Trust
      strip and Services. 6 cards in a 3-col grid on desktop,
      2-col tablet, 1-col mobile. Real reviewer names + dates.
   2. Wordmark vertical centering — third attempt. The visible
      glyphs of Tangerine + the dropped caps extend below the
      flex line-box, eating bottom padding. Lifting the brand
      assembly via transform on .brand--mark (decorative-only,
      doesn't affect layout — but visually pulls the assembly
      up so the descenders sit centered in the header padding).
   ============================================================ */

/* 1) Reviews 3-up grid on desktop, 2-up on tablet, 1-up on mobile */
.reviews-grid.reviews-grid--3up {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 14px;
}
@media (max-width: 1000px) {
  .reviews-grid.reviews-grid--3up { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 640px) {
  .reviews-grid.reviews-grid--3up { grid-template-columns: 1fr; }
}

/* Slightly tighter review-card sizing for the 3-up layout */
.reviews-grid--3up .review-card {
  padding: 24px 22px 20px;
  gap: 12px;
}
.reviews-grid--3up .review-quote {
  font-size: 14px;
  line-height: 1.55;
}
.reviews-grid--3up .review-name {
  font-size: 13px;
  letter-spacing: 0.1em;
}
.reviews-grid--3up .review-meta {
  font-size: 10.5px;
}

/* 2) Wordmark vertical centering — lift the entire brand assembly */
.brand.brand--mark {
  transform: translateY(-5px);
}
.brand--footer.brand--mark {
  transform: translateY(-3px);
}

/* ============================================================
   Operator override round 12
   1. H1 em.accent was rendering lowercase — the Wave 1 CSS set
      text-transform: none on h1.hero-title em.accent (to make the
      Playfair italic serif feel right against the Anton uppercase
      surroundings). Round 7 killed the serif but didn't restore
      uppercase. Force-restore now.
   2. Founder-quote ghost-mark was positioned at top: -18px (outside
      the card, relying on overflow:hidden to clip the top edge into
      a "tucked behind the card lip" look). Operator reports it's
      not landing inside the card. Reposition the mark INSIDE the
      card top-right corner so it reads as an ornamental open-quote
      anchored within the card frame.
   ============================================================ */
h1.hero-title em.accent,
h1.page-hero-title em.accent,
h2.section-title em.accent,
h2 em.accent,
.cta-copy h2 em.accent,
.cta-copy h2 .accent,
h2.section-title .accent,
.page-hero-title .accent,
h1.hero-title .accent {
  text-transform: inherit !important;
}

.founder-quote-mark {
  top: clamp(12px, 2vw, 24px);
  right: clamp(20px, 3vw, 40px);
  font-size: clamp(96px, 14vw, 160px);
  line-height: 0.85;
  font-family: 'Playfair Display', 'Georgia', 'Times New Roman', serif !important;
  font-style: italic;
  font-weight: 600;
  color: rgba(211, 47, 47, 0.16);
}

/* Round-12 follow-up: the founder-quote mark was using Playfair via
   font-family stack, but Playfair was unloaded site-wide per operator
   directive. Use system Georgia instead — ships on every OS and
   renders a clean italic curly-quote glyph at the ornamental size. */
.founder-quote-mark {
  font-family: 'Georgia', 'Times New Roman', serif !important;
  font-weight: 700;
}

/* ============================================================
   Operator override round 13 — nav dropdown, inner-page heroes,
   /work hero with image + reviews strip, crown position fix.
   ============================================================ */

/* 1) Nav dropdown */
.nav-dropdown {
  position: relative;
  display: inline-flex;
  align-items: center;
}
.nav-dropdown-trigger {
  display: inline-flex;
  align-items: center;
  gap: 6px;
}
.nav-caret {
  transition: transform 0.2s ease;
  opacity: 0.7;
  flex-shrink: 0;
}
.nav-dropdown:hover .nav-caret,
.nav-dropdown:focus-within .nav-caret {
  transform: rotate(180deg);
  opacity: 1;
}
.nav-dropdown-menu {
  position: absolute;
  top: 100%;
  left: 50%;
  transform: translateX(-50%) translateY(-8px);
  min-width: 220px;
  background: var(--surface);
  border: 1px solid rgba(255, 255, 255, 0.08);
  border-radius: var(--radius);
  padding: 8px 0;
  margin-top: 8px;
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  transition: opacity 0.2s ease, transform 0.2s ease, visibility 0.2s ease;
  box-shadow: 0 20px 50px -10px rgba(0, 0, 0, 0.6);
  z-index: 80;
}
.nav-dropdown:hover .nav-dropdown-menu,
.nav-dropdown:focus-within .nav-dropdown-menu {
  opacity: 1;
  visibility: visible;
  pointer-events: auto;
  transform: translateX(-50%) translateY(0);
}
.nav-dropdown-menu a {
  display: block;
  padding: 12px 18px;
  color: var(--ink);
  text-decoration: none;
  font-size: 14px;
  font-weight: 500;
  white-space: nowrap;
  transition: background 0.15s ease, color 0.15s ease;
  min-height: 44px;
  display: flex;
  align-items: center;
}
.nav-dropdown-menu a:hover,
.nav-dropdown-menu a:focus {
  background: rgba(211, 47, 47, 0.12);
  color: var(--accent);
}

/* 2) Mobile drawer section group */
.mobile-drawer .drawer-section {
  padding-bottom: 8px;
  border-bottom: 1px solid rgba(255, 255, 255, 0.05);
  margin-bottom: 8px;
}
.mobile-drawer .drawer-section-head {
  padding-bottom: 6px;
  font-weight: 700;
}
.mobile-drawer .drawer-sub {
  padding: 12px 0 12px 16px;
  font-size: 15px;
  color: var(--ink-soft);
  border-bottom: none;
  min-height: 44px;
}
.mobile-drawer .drawer-sub:last-child { border-bottom: 1px solid rgba(255,255,255,0.05); }

/* 3) Crown position — bring DOWN to align with wordmark's lowercase
   x-height row. Earlier round-12 lifted it (-4px); operator wants
   it at the visual middle of the wordmark, so it goes the other way. */
.brand-crown { transform: translateY(4px); }
@media (max-width: 540px) {
  .brand-crown { transform: translateY(3px); }
}
@media (max-width: 380px) {
  .brand-crown { transform: translateY(3px); }
}
.brand--footer .brand-crown { transform: translateY(3px); }

/* Also retire the round-11 brand--mark assembly lift; with the
   crown now positioned at visual center, the assembly itself
   doesn't need translating. */
.brand.brand--mark { transform: none; }
.brand--footer.brand--mark { transform: none; }

/* 4) Inner-page heroes — widen the hero-text column. Was constrained
   to 56ch which broke long H1s into 4-5 lines on services / about /
   service-detail pages. */
.hero-content--simple {
  max-width: var(--container);
  margin: 0 auto;
}
.hero-content--simple .hero-text { max-width: none; }
.hero-content--simple h1.hero-title { max-width: 22ch; }
.hero-content--simple .hero-sub { max-width: 64ch; }
@media (max-width: 900px) {
  .hero-content--simple h1.hero-title { max-width: none; }
}

/* 5) Compact /work hero — full-bleed with the pool image as bg,
   but TIGHTER vertically so the gallery sits above the fold on
   a typical laptop. */
.hero--work {
  padding-top: clamp(110px, 11vw, 140px);
  padding-bottom: clamp(40px, 5vw, 64px);
  min-height: auto;
}
.hero-title--compact {
  font-size: clamp(36px, 4.6vw, 64px);
  line-height: 0.96;
}
.hero--work .hero-content--simple h1.hero-title { max-width: 22ch; }
.hero--work .hero-content--simple .hero-sub { max-width: 64ch; }

/* 6) Reviews rating strip — inline ribbon on /work hero */
.reviews-rating-strip {
  display: inline-flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 6px 12px;
  margin-top: 18px;
  padding: 10px 16px;
  background: rgba(22, 32, 56, 0.7);
  backdrop-filter: blur(8px);
  border: 1px solid rgba(255, 255, 255, 0.08);
  border-left: 3px solid var(--accent);
  border-radius: var(--radius);
  max-width: 100%;
}
.rrs-stars {
  color: var(--accent);
  letter-spacing: 0.08em;
  font-size: 16px;
  line-height: 1;
}
.rrs-rating {
  font-family: 'Anton', Impact, sans-serif;
  font-size: 26px;
  color: var(--ink);
  line-height: 1;
}
.rrs-meta {
  font-size: 12px;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--ink-soft);
  font-weight: 600;
}

/* Now that /work has a full-bleed hero, also tighten the filter
   row and gallery padding so the gallery appears within the first
   viewport on common laptop heights. */
.hero--work + .filter-section { top: 64px; }

/* ============================================================
   ROUND 14 — Hero CTA buttons + mobile sticky timing
   - Hero "Call (618) 530-0391" is now a btn-primary, side-by-side
     with btn-secondary "See Our Work" on desktop and stacked on
     mobile.
   - Header phone icon on mobile is hidden; the sticky CTA bar
     serves the same role and now appears the moment the contact
     form's submit button enters the viewport (see site.js + the
     .sticky-cta-trigger sentinel after the hero form).
   ============================================================ */

/* Hero meta row: primary call CTA + secondary "See work" link */
.hero-content .hero-meta--actions {
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  align-items: center;
  gap: 12px;
}
.hero-content .hero-meta--actions .btn-primary,
.hero-content .hero-meta--actions .btn-secondary {
  flex: 0 0 auto;
}
.btn-hero-call {
  /* Lean on btn-primary for the gradient + weight; add a subtle
     glow so the call button is clearly the primary action. */
  box-shadow: 0 8px 24px -10px rgba(211, 47, 47, 0.6);
}
.btn-hero-call .btn-icon {
  flex-shrink: 0;
  margin-right: 2px;
}

@media (max-width: 720px) {
  .hero-content .hero-meta--actions {
    flex-direction: column;
    align-items: stretch;
    gap: 10px;
  }
  .hero-content .hero-meta--actions .btn-primary,
  .hero-content .hero-meta--actions .btn-secondary {
    width: 100%;
    min-width: 0;
    justify-content: center;
  }
}

/* Hide header phone icon on mobile — sticky CTA bar replaces it.
   Override the 860px rebuild from line 3830ish that turned it
   into a 48px icon button. */
@media (max-width: 860px) {
  .phone-cta { display: none !important; }
}

/* Sticky CTA sentinel — invisible marker at the bottom of the
   hero contact form. The IntersectionObserver in site.js watches
   this element; when it enters the viewport, the mobile sticky
   bar reveals. Zero visual footprint. */
.sticky-cta-trigger {
  display: block;
  width: 100%;
  height: 1px;
  margin: 0;
  padding: 0;
  pointer-events: none;
  background: transparent;
}

/* ============================================================
   ROUND 15 — Overlay lift + dropdown bridge + multi-line H1s
   - Hero overlays lightened so the underlying imagery shows
     through (above the .hero-bg img filter and .hero-overlay
     gradient stops earlier in this file).
   - Nav dropdown was finicky: the 8px margin-top between the
     trigger and the menu created a dead zone where neither was
     hovered, so the menu hid the moment the cursor entered the
     gap. Fix: drop margin-top and add a transparent ::before
     bridge that extends the menu's hit area back up to the
     trigger. Visual gap preserved via the ::before height.
   - H1s now use explicit <br> line breaks for intentional
     wrapping across breakpoints. Tighten line-height a hair so
     three-line headlines don't sprawl, and prevent the accent
     line from sticking to the previous line.
   ============================================================ */

/* Dropdown hover-bridge */
.nav-dropdown-menu {
  margin-top: 0;
}
.nav-dropdown-menu::before {
  content: '';
  position: absolute;
  top: -12px;
  left: 0;
  right: 0;
  height: 12px;
  background: transparent;
  pointer-events: auto;
}
.nav-dropdown-menu {
  top: calc(100% + 12px);
}

/* Slight delay on hide so a small overshoot doesn't kill it */
.nav-dropdown-menu {
  transition: opacity 0.18s ease 0.05s, transform 0.18s ease 0.05s, visibility 0.18s ease 0.05s;
}
.nav-dropdown:hover .nav-dropdown-menu,
.nav-dropdown:focus-within .nav-dropdown-menu {
  transition-delay: 0s;
}

/* Multi-line hero H1 rhythm */
.hero-fullbleed h1.hero-title { line-height: 1.02; }
.hero-fullbleed h1.hero-title br + em.accent,
.hero-fullbleed h1.hero-title em.accent { display: inline-block; }

/* Mobile: scale H1 down a hair for 3-line stacks */
@media (max-width: 720px) {
  .hero-fullbleed h1.hero-title {
    font-size: clamp(30px, 8.5vw, 42px);
    line-height: 1.05;
  }
}

/* ============================================================
   ROUND 16 — Page-specific hero crops, About stacked CTA,
   Flatwork overlay further-lightened
   ============================================================ */

/* Page-specific hero crops — push focal point to the right part
   of each source image. */
.hero-bg img[src*="hero-driveway"] {
  object-position: 50% 88%; /* driveway dominates, garage trimmed */
}
.hero-bg img[src*="work-hero-pool"] {
  object-position: 50% 22%; /* pool in upper half of source frame */
}
.hero-bg img[src*="home-hero-driveway"] {
  object-position: 50% 60%; /* favor the slab over the trees and sky */
}
.hero-bg img[src*="services-hero-finished"] {
  object-position: 50% 65%; /* favor the foreground concrete pattern */
}

/* Flatwork hero overlay — operator wants the pour visible.
   Override the global overlay just for this page. */
.page-flatwork .hero-overlay {
  background:
    linear-gradient(105deg, rgba(11, 18, 32, 0.58) 0%, rgba(11, 18, 32, 0.40) 35%, rgba(11, 18, 32, 0.18) 65%, rgba(11, 18, 32, 0.05) 100%),
    radial-gradient(ellipse at top right, rgba(211, 47, 47, 0.10), transparent 60%);
}
@media (max-width: 900px) {
  .page-flatwork .hero-overlay {
    background: linear-gradient(180deg, rgba(11, 18, 32, 0.32) 0%, rgba(11, 18, 32, 0.55) 65%, rgba(11, 18, 32, 0.78) 100%);
  }
}

/* About hero: stack the phone-call line below the button row. */
.hero-meta--stacked {
  display: flex;
  flex-direction: column;
  gap: 14px;
  align-items: flex-start;
}
.hero-meta--stacked .hero-meta-row {
  display: flex;
  flex-direction: row;
  gap: 12px;
  flex-wrap: wrap;
}
.hero-meta--stacked .hero-meta-text {
  display: block;
}
@media (max-width: 720px) {
  .hero-meta--stacked .hero-meta-row {
    flex-direction: column;
    align-items: stretch;
    width: 100%;
  }
  .hero-meta--stacked .hero-meta-row .btn-primary,
  .hero-meta--stacked .hero-meta-row .btn-secondary {
    width: 100%;
    justify-content: center;
  }
}

/* ============================================================
   ROUND 18 — Mirror home hero, page-specific crops for new
   AI-generated heroes, /work H1 4-line break
   ============================================================ */

/* Home hero — image is pre-flipped at the file level (so the
   driveway's open sweep sits on the left where the headline reads).
   No CSS transform applied — transforms on the LCP candidate can
   cause Chrome to skip it for LCP scoring. */
.hero-bg img[src*="home-hero-driveway"] {
  object-position: 40% 65%;
}

/* New hero crops. Each image is 16:9 landscape but the hero band
   trims top/bottom, so we bias each toward the most concrete-
   dominant slice. */
.hero-bg img[src*="driveway-hero-broom"] {
  object-position: 50% 75%;
}
.hero-bg img[src*="stamped-hero-slate"] {
  object-position: 50% 100%;
}
.hero-bg img[src*="flatwork-hero-patio"] {
  object-position: 50% 80%;
}
.hero-bg img[src*="work-hero-portfolio"] {
  object-position: 50% 75%;
}

/* /work H1 — 4-line stack reads like a sign list. Slightly
   tighter font-size since we now have four rows instead of two. */
.hero--work .hero-title--compact {
  font-size: clamp(34px, 4.2vw, 58px);
  line-height: 1.0;
}
@media (max-width: 720px) {
  .hero--work .hero-title--compact {
    font-size: clamp(28px, 7.5vw, 38px);
  }
}

/* ============================================================
   ROUND 19 — Contact portfolio hero, work gallery removed
   reveal, stamped hero further-cropped
   ============================================================ */

/* Contact page now uses a hero-fullbleed with a real Edwardsville
   pool-surround photo behind the text. Smaller than other heroes
   per operator: portfolio touch, not a showpiece. */
.hero--contact {
  padding-top: clamp(110px, 11vw, 140px);
  padding-bottom: clamp(40px, 5vw, 64px);
}
.hero--contact .hero-content--simple {
  max-width: var(--container);
  margin: 0 auto;
}
.hero--contact .hero-title--compact {
  font-size: clamp(32px, 4vw, 54px);
}
.hero-bg img[src*="474618665"] {
  object-position: 50% 35%;
}

/* ============================================================
   ROUND 20 — Transparent header at scroll-top + no overlay on
   home hero
   ============================================================ */

/* Homepage hero: drop the dark overlay so the image reads at
   full brightness. Keeping the image filter modest. */
.page-home .hero-overlay {
  display: none;
}
.page-home .hero-bg img[src*="home-hero-driveway"] {
  filter: contrast(1.04) saturate(1.05);
}

/* When the header is in its transparent (top-of-page) state,
   the hero image extends UP behind the fixed header. Most heroes
   are fairly light at the top, so nav text + wordmark flip to
   black; they snap back to white once the user scrolls and the
   .scrolled background kicks in. */
.site-header:not(.scrolled) .brand,
.site-header:not(.scrolled) .brand-wordmark,
.site-header:not(.scrolled) .brand-cap,
.site-header:not(.scrolled) .nav-link,
.site-header:not(.scrolled) .nav-dropdown-trigger {
  color: #0B1220;
}
.site-header:not(.scrolled) .brand-crown {
  color: #0B1220;
}
.site-header:not(.scrolled) .menu-toggle span {
  background: #0B1220;
}
.site-header.scrolled .brand,
.site-header.scrolled .brand-wordmark,
.site-header.scrolled .brand-cap,
.site-header.scrolled .nav-link,
.site-header.scrolled .nav-dropdown-trigger,
.site-header.scrolled .brand-crown {
  color: var(--ink);
}
.site-header.scrolled .menu-toggle span {
  background: var(--ink);
}

/* ============================================================
   ROUND 24 — Mobile-only home hero crop + delayed sticky CTA
   ============================================================ */

/* Mobile-only: move the Get a Free Quote form OUT of the hero into
   its own section between hero and trust strip. The hero on mobile
   collapses to just headline + CTA buttons over the photo, the
   form lives in its own breathable section below. Desktop/tablet
   keep the form inside the hero, side-by-side with the text. */
.quote-form-mobile-section { display: none; }
@media (max-width: 720px) {
  .hero-content > .hero-form { display: none; }
  .quote-form-mobile-section {
    display: block;
    background: var(--bg);
    padding: clamp(32px, 6vw, 48px) var(--pad-x);
  }
  .quote-form-mobile-section .section-inner {
    max-width: 560px;
    margin: 0 auto;
  }
  /* Image is pre-flipped at the file level; no CSS transform needed. */
}
