/* ==========================================================================
   Junk Removal Pro Service LLC
   ========================================================================== */

/* --------------------------------------------------------------------------
   Fonts
   Barlow and Barlow Condensed (SIL Open Font License, see fonts/OFL.txt), hosted on this site instead of
   Google Fonts so the page doesn't wait on another company's server before it can show text.
   Latin subset only, which covers every character the site uses. The three fonts the top of the page
   needs (barlow-400, barlow-500, barlow-condensed-800-italic) are preloaded in each page's <head>.
   -------------------------------------------------------------------------- */
@font-face {
  font-family: "Barlow";
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url("../fonts/barlow-400.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
  font-family: "Barlow";
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url("../fonts/barlow-500.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
  font-family: "Barlow";
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url("../fonts/barlow-600.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
  font-family: "Barlow Condensed";
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url("../fonts/barlow-condensed-600.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
  font-family: "Barlow Condensed";
  font-style: italic;
  font-weight: 800;
  font-display: swap;
  src: url("../fonts/barlow-condensed-800-italic.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

/* --------------------------------------------------------------------------
   Design tokens
   -------------------------------------------------------------------------- */
:root {
  --font-heading: "Barlow Condensed", "Arial Narrow", Impact, sans-serif;
  --font-body: "Barlow", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;

  /* Brand red, sampled from the logo */
  --red: #d70302;
  --red-dark: #a80200;

  /* Layout */
  --container: 1240px;
  --gutter: 1rem;

  /* Navbar (mobile first). The logo is taller than the bar on purpose,
     so it hangs below the bar. --logo-top nudges it down from the top edge. */
  --nav-h: 60px;
  --nav-line: 4px;
  --logo-w: clamp(132px, 40vw, 168px);
  --logo-h: calc(var(--logo-w) * 0.5017); /* logo is 600 x 301 */
  --logo-top: 6px;
  --logo-overhang: calc(var(--logo-top) + var(--logo-h) - var(--nav-h) - var(--nav-line));

  /* Red brush stroke, used behind nav hovers and the hero headline */
  --streak: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 60' preserveAspectRatio='none'%3E%3Cpath fill='%23d70302' d='M6 15C3 10 9 7 20 8L58 4 108 7 158 3 188 6C196 8 196 15 198 21L194 26 199 32 193 38 197 46C196 52 187 54 175 53L128 56 78 53 30 56 14 53C6 52 8 46 5 42L9 36 2 30 8 24 4 18ZM194 13L200 14 195 17ZM196 47L200 49 193 50Z'/%3E%3C/svg%3E");

  /* Check mark, used as a mask so it can take any color (about list, service lists) */
  --check: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M9 16.2 4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4z'/%3E%3C/svg%3E");
}

/* Light theme (default) */
:root,
:root[data-theme="light"] {
  color-scheme: light;
  --bg: #ffffff;
  --text: #111113;
  --text-muted: #4a4d55;
  --surface: #f4f4f6;              /* alternate section background */
  --card-bg: #ffffff;
  --card-border: #e5e5ea;
  --card-shadow: 0 8px 24px rgb(0 0 0 / 0.06);
  --accent-text: var(--red);       /* red used as text / hover color */
  --nav-shadow: rgb(0 0 0 / 0.12);
  --focus: var(--red);
  --success: #15803d;
  --logo-shadow: rgb(0 0 0 / 0.3);
  --field-bg: #ffffff;
  --field-border: #868993;         /* about 3.6:1 against the card, so the box edges stay visible */
}

/* Dark theme */
:root[data-theme="dark"] {
  color-scheme: dark;
  --bg: #0b0b0c;
  --text: #f4f4f5;
  --text-muted: #b6b6bd;
  --surface: #101013;
  --card-bg: #18181c;
  --card-border: #2a2a30;
  --card-shadow: 0 8px 24px rgb(0 0 0 / 0.35);
  --accent-text: #ff4a4a;          /* brighter red so it stays readable on black */
  --nav-shadow: rgb(0 0 0 / 0.6);
  --focus: #ffffff;
  --success: #4ade80;
  --logo-shadow: rgb(0 0 0 / 0.7);
  --field-bg: #101013;
  --field-border: #7a7c88;
}

@media (min-width: 40em) {
  :root { --gutter: 1.5rem; }
}

@media (min-width: 62em) {
  :root {
    --nav-h: 80px;
    /* Smaller than the 75em+ size on purpose: two drop-downs plus five other nav items need the room between
       62em and 75em, and the logo gets to grow again once the bar has space to spare. */
    --logo-w: 185px;
    --logo-top: 8px;
  }
}

@media (min-width: 75em) {
  :root { --logo-w: 250px; }
}

/* --------------------------------------------------------------------------
   Base
   -------------------------------------------------------------------------- */
*,
*::before,
*::after {
  box-sizing: border-box;
}

/* The navbar is sticky, so in-page links and keyboard focus stop below it instead of underneath it */
html {
  scroll-padding-top: calc(var(--nav-h) + var(--nav-line) + 0.5rem);
}

/* In-page links glide instead of jumping, unless the visitor asked for less motion */
@media (prefers-reduced-motion: no-preference) {
  html {
    scroll-behavior: smooth;
  }
}

body {
  margin: 0;
  min-height: 100vh;
  background: var(--bg);
  color: var(--text);
  font-family: var(--font-body);
  font-size: 1rem;
  line-height: 1.5;
  -webkit-font-smoothing: antialiased;
  transition: background-color 0.25s ease, color 0.25s ease;
}

img {
  display: block;
  max-width: 100%;
  height: auto;
}

/* Visible only to screen readers */
.sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
  border: 0;
}

/* First tab stop on every page: jumps past the navbar to the main content */
.skip-link {
  position: absolute;
  top: 0.75rem;
  left: 0.75rem;
  z-index: 200;
  padding: 0.6rem 1.1rem;
  border-radius: 4px;
  background: var(--red);
  color: #ffffff;
  font-family: var(--font-heading);
  font-size: 1.2rem;
  font-style: italic;
  font-weight: 800;
  text-decoration: none;
  transform: translateY(-200%);
}

.skip-link:focus {
  transform: none;
  outline: 3px solid #ffffff;
  outline-offset: 2px;
}

/* main is only focused by the skip link, so it doesn't need a focus ring */
main:focus {
  outline: none;
}

:focus-visible {
  outline: 3px solid var(--focus);
  outline-offset: 3px;
  border-radius: 4px;
}

.container {
  width: min(100% - (var(--gutter) * 2), var(--container));
  margin-inline: auto;
}

/* --------------------------------------------------------------------------
   Buttons
   -------------------------------------------------------------------------- */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.6rem;
  padding: 0.6rem 1.5rem;
  border-radius: 4px;
  font-family: var(--font-heading);
  font-size: 1.3rem;
  font-style: italic;
  font-weight: 800;
  letter-spacing: 0.02em;
  line-height: 1.2;
  text-decoration: none;
  white-space: nowrap;
  cursor: pointer; /* links get this for free, but a real <button> doesn't */
  transition: background-color 0.15s ease, transform 0.15s ease, box-shadow 0.15s ease;
}

.btn-primary {
  background: var(--red);
  color: #ffffff;
  box-shadow: 0 3px 0 var(--red-dark);
}

.btn-primary:hover {
  background: #eb0a08;
  transform: translateY(-1px);
  box-shadow: 0 4px 0 var(--red-dark);
}

.btn-primary:active {
  transform: translateY(2px);
  box-shadow: 0 1px 0 var(--red-dark);
}

/* Outline button, for use on dark / photo backgrounds */
.btn-outline {
  background: rgb(255 255 255 / 0.06);
  color: #ffffff;
  box-shadow: inset 0 0 0 2px rgb(255 255 255 / 0.85);
  backdrop-filter: blur(4px);
}

.btn-outline:hover {
  background: #ffffff;
  color: #111113;
  transform: translateY(-1px);
}

.btn-outline:active {
  transform: translateY(1px);
}

/* Outline button that follows the theme (dark on light, light on dark) */
.btn-secondary {
  background: transparent;
  color: var(--text);
  box-shadow: inset 0 0 0 2px currentColor;
}

.btn-secondary:hover {
  background: var(--text);
  color: var(--bg);
  transform: translateY(-1px);
}

.btn-secondary:active {
  transform: translateY(1px);
}

.btn-icon {
  flex: none;
  width: 1.05em;
  height: 1.05em;
  fill: currentColor;
}

.btn-lg {
  padding: 0.8rem 2rem;
  font-size: 1.55rem;
}

/* --------------------------------------------------------------------------
   Navbar
   -------------------------------------------------------------------------- */
/* The navbar is always dark, in both themes, so it uses its own dark palette */
.site-header {
  --text: #f4f4f5;
  --accent-text: #ff4a4a;
  --focus: #ffffff;
  --nav-bg: #0d0d0f;
  --divider: #2a2a2f;
  --toggle-track: #1c1c20;
  --toggle-border: #37373d;
  --toggle-knob: #2f2f36;
  --toggle-knob-shadow: rgb(0 0 0 / 0.6);

  position: sticky;
  top: 0;
  z-index: 100;
  background: var(--nav-bg);
  border-bottom: var(--nav-line) solid var(--red);
  box-shadow: 0 6px 20px var(--nav-shadow);
  transition: background-color 0.25s ease;
}

.nav {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  height: var(--nav-h);
}

/* Logo: sized independently of the bar so it overflows below it */
.brand {
  position: relative;
  z-index: 2; /* stays above the mobile dropdown */
  flex: none;
  width: var(--logo-w);
  height: 100%;
}

.brand-logo {
  position: absolute;
  top: var(--logo-top);
  left: 0;
  width: 100%;
  filter: drop-shadow(0 5px 6px var(--logo-shadow));
}

/* Links + CTA. Mobile: a dropdown panel under the bar. */
.nav-menu {
  position: absolute;
  top: calc(100% + var(--nav-line));
  left: 0;
  right: 0;
  z-index: 1;
  /* top padding clears the part of the logo hanging over the panel */
  padding: calc(var(--logo-overhang) + 0.75rem) var(--gutter) 1.5rem;
  /* with the Services list open the panel can be taller than a phone, so it scrolls instead of running off the screen */
  max-height: calc(100vh - var(--nav-h) - var(--nav-line) * 2);
  max-height: calc(100dvh - var(--nav-h) - var(--nav-line) * 2);
  overflow-y: auto;
  overscroll-behavior: contain;
  background: var(--nav-bg);
  border-bottom: var(--nav-line) solid var(--red);
  box-shadow: 0 14px 24px var(--nav-shadow);
  opacity: 0;
  visibility: hidden;
  transform: translateY(-8px);
  transition: opacity 0.2s ease, transform 0.2s ease, visibility 0s linear 0.2s;
}

.nav-menu.is-open {
  opacity: 1;
  visibility: visible;
  transform: none;
  transition-delay: 0s;
}

.nav-list {
  display: flex;
  flex-direction: column;
  max-width: 26rem;
  margin: 0;
  padding: 0;
  list-style: none;
}

/* Direct children only, so the Services list inside the menu doesn't pick these up */
.nav-list > li:not(:last-child) {
  border-bottom: 1px solid var(--divider);
}

.nav-list > li:last-child {
  margin-top: 1.25rem;
}

.nav-list .btn {
  display: flex;
  width: 100%;
}

.nav-link {
  position: relative;
  display: block;
  padding: 0.85rem 0;
  color: var(--text);
  font-family: var(--font-heading);
  font-size: 1.5rem;
  font-weight: 600;
  letter-spacing: 0.03em;
  text-decoration: none;
  transition: color 0.15s ease;
}

/* aria-current="page" marks the page you're on. The Services button uses aria-current="true" when you're on one of the service pages. */
.nav-link:hover,
.nav-link[aria-current] {
  color: var(--accent-text);
}

/* Services: a button that opens the list of service pages, so it doesn't get the pointing hand a link would.
   Phones: it's an accordion inside the menu. Desktop: a drop-down panel (see "Navbar: desktop"). */
.nav-trigger {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.5rem;
  width: 100%;
  margin: 0;
  border: 0;
  background: none;
  line-height: inherit;
  text-align: left;
  cursor: default;
}

.nav-caret {
  flex: none;
  width: 1.15em;
  height: 1.15em;
  fill: none;
  stroke: currentColor;
  stroke-width: 3;
  stroke-linecap: round;
  stroke-linejoin: round;
  transition: transform 0.3s cubic-bezier(0.3, 1.4, 0.5, 1);
}

.nav-item--dropdown.is-open .nav-caret {
  transform: rotate(180deg);
}

/* The list opens by growing from 0fr to 1fr, and stays out of the tab order while it's closed */
.nav-dropdown {
  display: grid;
  grid-template-rows: 0fr;
  visibility: hidden;
  transition: grid-template-rows 0.3s ease, visibility 0s linear 0.3s;
}

.nav-item--dropdown.is-open .nav-dropdown {
  grid-template-rows: 1fr;
  visibility: visible;
  transition-delay: 0s;
}

.nav-sublist {
  min-height: 0;
  margin: 0 0 0 0.35rem;
  padding: 0 0 0 1rem;
  overflow: hidden;
  border-left: 3px solid var(--red);
  list-style: none;
}

.nav-sublist > li:last-child {
  padding-bottom: 0.6rem;
}

.nav-sublink {
  display: flex;
  align-items: center;
  gap: 0.8rem;
  padding: 0.5rem 0;
  color: rgb(255 255 255 / 0.88);
  font-family: var(--font-heading);
  font-size: 1.25rem;
  font-weight: 600;
  letter-spacing: 0.03em;
  line-height: 1.2;
  text-decoration: none;
  transition: color 0.15s ease, background-color 0.15s ease;
}

.nav-sublink:hover,
.nav-sublink:focus-visible {
  color: #ffffff;
}

.nav-sublink[aria-current="page"] {
  color: var(--accent-text);
}

/* Small version of the red parallelogram icon badge from the service cards */
.nav-subicon {
  display: grid;
  flex: none;
  place-items: center;
  width: 2rem;
  height: 2rem;
  border-radius: 6px;
  background: rgb(255 255 255 / 0.1);
  color: #ffffff;
  transform: skewX(-10deg);
  transition: background-color 0.15s ease;
}

.nav-subicon svg {
  width: 1.05rem;
  height: 1.05rem;
  fill: currentColor;
  transform: skewX(10deg); /* undo the badge's slant so the icon stands upright */
}

.nav-sublink:hover .nav-subicon,
.nav-sublink:focus-visible .nav-subicon,
.nav-sublink[aria-current="page"] .nav-subicon {
  background: var(--red);
}

/* Theme switch: sun on the left, moon on the right, knob slides under the active one */
.theme-toggle {
  position: relative;
  display: flex;
  justify-content: space-between;
  flex: none;
  width: 76px;
  height: 40px;
  margin-left: auto;
  padding: 2px;
  border: 1px solid var(--toggle-border);
  border-radius: 999px;
  background: var(--toggle-track);
  cursor: pointer;
  transition: background-color 0.25s ease, border-color 0.25s ease;
}

.theme-knob {
  position: absolute;
  top: 2px;
  left: 2px;
  width: 34px;
  height: 34px;
  border-radius: 50%;
  background: var(--toggle-knob);
  box-shadow: 0 1px 3px var(--toggle-knob-shadow);
  transition: transform 0.25s ease, background-color 0.25s ease;
}

:root[data-theme="dark"] .theme-knob {
  transform: translateX(36px);
}

.theme-icon {
  position: relative;
  display: grid;
  place-items: center;
  width: 34px;
  height: 34px;
  transition: opacity 0.25s ease;
}

.theme-icon img {
  width: 26px;
  height: 26px;
  object-fit: contain;
}

:root[data-theme="light"] .theme-icon-dark,
:root[data-theme="dark"] .theme-icon-light {
  opacity: 0.45;
}

/* Hamburger */
.menu-toggle {
  position: relative;
  flex: none;
  width: 44px;
  height: 44px;
  padding: 0;
  border: 0;
  border-radius: 6px;
  background: transparent;
  color: var(--text);
  cursor: pointer;
  transition: color 0.15s ease;
}

.menu-toggle:hover {
  color: var(--accent-text);
}

.menu-toggle .bar {
  position: absolute;
  left: 9px;
  right: 9px;
  top: 50%;
  height: 3px;
  margin-top: -1.5px;
  border-radius: 2px;
  background: currentColor;
  transition: transform 0.25s ease, opacity 0.2s ease;
}

.menu-toggle .bar:nth-child(1) { transform: translateY(-8px); }
.menu-toggle .bar:nth-child(3) { transform: translateY(8px); }

.menu-toggle[aria-expanded="true"] .bar:nth-child(1) { transform: rotate(45deg); }
.menu-toggle[aria-expanded="true"] .bar:nth-child(2) { opacity: 0; }
.menu-toggle[aria-expanded="true"] .bar:nth-child(3) { transform: rotate(-45deg); }

/* --------------------------------------------------------------------------
   Navbar: desktop
   -------------------------------------------------------------------------- */
@media (min-width: 62em) {
  .nav {
    gap: 1.5rem;
  }

  .menu-toggle {
    display: none;
  }

  /* Dropdown becomes an inline row */
  .nav-menu {
    position: static;
    align-self: stretch; /* as tall as the bar, so the Services drop-down's hover area reaches the bar's bottom edge */
    display: flex;
    margin-left: auto;
    padding: 0;
    max-height: none;
    overflow: visible; /* the drop-down hangs below the bar */
    background: none;
    border: 0;
    box-shadow: none;
    opacity: 1;
    visibility: visible;
    transform: none;
    transition: none;
  }

  .nav-list {
    flex-direction: row;
    align-items: center;
    gap: 1.5rem;
    max-width: none;
  }

  .nav-list > li:not(:last-child) {
    border-bottom: 0;
  }

  .nav-list > li:last-child {
    margin-top: 0;
    margin-left: 0.5rem;
  }

  .nav-list .btn {
    display: inline-flex;
    width: auto;
  }

  .nav-link {
    padding: 0.4rem 0;
    font-size: 1.2rem;
    white-space: nowrap;
  }

  /* Hover: a red paint streak wipes in behind the text */
  .nav-link {
    isolation: isolate; /* keeps the streak behind the text but above the bar */
    transition: color 0.2s ease;
  }

  .nav-link:hover,
  .nav-link:focus-visible,
  .nav-link[aria-current],
  .nav-item--dropdown.is-open .nav-trigger {
    color: #ffffff;
  }

  .nav-link::after {
    content: "";
    position: absolute;
    z-index: -1;
    inset: 0 -0.8rem;
    background: var(--streak) center / 100% 100% no-repeat;
    transform: rotate(-2deg);
    clip-path: inset(0 100% 0 0);
    transition: clip-path 0.3s cubic-bezier(0.3, 0.7, 0.2, 1);
  }

  /* On the page they're on, the streak stays. Services keeps it while you're on any service page. */
  .nav-link:hover::after,
  .nav-link:focus-visible::after,
  .nav-link[aria-current]::after,
  .nav-item--dropdown.is-open .nav-trigger::after {
    clip-path: inset(0 0 0 0);
  }

  .theme-toggle {
    margin-left: 0;
  }

  /* ----- Services drop-down ----- */
  /* The list item is as tall as the bar, so pointing anywhere above or below the word keeps the panel open */
  .nav-item--dropdown {
    position: relative;
    display: flex;
    align-items: center;
    align-self: stretch;
  }

  .nav-trigger {
    width: auto;
    justify-content: flex-start;
    gap: 0.3rem;
  }

  .nav-caret {
    width: 1rem;
    height: 1rem;
    margin-top: 0.1rem;
  }

  /* Hangs below the bar's red line, the same dark panel with a red edge as the phone menu. It closes after a short
     delay so the pointer can travel from the word to the panel without it flickering shut. */
  .nav-dropdown {
    position: absolute;
    top: calc(100% + var(--nav-line));
    left: 50%;
    display: block;
    width: max-content;
    min-width: 21.5rem;
    padding: 0.6rem;
    border-bottom: var(--nav-line) solid var(--red);
    border-radius: 0 0 10px 10px;
    background: var(--nav-bg);
    box-shadow: 0 18px 30px var(--nav-shadow);
    opacity: 0;
    visibility: hidden;
    transform: translate(-50%, -8px);
    transition: opacity 0.2s ease 0.15s, transform 0.2s ease 0.15s, visibility 0s linear 0.35s;
  }

  /* Bridges the red line between the bar and the panel, so the pointer never leaves the menu on the way down */
  .nav-dropdown::before {
    content: "";
    position: absolute;
    right: 0;
    bottom: 100%;
    left: 0;
    height: calc(var(--nav-line) + 0.6rem);
  }

  .nav-item--dropdown.is-open .nav-dropdown {
    opacity: 1;
    visibility: visible;
    transform: translate(-50%, 0);
    transition-delay: 0s;
  }

  .nav-sublist {
    margin: 0;
    padding: 0;
    overflow: visible;
    border-left: 0;
  }

  .nav-sublist > li:last-child {
    padding-bottom: 0;
  }

  .nav-sublink {
    padding: 0.5rem 0.75rem;
    border-radius: 8px;
    font-size: 1.2rem;
  }

  .nav-sublink:hover,
  .nav-sublink:focus-visible {
    background: rgb(255 255 255 / 0.08);
  }

  .nav-sublink[aria-current="page"] {
    background: rgb(215 3 2 / 0.14);
  }

  /* The entries slide down one after another as the panel opens */
  .nav-sublist > li {
    opacity: 0;
    transform: translateY(-6px);
    transition: opacity 0.22s ease, transform 0.22s ease;
  }

  .nav-sublist > li:nth-child(2) { --i: 1; }
  .nav-sublist > li:nth-child(3) { --i: 2; }
  .nav-sublist > li:nth-child(4) { --i: 3; }
  .nav-sublist > li:nth-child(5) { --i: 4; }
  .nav-sublist > li:nth-child(6) { --i: 5; }
  .nav-sublist > li:nth-child(7) { --i: 6; }
  .nav-sublist > li:nth-child(8) { --i: 7; }
  .nav-sublist > li:nth-child(9) { --i: 8; }

  .nav-item--dropdown.is-open .nav-sublist > li {
    opacity: 1;
    transform: none;
    transition-delay: calc(var(--i, 0) * 30ms + 60ms);
  }
}

/* Just past the phone breakpoint the bar is tight (seven items plus the logo and switch), so the links, the
   two drop-down triggers, and the button are a touch smaller and closer together. Without this, items would wrap. */
@media (min-width: 62em) and (max-width: 79.99em) {
  .nav-list {
    gap: 0.85rem;
  }

  .nav-list > li:last-child {
    margin-left: 0.15rem;
  }

  .nav-link {
    font-size: 0.98rem;
  }

  .nav-caret {
    width: 0.85rem;
    height: 0.85rem;
  }

  .nav-list .btn {
    padding-inline: 0.85rem;
    font-size: 1.05rem;
  }
}

/* Mouse: pointing at Services opens it (touch screens and the keyboard use the button, see js/main.js) */
@media (min-width: 62em) and (hover: hover) {
  .nav-item--dropdown:hover .nav-trigger {
    color: #ffffff;
  }

  .nav-item--dropdown:hover .nav-trigger::after {
    clip-path: inset(0 0 0 0);
  }

  .nav-item--dropdown:hover .nav-caret {
    transform: rotate(180deg);
  }

  .nav-item--dropdown:hover .nav-dropdown {
    opacity: 1;
    visibility: visible;
    transform: translate(-50%, 0);
    transition-delay: 0s;
  }

  .nav-item--dropdown:hover .nav-sublist > li {
    opacity: 1;
    transform: none;
    transition-delay: calc(var(--i, 0) * 30ms + 60ms);
  }
}

/* --------------------------------------------------------------------------
   Hero
   -------------------------------------------------------------------------- */
.hero {
  position: relative;
  isolation: isolate;
  display: flex;
  align-items: center;
  min-height: clamp(34rem, calc(100vh - var(--nav-h) - var(--nav-line)), 58rem);
  min-height: clamp(34rem, calc(100svh - var(--nav-h) - var(--nav-line)), 58rem);
  /* top padding clears the part of the logo hanging over the hero */
  padding-block: calc(var(--logo-overhang) + 2.5rem) 4rem;
  overflow: hidden;
  background: #1a0505; /* shows until the video loads */
  color: #ffffff;
}

.hero-video {
  position: absolute;
  inset: 0;
  z-index: -2;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

/* Dark-red overlay so the copy stays readable over bright footage */
.hero::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  background: linear-gradient(180deg, rgb(24 0 0 / 0.86), rgb(80 0 0 / 0.8));
}

.hero-content {
  max-width: 60rem;
}

/* Review-platform pills */
.hero-proof {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.6rem 0.4rem;
  margin: 0 0 1.5rem;
  padding: 0;
  list-style: none;
}

/* Phones: the three pills share one row (they wrap only on the very narrowest screens) */
.hero-proof > li {
  flex: 1 1 6rem;
}

.proof-pill {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.4rem;
  padding: 0.4rem 0.45rem;
  border: 1px solid rgb(255 255 255 / 0.28);
  border-radius: 10px;
  background: rgb(255 255 255 / 0.1);
  backdrop-filter: blur(6px);
  color: #ffffff;
  text-decoration: none;
  transition: background-color 0.15s ease, border-color 0.15s ease;
}

/* Five gold stars */
.stars {
  flex: none;
  width: 3.75rem;
  height: 0.75rem;
  background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23f2b632' d='M12 1.8l3.1 6.6 7.2.9-5.3 5 1.4 7.2L12 17.9l-6.4 3.6L7 14.3 1.7 9.3l7.2-.9z'/%3E%3C/svg%3E") left center / 0.75rem 0.75rem repeat-x;
}

.proof-pill:hover {
  background: rgb(255 255 255 / 0.2);
  border-color: rgb(255 255 255 / 0.5);
}

.proof-pill img {
  width: 22px;
  height: 22px;
}

/* Phones: sits on its own line under the pills */
.hero-proof > .proof-note {
  flex: 1 1 100%;
  font-family: var(--font-heading);
  font-size: 1.25rem;
  font-style: italic;
  font-weight: 800;
  letter-spacing: 0.03em;
  line-height: 1.2;
  text-shadow: 0 1px 8px rgb(0 0 0 / 0.4);
}

.hero-title {
  margin: 0 0 1.25rem;
  font-family: var(--font-heading);
  font-size: clamp(1.9rem, 9.4vw, 3.5rem);
  font-style: italic;
  font-weight: 800;
  line-height: 1;
  text-transform: uppercase;
  text-shadow: 0 2px 14px rgb(0 0 0 / 0.35);
}

.hero-title-line {
  display: block;
  text-wrap: balance;
}

/* Red brush stroke behind the location, echoing the nav hover */
.hero-accent {
  display: inline;
  padding: 0.04em 0.3em;
  margin-left: -0.3em;
  background: var(--streak) center / 100% 100% no-repeat;
  -webkit-box-decoration-break: clone;
  box-decoration-break: clone;
  text-shadow: none;
}

.hero-title-line + .hero-title-line {
  margin-top: 0.15em;
}

.hero-lead {
  max-width: 38rem;
  margin: 0 0 2rem;
  font-size: clamp(1.1rem, 0.9rem + 0.6vw, 1.3rem);
  font-weight: 500;
  line-height: 1.55;
  color: rgb(255 255 255 / 0.9);
}

.hero-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 0.9rem 1rem;
  margin-bottom: 1.75rem;
}

.hero-actions .btn {
  flex: 1 1 100%;
}

.hero-trust {
  display: flex;
  flex-wrap: wrap;
  gap: 0.35rem 0.6rem;
  margin: 0;
  font-size: 1rem;
  font-weight: 600;
  letter-spacing: 0.02em;
  color: rgb(255 255 255 / 0.88);
}

.hero-trust > * + *::before {
  content: "\2022";
  margin-right: 0.6rem;
  color: #ff4a4a;
}

/* On phones the number gets its own line, so no bullet is left dangling */
.hero-trust > :last-child {
  flex-basis: 100%;
}

.hero-trust > :last-child::before {
  display: none;
}

.hero-phone {
  color: #ffffff;
  text-decoration: none;
}

.hero-phone:hover {
  text-decoration: underline;
  text-underline-offset: 3px;
}

/* Tablet and up: the overlay is heavier on the copy side, lighter over the footage */
@media (min-width: 40em) {
  .hero-title {
    font-size: clamp(3.25rem, 7.5vw + 0.5rem, 5.25rem);
  }

  .hero-proof {
    gap: 0.6rem 0.75rem;
  }

  .hero-proof > li,
  .hero-proof > .proof-note {
    flex: none;
  }

  .hero-proof > .proof-note {
    margin-left: 0.5rem;
    font-size: 1.4rem;
  }

  .proof-pill {
    display: inline-flex;
    justify-content: flex-start;
    gap: 0.65rem;
    padding: 0.5rem 1.1rem 0.5rem 0.7rem;
  }

  .proof-pill img {
    width: 26px;
    height: 26px;
  }

  .stars {
    width: 5.5rem;
    height: 1.1rem;
    background-size: 1.1rem 1.1rem;
  }

  .hero-actions .btn {
    flex: 0 0 auto;
  }

  .hero-trust > :last-child {
    flex-basis: auto;
  }

  .hero-trust > :last-child::before {
    display: inline;
  }
}

@media (min-width: 48em) {
  .hero::before {
    background: linear-gradient(100deg, rgb(24 0 0 / 0.92) 0%, rgb(85 0 0 / 0.78) 45%, rgb(165 0 0 / 0.5) 100%);
  }
}

/* --------------------------------------------------------------------------
   Section basics (shared by the sections below the hero)
   -------------------------------------------------------------------------- */
.eyebrow {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  margin: 0 0 1rem;
  color: var(--accent-text);
  font-family: var(--font-heading);
  font-size: 1.1rem;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
}

.eyebrow::before {
  content: "";
  flex: none;
  width: 2.25rem;
  height: 3px;
  background: var(--red);
  transform: skewX(-20deg);
}

.section-title {
  margin: 0 0 1.5rem;
  font-family: var(--font-heading);
  font-size: clamp(1.9rem, 8.4vw, 3.5rem);
  font-style: italic;
  font-weight: 800;
  line-height: 1;
  text-transform: uppercase;
}

.section-title-line {
  display: block;
}

.section-title .accent {
  color: var(--accent-text);
}

/* --------------------------------------------------------------------------
   About
   -------------------------------------------------------------------------- */
.about {
  position: relative;
  overflow: hidden;
  padding-top: 4rem;
  background: var(--bg);
  color: var(--text);
  transition: background-color 0.25s ease, color 0.25s ease;
}

/* Copy + photo live in one centered, capped box so they stay together on very wide screens */
.about-inner {
  position: relative;
  max-width: 100rem;
  margin-inline: auto;
}

.about-content {
  max-width: 38rem;
}

.about-text p {
  margin: 0 0 1rem;
  color: var(--text-muted);
  font-size: 1.15rem;
  line-height: 1.65;
}

.about-list {
  display: grid;
  gap: 0.7rem 1.5rem;
  margin: 1.75rem 0 2rem;
  padding: 0;
  list-style: none;
}

.about-list li {
  display: flex;
  align-items: center;
  gap: 0.7rem;
  font-size: 1.05rem;
  font-weight: 600;
}

/* Red check mark */
.about-list li::before {
  content: "";
  flex: none;
  width: 1.4rem;
  height: 1.4rem;
  background: var(--accent-text);
  -webkit-mask: var(--check) center / contain no-repeat;
  mask: var(--check) center / contain no-repeat;
}

.about-actions {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 1rem 1.5rem;
}

.about-actions .btn {
  flex: 1 1 100%;
}

/* Photo: below the copy on phones and tablets, fading up into it */
.about-media {
  width: min(100%, 26rem);
  margin: 2.5rem 0 0 auto;
}

.about-media img {
  width: 100%;
  height: auto;
  -webkit-mask-image: linear-gradient(to bottom, transparent 0%, rgb(0 0 0 / 0.55) 14%, #000 38%);
  mask-image: linear-gradient(to bottom, transparent 0%, rgb(0 0 0 / 0.55) 14%, #000 38%);
}

@media (min-width: 40em) {
  .about {
    padding-top: 5rem;
  }

  .about-list {
    grid-template-columns: repeat(2, auto);
    justify-content: start;
  }

  .about-actions .btn {
    flex: 0 0 auto;
  }
}

/* Desktop: photo sits on the right edge of the box and fades left into the copy */
@media (min-width: 75em) {
  .about {
    padding-top: 0;
  }

  .about-inner {
    display: flex;
    align-items: center;
    min-height: 42rem;
    padding-block: 6rem;
  }

  .about-media {
    position: absolute;
    top: 0;
    right: 0;
    width: auto;
    height: 100%;
    aspect-ratio: 350 / 507;
    margin: 0;
  }

  .about-media img {
    height: 100%;
    object-fit: cover;
    -webkit-mask-image: linear-gradient(to right, transparent 0%, rgb(0 0 0 / 0.55) 16%, #000 42%);
    mask-image: linear-gradient(to right, transparent 0%, rgb(0 0 0 / 0.55) 16%, #000 42%);
  }
}

/* Wider than the box (100rem): the photo no longer touches the screen edge, so it fades out on the right too */
@media (min-width: 100rem) {
  .about-media img {
    -webkit-mask-image: linear-gradient(to right, transparent 0%, rgb(0 0 0 / 0.55) 16%, #000 42%, #000 86%, transparent 100%);
    mask-image: linear-gradient(to right, transparent 0%, rgb(0 0 0 / 0.55) 16%, #000 42%, #000 86%, transparent 100%);
  }
}

/* --------------------------------------------------------------------------
   Testimonials
   -------------------------------------------------------------------------- */
.testimonials {
  padding-block: 4.5rem;
  overflow: hidden;
  background: var(--surface);
  color: var(--text);
  transition: background-color 0.25s ease, color 0.25s ease;
}

/* Full container width, left aligned, so the title can run long */
.testimonials-head {
  margin-bottom: 2.5rem;
}

.testimonials-head .section-title {
  margin-bottom: 1rem;
}

.testimonials-lead {
  margin: 0;
  color: var(--text-muted);
  font-size: 1.15rem;
}

/* Two conveyor belts, one moving each way */
.marquees {
  display: grid;
  gap: 1.25rem;
}

.marquee {
  --gap: 1.25rem;
  --marquee-duration: 95s;
  overflow-x: auto; /* no JS or reduced motion: a plain swipeable row */
  padding-block: 0.5rem 1.25rem; /* room for the card shadow */
  margin-block: -0.5rem -1.25rem;
  -webkit-mask-image: linear-gradient(to right, transparent 0, #000 5%, #000 95%, transparent 100%);
  mask-image: linear-gradient(to right, transparent 0, #000 5%, #000 95%, transparent 100%);
}

/* Reduced motion: the row is scrollable and main.js makes it focusable. The ring goes inside because the fade mask clips anything outside. */
.marquee:focus-visible {
  outline-offset: -3px;
}

.marquee--reverse {
  --marquee-duration: 105s;
}

.marquee-track {
  display: flex;
  width: max-content;
  gap: var(--gap);
  margin: 0;
  padding: 0 var(--gap) 0 0; /* the extra gap makes the two halves identical, so the loop is seamless */
  list-style: none;
}

.marquee-track > li {
  display: flex;
  flex: none;
  width: min(80vw, 22rem);
}

/* JS clones each row once, then this slides it left by exactly one copy */
.marquee.is-running {
  overflow: hidden;
}

.marquee.is-running .marquee-track {
  animation: marquee var(--marquee-duration) linear infinite;
  will-change: transform;
}

.marquee--reverse.is-running .marquee-track {
  animation-direction: reverse;
}

@keyframes marquee {
  from { transform: translateX(0); }
  to { transform: translateX(-50%); }
}

.review-card {
  display: flex;
  flex-direction: column;
  width: 100%;
  margin: 0;
  padding: 1.5rem;
  background: var(--card-bg);
  border: 1px solid var(--card-border);
  border-radius: 14px;
  box-shadow: var(--card-shadow);
  transition: background-color 0.25s ease, border-color 0.25s ease;
}

.review-top {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 0.9rem;
}

.review-quote-icon {
  width: 2.25rem;
  height: 2.25rem;
  background: var(--accent-text);
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M6 17h3l2-4V7H5v6h3zm8 0h3l2-4V7h-6v6h3z'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M6 17h3l2-4V7H5v6h3zm8 0h3l2-4V7h-6v6h3z'/%3E%3C/svg%3E") center / contain no-repeat;
}

.review-platform {
  width: 26px;
  height: 26px;
}

.review-text {
  flex: 1;
  margin: 0 0 1.4rem;
  font-size: 1.05rem;
  line-height: 1.6;
}

.review-author {
  display: flex;
  align-items: center;
  gap: 0.8rem;
  padding-top: 1.1rem;
  border-top: 1px solid var(--card-border);
}

.review-avatar {
  display: grid;
  flex: none;
  place-items: center;
  width: 2.75rem;
  height: 2.75rem;
  border-radius: 50%;
  background: var(--red);
  color: #ffffff;
  font-family: var(--font-heading);
  font-size: 1.2rem;
  font-style: italic;
  font-weight: 800;
  letter-spacing: 0.02em;
}

.review-name,
.review-meta {
  display: block;
}

.review-name {
  font-weight: 600;
  line-height: 1.3;
}

.review-meta {
  color: var(--text-muted);
  font-size: 0.9rem;
}

@media (min-width: 40em) {
  .testimonials {
    padding-block: 5.5rem;
  }
}

/* --------------------------------------------------------------------------
   Services
   -------------------------------------------------------------------------- */
.services {
  padding-block: 4.5rem;
  background: var(--bg);
  color: var(--text);
  transition: background-color 0.25s ease, color 0.25s ease;
}

.services-head {
  margin-bottom: 2.5rem;
}

.services-head .section-title {
  margin-bottom: 1rem;
}

.services-lead {
  max-width: 46rem;
  margin: 0;
  color: var(--text-muted);
  font-size: 1.15rem;
}

/* Eight cards: 1 column on phones, 2 on tablets, 4 on wide screens, so the last row is never half empty */
.services-grid {
  --card-gap: 1.25rem;
  display: grid;
  column-gap: var(--card-gap);
  margin: 0;
  padding: 0;
  list-style: none;
}

/* Each card spans four rows (heading / text / list / "Learn more") and shares them with the cards beside it through
   subgrid, so titles, text, and divider lines line up across a row however much any one of them wraps.
   The gap below each card is a margin because the card's own four rows must touch. */
.service-card {
  position: relative;
  display: grid;
  grid-row: span 4;
  grid-template-rows: subgrid;
  row-gap: 0;
  margin-bottom: var(--card-gap);
  padding: 1.5rem;
  overflow: hidden;
  background: var(--card-bg);
  border: 1px solid var(--card-border);
  border-radius: 14px;
  box-shadow: var(--card-shadow);
  transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.25s ease, background-color 0.25s ease;
}

/* Red bar that sweeps across the top on hover */
.service-card::before {
  content: "";
  position: absolute;
  inset: 0 0 auto;
  height: 4px;
  background: var(--red);
  transform: scaleX(0);
  transform-origin: left;
  transition: transform 0.3s ease;
}

@media (hover: hover) {
  .service-card:hover {
    transform: translateY(-4px);
    border-color: var(--red);
  }

  .service-card:hover::before {
    transform: scaleX(1);
  }
}

/* Phones: icon beside the title. Tablet and up: icon above it. */
.service-head {
  display: flex;
  align-items: center;
  gap: 1rem;
  margin-bottom: 1rem;
}

/* Red parallelogram badge, echoing the slanted eyebrow line and the italic type */
.service-icon {
  display: grid;
  flex: none;
  place-items: center;
  width: 3.5rem;
  height: 3.5rem;
  border-radius: 8px;
  background: var(--red);
  color: #ffffff;
  box-shadow: 0 3px 0 var(--red-dark);
  transform: skewX(-10deg);
}

.service-icon svg {
  width: 1.75rem;
  height: 1.75rem;
  fill: currentColor;
  transform: skewX(10deg); /* undo the badge's slant so the icon stands upright */
}

.service-title {
  margin: 0;
  font-family: var(--font-heading);
  font-size: 1.65rem;
  font-style: italic;
  font-weight: 800;
  line-height: 1.05;
  text-transform: uppercase;
}

/* Keeps "Move-Out" from breaking at its hyphen */
.service-title .nowrap {
  white-space: nowrap;
}

/* The title links to the service's page, and the link is stretched over the whole card so the card is the click target */
.service-title a {
  color: inherit;
  text-decoration: none;
}

.service-title a::after {
  content: "";
  position: absolute;
  z-index: 1;
  inset: 0;
}

.service-title a:focus-visible {
  outline: none;
}

/* The ring goes on the stretched area, inside the card, because the card clips anything outside it */
.service-title a:focus-visible::after {
  outline: 3px solid var(--focus);
  outline-offset: -3px;
  border-radius: 14px;
}

.service-more {
  display: flex;
  align-items: center;
  gap: 0.4rem;
  margin-top: 1.1rem;
  color: var(--accent-text);
  font-family: var(--font-heading);
  font-size: 1.15rem;
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
}

.service-more svg {
  width: 1.1rem;
  height: 1.1rem;
  fill: currentColor;
  transition: transform 0.2s ease;
}

@media (hover: hover) {
  .service-card:hover .service-more svg {
    transform: translateX(5px);
  }
}

.service-text {
  margin: 0 0 1.25rem;
  color: var(--text-muted);
  font-size: 1.05rem;
  line-height: 1.55;
}

.service-list {
  display: grid;
  align-content: start;
  gap: 0.55rem;
  margin: 0;
  padding: 1.1rem 0 0;
  border-top: 1px solid var(--card-border);
  list-style: none;
}

.service-list li {
  display: flex;
  align-items: flex-start;
  gap: 0.6rem;
  font-size: 0.98rem;
  font-weight: 600;
  line-height: 1.35;
}

.service-list li::before {
  content: "";
  flex: none;
  width: 1.2rem;
  height: 1.2rem;
  background: var(--accent-text);
  -webkit-mask: var(--check) center / contain no-repeat;
  mask: var(--check) center / contain no-repeat;
}

/* Dump trailer rentals: a dark banner, always dark (like the navbar and hero) so it stands out from the cards */
.trailer {
  position: relative;
  isolation: isolate;
  display: grid;
  gap: 2rem;
  padding: 2rem 1.5rem;
  overflow: hidden;
  border-radius: 14px;
  background: linear-gradient(120deg, #180000 0%, #550000 55%, #a50000 100%);
  box-shadow: var(--card-shadow);
  color: #ffffff;
}

.trailer .service-icon {
  margin-bottom: 1.25rem;
  background: #ffffff;
  color: var(--red);
  box-shadow: 0 3px 0 rgb(0 0 0 / 0.35);
}

/* Gold label, the same gold as the review stars (red would disappear on the dark red) */
.trailer .eyebrow,
.contact-info .eyebrow,
.page-hero .eyebrow,
.error-page .eyebrow {
  color: #f2b632;
}

.trailer .eyebrow::before,
.contact-info .eyebrow::before,
.page-hero .eyebrow::before,
.error-page .eyebrow::before {
  background: #f2b632;
}

.trailer-title {
  margin: 0 0 1rem;
  font-family: var(--font-heading);
  font-size: clamp(1.9rem, 8vw, 3rem);
  font-style: italic;
  font-weight: 800;
  line-height: 1;
  text-transform: uppercase;
  text-wrap: balance;
}

.trailer-text {
  max-width: 34rem;
  margin: 0 0 1.5rem;
  color: rgb(255 255 255 / 0.9);
  font-size: 1.15rem;
  line-height: 1.6;
}

.trailer-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 0.75rem 1rem;
}

.trailer-uses-title {
  margin: 0 0 0.9rem;
  color: #f2b632;
  font-family: var(--font-heading);
  font-size: 1.1rem;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
}

/* The two rental rates, side by side: label, big price, then the dumping fee that comes on top */
.trailer-rates {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 0.75rem;
  margin: 0 0 1.75rem;
}

.trailer-rate {
  padding: 1rem 1.1rem;
  border: 1px solid rgb(255 255 255 / 0.35);
  border-radius: 12px;
  background: rgb(255 255 255 / 0.08);
}

.trailer-rate dt {
  color: rgb(255 255 255 / 0.85);
  font-size: 1rem;
  font-weight: 600;
}

.trailer-rate dd {
  margin: 0;
}

.trailer-price {
  margin-top: 0.15rem;
  font-family: var(--font-heading);
  font-size: clamp(2.25rem, 9vw, 3rem);
  font-style: italic;
  font-weight: 800;
  line-height: 1;
}

.trailer-fee {
  margin-top: 0.35rem;
  font-size: 0.95rem;
  font-weight: 600;
  line-height: 1.3;
  text-wrap: balance;
}

/* On the trailer page nothing follows the rates, so they don't need the space below */
.trailer-uses .trailer-rates:last-child {
  margin-bottom: 0;
}

.trailer-chips {
  display: flex;
  flex-wrap: wrap;
  gap: 0.6rem;
  margin: 0;
  padding: 0;
  list-style: none;
}

.trailer-chips li {
  padding: 0.3rem 0.9rem;
  border: 1px solid rgb(255 255 255 / 0.35);
  border-radius: 999px;
  background: rgb(255 255 255 / 0.08);
  font-size: 1rem;
  font-weight: 600;
}

/* Closing call to action */
.services-cta {
  display: grid;
  gap: 1.5rem;
  margin-top: 3rem;
  padding-top: 2.5rem;
  border-top: 1px solid var(--card-border);
}

.services-cta-title {
  margin: 0 0 0.5rem;
  font-family: var(--font-heading);
  font-size: clamp(1.9rem, 8vw, 2.75rem);
  font-style: italic;
  font-weight: 800;
  line-height: 1;
  text-transform: uppercase;
}

.services-cta-text p {
  margin: 0;
  color: var(--text-muted);
  font-size: 1.15rem;
}

.services-cta-text .services-cta-note {
  margin-top: 0.75rem;
  font-size: 1rem;
}

.services-cta-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 0.9rem 1rem;
}

.services-cta-actions .btn {
  flex: 1 1 100%;
}

@media (min-width: 40em) {
  .services {
    padding-block: 5.5rem;
  }

  .services-grid {
    grid-template-columns: repeat(2, 1fr);
  }

  .service-head {
    flex-direction: column;
    align-items: flex-start;
    gap: 1.1rem;
  }

  .services-cta-actions .btn {
    flex: 0 0 auto;
  }
}

@media (min-width: 62em) {
  .services-cta {
    grid-template-columns: 1fr auto;
    align-items: center;
    gap: 2rem;
  }

  .trailer {
    grid-template-columns: 1.25fr 1fr;
    align-items: center;
    gap: 3rem;
    padding: 3rem;
  }

  .trailer-uses {
    padding-left: 3rem;
    border-left: 1px solid rgb(255 255 255 / 0.2);
  }
}

@media (min-width: 75em) {
  .services-grid {
    --card-gap: 1.5rem;
    grid-template-columns: repeat(4, 1fr);
  }
}

/* --------------------------------------------------------------------------
   Our Work: before / after sliders
   -------------------------------------------------------------------------- */
.work {
  padding-block: 4.5rem;
  background: var(--surface); /* alternates with the white Services section above it */
  color: var(--text);
  transition: background-color 0.25s ease, color 0.25s ease;
}

.work-head {
  margin-bottom: 2.5rem;
}

.work-head .section-title {
  margin-bottom: 1rem;
}

.work-lead {
  max-width: 40rem;
  margin: 0;
  color: var(--text-muted);
  font-size: 1.15rem;
}

.work-grid {
  display: grid;
  gap: 2.5rem;
}

.work-item {
  margin: 0;
}

.work-caption {
  margin-top: 0.9rem;
  font-family: var(--font-heading);
  font-size: 1.5rem;
  font-weight: 600;
  letter-spacing: 0.03em;
  line-height: 1.2;
  text-transform: uppercase;
}

/* The "after" photo is the base layer. The "before" photo sits on top, clipped to everything left of
   the divider. JS updates --pos (0% to 100%) and both the clip and the handle follow it. */
.compare {
  --pos: 50%;
  position: relative;
  aspect-ratio: 4 / 3;
  overflow: hidden;
  border: 1px solid var(--card-border);
  border-radius: 14px;
  background: var(--card-bg);
  box-shadow: var(--card-shadow);
  cursor: ew-resize;
  touch-action: pan-y; /* sideways swipes move the divider, vertical swipes still scroll the page */
  -webkit-user-select: none;
  user-select: none;
}

.compare img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: var(--crop, 50% 50%); /* photos that aren't 4:3 set --crop on .compare to choose what stays in frame */
  pointer-events: none; /* keeps the browser from starting an image drag */
}

.compare-before {
  position: absolute;
  inset: 0;
  clip-path: inset(0 calc(100% - var(--pos)) 0 0);
}

.compare-tag {
  position: absolute;
  top: 0.75rem;
  padding: 0.2rem 0.7rem;
  border-radius: 4px;
  background: rgb(0 0 0 / 0.7);
  color: #ffffff;
  font-family: var(--font-heading);
  font-size: 1.05rem;
  font-style: italic;
  font-weight: 800;
  letter-spacing: 0.08em;
  line-height: 1.3;
  text-transform: uppercase;
}

.compare-tag--before {
  left: 0.75rem;
}

.compare-tag--after {
  right: 0.75rem;
  background: var(--red);
}

/* Full-height grab strip with the divider line and round grip on it */
.compare-handle {
  position: absolute;
  top: 0;
  bottom: 0;
  left: var(--pos);
  display: grid;
  place-items: center;
  width: 3rem;
  margin-left: -1.5rem;
}

.compare-handle::before {
  content: "";
  position: absolute;
  top: 0;
  bottom: 0;
  left: 50%;
  width: 3px;
  margin-left: -1.5px;
  background: #ffffff;
  box-shadow: 0 0 6px rgb(0 0 0 / 0.5);
}

.compare-grip {
  position: relative;
  display: grid;
  place-items: center;
  width: 3rem;
  height: 3rem;
  border: 3px solid #ffffff;
  border-radius: 50%;
  background: var(--red);
  color: #ffffff;
  box-shadow: 0 2px 10px rgb(0 0 0 / 0.45);
}

.compare-grip svg {
  width: 1.6rem;
  height: 1.6rem;
  fill: none;
  stroke: currentColor;
  stroke-width: 3;
  stroke-linecap: round;
  stroke-linejoin: round;
}

/* The strip is tall and thin, so the focus ring goes on the grip instead */
.compare-handle:focus-visible {
  outline: none;
}

.compare-handle:focus-visible .compare-grip {
  outline: 3px solid #ffffff;
  outline-offset: 3px;
}

/* Link to the full photo gallery (and, under the reviews, to the full testimonials page) */
.work-more,
.testimonials-more {
  display: flex;
  justify-content: center;
  margin-top: 3rem;
}

@media (min-width: 40em) {
  .work {
    padding-block: 5.5rem;
  }
}

@media (min-width: 48em) {
  .work-grid {
    grid-template-columns: repeat(2, 1fr);
    gap: 2rem;
  }
}

/* Points from the photo comparisons over to the full video gallery (/gallery-videos) */
.work-video-btn {
  margin-top: 1.75rem;
}

/* --------------------------------------------------------------------------
   Contact
   -------------------------------------------------------------------------- */
.contact {
  padding-block: 4.5rem;
  background: var(--bg);
  color: var(--text);
  transition: background-color 0.25s ease, color 0.25s ease;
}

/* One rounded card: contact details on the left, the form on the right (stacked on phones) */
.contact-card {
  display: grid;
  overflow: hidden;
  border: 1px solid var(--card-border);
  border-radius: 14px;
  background: var(--card-bg);
  box-shadow: var(--card-shadow);
  transition: background-color 0.25s ease, border-color 0.25s ease;
}

/* Details panel: always dark (like the navbar), so it has its own focus color */
.contact-info {
  --focus: #ffffff;
  padding: 2rem 1.5rem;
  border-bottom: 4px solid var(--red);
  background: radial-gradient(110% 80% at 0% 0%, #6a0000 0%, rgb(106 0 0 / 0) 60%), #0d0d0f;
  color: #ffffff;
}

.contact-info .section-title {
  margin-bottom: 1.25rem;
}

.contact-info .section-title .accent {
  color: #f2b632;
}

.contact-lead {
  max-width: 28rem;
  margin: 0;
  color: rgb(255 255 255 / 0.85);
  font-size: 1.1rem;
  line-height: 1.6;
}

.contact-list {
  display: grid;
  gap: 1.5rem;
  margin: 2rem 0 0;
  padding: 0;
  list-style: none;
}

.contact-item {
  display: flex;
  align-items: flex-start;
  gap: 1rem;
}

/* Red parallelogram badge, the same shape as the service icons */
.contact-icon {
  display: grid;
  flex: none;
  place-items: center;
  width: 3rem;
  height: 3rem;
  border-radius: 8px;
  background: var(--red);
  box-shadow: 0 3px 0 var(--red-dark);
  transform: skewX(-10deg);
}

/* The icon files are plain black, so a filter turns them white */
.contact-icon img {
  width: 1.35rem;
  height: 1.35rem;
  filter: brightness(0) invert(1);
  transform: skewX(10deg); /* undo the badge's slant so the icon stands upright */
}

.contact-body {
  min-width: 0;
}

.contact-label {
  margin: 0 0 0.2rem;
  color: rgb(255 255 255 / 0.65);
  font-family: var(--font-heading);
  font-size: 1rem;
  font-weight: 600;
  letter-spacing: 0.14em;
  line-height: 1.3;
  text-transform: uppercase;
}

/* The phone number is the star, like the big number on the flyer */
.contact-phone {
  display: inline-block;
  color: #f2b632;
  font-family: var(--font-heading);
  font-size: clamp(1.9rem, 8vw, 2.4rem);
  font-style: italic;
  font-weight: 800;
  line-height: 1.1;
  text-decoration: none;
}

.contact-phone:hover {
  text-decoration: underline;
  text-underline-offset: 4px;
}

.contact-value {
  margin: 0;
  font-size: clamp(0.8rem, 4.2vw, 1.15rem); /* shrinks on the narrowest phones so the email stays on one line */
  font-weight: 600;
  line-height: 1.4;
  overflow-wrap: anywhere;
}

a.contact-value {
  color: #ffffff;
  text-decoration: underline;
  text-decoration-color: rgb(255 255 255 / 0.4);
  text-underline-offset: 3px;
}

a.contact-value:hover {
  text-decoration-color: #ffffff;
}

.contact-sub {
  margin: 0.15rem 0 0;
  color: rgb(255 255 255 / 0.75);
  font-size: 1rem;
}

.contact-sub a {
  color: #ffffff;
  font-weight: 600;
  text-decoration: underline;
  text-decoration-color: rgb(255 255 255 / 0.4);
  text-underline-offset: 3px;
}

.contact-sub a:hover {
  text-decoration-color: #ffffff;
}

/* Days in one column, times in the next. The label column is as wide as the longest day, so the times
   get all the rest of the room. It works for one row ("Every Day") or several if the hours ever differ. */
.hours {
  display: grid;
  grid-template-columns: max-content 1fr;
  column-gap: 0.75rem;
  margin: 0;
}

.hours > div {
  display: contents; /* the wrapper divs are only there for valid markup */
}

.hours dt,
.hours dd {
  padding-block: 0.15rem;
}

.hours dt {
  color: rgb(255 255 255 / 0.75);
}

.hours dd {
  margin: 0;
  font-weight: 600;
}

@media (min-width: 26em) {
  .hours {
    column-gap: 1.5rem;
  }
}

/* Very narrow phones: a slightly smaller badge frees up room for the text */
@media (max-width: 25.99em) {
  .contact-item {
    gap: 0.75rem;
  }

  .contact-icon {
    width: 2.75rem;
    height: 2.75rem;
  }
}

/* Below the contact list on phones and tablets, a plain photo at its own height. From 75em up (see the
   media query near .contact-card below) it switches to filling whatever space the taller form leaves. */
.contact-photo {
  display: block;
  width: 100%;
  aspect-ratio: 4 / 3;
  margin-top: 1.75rem;
  border-radius: 10px;
  object-fit: cover;
}

/* Form */
.contact-form {
  padding: 2rem 1.5rem;
}

.form-title {
  margin: 0 0 1.5rem;
  font-family: var(--font-heading);
  font-size: clamp(1.7rem, 6vw, 2.25rem);
  font-style: italic;
  font-weight: 800;
  line-height: 1;
  text-transform: uppercase;
}

.form-grid {
  display: grid;
  gap: 1.25rem;
}

.field {
  min-width: 0;
}

/* Label on the left, whether the field is needed on the right */
.field-top {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 0.75rem;
  margin-bottom: 0.4rem;
}

.field-top label {
  font-size: 1.1rem;
  font-weight: 600;
}

.field-hint {
  color: var(--text-muted);
  font-size: 0.95rem;
  text-align: right;
}

.field-control {
  display: block;
  width: 100%;
  padding: 0.85rem 1.1rem;
  border: 1.5px solid var(--field-border);
  border-radius: 8px;
  background: var(--field-bg);
  color: var(--text);
  font: inherit;
  font-size: 1.125rem; /* 18px. Anything under 16px makes iPhones zoom in when a field is tapped */
  line-height: 1.4;
  transition: border-color 0.15s ease, background-color 0.25s ease, color 0.25s ease;
}

.field-control::placeholder {
  color: var(--text-muted);
  opacity: 0.8;
}

.field-control:hover {
  border-color: var(--text-muted);
}

.field-control:focus {
  border-color: var(--red);
}

/* The page-wide focus ring squares corners off, so restore this field's radius */
.field-control:focus-visible {
  outline-offset: 2px;
  border-radius: 8px;
}

textarea.field-control {
  min-height: 8.5rem;
  resize: vertical;
}

/* Native select with the browser's arrow swapped for a themed one */
.select-wrap {
  position: relative;
}

.select-wrap select {
  padding-right: 2.75rem;
  cursor: pointer;
  -webkit-appearance: none;
  appearance: none;
}

.select-wrap::after {
  content: "";
  position: absolute;
  top: 50%;
  right: 1rem;
  width: 1rem;
  height: 1rem;
  margin-top: -0.5rem;
  background: var(--text-muted);
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7 10l5 5 5-5z'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7 10l5 5 5-5z'/%3E%3C/svg%3E") center / contain no-repeat;
  pointer-events: none;
}

.form-submit {
  width: 100%;
  margin-top: 1.5rem;
}

.form-note {
  margin: 1rem 0 0;
  color: var(--text-muted);
  font-size: 1.05rem;
  text-align: center;
}

.form-note a {
  color: var(--accent-text);
  font-weight: 600;
}

/* Spam trap, kept off screen instead of display:none so bots still see it */
.hp-field {
  position: absolute;
  left: -9999px;
  width: 1px;
  height: 1px;
  overflow: hidden;
}

.form-error {
  margin: 1.25rem 0 0;
  padding: 0.75rem 1rem;
  border-left: 4px solid var(--red);
  border-radius: 4px;
  background: var(--surface);
  color: var(--text);
  font-size: 1.05rem;
  font-weight: 600;
}

.form-error a {
  color: var(--accent-text);
}

/* While sending: fields and button are disabled, so show that they are paused */
.contact-form[aria-busy="true"] .field-control {
  opacity: 0.55;
  cursor: not-allowed;
}

.contact-form[aria-busy="true"] .field-control:hover {
  border-color: var(--field-border);
}

.form-submit:disabled {
  cursor: progress;
  transform: none;
  box-shadow: 0 3px 0 var(--red-dark);
  background: var(--red);
}

.form-submit:disabled .submit-label {
  opacity: 0.85;
}

/* Spinner sits inside the button and only takes up room while sending */
.submit-spinner {
  display: none;
  flex: none;
  width: 1.1em;
  height: 1.1em;
  border: 3px solid rgb(255 255 255 / 0.35);
  border-top-color: #ffffff;
  border-radius: 50%;
}

.contact-form[aria-busy="true"] .submit-spinner {
  display: block;
}

@media (prefers-reduced-motion: no-preference) {
  .contact-form[aria-busy="true"] .submit-spinner {
    animation: form-spin 0.7s linear infinite;
  }

  @keyframes form-spin {
    to {
      transform: rotate(360deg);
    }
  }
}

/* Form fades out, the success message takes its place */
.form-panel {
  transition: opacity 0.25s ease, transform 0.25s ease;
}

.form-panel.is-leaving {
  opacity: 0;
  transform: translateY(-0.5rem);
}

.form-success {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  flex: 1;
  padding-block: 1rem;
  text-align: center;
}

.form-success[hidden] {
  display: none;
}

.form-success:focus {
  outline: none;
}

.success-mark {
  width: 6rem;
  height: 6rem;
  margin-bottom: 1.25rem;
  overflow: visible;
}

.success-ring,
.success-check {
  stroke: var(--success);
}

.success-title {
  margin: 0 0 0.75rem;
  font-family: var(--font-heading);
  font-size: clamp(2rem, 7vw, 2.75rem);
  font-style: italic;
  font-weight: 800;
  line-height: 1;
  text-transform: uppercase;
}

.success-text {
  max-width: 28rem;
  margin: 0 0 0.5rem;
  color: var(--text-muted);
  font-size: 1.15rem;
}

.success-text a {
  color: var(--accent-text);
  font-weight: 600;
}

.success-again {
  margin-top: 1.5rem;
}

@media (prefers-reduced-motion: no-preference) {
  .form-success.is-shown .success-ring {
    stroke-dasharray: 151; /* circle circumference: 2 * pi * 24 */
    stroke-dashoffset: 151;
    animation: success-draw 0.6s cubic-bezier(0.65, 0, 0.45, 1) 0.05s forwards;
  }

  .form-success.is-shown .success-check {
    stroke-dasharray: 40;
    stroke-dashoffset: 40;
    animation: success-draw 0.4s cubic-bezier(0.65, 0, 0.45, 1) 0.6s forwards;
  }

  /* One soft pulse as the check lands */
  .form-success.is-shown .success-mark {
    animation: success-pop 0.45s cubic-bezier(0.3, 1.5, 0.5, 1) 0.95s both;
  }

  .form-success.is-shown .success-title,
  .form-success.is-shown .success-text,
  .form-success.is-shown .success-again {
    animation: success-rise 0.5s ease-out both;
  }

  .form-success.is-shown .success-title { animation-delay: 0.85s; }
  .form-success.is-shown .success-text { animation-delay: 1s; }
  .form-success.is-shown .success-text + .success-text { animation-delay: 1.1s; }
  .form-success.is-shown .success-again { animation-delay: 1.2s; }

  @keyframes success-draw {
    to {
      stroke-dashoffset: 0;
    }
  }

  @keyframes success-pop {
    50% {
      transform: scale(1.12);
    }
  }

  @keyframes success-rise {
    from {
      opacity: 0;
      transform: translateY(0.75rem);
    }
  }
}

@media (min-width: 40em) {
  .contact {
    padding-block: 5.5rem;
  }

  .contact-info,
  .contact-form {
    padding: 2.5rem;
  }

  .form-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }

  .field--full {
    grid-column: 1 / -1;
  }
}

/* Tablet: the four details sit in two columns under the intro, once each column can fit the
   phone number and email on one line (narrower than this they stay in one column) */
@media (min-width: 52em) {
  .contact-list {
    grid-template-columns: repeat(2, 1fr);
    gap: 1.75rem 2rem;
  }
}

/* Side by side only once the details column has room for the email and hours without wrapping */
@media (min-width: 75em) {
  .contact-card {
    grid-template-columns: minmax(0, 5fr) minmax(0, 7fr);
  }

  .contact-info,
  .contact-form {
    padding: 3rem;
  }

  .contact-info {
    display: flex;
    flex-direction: column;
    border-right: 4px solid var(--red);
    border-bottom: 0;
  }

  .contact-list {
    grid-template-columns: 1fr;
    gap: 1.5rem;
  }

  /* The list above stays its natural height; the photo below is what stretches or shrinks to
     land the panel's bottom edge level with the form's, whichever the form's height turns out to be. */
  .contact-photo {
    flex: 1;
    min-height: 0;
    aspect-ratio: auto;
  }

  /* The details panel is taller than the form, so the Message box soaks up the spare height
     and the button lands level with the bottom of the panel */
  .contact-form,
  .form-panel {
    display: flex;
    flex-direction: column;
  }

  .form-panel {
    flex: 1;
  }

  .form-panel[hidden] {
    display: none;
  }

  .form-grid {
    flex: 1;
    grid-template-rows: auto auto minmax(0, 1fr);
  }

  .field--full {
    display: flex;
    flex-direction: column;
  }

  .field--full textarea {
    flex: 1;
  }
}

/* --------------------------------------------------------------------------
   Footer
   -------------------------------------------------------------------------- */
/* Always dark, like the navbar, with the same red line on the edge that meets the page */
.site-footer {
  --focus: #ffffff;
  border-top: 4px solid var(--red);
  background: radial-gradient(90% 130% at 100% 0%, rgb(106 0 0 / 0.5) 0%, rgb(106 0 0 / 0) 55%), #0d0d0f;
  color: rgb(255 255 255 / 0.78);
}

.footer-main {
  padding-block: 3.5rem 2.5rem;
}

.footer-grid {
  display: grid;
  gap: 2.5rem;
}

.footer-logo {
  display: inline-block;
  width: 13rem;
  max-width: 100%;
}

.footer-blurb {
  max-width: 24rem;
  margin: 1.25rem 0 0;
  font-size: 1.05rem;
  line-height: 1.6;
}

/* Brand icons sit in matching rounded tiles. The ring keeps the black TikTok tile visible on the dark footer. */
.footer-social {
  display: flex;
  flex-wrap: wrap;
  gap: 0.75rem;
  margin: 1.5rem 0 0;
  padding: 0;
  list-style: none;
}

.footer-social a {
  display: block;
  width: 2.75rem;
  height: 2.75rem;
  overflow: hidden;
  border-radius: 10px;
  box-shadow: 0 0 0 1px rgb(255 255 255 / 0.28);
  transition: transform 0.15s ease, box-shadow 0.15s ease;
}

.footer-social a:hover {
  transform: translateY(-3px);
  box-shadow: 0 0 0 2px #ffffff;
}

.footer-social img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

/* The Facebook file has a 2px transparent margin around its blue square, which leaves a thin gap inside the
   tile's outline. A slight zoom (the tile clips the overflow) lets the blue reach the edge like the other icons. */
.footer-social img.is-padded {
  transform: scale(1.08);
}

/* Column titles reuse the slanted red dash from the section eyebrows */
.footer-title {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  margin: 0 0 1.1rem;
  color: #ffffff;
  font-family: var(--font-heading);
  font-size: 1.25rem;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
}

.footer-title::before {
  content: "";
  flex: none;
  width: 1.5rem;
  height: 3px;
  background: var(--red);
  transform: skewX(-20deg);
}

.footer-links,
.footer-contact {
  display: grid;
  margin: 0;
  padding: 0;
  list-style: none;
}

.footer-links {
  gap: 0.4rem;
}

.footer-links a,
.footer-legal a,
.footer-contact a {
  color: inherit;
  text-decoration: none;
}

.footer-links a {
  display: inline-block;
  padding-block: 0.1rem;
}

.footer-links a:hover,
.footer-links a[aria-current="page"],
.footer-legal a:hover,
.footer-contact a:hover,
.footer-credit a:hover {
  color: #ffffff;
  text-decoration: underline;
  text-decoration-color: var(--red);
  text-decoration-thickness: 2px;
  text-underline-offset: 4px;
}

.footer-contact {
  gap: 0.9rem;
  margin-bottom: 1.5rem;
}

.footer-contact li {
  display: flex;
  align-items: flex-start;
  gap: 0.75rem;
}

/* The icon files are plain black, so a filter turns them white */
.footer-contact img {
  flex: none;
  width: 1.1rem;
  height: 1.1rem;
  margin-top: 0.3rem;
  filter: brightness(0) invert(1);
  opacity: 0.85;
}

.footer-bottom {
  border-top: 1px solid rgb(255 255 255 / 0.12);
  font-size: 0.95rem;
}

.footer-bottom-inner {
  display: grid;
  gap: 0.9rem;
  padding-block: 1.5rem;
}

.footer-bottom p {
  margin: 0;
}

.footer-copy-legal {
  display: grid;
  gap: 0.9rem;
}

.footer-legal {
  display: flex;
  flex-wrap: wrap;
  gap: 0.4rem 1.5rem;
  margin: 0;
  padding: 0;
  list-style: none;
}

.footer-credit a {
  color: #ffffff;
  font-weight: 600;
  text-decoration: none;
}

@media (min-width: 40em) {
  .footer-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 2.5rem 2rem;
  }

  /* Only the brand block is forced full width here, so Quick Links pairs with Services and
     Service Areas pairs with Get in Touch instead of leaving an empty cell beside either. */
  .footer-brand {
    grid-column: 1 / -1;
  }

  .footer-contact {
    grid-template-columns: repeat(auto-fit, minmax(14rem, max-content));
    gap: 0.9rem 2.5rem;
  }
}

@media (min-width: 48em) {
  .footer-bottom-inner {
    grid-template-columns: 1fr auto;
    align-items: center;
    gap: 0.75rem 2rem;
  }

  .footer-copy-legal {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.4rem 2rem;
  }
}

@media (min-width: 62em) {
  .footer-grid {
    grid-template-columns: 1.3fr 0.85fr 1fr 1fr 1.05fr;
    gap: 2.25rem;
  }

  .footer-brand,
  .footer-contact-col {
    grid-column: auto;
  }

  .footer-contact {
    grid-template-columns: 1fr;
    gap: 0.9rem;
  }
}

/* --------------------------------------------------------------------------
   Legal pages (privacy policy, accessibility statement)
   -------------------------------------------------------------------------- */
/* Dark banner, like the trailer and contact panels. The top padding clears the logo hanging off the navbar. */
.page-hero {
  padding: calc(var(--logo-overhang) + 2.5rem) 0 3rem;
  background: linear-gradient(120deg, #180000 0%, #550000 55%, #a50000 100%);
  color: #ffffff;
}

.page-title {
  margin: 0 0 0.75rem;
  font-family: var(--font-heading);
  font-size: clamp(2.4rem, 9vw, 4.25rem);
  font-style: italic;
  font-weight: 800;
  line-height: 1;
  text-transform: uppercase;
}

.page-meta {
  margin: 0;
  color: rgb(255 255 255 / 0.85);
  font-size: 1.05rem;
}

.page-lead {
  max-width: 40rem;
  margin: 0;
  color: rgb(255 255 255 / 0.9);
  font-size: 1.15rem;
  line-height: 1.6;
}

.legal {
  padding-block: 3rem 5rem;
  background: var(--bg);
  color: var(--text);
  transition: background-color 0.25s ease, color 0.25s ease;
}

.legal-inner {
  max-width: 48rem;
  margin-inline: auto;
}

.legal-intro {
  margin: 0 0 2rem;
  font-size: 1.2rem;
  line-height: 1.65;
}

.legal-toc {
  margin: 0 0 1rem;
  padding: 1.5rem;
  border: 1px solid var(--card-border);
  border-radius: 14px;
  background: var(--surface);
}

.legal-toc-title {
  margin: 0 0 0.75rem;
  color: var(--accent-text);
  font-family: var(--font-heading);
  font-size: 1.1rem;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
}

.legal-toc ol {
  display: grid;
  gap: 0.4rem 2rem;
  margin: 0;
  padding-left: 1.4rem;
}

.legal-toc a {
  color: var(--text);
  text-underline-offset: 3px;
}

.legal-toc a:hover {
  color: var(--accent-text);
}

.legal h2 {
  margin: 3rem 0 0.9rem;
  font-family: var(--font-heading);
  font-size: clamp(1.6rem, 5vw, 2.1rem);
  font-style: italic;
  font-weight: 800;
  line-height: 1.1;
  text-transform: uppercase;
}

.legal h3 {
  margin: 1.75rem 0 0.5rem;
  font-family: var(--font-heading);
  font-size: 1.35rem;
  font-weight: 600;
  letter-spacing: 0.03em;
}

.legal p,
.legal li {
  font-size: 1.075rem;
  line-height: 1.7;
}

.legal p {
  margin: 0 0 1rem;
}

.legal ul {
  margin: 0 0 1.25rem;
  padding-left: 1.4rem;
}

.legal li {
  margin-bottom: 0.45rem;
  padding-left: 0.25rem;
}

.legal li::marker {
  color: var(--accent-text);
}

.legal a {
  color: var(--accent-text);
  font-weight: 600;
  text-underline-offset: 3px;
}

.legal a:hover {
  text-decoration-thickness: 2px;
}

.legal-contact {
  margin-top: 1.25rem;
  padding: 1.5rem;
  border: 1px solid var(--card-border);
  border-left: 4px solid var(--red);
  border-radius: 10px;
  background: var(--surface);
}

.legal-contact p {
  margin: 0 0 0.35rem;
}

.legal-contact p:last-child {
  margin-bottom: 0;
}

@media (min-width: 40em) {
  .footer-main {
    padding-block: 4rem 3rem;
  }

  .page-hero {
    padding-bottom: 3.5rem;
  }

  .legal {
    padding-block: 4rem 6rem;
  }

  .legal-toc ol {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

/* --------------------------------------------------------------------------
   Gallery page
   -------------------------------------------------------------------------- */
/* Lets the before/after divider on the tiles glide instead of jump (older browsers just jump) */
@property --split {
  syntax: "<percentage>";
  inherits: true;
  initial-value: 56%;
}

.gallery {
  padding-block: 3rem 4.5rem;
  background: var(--surface);
  color: var(--text);
  transition: background-color 0.25s ease, color 0.25s ease;
}

/* Masonry: columns let every photo keep its own shape. They fill top to bottom, one column at a time. */
.gallery-grid {
  --gap: 0.75rem;
  columns: 2;
  column-gap: var(--gap);
  margin: 0;
  padding: 0;
  list-style: none;
}

.gallery-item {
  margin: 0 0 var(--gap);
  break-inside: avoid;
}

/* Tiles fade up as they scroll into view (gallery.js adds .is-reveal, and skips it for reduced motion) */
.gallery-grid.is-reveal .gallery-item {
  opacity: 0;
  transform: translateY(1.5rem);
  transition: opacity 0.6s ease, transform 0.7s cubic-bezier(0.2, 0.8, 0.2, 1);
}

.gallery-grid.is-reveal .gallery-item.is-in {
  opacity: 1;
  transform: none;
}

.gallery-tile {
  --zoom-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='2.4' stroke-linecap='round'%3E%3Ccircle cx='10.5' cy='10.5' r='6.5'/%3E%3Cpath d='M15.5 15.5 21 21M10.5 7.5v6M7.5 10.5h6'/%3E%3C/svg%3E");
  position: relative;
  display: block;
  width: 100%;
  margin: 0;
  padding: 0;
  overflow: hidden;
  border: 0;
  border-radius: 14px;
  background: var(--card-bg);
  box-shadow: var(--card-shadow);
  color: #ffffff;
  font: inherit;
  text-align: left;
  cursor: zoom-in;
  -webkit-tap-highlight-color: transparent;
  transition: transform 0.3s cubic-bezier(0.2, 0.8, 0.2, 1), box-shadow 0.3s ease;
}

/* The lightbox hides the tile it grows out of, so it never shows twice */
.gallery-tile.is-lifted {
  visibility: hidden;
}

/* The page-wide focus ring squares corners off, so restore the tile's radius */
.gallery-tile:focus-visible {
  border-radius: 14px;
}

.gallery-tile img {
  display: block;
  width: 100%;
  height: auto;
  transition: transform 0.7s cubic-bezier(0.2, 0.8, 0.2, 1);
}

/* Name plate over the bottom of every photo, always visible so it works on touch screens too */
.gallery-caption {
  position: absolute;
  right: 0;
  bottom: 0;
  left: 0;
  padding: 2.25rem 2.9rem 0.65rem 0.7rem;
  background: linear-gradient(to top, rgb(0 0 0 / 0.82), rgb(0 0 0 / 0));
  font-family: var(--font-heading);
  font-size: 0.98rem;
  font-weight: 600;
  letter-spacing: 0.03em;
  line-height: 1.15;
  text-transform: uppercase;
  pointer-events: none;
}

/* Magnifier badge: on hover and keyboard focus, and always on touch screens where there is no hover */
.gallery-tile::after {
  content: "";
  position: absolute;
  right: 0.5rem;
  bottom: 0.5rem;
  width: 1.9rem;
  height: 1.9rem;
  border-radius: 50%;
  background: var(--red) var(--zoom-icon) center / 58% no-repeat;
  box-shadow: 0 2px 8px rgb(0 0 0 / 0.4);
  opacity: 0;
  transform: scale(0.6);
  transition: opacity 0.25s ease, transform 0.35s cubic-bezier(0.2, 0.8, 0.2, 1);
  pointer-events: none;
}

.gallery-tile:focus-visible::after {
  opacity: 1;
  transform: none;
}

@media (hover: none) {
  .gallery-tile::after {
    opacity: 1;
    transform: none;
  }
}

@media (hover: hover) {
  .gallery-tile:hover {
    transform: translateY(-4px);
    box-shadow: 0 16px 34px rgb(0 0 0 / 0.28);
  }

  .gallery-tile:hover::after {
    opacity: 1;
    transform: none;
  }

  .gallery-tile:not(.gallery-tile--pair):hover img {
    transform: scale(1.06);
  }
}

/* Before / after tile: one photo per side of a slanted divider, the same slant as the brand's italic type */
.gallery-tile--pair {
  --split: 56%;
  transition: --split 0.6s cubic-bezier(0.2, 0.8, 0.2, 1), transform 0.3s cubic-bezier(0.2, 0.8, 0.2, 1), box-shadow 0.3s ease;
}

@media (hover: hover) {
  /* The divider sweeps right to show more of the "before" */
  .gallery-tile--pair:hover {
    --split: 68%;
  }
}

/* --ar is the tile's shape. --crop-before / --crop-after pick what stays in frame when a photo isn't that shape. */
.gallery-frame {
  position: relative;
  display: block;
  overflow: hidden;
  aspect-ratio: var(--ar, 4 / 3);
}

.gallery-frame img {
  position: absolute;
  inset: 0;
  height: 100%;
  object-fit: cover;
}

.gallery-frame .pair-after {
  object-position: var(--crop-after, 50% 50%);
}

.gallery-frame .pair-before {
  object-position: var(--crop-before, 50% 50%);
  clip-path: polygon(0 0, var(--split) 0, calc(var(--split) - 14%) 100%, 0 100%);
}

/* The white line on the divider. The line is the ::before shape, so the shadow goes on the wrapper. */
.gallery-split {
  position: absolute;
  inset: 0;
  filter: drop-shadow(0 0 4px rgb(0 0 0 / 0.55));
  pointer-events: none;
}

.gallery-split::before {
  content: "";
  position: absolute;
  inset: 0;
  background: #ffffff;
  clip-path: polygon(
    calc(var(--split) - 0.14rem) 0,
    calc(var(--split) + 0.14rem) 0,
    calc(var(--split) - 14% + 0.14rem) 100%,
    calc(var(--split) - 14% - 0.14rem) 100%
  );
}

/* Smaller Before / After tags than the sliders have, since the tiles are smaller */
.gallery-frame .compare-tag {
  top: 0.55rem;
  padding: 0.1rem 0.55rem;
  font-size: 0.9rem;
}

.gallery-frame .compare-tag--before {
  left: 0.55rem;
}

.gallery-frame .compare-tag--after {
  right: 0.55rem;
}

/* The words are drawn here instead of written in the HTML. The tags are decoration (aria-hidden), and this keeps
   a tile's visible text down to its caption, which is what its aria-label starts with. */
.gallery-frame .compare-tag--before::after {
  content: "Before";
}

.gallery-frame .compare-tag--after::after {
  content: "After";
}

/* Closing call to action on a page of its own (the gallery and testimonials pages) */
.gallery-cta,
.page-cta {
  padding-block: 3.5rem 4.5rem;
  background: var(--bg);
  color: var(--text);
  transition: background-color 0.25s ease, color 0.25s ease;
}

/* Same closing call to action as the Services section, minus the divider line that sits above it there */
.gallery-cta .services-cta,
.page-cta .services-cta {
  margin-top: 0;
  padding-top: 0;
  border-top: 0;
}

@media (min-width: 40em) {
  .gallery-grid {
    --gap: 1rem;
  }

  .gallery {
    padding-block: 4rem 5.5rem;
  }

  .gallery-caption {
    padding: 3rem 3.75rem 0.95rem 1rem;
    font-size: 1.2rem;
  }

  .gallery-tile::after {
    right: 0.8rem;
    bottom: 0.8rem;
    width: 2.4rem;
    height: 2.4rem;
  }

  .gallery-frame .compare-tag {
    top: 0.75rem;
    padding: 0.2rem 0.7rem;
    font-size: 1.05rem;
  }

  .gallery-frame .compare-tag--before {
    left: 0.75rem;
  }

  .gallery-frame .compare-tag--after {
    right: 0.75rem;
  }
}

@media (min-width: 48em) {
  .gallery-grid {
    --gap: 1.25rem;
    columns: 3;
  }
}

/* --------------------------------------------------------------------------
   Photos / Videos tabs (page-hero on the gallery and video gallery pages)
   -------------------------------------------------------------------------- */
.gallery-tabs {
  display: flex;
  gap: 0.85rem;
  margin: 2rem 0 0;
  padding: 0;
  list-style: none;
}

.gallery-tab {
  display: inline-flex;
  align-items: center;
  padding: 0.75rem 1.75rem;
  border: 2px solid rgb(255 255 255 / 0.4);
  border-radius: 999px;
  background: rgb(255 255 255 / 0.08);
  color: #ffffff;
  font-family: var(--font-heading);
  font-size: 1.2rem;
  font-weight: 700;
  letter-spacing: 0.05em;
  text-decoration: none;
  text-transform: uppercase;
  transition: background-color 0.15s ease, border-color 0.15s ease, transform 0.15s ease;
}

.gallery-tab:hover {
  background: rgb(255 255 255 / 0.2);
  border-color: rgb(255 255 255 / 0.7);
  transform: translateY(-1px);
}

.gallery-tab[aria-current="page"] {
  border-color: var(--red);
  background: var(--red);
  box-shadow: 0 3px 0 var(--red-dark);
}

/* --------------------------------------------------------------------------
   Video tiles (home page teaser section + the video gallery page)
   -------------------------------------------------------------------------- */
/* A tile starts as nothing more than a poster photo and a Play button, so it costs the same as any other
   photo on the page. The clip itself only starts downloading once that button is tapped, when js/main.js
   builds the real <video> element and drops it in. */
.video-frame {
  position: relative;
  overflow: hidden;
  aspect-ratio: var(--ar, 9 / 16);
  border-radius: 14px;
  background: #000000;
  box-shadow: var(--card-shadow);
}

.video-frame img,
.video-frame video {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.video-play {
  position: absolute;
  inset: 0;
  display: grid;
  place-items: center;
  width: 3.75rem;
  height: 3.75rem;
  margin: auto;
  padding: 0;
  border: 3px solid #ffffff;
  border-radius: 50%;
  background: var(--red);
  color: #ffffff;
  cursor: pointer;
  box-shadow: 0 4px 16px rgb(0 0 0 / 0.45);
  transition: background-color 0.15s ease, transform 0.2s cubic-bezier(0.2, 0.8, 0.2, 1);
}

.video-play svg {
  width: 1.5rem;
  height: 1.5rem;
  margin-left: 0.2rem; /* optically centers the triangle in the circle */
  fill: currentColor;
}

@media (hover: hover) {
  .video-play:hover {
    background: #eb0a08;
    transform: scale(1.08);
  }
}

.video-caption {
  margin: 0.75rem 0 0;
  font-family: var(--font-heading);
  font-size: 1.05rem;
  font-weight: 600;
  letter-spacing: 0.02em;
  line-height: 1.25;
  text-transform: uppercase;
}

/* --------------------------------------------------------------------------
   Video gallery page (/gallery-videos)
   -------------------------------------------------------------------------- */
.video-gallery {
  padding-block: 3rem 4.5rem;
  background: var(--surface);
  color: var(--text);
  transition: background-color 0.25s ease, color 0.25s ease;
}

/* Same masonry approach as .gallery-grid: columns let each portrait clip keep its own tile,
   filling top to bottom one column at a time. */
.video-grid {
  --gap: 1rem;
  columns: 2;
  column-gap: var(--gap);
  margin: 0;
  padding: 0;
  list-style: none;
}

.video-item {
  margin: 0 0 var(--gap);
  break-inside: avoid;
}

@media (min-width: 40em) {
  .video-gallery {
    padding-block: 4rem 5.5rem;
  }

  .video-grid {
    --gap: 1.25rem;
  }
}

@media (min-width: 62em) {
  .video-grid {
    columns: 4;
  }
}

/* --------------------------------------------------------------------------
   Lightbox (the photo viewer on the gallery page)
   -------------------------------------------------------------------------- */
/* Keeps the page from scrolling behind the viewer, without the page shifting sideways when the scrollbar goes */
html.lightbox-lock {
  overflow: hidden;
  scrollbar-gutter: stable;
}

/* A native <dialog>: it traps focus, closes on Escape, and makes everything behind it inert.
   It fills the screen and paints its own dark blur, which fades in when gallery.js adds .is-open. */
.lightbox {
  --focus: #ffffff; /* the viewer is always dark, so the ring is always white */
  position: fixed;
  inset: 0;
  width: 100%;
  height: 100%;
  max-width: none;
  max-height: none;
  margin: 0;
  padding: 0;
  overflow: hidden;
  border: 0;
  background: rgb(8 8 10 / 0);
  color: #ffffff;
  overscroll-behavior: contain;
  touch-action: none;
  -webkit-backdrop-filter: blur(0);
  backdrop-filter: blur(0);
  transition: background-color 0.35s ease, -webkit-backdrop-filter 0.35s ease, backdrop-filter 0.35s ease;
}

.lightbox.is-open {
  background: rgb(8 8 10 / 0.92);
  -webkit-backdrop-filter: blur(10px);
  backdrop-filter: blur(10px);
}

.lightbox::backdrop {
  background: transparent;
}

.lightbox-shell {
  position: absolute;
  inset: 0;
  display: grid;
  place-items: center;
  padding: 4.25rem var(--gutter) 5.25rem; /* room for the close button above and the caption row below */
}

.lightbox-figure {
  display: grid;
  justify-items: center;
  width: 100%;
  margin: 0;
}

/* The photo's box. gallery.js sets --ratio (the tile's shape) and --max-w, and the box grows to the largest
   size that fits the screen. It's also what zooms out of and back into the tiles. */
.lightbox-frame {
  --max-h: calc(100vh - 9.5rem);
  position: relative;
  width: min(100%, calc(var(--max-h) * var(--ratio, 1.333)), var(--max-w, 1200px));
  aspect-ratio: var(--ratio, 1.333);
  overflow: hidden;
  border-radius: 12px;
  background: #111113;
  box-shadow: 0 30px 80px rgb(0 0 0 / 0.6);
  transform-origin: 0 0;
}

@supports (height: 100dvh) {
  .lightbox-frame {
    --max-h: calc(100dvh - 9.5rem);
  }
}

.lightbox-frame > img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

/* A before/after job fills the frame with the same slider as the Our Work section */
.lightbox-frame .compare {
  position: absolute;
  inset: 0;
  aspect-ratio: auto;
  border: 0;
  border-radius: 0;
  box-shadow: none;
}

.lightbox-frame .compare > img {
  object-position: var(--crop-after, 50% 50%);
}

.lightbox-frame .compare-before img {
  object-position: var(--crop-before, 50% 50%);
}

.lightbox-caption {
  position: absolute;
  bottom: 1.2rem;
  left: 50%;
  display: grid;
  gap: 0.15rem;
  justify-items: center;
  max-width: calc(100% - 8.5rem);
  text-align: center;
  transform: translateX(-50%);
}

.lightbox-title {
  font-family: var(--font-heading);
  font-size: clamp(1.25rem, 4.5vw, 1.75rem);
  font-style: italic;
  font-weight: 800;
  line-height: 1.05;
  text-transform: uppercase;
}

.lightbox-count {
  color: rgb(255 255 255 / 0.75);
  font-size: 0.95rem;
}

.lightbox-close,
.lightbox-nav {
  position: absolute;
  display: grid;
  place-items: center;
  width: 3rem;
  height: 3rem;
  padding: 0;
  border: 0;
  border-radius: 50%;
  background: rgb(255 255 255 / 0.14);
  color: #ffffff;
  cursor: pointer;
}

.lightbox-close svg,
.lightbox-nav svg {
  width: 1.5rem;
  height: 1.5rem;
  fill: none;
  stroke: currentColor;
  stroke-width: 2.6;
  stroke-linecap: round;
  stroke-linejoin: round;
}

.lightbox-close {
  top: 0.9rem;
  right: 0.9rem;
}

.lightbox-nav {
  bottom: 1.2rem;
}

.lightbox-nav--prev {
  left: 0.9rem;
}

.lightbox-nav--next {
  right: 0.9rem;
}

/* Hover only where there is a hover, or a tapped arrow would stay red on touch screens */
@media (hover: hover) {
  .lightbox-close:hover,
  .lightbox-nav:hover {
    background: var(--red);
  }
}

.lightbox-close:active,
.lightbox-nav:active {
  background: var(--red);
  transform: scale(0.94);
}

/* Controls and caption fade in once the photo has landed, and out quickly when it leaves */
.lightbox-close,
.lightbox-nav,
.lightbox-caption {
  opacity: 0;
  transition: opacity 0.15s ease, background-color 0.2s ease, transform 0.2s ease;
}

.lightbox.is-open .lightbox-close,
.lightbox.is-open .lightbox-nav,
.lightbox.is-open .lightbox-caption {
  opacity: 1;
  transition: opacity 0.35s ease 0.25s, background-color 0.2s ease, transform 0.2s ease;
}

/* Room on either side of the photo for the arrows, which sit beside it instead of under it */
@media (min-width: 48em) {
  .lightbox-shell {
    padding-inline: 6rem;
  }

  .lightbox-nav {
    top: 50%;
    bottom: auto;
    width: 3.5rem;
    height: 3.5rem;
    margin-top: -1.75rem;
  }

  .lightbox-nav--prev {
    left: 1.5rem;
  }

  .lightbox-nav--next {
    right: 1.5rem;
  }

  .lightbox-close {
    top: 1.25rem;
    right: 1.5rem;
  }

  .lightbox-caption {
    max-width: calc(100% - 12rem);
  }
}

/* --------------------------------------------------------------------------
   Service pages, testimonials page, contact page
   These share a dark banner at the top (.page-hero, above), then alternate white and grey sections like the home page.
   -------------------------------------------------------------------------- */
/* Banner title in two lines, the second one on the red brush stroke (the same look as the home page hero) */
.page-title-line {
  display: block;
  text-wrap: balance;
}

.page-title-line + .page-title-line {
  margin-top: 0.15em;
}

/* A banner with buttons under the lead needs room between them */
.page-hero .page-lead:not(:last-child) {
  margin-bottom: 1.75rem;
}

/* Section heading block (eyebrow, title, intro line) shared by the sections below */
.section-head {
  margin-bottom: 2.5rem;
}

.section-head .section-title {
  margin-bottom: 1rem;
}

/* Keeps a long title from leaving one word (or half a city name) alone on its last line */
.svc-copy .section-title,
.section-head .section-title {
  text-wrap: balance;
}

.section-lead {
  max-width: 46rem;
  margin: 0;
  color: var(--text-muted);
  font-size: 1.15rem;
}

/* ----- Overview: the copy, and a photo or before/after slider beside it ----- */
.svc-overview {
  padding-block: 4rem;
  background: var(--bg);
  color: var(--text);
  transition: background-color 0.25s ease, color 0.25s ease;
}

.svc-overview-grid {
  display: grid;
  gap: 2.5rem;
}

.svc-copy {
  max-width: 40rem;
}

.svc-media {
  margin: 0;
}

.svc-photo {
  overflow: hidden;
  border: 1px solid var(--card-border);
  border-radius: 14px;
  background: var(--card-bg);
  box-shadow: var(--card-shadow);
}

.svc-photo img {
  width: 100%;
  height: auto;
}

/* Tall phone photos are shown at their real size instead of being stretched wide. The whole figure (photo, caption,
   link) narrows and centers, so the caption stays under the photo. */
.svc-media--portrait {
  width: min(100%, 25rem);
  margin-inline: auto;
}

.svc-media-link {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  margin-top: 0.5rem;
  color: var(--accent-text);
  font-family: var(--font-heading);
  font-size: 1.15rem;
  font-weight: 600;
  letter-spacing: 0.08em;
  text-decoration: none;
  text-transform: uppercase;
}

.svc-media-link svg {
  width: 1.1rem;
  height: 1.1rem;
  fill: currentColor;
  transition: transform 0.2s ease;
}

.svc-media-link:hover {
  text-decoration: underline;
  text-underline-offset: 4px;
}

.svc-media-link:hover svg {
  transform: translateX(4px);
}

/* ----- What we take: a grid of small cards ----- */
.svc-items {
  padding-block: 4rem;
  background: var(--surface);
  color: var(--text);
  transition: background-color 0.25s ease, color 0.25s ease;
}

.item-grid {
  display: grid;
  gap: 1.25rem;
  margin: 0;
  padding: 0;
  list-style: none;
}

.item-card {
  padding: 1.5rem;
  border: 1px solid var(--card-border);
  border-radius: 14px;
  background: var(--card-bg);
  box-shadow: var(--card-shadow);
  transition: border-color 0.25s ease, background-color 0.25s ease;
}

.item-title {
  display: flex;
  align-items: flex-start;
  gap: 0.6rem;
  margin: 0 0 0.6rem;
  font-family: var(--font-heading);
  font-size: 1.45rem;
  font-style: italic;
  font-weight: 800;
  line-height: 1.1;
  text-transform: uppercase;
}

.item-title::before {
  content: "";
  flex: none;
  width: 1.5rem;
  height: 1.5rem;
  background: var(--accent-text);
  -webkit-mask: var(--check) center / contain no-repeat;
  mask: var(--check) center / contain no-repeat;
}

.item-text {
  margin: 0;
  color: var(--text-muted);
  font-size: 1.05rem;
  line-height: 1.55;
}

.item-note {
  margin: 1.75rem 0 0;
  color: var(--text-muted);
  font-size: 1.1rem;
}

.item-note a,
.section-lead a,
.faq-answer a {
  color: var(--accent-text);
  font-weight: 600;
  text-underline-offset: 3px;
}

/* A phone number shouldn't break across two lines at its hyphens */
.item-note a[href^="tel:"],
.section-lead a[href^="tel:"],
.faq-answer a[href^="tel:"] {
  white-space: nowrap;
}

/* ----- How it works: three numbered steps, then how pricing works ----- */
.svc-steps {
  padding-block: 4rem;
  background: var(--bg);
  color: var(--text);
  transition: background-color 0.25s ease, color 0.25s ease;
}

.steps {
  display: grid;
  gap: 1.25rem;
  margin: 0;
  padding: 0;
  list-style: none;
  counter-reset: step;
}

.step {
  padding: 1.5rem;
  border: 1px solid var(--card-border);
  border-radius: 14px;
  background: var(--card-bg);
  box-shadow: var(--card-shadow);
  counter-increment: step;
  transition: border-color 0.25s ease, background-color 0.25s ease;
}

/* The list is already numbered for screen readers, so the red badge is only decoration */
.step-num {
  display: grid;
  place-items: center;
  width: 3.5rem;
  height: 3.5rem;
  margin-bottom: 1.1rem;
  border-radius: 8px;
  background: var(--red);
  box-shadow: 0 3px 0 var(--red-dark);
  color: #ffffff;
  font-family: var(--font-heading);
  font-size: 1.9rem;
  font-style: italic;
  font-weight: 800;
  line-height: 1;
  transform: skewX(-10deg);
}

.step-num::before {
  content: counter(step);
  transform: skewX(10deg); /* undo the badge's slant so the number stands upright */
}

.step-title {
  margin: 0 0 0.5rem;
  font-family: var(--font-heading);
  font-size: 1.65rem;
  font-style: italic;
  font-weight: 800;
  line-height: 1.05;
  text-transform: uppercase;
}

.step-text {
  margin: 0;
  color: var(--text-muted);
  font-size: 1.05rem;
  line-height: 1.55;
}

.price-note {
  display: grid;
  gap: 0.4rem;
  margin-top: 2rem;
  padding: 1.5rem;
  border: 1px solid var(--card-border);
  border-left: 4px solid var(--red);
  border-radius: 10px;
  background: var(--surface);
  transition: background-color 0.25s ease, border-color 0.25s ease;
}

.price-title {
  margin: 0;
  font-family: var(--font-heading);
  font-size: 1.6rem;
  font-style: italic;
  font-weight: 800;
  line-height: 1.05;
  text-transform: uppercase;
}

.price-note p {
  margin: 0;
  color: var(--text-muted);
  font-size: 1.1rem;
  line-height: 1.55;
}

/* ----- Dump trailer page: the rates banner gets its own grey band ----- */
.svc-rates {
  padding-block: 4rem;
  background: var(--surface);
  transition: background-color 0.25s ease;
}

/* ----- FAQ ----- */
.faq {
  padding-block: 4rem;
  background: var(--surface);
  color: var(--text);
  transition: background-color 0.25s ease, color 0.25s ease;
}

.faq-layout {
  display: grid;
  gap: 1.5rem;
}

.faq-list {
  display: grid;
  gap: 0.85rem;
  align-content: start;
}

.faq-item {
  border: 1px solid var(--card-border);
  border-radius: 12px;
  background: var(--card-bg);
  box-shadow: var(--card-shadow);
  transition: border-color 0.2s ease, background-color 0.25s ease;
}

.faq-item[open] {
  border-color: var(--red);
}

.faq-item summary {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  padding: 1.1rem 1.25rem;
  border-radius: 12px;
  font-size: 1.15rem;
  font-weight: 600;
  line-height: 1.35;
  cursor: pointer;
  list-style: none;
}

.faq-item summary::-webkit-details-marker {
  display: none;
}

.faq-item summary:focus-visible {
  outline-offset: -3px;
  border-radius: 12px;
}

/* Down arrow that flips up when the answer is open */
.faq-item summary::after {
  content: "";
  flex: none;
  width: 1.5rem;
  height: 1.5rem;
  background: var(--accent-text);
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7 10l5 5 5-5z'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7 10l5 5 5-5z'/%3E%3C/svg%3E") center / contain no-repeat;
  transition: transform 0.25s ease;
}

.faq-item[open] summary::after {
  transform: rotate(180deg);
}

.faq-answer {
  padding: 0 1.25rem 1.25rem;
  color: var(--text-muted);
  font-size: 1.075rem;
  line-height: 1.65;
}

.faq-answer p {
  margin: 0 0 0.75rem;
}

.faq-answer p:last-child {
  margin-bottom: 0;
}

/* ----- Other services, then the closing call to action ----- */
.related {
  padding-block: 4rem;
  background: var(--bg);
  color: var(--text);
  transition: background-color 0.25s ease, color 0.25s ease;
}

/* The commercial page's vendor-packet CTA reuses .related as its section, but unlike everywhere else
   .related shows up, there's no service grid above it here - just the CTA box. That left the section's
   own top padding and the box's own top margin (sized for sitting under the grid) stacking into one big
   gap under the FAQ above it. Trimmed here only, scoped to this one section. */
.related#vendor-packet {
  padding-top: 0.5rem;
}

.related#vendor-packet .commercial-cta {
  margin-top: 0;
}

.related-grid {
  display: grid;
  gap: 1rem;
  margin: 0;
  padding: 0;
  list-style: none;
}

.related-card {
  display: flex;
  align-items: center;
  gap: 1rem;
  height: 100%;
  padding: 1rem 1.25rem;
  border: 1px solid var(--card-border);
  border-radius: 14px;
  background: var(--card-bg);
  box-shadow: var(--card-shadow);
  color: inherit;
  text-decoration: none;
  transition: transform 0.2s ease, border-color 0.25s ease, background-color 0.25s ease;
}

.related-card .service-icon {
  width: 3rem;
  height: 3rem;
}

.related-card .service-icon svg {
  width: 1.5rem;
  height: 1.5rem;
}

.related-name {
  font-family: var(--font-heading);
  font-size: 1.35rem;
  font-style: italic;
  font-weight: 800;
  line-height: 1.05;
  text-transform: uppercase;
}

.related-arrow {
  flex: none;
  width: 1.4rem;
  height: 1.4rem;
  margin-left: auto;
  fill: var(--accent-text);
  transition: transform 0.2s ease;
}

@media (hover: hover) {
  .related-card:hover {
    transform: translateY(-4px);
    border-color: var(--red);
  }

  .related-card:hover .related-arrow {
    transform: translateX(4px);
  }
}

/* ----- Testimonials page: every review, in columns like the gallery ----- */
.platform-row {
  display: flex;
  flex-wrap: wrap;
  gap: 0.6rem;
  margin: 0;
  padding: 0;
  list-style: none;
}

.platform-row li {
  display: inline-flex;
  align-items: center;
  gap: 0.55rem;
  padding: 0.4rem 1rem 0.4rem 0.6rem;
  border: 1px solid rgb(255 255 255 / 0.28);
  border-radius: 10px;
  background: rgb(255 255 255 / 0.1);
  font-weight: 600;
}

.platform-row img {
  width: 24px;
  height: 24px;
}

.review-wall {
  padding-block: 3rem 4.5rem;
  background: var(--surface);
  color: var(--text);
  transition: background-color 0.25s ease, color 0.25s ease;
}

/* Columns let every review keep its own height. They fill top to bottom, one column at a time. */
.review-grid {
  --gap: 1rem;
  columns: 1;
  column-gap: var(--gap);
  margin: 0;
  padding: 0;
  list-style: none;
}

.review-grid > li {
  margin: 0 0 var(--gap);
  break-inside: avoid;
}

/* ----- Contact page ----- */
/* The card straddles the bottom edge of the banner. The section is pulled up over the banner, and its own background
   (the ::before) starts below the overlap so the banner still shows behind the top of the card. */
.contact--page {
  --overlap: 2.25rem;
  position: relative;
  isolation: isolate;
  margin-top: calc(var(--overlap) * -1);
  padding-top: 0;
  background: none;
}

.contact--page::before {
  content: "";
  position: absolute;
  z-index: -1;
  inset: var(--overlap) 0 0;
  background: var(--bg);
  transition: background-color 0.25s ease;
}

.contact-hero-actions {
  margin-bottom: 1.5rem;
}

/* Lets a page flip a section's background when its neighbours would otherwise match */
.bg-base {
  background: var(--bg);
}

.bg-surface {
  background: var(--surface);
}

@media (min-width: 40em) {
  .svc-overview,
  .svc-items,
  .svc-steps,
  .svc-rates,
  .faq,
  .related {
    padding-block: 5rem;
  }

  .review-wall {
    padding-block: 4rem 5.5rem;
  }

  .review-grid {
    --gap: 1.25rem;
    columns: 2;
  }

  .item-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }

  .related-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }

  .contact--page {
    --overlap: 3rem;
  }
}

@media (min-width: 62em) {
  .svc-overview-grid {
    grid-template-columns: minmax(0, 1.15fr) minmax(0, 0.85fr);
    align-items: center;
    gap: 4rem;
  }

  .item-grid {
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 1.5rem;
  }

  .steps {
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 1.5rem;
  }

  .faq-layout {
    grid-template-columns: minmax(0, 0.8fr) minmax(0, 1.4fr);
    gap: 4rem;
  }

  .faq-layout .section-head {
    margin-bottom: 0;
  }

  .review-grid {
    columns: 3;
  }
}

@media (min-width: 75em) {
  .related-grid {
    grid-template-columns: repeat(4, minmax(0, 1fr));
  }
}

@media (min-width: 62em) {
  .related-grid--three {
    grid-template-columns: repeat(3, minmax(0, 1fr));
  }
}

/* --------------------------------------------------------------------------
   Sticky mobile Call / Text bar
   Persistent quick actions for phones and small tablets, replaced by the header's own Call/Text
   presence once the desktop nav takes over. Present on every page.
   -------------------------------------------------------------------------- */
.mobile-cta-bar {
  position: fixed;
  right: 0;
  bottom: 0;
  left: 0;
  z-index: 90; /* below the sticky header (100) and a native <dialog>'s top layer, above page content */
  display: flex;
  gap: 1px;
  background: #000000;
  box-shadow: 0 -6px 20px rgb(0 0 0 / 0.3);
  padding-bottom: env(safe-area-inset-bottom, 0px);
}

.mobile-cta-btn {
  display: flex;
  flex: 1 1 50%;
  align-items: center;
  justify-content: center;
  gap: 0.5rem;
  padding: 0.9rem 0.5rem;
  background: var(--red);
  color: #ffffff;
  font-family: var(--font-heading);
  font-size: 1.15rem;
  font-style: italic;
  font-weight: 800;
  letter-spacing: 0.02em;
  text-decoration: none;
  text-align: center;
  transition: background-color 0.15s ease;
}

.mobile-cta-btn:active {
  background: var(--red-dark);
}

.mobile-cta-btn--text {
  background: #17171b;
}

.mobile-cta-btn--text:active {
  background: #000000;
}

.mobile-cta-btn svg {
  flex: none;
  width: 1.2rem;
  height: 1.2rem;
  fill: currentColor;
}

/* Room at the bottom of every page so the bar never sits over content or the footer's own CTA */
@media (max-width: 61.99em) {
  body {
    padding-bottom: calc(3.6rem + env(safe-area-inset-bottom, 0px));
  }
}

/* Hidden while the mobile menu is open, so the two fixed bars never compete for the same screen */
body.menu-open .mobile-cta-bar {
  display: none;
}

@media (min-width: 62em) {
  .mobile-cta-bar {
    display: none;
  }
}

/* --------------------------------------------------------------------------
   Contact form: photo upload
   A native file input sits transparent over the styled drop zone, so click-to-browse, drag-and-drop,
   and keyboard/screen-reader use all go through one real, focusable control. js/main.js keeps its own
   array of the chosen files (so one can be removed individually) and writes it back to the input via
   DataTransfer before the form submits.
   -------------------------------------------------------------------------- */
.upload-drop {
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.6rem;
  padding: 1.75rem 1rem;
  border: 2px dashed var(--field-border);
  border-radius: 10px;
  background: var(--field-bg);
  text-align: center;
  transition: border-color 0.15s ease, background-color 0.2s ease, padding-block 0.2s ease;
}

.upload-drop:hover {
  border-color: var(--red);
}

.upload-drop.is-dragover {
  border-color: var(--red);
  background: rgb(215 3 2 / 0.06);
}

.upload-drop.has-files {
  padding-block: 1.1rem;
}

.upload-input {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  opacity: 0;
  cursor: pointer;
}

.upload-icon {
  width: 2.25rem;
  height: 2.25rem;
  fill: none;
  stroke: var(--accent-text);
  stroke-width: 1.8;
  stroke-linecap: round;
  stroke-linejoin: round;
  transition: transform 0.2s ease;
}

.upload-drop.is-dragover .upload-icon {
  transform: translateY(-3px) scale(1.08);
}

.upload-text {
  margin: 0;
  color: var(--text-muted);
  font-size: 0.98rem;
  line-height: 1.45;
}

.upload-text strong {
  color: var(--text);
}

.upload-count {
  margin: 0.6rem 0 0;
  color: var(--text-muted);
  font-size: 0.9rem;
}

.upload-notice {
  margin: 0.6rem 0 0;
  color: var(--accent-text);
  font-size: 0.9rem;
  font-weight: 600;
}

/* Selected-photo chips: pop in when added, and fade+shrink out just before they're removed */
.upload-list {
  display: flex;
  flex-wrap: wrap;
  gap: 0.6rem;
  margin: 1rem 0 0;
  padding: 0;
  list-style: none;
}

.upload-chip {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  max-width: 12rem;
  padding: 0.35rem 0.6rem 0.35rem 0.35rem;
  border: 1px solid var(--card-border);
  border-radius: 999px;
  background: var(--card-bg);
  opacity: 0;
  transform: scale(0.85);
  transition: opacity 0.2s ease, transform 0.2s cubic-bezier(0.3, 1.4, 0.5, 1);
}

.upload-chip.is-in {
  opacity: 1;
  transform: none;
}

.upload-chip.is-leaving {
  opacity: 0;
  transform: scale(0.85);
}

.upload-thumb {
  flex: none;
  width: 2rem;
  height: 2rem;
  border-radius: 50%;
  object-fit: cover;
  background: var(--surface);
}

/* Shown instead of the <img> when a format (HEIC, for one) won't preview in this browser */
.upload-thumb--fallback {
  display: grid;
  place-items: center;
  font-size: 0.55rem;
  font-weight: 700;
  letter-spacing: 0.02em;
  color: var(--text-muted);
  border: 1px solid var(--card-border);
}

.upload-name {
  overflow: hidden;
  color: var(--text);
  font-size: 0.85rem;
  font-weight: 600;
  white-space: nowrap;
  text-overflow: ellipsis;
}

.upload-remove {
  display: grid;
  flex: none;
  place-items: center;
  width: 1.3rem;
  height: 1.3rem;
  margin-left: 0.1rem;
  border: 0;
  border-radius: 50%;
  background: var(--surface);
  color: var(--text-muted);
  font-size: 1rem;
  line-height: 1;
  cursor: pointer;
  transition: background-color 0.15s ease, color 0.15s ease;
}

.upload-remove:hover {
  background: var(--red);
  color: #ffffff;
}

/* While sending: photos are locked in, same as the other fields */
.contact-form[aria-busy="true"] .upload-remove {
  opacity: 0.4;
  cursor: not-allowed;
  pointer-events: none;
}

@media (prefers-reduced-motion: reduce) {
  .upload-chip {
    opacity: 1;
    transform: none;
  }
}

/* --------------------------------------------------------------------------
   Quick facts band (home page): same-day service, bilingual, licensed
   -------------------------------------------------------------------------- */
.quick-facts {
  padding-block: 1.25rem;
  background: #0d0d0f;
  color: #ffffff;
  border-block: 1px solid rgb(255 255 255 / 0.08);
}

/* Phones: no icons, no boxed-off feel - each fact is just its own line, set in the same
   bold italic condensed type the buttons use, stacked tight with no side padding to speak of. */
.quick-facts-list {
  display: grid;
  gap: 0.5rem;
  margin: 0;
  padding: 0;
  list-style: none;
  text-align: center;
}

.quick-facts-list li {
  display: block;
}

.quick-fact-icon {
  display: none;
}

.quick-fact-text {
  display: block;
  font-family: var(--font-heading);
  font-size: 1.4rem;
  font-style: italic;
  font-weight: 800;
  letter-spacing: 0.02em;
  line-height: 1.3;
}

/* Tablet and up: back to the icon badges, one per column */
@media (min-width: 40em) {
  .quick-facts {
    padding-block: 1.75rem;
  }

  .quick-facts-list {
    grid-template-columns: repeat(3, 1fr);
    gap: 1.25rem;
  }

  .quick-facts-list li {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.5rem;
  }

  .quick-fact-icon {
    display: grid;
    flex: none;
    place-items: center;
    width: 3.5rem;
    height: 3.5rem;
    border-radius: 50%;
    background: rgb(215 3 2 / 0.18);
    color: #ff4a4a;
  }

  .quick-fact-icon svg {
    width: 1.75rem;
    height: 1.75rem;
    fill: currentColor;
  }

  .quick-fact-text {
    font-size: 1.25rem;
    font-style: normal;
    font-weight: 600;
    line-height: 1.25;
  }
}

@media (min-width: 62em) {
  .quick-facts-list li {
    flex-direction: row;
    justify-content: center;
  }

  .quick-fact-text {
    font-size: 1.35rem;
  }
}

/* --------------------------------------------------------------------------
   Commercial / Government services teaser (home page; the full page is
   /commercial-government-services)
   -------------------------------------------------------------------------- */
.commercial-cta {
  display: grid;
  gap: 1.5rem;
  margin-top: 2rem;
  padding: 2rem 1.5rem;
  border: 1px solid var(--card-border);
  border-left: 4px solid var(--red);
  border-radius: 14px;
  background: var(--card-bg);
  box-shadow: var(--card-shadow);
  transition: background-color 0.25s ease, border-color 0.25s ease;
}

.commercial-cta-head {
  display: flex;
  align-items: flex-start;
  gap: 1.1rem;
}

/* h2 on its own dedicated section (the commercial page), h3 when nested beside the trailer banner (home page) */
.commercial-cta-text h2,
.commercial-cta-text h3 {
  margin: 0 0 0.5rem;
  font-family: var(--font-heading);
  font-size: clamp(1.5rem, 5.5vw, 2rem);
  font-style: italic;
  font-weight: 800;
  line-height: 1.05;
  text-transform: uppercase;
}

.commercial-cta-text p {
  margin: 0;
  color: var(--text-muted);
  font-size: 1.05rem;
  line-height: 1.55;
}

.commercial-cta-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 0.75rem 1rem;
}

.commercial-cta-actions .btn {
  flex: 1 1 auto;
}

@media (min-width: 40em) {
  .commercial-cta-actions .btn {
    flex: 0 0 auto;
  }
}

@media (min-width: 62em) {
  .commercial-cta {
    grid-template-columns: 1fr auto;
    align-items: center;
    gap: 2rem;
    padding: 2.25rem 2.5rem;
  }

  .commercial-cta-actions {
    flex-direction: column;
  }
}

/* --------------------------------------------------------------------------
   404 page
   -------------------------------------------------------------------------- */
/* Fills the space between the navbar and footer. Same dark red banner as the legal pages, in both themes.
   The top padding clears the logo hanging off the navbar. */
.error-page {
  --focus: #ffffff;
  position: relative;
  isolation: isolate;
  display: flex;
  align-items: center;
  min-height: clamp(34rem, calc(100vh - var(--nav-h) - var(--nav-line)), 60rem);
  min-height: clamp(34rem, calc(100svh - var(--nav-h) - var(--nav-line)), 60rem);
  padding-block: calc(var(--logo-overhang) + 2.5rem) 5.5rem;
  overflow: hidden;
  background:
    radial-gradient(60% 90% at 88% 25%, rgb(215 3 2 / 0.4), rgb(215 3 2 / 0) 70%),
    linear-gradient(120deg, #180000 0%, #550000 55%, #a50000 100%);
  color: #ffffff;
}

/* Red and black tape along the bottom edge, since this page has been "removed" */
.error-page::after {
  content: "";
  position: absolute;
  inset: auto 0 0;
  height: 0.9rem;
  background: repeating-linear-gradient(-45deg, var(--red) 0 1rem, #111113 1rem 2rem);
}

.error-layout {
  display: grid;
  gap: 0.5rem;
}

/* The giant number. The outline is drawn behind the fill so the italic letters keep clean edges. */
.error-code {
  margin: 0;
  font-family: var(--font-heading);
  font-size: clamp(8rem, 52vw, 15rem);
  font-style: italic;
  font-weight: 800;
  line-height: 0.85;
  letter-spacing: 0.02em;
  color: transparent;
  -webkit-text-stroke: 3px #ffffff;
  paint-order: stroke fill;
  text-shadow: 0 0.06em 0 rgb(0 0 0 / 0.35);
  user-select: none;
}

.error-title {
  margin: 0 0 1.25rem;
  font-family: var(--font-heading);
  font-size: clamp(2.1rem, 9vw, 4.25rem);
  font-style: italic;
  font-weight: 800;
  line-height: 1;
  text-transform: uppercase;
  text-shadow: 0 2px 14px rgb(0 0 0 / 0.35);
}

.error-title-line {
  display: block;
  text-wrap: balance;
}

.error-title-line + .error-title-line {
  margin-top: 0.15em;
}

.error-lead {
  max-width: 34rem;
  margin: 0 0 2rem;
  font-size: clamp(1.1rem, 0.9rem + 0.6vw, 1.3rem);
  font-weight: 500;
  line-height: 1.55;
  color: rgb(255 255 255 / 0.92);
}

/* Shortcuts to the main sections, for visitors who'd rather browse than call */
.error-links {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.6rem 0.9rem;
}

.error-links-label {
  margin: 0;
  font-weight: 600;
  letter-spacing: 0.02em;
  color: rgb(255 255 255 / 0.85);
}

.error-links ul {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem;
  margin: 0;
  padding: 0;
  list-style: none;
}

.error-links a {
  display: inline-block;
  padding: 0.35rem 0.95rem;
  border: 1px solid rgb(255 255 255 / 0.4);
  border-radius: 999px;
  background: rgb(255 255 255 / 0.08);
  color: #ffffff;
  font-weight: 600;
  text-decoration: none;
  transition: background-color 0.15s ease, color 0.15s ease, border-color 0.15s ease;
}

.error-links a:hover {
  border-color: #ffffff;
  background: #ffffff;
  color: #111113;
}

/* Desktop: message on the left, the number towering on the right */
@media (min-width: 62em) {
  .error-layout {
    grid-template-columns: minmax(0, 1fr) auto;
    align-items: center;
    gap: 3rem;
  }

  .error-code {
    grid-column: 2;
    grid-row: 1;
    font-size: clamp(16rem, 30vw, 28rem);
    -webkit-text-stroke-width: 4px;
  }

  .error-content {
    grid-column: 1;
    grid-row: 1;
  }
}

@media (prefers-reduced-motion: no-preference) {
  .error-code {
    animation: error-drop 0.7s cubic-bezier(0.2, 0.8, 0.2, 1) both;
  }

  @keyframes error-drop {
    from {
      opacity: 0;
      transform: translateY(-1.5rem);
    }
  }
}

/* --------------------------------------------------------------------------
   Enter animations
   The hero plays once on load. Everything else fades up as it scrolls into view: main.js adds
   data-reveal to the elements, then .is-in when they enter the screen (with a --reveal-delay so
   groups stagger). The animation only fills backwards, so hover transforms still work afterward.
   The footer is deliberately left out. No JS or reduced motion: everything just shows.
   -------------------------------------------------------------------------- */
@media (prefers-reduced-motion: no-preference) {
  [data-reveal]:not(.is-in) {
    opacity: 0;
    transform: translate(var(--reveal-x, 0), var(--reveal-y, 1.5rem));
  }

  [data-reveal="right"] {
    --reveal-x: 2.5rem;
    --reveal-y: 0;
  }

  [data-reveal].is-in {
    animation: reveal 0.75s cubic-bezier(0.2, 0.8, 0.2, 1) var(--reveal-delay, 0s) backwards;
  }

  @keyframes reveal {
    from {
      opacity: 0;
      transform: translate(var(--reveal-x, 0), var(--reveal-y, 1.5rem));
    }
  }

  /* Hero: each piece rises in one after the other. The poster is already on screen, so this never delays it. */
  .hero-proof,
  .hero-title-line,
  .hero-lead,
  .hero-actions,
  .hero-trust {
    animation: reveal 0.8s cubic-bezier(0.2, 0.8, 0.2, 1) backwards;
  }

  .hero-proof { animation-delay: 0.05s; }
  .hero-title-line:nth-child(1) { animation-delay: 0.15s; }
  .hero-title-line:nth-child(2) { animation-delay: 0.3s; }
  .hero-lead { animation-delay: 0.45s; }
  .hero-actions { animation-delay: 0.6s; }
  .hero-trust { animation-delay: 0.75s; }

  /* The banner on every inner page does the same, so moving between pages feels alike */
  .page-hero .container > * {
    animation: reveal 0.8s cubic-bezier(0.2, 0.8, 0.2, 1) backwards;
  }

  .page-hero .container > :nth-child(1) { animation-delay: 0.05s; }
  .page-hero .container > :nth-child(2) { animation-delay: 0.15s; }
  .page-hero .container > :nth-child(3) { animation-delay: 0.3s; }
  .page-hero .container > :nth-child(4) { animation-delay: 0.45s; }
  .page-hero .container > :nth-child(5) { animation-delay: 0.6s; }
}

/* --------------------------------------------------------------------------
   Reduced motion
   -------------------------------------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    transition-duration: 0.01ms !important;
    transition-delay: 0s !important;
  }
}
