patx/frontlineboats

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Miami Boat Repair &amp; Marine Services | Frontline</title>
  <meta name="description" content="Mobile boat repair and marine services in Miami, FL: electronics, rewiring, outboard service, detailing, audio and lighting across Miami-Dade and Broward." />
  <meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1" />
  <link rel="canonical" href="https://frontlineboats.com/" />
  <meta name="theme-color" content="#131314" />
  <link rel="icon" href="favicon.ico" sizes="any" />
  <link rel="icon" type="image/png" sizes="32x32" href="favicon-32.png" />
  <link rel="icon" type="image/png" sizes="192x192" href="favicon-192.png" />
  <link rel="apple-touch-icon" href="apple-touch-icon.png" />
  <meta property="og:type" content="website" />
  <meta property="og:site_name" content="Frontline Boat Services" />
  <meta property="og:url" content="https://frontlineboats.com/" />
  <meta property="og:locale" content="en_US" />
  <meta property="og:title" content="Miami Boat Repair &amp; Marine Services | Frontline" />
  <meta property="og:description" content="Mobile marine electronics, rewiring, outboard service, detailing, audio, lighting and boat repair across Miami-Dade and Broward." />
  <meta property="og:image" content="https://frontlineboats.com/frontline-og_card.png" />
  <meta property="og:image:width" content="1731" />
  <meta property="og:image:height" content="909" />
  <meta property="og:image:alt" content="Frontline Boat Services social preview card" />
  <meta name="twitter:card" content="summary_large_image" />
  <meta name="twitter:title" content="Miami Boat Repair &amp; Marine Services | Frontline" />
  <meta name="twitter:description" content="Mobile marine electronics, rewiring, outboard service, detailing, audio, lighting and boat repair across Miami-Dade and Broward." />
  <meta name="twitter:image" content="https://frontlineboats.com/frontline-og_card.png" />
  <meta name="twitter:image:alt" content="Frontline Boat Services social preview card" />
  <link rel="preconnect" href="https://fonts.googleapis.com" />
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
  <link href="https://fonts.googleapis.com/css2?family=Bebas+Neue&family=Inter:wght@300;400;500;600&family=Oswald:wght@400;500;600;700&display=swap" rel="stylesheet" />
  <link rel="preload" as="image" href="frontline-hero.png" />
  <script>document.documentElement.classList.add('js');</script>
  <style>
    /* ══ TOKENS ═══════════════════════════════════════════════════════════ */
    :root {
      /* Brand */
      --flame:      #D62B2B;   /* fills, rules, indicators */
      --flame-lite: #F04141;   /* small red text — meets AA on dark */
      --ember:      #FF5C1A;   /* hover / energized */
      --gold:       #C9A84C;   /* certifications only */

      /* Surfaces, darkest to lightest */
      --pitch:   #0C0C0E;      /* acrylic panel face */
      --smoke:   #131314;      /* page */
      --coal:    #171719;      /* alternating band */
      --ash:     #1C1C1F;      /* raised card */
      --steel:   #2C2C30;      /* hairline border */
      --slate:   #3D3D42;      /* stronger border */

      /* Ink */
      --white:   #F0EDE8;
      --engrave: #E6E2DC;      /* panel legend text */
      --mist:    #B4B4B9;      /* body */
      --mist-dim:#8A8A90;      /* captions */

      --font-display: 'Bebas Neue', 'Oswald', sans-serif;
      --font-heading: 'Oswald', sans-serif;
      --font-body:    'Inter', system-ui, sans-serif;

      --gutter: 5vw;
      --engraved: 0 1px 0 rgba(0,0,0,0.85), 0 -1px 0 rgba(255,255,255,0.05);
    }

    *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }

    html { scroll-behavior: smooth; -webkit-text-size-adjust: 100%; }

    body {
      background: var(--smoke);
      color: var(--white);
      font-family: var(--font-body);
      font-size: 16px;
      line-height: 1.6;
      overflow-x: hidden;
    }

    img { max-width: 100%; }

    ::selection { background: var(--flame); color: #fff; }

    :focus-visible {
      outline: 2px solid var(--ember);
      outline-offset: 3px;
    }

    .skip-link {
      position: absolute;
      left: 1rem;
      top: -4rem;
      z-index: 200;
      background: var(--flame);
      color: #fff;
      font-family: var(--font-heading);
      font-size: 0.75rem;
      letter-spacing: 0.14em;
      text-transform: uppercase;
      padding: 0.75rem 1.25rem;
      text-decoration: none;
      transition: top 0.2s ease;
    }

    .skip-link:focus { top: 1rem; }

    /* ══ TYPE UTILITIES ═══════════════════════════════════════════════════ */
    .eyebrow {
      display: inline-flex;
      align-items: center;
      gap: 0.6rem;
      font-family: var(--font-heading);
      font-size: 0.7rem;
      font-weight: 600;
      letter-spacing: 0.22em;
      text-transform: uppercase;
      color: var(--flame-lite);
      margin-bottom: 0.9rem;
    }

    .eyebrow::before {
      content: '';
      width: 26px;
      height: 2px;
      background: var(--flame);
      flex-shrink: 0;
    }

    .display {
      font-family: var(--font-display);
      font-size: clamp(2.5rem, 5.2vw, 4.1rem);
      font-weight: 400;
      line-height: 0.96;
      letter-spacing: 0.015em;
      color: var(--white);
      margin-bottom: 1.25rem;
    }

    .display .accent { color: var(--flame); }

    .lede {
      font-size: 1rem;
      font-weight: 300;
      color: var(--mist);
      max-width: 58ch;
      line-height: 1.75;
    }

    .lede + .lede { margin-top: 1rem; }

    /* Engraved panel legend — the page's signature type treatment */
    .legend {
      font-family: var(--font-heading);
      font-size: 0.66rem;
      font-weight: 600;
      letter-spacing: 0.2em;
      text-transform: uppercase;
      color: var(--engrave);
      text-shadow: var(--engraved);
    }

    /* ══ BUTTONS ══════════════════════════════════════════════════════════ */
    .btn {
      display: inline-block;
      font-family: var(--font-heading);
      font-size: 0.8rem;
      font-weight: 500;
      letter-spacing: 0.15em;
      text-transform: uppercase;
      padding: 1rem 2rem;
      border: 1px solid transparent;
      cursor: pointer;
      text-decoration: none;
      text-align: center;
      transition: background 0.2s ease, border-color 0.2s ease, color 0.2s ease, transform 0.15s ease;
    }

    .btn--primary {
      background: var(--flame);
      color: #fff;
    }

    .btn--primary:hover { background: var(--ember); transform: translateY(-1px); }

    .btn--ghost {
      background: transparent;
      color: var(--white);
      border-color: var(--slate);
    }

    .btn--ghost:hover { border-color: var(--flame); color: var(--flame-lite); }

    /* ══ NAV ══════════════════════════════════════════════════════════════ */
    .nav {
      position: fixed;
      top: 0; left: 0; right: 0;
      z-index: 100;
      display: flex;
      align-items: center;
      justify-content: space-between;
      gap: 1.5rem;
      padding: 0 var(--gutter);
      height: 108px;
      background: rgba(15,15,16,0.74);
      backdrop-filter: blur(10px);
      -webkit-backdrop-filter: blur(10px);
      border-bottom: 1px solid transparent;
      transition: height 0.25s ease, background 0.25s ease, border-color 0.25s ease, box-shadow 0.25s ease;
    }

    .nav.is-scrolled,
    .nav.is-open {
      height: 64px;
      background: rgba(15,15,16,0.94);
      border-bottom-color: var(--steel);
      box-shadow: 0 4px 24px rgba(0,0,0,0.55);
    }

    .nav-logo { display: inline-flex; align-items: center; text-decoration: none; flex-shrink: 0; }

    .nav-logo img {
      width: 230px;
      height: auto;
      display: block;
      transition: width 0.25s ease;
    }

    .nav.is-scrolled .nav-logo img,
    .nav.is-open .nav-logo img { width: 132px; }

    .nav-links {
      display: flex;
      gap: 1.9rem;
      list-style: none;
    }

    .nav-links a {
      position: relative;
      font-family: var(--font-heading);
      font-size: 0.78rem;
      font-weight: 500;
      letter-spacing: 0.13em;
      text-transform: uppercase;
      color: var(--mist);
      text-decoration: none;
      white-space: nowrap;
      transition: color 0.2s;
    }

    .nav-links a::after {
      content: '';
      position: absolute;
      left: 0;
      bottom: -0.45rem;
      width: 24px;
      height: 2px;
      background: var(--flame);
      transform: scaleX(0);
      transform-origin: left;
      transition: transform 0.2s ease;
    }

    .nav-links a:hover,
    .nav-links a.is-active { color: var(--flame-lite); }

    .nav-links a:hover::after,
    .nav-links a.is-active::after { transform: scaleX(1); }

    .nav-actions { display: flex; align-items: center; gap: 0.75rem; }

    .nav-cta {
      font-family: var(--font-heading);
      font-size: 0.74rem;
      font-weight: 500;
      letter-spacing: 0.12em;
      text-transform: uppercase;
      white-space: nowrap;
      background: var(--flame);
      color: #fff;
      padding: 0.6rem 1.2rem;
      border: 1px solid var(--flame);
      cursor: pointer;
      text-decoration: none;
      transition: background 0.2s, color 0.2s;
    }

    .nav-cta:hover { background: var(--ember); border-color: var(--ember); }

    .nav-cta--call {
      background: transparent;
      color: var(--white);
    }

    .nav-cta--call:hover { background: var(--flame); border-color: var(--flame); color: #fff; }

    .nav-cta--social {
      display: inline-flex;
      align-items: center;
      justify-content: center;
      gap: 0.5rem;
      background: transparent;
      border-color: var(--slate);
      color: var(--white);
      padding: 0.55rem 0.7rem;
    }

    .nav-cta--social:hover { background: var(--flame); border-color: var(--flame); color: #fff; }

    /* Icon only until the nav collapses, where it gets a label like the others */
    .nav-social-label { display: none; }

    .nav-toggle {
      display: none;
      width: 46px;
      height: 46px;
      border: 1px solid var(--slate);
      background: transparent;
      color: var(--white);
      cursor: pointer;
      align-items: center;
      justify-content: center;
      flex-direction: column;
      gap: 5px;
    }

    .nav-toggle span {
      width: 20px;
      height: 2px;
      background: currentColor;
      transition: transform 0.2s ease, opacity 0.2s ease;
    }

    .nav-toggle[aria-expanded="true"] span:nth-child(1) { transform: translateY(7px) rotate(45deg); }
    .nav-toggle[aria-expanded="true"] span:nth-child(2) { opacity: 0; }
    .nav-toggle[aria-expanded="true"] span:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }

    /* ══ HERO ═════════════════════════════════════════════════════════════ */
    .hero {
      position: relative;
      min-height: 100vh;
      display: flex;
      align-items: flex-end;
      /* Top padding clears the nav so the headline can never slide under it
         on short viewports — the hero grows instead of clipping. */
      padding: calc(108px + 2.5rem) var(--gutter) 8vh;
      overflow: hidden;
    }

    .hero-bg {
      position: absolute;
      inset: 0;
      background:
        linear-gradient(to right, rgba(8,8,9,0.96) 34%, rgba(8,8,9,0.45) 100%),
        linear-gradient(to top, rgba(8,8,9,0.9), rgba(8,8,9,0) 45%),
        url('frontline-hero.png') center/cover no-repeat;
    }

    /* Diagonal red slash bleeding off the right edge — carried from the mark */
    .hero-slash {
      position: absolute;
      top: 0; right: -60px;
      width: 180px;
      height: 100%;
      background: var(--flame);
      transform: skewX(-8deg);
      opacity: 0.09;
      pointer-events: none;
    }

    .hero-slash::after {
      content: '';
      position: absolute;
      top: 0; left: -100px;
      width: 60px;
      height: 100%;
      background: var(--ember);
      opacity: 0.5;
    }

    .hero-content {
      position: relative;
      z-index: 2;
      max-width: 44rem;
      width: 100%;
    }

    /* Hero eyebrow reads as a live panel circuit */
    .hero-eyebrow {
      display: inline-flex;
      align-items: center;
      gap: 0.7rem;
      margin-bottom: 1.4rem;
    }

    .hero-eyebrow .legend { color: var(--engrave); }

    .led {
      width: 9px;
      height: 9px;
      border-radius: 50%;
      flex-shrink: 0;
      background: var(--flame);
      box-shadow: 0 0 0 3px rgba(214,43,43,0.16), 0 0 12px rgba(255,92,26,0.8);
      animation: pulse 3.2s ease-in-out infinite;
    }

    @keyframes pulse {
      0%, 100% { box-shadow: 0 0 0 3px rgba(214,43,43,0.16), 0 0 12px rgba(255,92,26,0.75); }
      50%      { box-shadow: 0 0 0 5px rgba(214,43,43,0.08), 0 0 18px rgba(255,92,26,0.95); }
    }

    .hero-title {
      font-family: var(--font-display);
      font-size: clamp(3.4rem, 8.4vw, 6.8rem);
      line-height: 0.9;
      letter-spacing: 0.015em;
      color: var(--white);
      margin-bottom: 1rem;
    }

    .hero-title .accent { color: var(--flame); }

    .hero-sub {
      font-family: var(--font-heading);
      font-size: clamp(0.95rem, 2vw, 1.25rem);
      font-weight: 400;
      letter-spacing: 0.09em;
      text-transform: uppercase;
      color: var(--mist);
      margin-bottom: 1.6rem;
      max-width: 48ch;
    }

    .hero-body {
      font-size: 1.02rem;
      font-weight: 300;
      color: var(--mist);
      max-width: 52ch;
      margin-bottom: 2.4rem;
      line-height: 1.75;
    }

    .hero-body strong {
      font-family: var(--font-heading);
      font-size: 1.06em;
      font-weight: 600;
      letter-spacing: 0.05em;
      text-transform: uppercase;
      color: var(--flame-lite);
    }

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

    /* ══ TRUST BAR ════════════════════════════════════════════════════════ */
    .trust-bar {
      background: var(--ash);
      border-top: 1px solid var(--steel);
      border-bottom: 1px solid var(--steel);
      padding: 1.25rem var(--gutter);
      display: flex;
      align-items: center;
      gap: 2.4rem;
      flex-wrap: wrap;
      justify-content: center;
    }

    .trust-item {
      display: flex;
      align-items: center;
      gap: 0.6rem;
      font-family: var(--font-heading);
      font-size: 0.74rem;
      font-weight: 500;
      letter-spacing: 0.12em;
      text-transform: uppercase;
      color: var(--mist);
    }

    .trust-item svg { flex-shrink: 0; color: var(--flame); }

    .trust-divider { width: 1px; height: 20px; background: var(--steel); }

    /* ══ SECTION SHELL ════════════════════════════════════════════════════ */
    .section {
      padding: 7rem var(--gutter);
      scroll-margin-top: 76px;
    }

    .section--band { background: var(--coal); }

    .section-head { max-width: 62rem; margin-bottom: 3.5rem; }

    .section-head--split {
      display: grid;
      grid-template-columns: minmax(0, 1fr) minmax(0, 0.9fr);
      gap: 3rem;
      align-items: end;
      max-width: none;
    }

    .section-head--split .display { margin-bottom: 0; }

    /* ══ SERVICES — BENTO ═════════════════════════════════════════════════ */
    /* Asymmetric grid: the two trades Frontline is known for get the room,
       the rest fill in around them. */
    .bento {
      display: grid;
      gap: 1px;
      background: var(--steel);
      border: 1px solid var(--steel);
      grid-template-columns: repeat(6, minmax(0, 1fr));
      grid-template-areas:
        "elec elec elec elec wir  wir"
        "elec elec elec elec wir  wir"
        "out  out  det  det  serv serv"
        "aud  aud  aud  aud  aud  aud"
        "bus  bus  bus  bus  bus  bus";
    }

    .b-elec { grid-area: elec; }
    .b-wir  { grid-area: wir;  }
    .b-out  { grid-area: out;  }
    .b-det  { grid-area: det;  }
    .b-serv { grid-area: serv; }
    .b-aud  { grid-area: aud;  }

    .tile {
      position: relative;
      display: flex;
      flex-direction: column;
      background: var(--pitch);
    }

    .tile-figure {
      position: relative;
      overflow: hidden;
      background: var(--ash);
    }

    .tile-figure img {
      position: absolute;
      inset: 0;
      width: 100%;
      height: 100%;
      object-fit: cover;
      filter: contrast(1.02);
      transform: scale(1.01);
      transition: transform 0.6s ease;
    }

    .tile:hover .tile-figure img { transform: scale(1.05); }

    .tile-body {
      position: relative;
      display: flex;
      flex-direction: column;
      flex: 1;
      padding: 1.9rem 1.75rem 2rem;
      /* acrylic face + sheen */
      background:
        linear-gradient(154deg, rgba(255,255,255,0.05) 0%, rgba(255,255,255,0) 45%),
        var(--pitch);
    }

    .tile-legend {
      display: block;
      margin-bottom: 0.5rem;
      font-size: 0.61rem;
      letter-spacing: 0.19em;
      line-height: 1.6;
    }

    .tile-name {
      font-family: var(--font-display);
      font-size: clamp(1.55rem, 2vw, 1.95rem);
      line-height: 1;
      letter-spacing: 0.02em;
      color: var(--white);
      padding-bottom: 0.95rem;
      margin-bottom: 0.95rem;
      border-bottom: 1px solid rgba(255,255,255,0.1);
    }

    .tile-desc {
      font-size: 0.875rem;
      font-weight: 300;
      color: var(--mist);
      line-height: 1.7;
      margin-bottom: 1.3rem;
      max-width: 46ch;
    }

    .tile-list {
      list-style: none;
      display: grid;
      grid-template-columns: repeat(auto-fit, minmax(min(100%, 9.5rem), 1fr));
      gap: 0.5rem 1.25rem;
      margin-top: auto;
    }

    .tile-list li {
      position: relative;
      padding-left: 0.95rem;
      font-size: 0.8rem;
      font-weight: 300;
      color: var(--mist-dim);
      line-height: 1.5;
    }

    .tile-list li::before {
      content: '';
      position: absolute;
      left: 0;
      top: 0.6em;
      width: 7px;
      height: 2px;
      background: var(--flame);
    }

    /* Feature tile — photo runs full bleed, copy sits on the scrim */
    .tile--feature .tile-figure {
      position: absolute;
      inset: 0;
    }

    .tile--feature .tile-figure::after {
      content: '';
      position: absolute;
      inset: 0;
      background:
        linear-gradient(to top, rgba(8,8,9,0.96) 30%, rgba(8,8,9,0.72) 62%, rgba(8,8,9,0.25) 100%),
        linear-gradient(to right, rgba(8,8,9,0.7) 0%, rgba(8,8,9,0) 65%);
    }

    .tile--feature .tile-body {
      justify-content: flex-end;
      min-height: 27rem;
      padding: 2.5rem;
      background: none;
    }

    .tile--feature .tile-name {
      font-size: clamp(2rem, 3.2vw, 3rem);
      padding-bottom: 1.1rem;
      margin-bottom: 1.1rem;
      border-bottom-color: rgba(255,255,255,0.22);
    }

    .tile--feature .tile-desc {
      color: var(--white);
      opacity: 0.82;
      max-width: 42ch;
      margin-bottom: 1.5rem;
    }

    .tile--feature .tile-list {
      margin-top: 0;
      max-width: 38rem;
      grid-template-columns: repeat(2, minmax(0, 1fr));
    }

    .tile--feature .tile-list li { color: var(--mist); }

    /* Tall tile — photo on top, copy beneath */
    .tile--tall .tile-figure { flex: 0 0 34%; min-height: 9rem; }

    /* Medium tiles */
    .tile--med .tile-figure { flex: 0 0 9.5rem; }

    /* Wide banner tile — photo beside the copy */
    .tile--wide { flex-direction: row; }
    .tile--wide .tile-figure { flex: 0 0 38%; min-height: 14rem; }
    .tile--wide .tile-body { padding: 2.25rem 2.25rem 2.4rem; }
    .tile--wide .tile-name { font-size: clamp(1.7rem, 2.4vw, 2.3rem); }
    .tile--wide .tile-desc { max-width: 58ch; }
    .tile--wide .tile-list { grid-template-columns: repeat(3, minmax(0, 1fr)); max-width: 46rem; }

    /* Bus bar closing the grid */
    .bento-bus {
      grid-area: bus;
      background: #0A0A0C;
      padding: 1.5rem clamp(1.5rem, 2.6vw, 2.5rem);
      display: flex;
      align-items: center;
      justify-content: space-between;
      gap: 1.5rem;
      flex-wrap: wrap;
    }

    .bento-bus p {
      font-size: 0.92rem;
      font-weight: 300;
      color: var(--mist);
      max-width: 56ch;
    }

    .bento-bus a {
      font-family: var(--font-heading);
      font-size: 0.78rem;
      font-weight: 500;
      letter-spacing: 0.13em;
      text-transform: uppercase;
      color: var(--flame-lite);
      text-decoration: none;
      white-space: nowrap;
      border-bottom: 1px solid rgba(240,65,65,0.4);
      padding-bottom: 2px;
      transition: color 0.2s, border-color 0.2s;
    }

    .bento-bus a:hover { color: var(--ember); border-color: var(--ember); }

    /* ══ ABOUT ════════════════════════════════════════════════════════════ */
    .about {
      display: grid;
      grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
      gap: 4.5rem;
      align-items: center;
      padding: 7rem var(--gutter);
      background: var(--ash);
      scroll-margin-top: 76px;
    }

    .about-visual {
      position: relative;
      align-self: stretch;
      min-height: clamp(30rem, 62vh, 44rem);
    }

    .about-img {
      width: 100%;
      height: 100%;
      min-height: inherit;
      object-fit: cover;
      object-position: center;
      display: block;
      background: linear-gradient(135deg, #1a1a1a, #2e2e2e);
    }

    .fr-badge {
      position: absolute;
      bottom: 1.25rem;
      right: -1.25rem;
      background: var(--smoke);
      border: 2px solid var(--flame);
      padding: 1rem 1.25rem;
      display: flex;
      align-items: center;
      gap: 0.85rem;
      box-shadow: 0 18px 40px -20px rgba(0,0,0,0.9);
    }

    .fr-badge-flag { width: 44px; flex-shrink: 0; }

    .fr-badge-text {
      font-family: var(--font-heading);
      font-size: 0.72rem;
      font-weight: 500;
      letter-spacing: 0.12em;
      text-transform: uppercase;
      color: var(--flame-lite);
      line-height: 1.35;
    }

    .credentials {
      display: flex;
      gap: 2.5rem;
      margin-top: 2.75rem;
      flex-wrap: wrap;
    }

    .credential { display: flex; flex-direction: column; gap: 0.3rem; max-width: 15rem; }

    .credential-mark {
      font-family: var(--font-display);
      font-size: 2.4rem;
      line-height: 1;
      color: var(--flame);
    }

    .credential-mark--gold { color: var(--gold); }

    .credential-label {
      font-family: var(--font-heading);
      font-size: 0.68rem;
      font-weight: 500;
      letter-spacing: 0.14em;
      text-transform: uppercase;
      color: var(--mist-dim);
      line-height: 1.5;
    }

    /* ══ REVIEWS ══════════════════════════════════════════════════════════ */
    .rating-summary {
      display: flex;
      align-items: center;
      gap: 1.25rem;
      flex-wrap: wrap;
    }

    .stars {
      display: inline-flex;
      gap: 4px;
      color: var(--flame);
    }

    .rating-score {
      font-family: var(--font-display);
      font-size: 3rem;
      line-height: 0.9;
      color: var(--white);
    }

    .rating-meta {
      font-family: var(--font-heading);
      font-size: 0.72rem;
      font-weight: 500;
      letter-spacing: 0.15em;
      text-transform: uppercase;
      color: var(--mist-dim);
      margin-top: 0.45rem;
    }

    .reviews {
      display: grid;
      grid-template-columns: repeat(auto-fit, minmax(min(100%, 18rem), 1fr));
      gap: 1px;
      background: var(--steel);
      border: 1px solid var(--steel);
    }

    .review {
      background: var(--smoke);
      padding: 2.5rem 2rem;
      display: flex;
      flex-direction: column;
      gap: 1.4rem;
    }

    .review blockquote {
      flex: 1;
      font-size: 0.95rem;
      font-weight: 300;
      color: var(--mist);
      line-height: 1.75;
    }

    .review-attrib {
      border-top: 1px solid var(--steel);
      padding-top: 1.3rem;
    }

    .review-name {
      font-family: var(--font-heading);
      font-size: 0.84rem;
      font-weight: 600;
      letter-spacing: 0.1em;
      text-transform: uppercase;
      color: var(--white);
    }

    .review-source {
      font-family: var(--font-heading);
      font-size: 0.64rem;
      font-weight: 500;
      letter-spacing: 0.17em;
      text-transform: uppercase;
      color: var(--mist-dim);
      margin-top: 0.35rem;
    }

    /* ══ GALLERY ══════════════════════════════════════════════════════════ */
    .filters {
      display: flex;
      flex-wrap: wrap;
      gap: 0.6rem;
      margin-bottom: 2.5rem;
    }

    /* Filters use the same panel language as the services section */
    .filter {
      display: inline-flex;
      align-items: center;
      gap: 0.6rem;
      background: var(--pitch);
      border: 1px solid var(--steel);
      color: var(--mist);
      font-family: var(--font-heading);
      font-size: 0.72rem;
      font-weight: 500;
      letter-spacing: 0.14em;
      text-transform: uppercase;
      padding: 0.65rem 1.1rem;
      cursor: pointer;
      transition: border-color 0.2s ease, color 0.2s ease, background 0.2s ease;
    }

    .filter::before {
      content: '';
      width: 7px;
      height: 7px;
      border-radius: 50%;
      background: var(--slate);
      transition: background 0.2s ease, box-shadow 0.2s ease;
    }

    .filter:hover { border-color: var(--slate); color: var(--white); }

    .filter[aria-pressed="true"] {
      color: var(--white);
      border-color: var(--flame);
      background: rgba(214,43,43,0.09);
    }

    .filter[aria-pressed="true"]::before {
      background: var(--flame);
      box-shadow: 0 0 9px rgba(255,92,26,0.9);
    }

    .filter-count {
      font-size: 0.66rem;
      color: var(--mist-dim);
      letter-spacing: 0.08em;
    }

    .shots {
      display: grid;
      grid-template-columns: repeat(auto-fill, minmax(min(100%, 17rem), 1fr));
      gap: 1px;
      background: var(--steel);
      border: 1px solid var(--steel);
    }

    .shot {
      position: relative;
      display: block;
      width: 100%;
      aspect-ratio: 4 / 5;
      border: 0;
      padding: 0;
      background: var(--ash);
      overflow: hidden;
      cursor: pointer;
      isolation: isolate;
    }

    .shot[hidden] { display: none; }

    .shot-img {
      width: 100%;
      height: 100%;
      object-fit: cover;
      display: block;
      filter: saturate(0.9) contrast(1.03);
      transform: scale(1.01);
      transition: transform 0.5s ease, filter 0.5s ease;
    }

    .shot::after {
      content: '';
      position: absolute;
      inset: 0;
      background: linear-gradient(to top, rgba(8,8,9,0.85) 0%, rgba(8,8,9,0.1) 42%, rgba(214,43,43,0.1) 100%);
      opacity: 0.9;
      transition: opacity 0.35s ease;
      pointer-events: none;
    }

    .shot:hover .shot-img,
    .shot:focus-visible .shot-img {
      transform: scale(1.06);
      filter: saturate(1.05) contrast(1.07);
    }

    .shot:hover::after { opacity: 0.75; }

    .shot-tag {
      position: absolute;
      left: 1rem;
      bottom: 1rem;
      right: 1rem;
      z-index: 1;
      font-family: var(--font-heading);
      font-size: 0.66rem;
      font-weight: 500;
      letter-spacing: 0.16em;
      text-transform: uppercase;
      color: var(--engrave);
      text-align: left;
      text-shadow: 0 1px 4px rgba(0,0,0,0.9);
    }

    .shot-tag::before {
      content: '';
      display: block;
      width: 20px;
      height: 2px;
      background: var(--flame);
      margin-bottom: 0.55rem;
    }

    .gallery-more {
      display: flex;
      justify-content: center;
      margin-top: 2.5rem;
    }

    .gallery-empty {
      padding: 3rem 0;
      text-align: center;
      color: var(--mist-dim);
      font-family: var(--font-heading);
      font-size: 0.8rem;
      letter-spacing: 0.14em;
      text-transform: uppercase;
    }

    /* ══ LIGHTBOX ═════════════════════════════════════════════════════════ */
    .lightbox {
      position: fixed;
      inset: 0;
      z-index: 1000;
      display: grid;
      place-items: center;
      padding: clamp(1rem, 4vw, 3.5rem);
      background: rgba(8,8,9,0.72);
      backdrop-filter: blur(20px);
      -webkit-backdrop-filter: blur(20px);
      opacity: 0;
      visibility: hidden;
      pointer-events: none;
      transition: opacity 0.2s ease, visibility 0.2s ease;
    }

    .lightbox.is-open { opacity: 1; visibility: visible; pointer-events: auto; }

    .lightbox-figure {
      display: flex;
      flex-direction: column;
      align-items: center;
      gap: 1rem;
      max-height: 100%;
    }

    .lightbox-figure img {
      max-width: 100%;
      max-height: 78vh;
      object-fit: contain;
      box-shadow: 0 30px 80px -30px rgba(0,0,0,0.9);
    }

    .lightbox-caption {
      display: flex;
      align-items: baseline;
      gap: 1rem;
      flex-wrap: wrap;
      justify-content: center;
      text-align: center;
      max-width: 62ch;
    }

    .lightbox-index {
      font-family: var(--font-heading);
      font-size: 0.72rem;
      font-weight: 600;
      letter-spacing: 0.16em;
      color: var(--flame-lite);
      white-space: nowrap;
    }

    .lightbox-text {
      font-size: 0.88rem;
      font-weight: 300;
      color: var(--mist);
    }

    .lightbox-btn {
      position: fixed;
      display: inline-flex;
      align-items: center;
      justify-content: center;
      width: 48px;
      height: 48px;
      border: 1px solid var(--slate);
      background: rgba(12,12,14,0.85);
      color: var(--white);
      cursor: pointer;
      transition: border-color 0.2s ease, color 0.2s ease;
    }

    .lightbox-btn:hover { border-color: var(--flame); color: var(--flame-lite); }

    .lightbox-close { top: 1.25rem; right: 1.25rem; }
    .lightbox-prev  { left: 1.25rem;  top: 50%; transform: translateY(-50%); }
    .lightbox-next  { right: 1.25rem; top: 50%; transform: translateY(-50%); }

    body.is-locked { overflow: hidden; }

    /* ══ SERVICE AREAS ════════════════════════════════════════════════════ */
    .areas {
      display: grid;
      grid-template-columns: repeat(auto-fit, minmax(min(100%, 20rem), 1fr));
      gap: 1px;
      background: var(--steel);
      border: 1px solid var(--steel);
      margin-top: 3.5rem;
    }

    .area {
      background: var(--ash);
      padding: 2.75rem 2.25rem;
      min-height: 15rem;
    }

    .area-name {
      font-family: var(--font-display);
      font-size: clamp(2.4rem, 5vw, 3.6rem);
      line-height: 1;
      color: var(--white);
      margin-bottom: 0.35rem;
    }

    .area-label {
      font-family: var(--font-heading);
      font-size: 0.72rem;
      font-weight: 600;
      letter-spacing: 0.15em;
      text-transform: uppercase;
      color: var(--flame-lite);
      margin-bottom: 1.1rem;
    }

    .area-copy {
      font-size: 0.92rem;
      font-weight: 300;
      color: var(--mist);
      line-height: 1.7;
    }

    /* ══ LOCAL SERVICE FAQ ════════════════════════════════════════════════ */
    .faq-grid {
      display: grid;
      grid-template-columns: repeat(2, minmax(0, 1fr));
      gap: 1px;
      background: var(--steel);
      border: 1px solid var(--steel);
    }

    .faq-item {
      background: var(--pitch);
      padding: 2rem;
    }

    .faq-question {
      font-family: var(--font-heading);
      font-size: 1rem;
      font-weight: 600;
      line-height: 1.4;
      color: var(--white);
      margin-bottom: 0.8rem;
    }

    .faq-answer {
      font-size: 0.9rem;
      font-weight: 300;
      color: var(--mist);
      line-height: 1.75;
    }

    .faq-answer a {
      color: var(--flame-lite);
      text-decoration-color: rgba(240,65,65,0.45);
      text-underline-offset: 3px;
    }

    /* ══ CONTACT ══════════════════════════════════════════════════════════ */
    .contact {
      display: grid;
      grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
      gap: 4.5rem;
      align-items: start;
      padding: 7rem var(--gutter);
      background: var(--ash);
      scroll-margin-top: 76px;
    }

    .contact-info {
      display: flex;
      flex-direction: column;
      gap: 1.6rem;
      margin-top: 2.5rem;
    }

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

    .contact-icon {
      width: 20px;
      height: 20px;
      color: var(--flame);
      flex-shrink: 0;
      margin-top: 3px;
    }

    .contact-label {
      font-family: var(--font-heading);
      font-size: 0.65rem;
      font-weight: 500;
      letter-spacing: 0.18em;
      text-transform: uppercase;
      color: var(--mist-dim);
      margin-bottom: 0.15rem;
    }

    .contact-value {
      font-size: 1rem;
      color: var(--white);
      text-decoration: none;
    }

    a.contact-value:hover { color: var(--flame-lite); }

    .social-row { display: flex; gap: 0.75rem; margin-top: 0.5rem; flex-wrap: wrap; }

    .social-btn {
      display: inline-flex;
      align-items: center;
      gap: 0.6rem;
      font-family: var(--font-heading);
      font-size: 0.76rem;
      font-weight: 600;
      letter-spacing: 0.11em;
      text-transform: uppercase;
      color: var(--white);
      background: var(--smoke);
      border: 1px solid var(--steel);
      padding: 0.8rem 1.15rem;
      text-decoration: none;
      transition: background 0.2s, border-color 0.2s, color 0.2s;
    }

    .social-btn svg { color: var(--flame); transition: color 0.2s; }

    .social-btn:hover {
      background: var(--flame);
      border-color: var(--flame);
      color: #fff;
    }

    .social-btn:hover svg { color: #fff; }

    /* Form */
    .quote-form {
      display: flex;
      flex-direction: column;
      gap: 1rem;
      background: var(--smoke);
      border: 1px solid var(--steel);
      padding: 2.25rem;
    }

    .form-title {
      font-family: var(--font-display);
      font-size: 1.75rem;
      line-height: 1;
      color: var(--white);
      margin-bottom: 0.35rem;
    }

    .form-note {
      font-size: 0.85rem;
      font-weight: 300;
      color: var(--mist-dim);
      margin-bottom: 0.75rem;
    }

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

    .form-label {
      font-family: var(--font-heading);
      font-size: 0.65rem;
      font-weight: 500;
      letter-spacing: 0.18em;
      text-transform: uppercase;
      color: var(--mist-dim);
      margin-bottom: 0.4rem;
    }

    .form-input,
    .form-select,
    .form-textarea {
      background: var(--pitch);
      border: 1px solid var(--steel);
      color: var(--white);
      font-family: var(--font-body);
      font-size: 0.95rem;
      padding: 0.8rem 1rem;
      outline: none;
      transition: border-color 0.2s;
      width: 100%;
    }

    .form-input::placeholder,
    .form-textarea::placeholder { color: #5A5A5F; }

    .form-input:focus,
    .form-select:focus,
    .form-textarea:focus { border-color: var(--flame); }

    .form-input:disabled,
    .form-select:disabled,
    .form-textarea:disabled { opacity: 0.5; }

    .form-select { appearance: none; cursor: pointer; }

    .form-textarea { resize: vertical; min-height: 7rem; }

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

    .form-submit { width: 100%; padding: 1.1rem 1rem; font-size: 0.85rem; }

    .form-fine {
      font-size: 0.76rem;
      color: var(--mist-dim);
      text-align: center;
      line-height: 1.6;
    }

    .form-error {
      display: none;
      font-size: 0.82rem;
      color: var(--flame-lite);
      text-align: center;
      line-height: 1.6;
    }

    .form-error.is-visible { display: block; }

    .form-success {
      display: none;
      border: 1px solid var(--flame);
      background: rgba(214,43,43,0.08);
      padding: 2rem 1.5rem;
      text-align: center;
    }

    .quote-form.is-sent .form-success { display: block; }
    .quote-form.is-sent > :not(.form-success) { display: none; }

    .form-success h3 {
      font-family: var(--font-display);
      font-size: 1.6rem;
      line-height: 1;
      color: var(--white);
      margin-bottom: 0.75rem;
    }

    .form-success p {
      font-size: 0.9rem;
      font-weight: 300;
      color: var(--mist);
      line-height: 1.7;
    }

    .form-success a { color: var(--flame-lite); }

    /* ══ STICKY CALL ══════════════════════════════════════════════════════ */
    .sticky-call {
      position: fixed;
      left: 50%;
      bottom: 1.25rem;
      z-index: 90;
      display: inline-flex;
      align-items: center;
      gap: 0.85rem;
      min-width: min(92vw, 26rem);
      padding: 0.8rem 1rem;
      background: #101012;
      border: 1px solid var(--flame);
      box-shadow: 0 16px 40px -12px rgba(0,0,0,0.8);
      color: var(--white);
      text-decoration: none;
      transform: translate(-50%, calc(100% + 2rem));
      opacity: 0;
      pointer-events: none;
      transition: transform 0.25s ease, opacity 0.25s ease;
    }

    .sticky-call.is-visible {
      transform: translate(-50%, 0);
      opacity: 1;
      pointer-events: auto;
    }

    .sticky-call-icon {
      width: 42px;
      height: 42px;
      display: inline-flex;
      align-items: center;
      justify-content: center;
      flex-shrink: 0;
      background: var(--flame);
      color: #fff;
    }

    .sticky-call-copy { display: flex; flex-direction: column; line-height: 1.25; }

    .sticky-call-label {
      font-family: var(--font-heading);
      font-size: 0.66rem;
      font-weight: 500;
      letter-spacing: 0.16em;
      text-transform: uppercase;
      color: var(--mist);
    }

    .sticky-call-number {
      font-family: var(--font-heading);
      font-size: 1.05rem;
      font-weight: 500;
      letter-spacing: 0.04em;
      color: var(--white);
    }

    /* ══ FOOTER ═══════════════════════════════════════════════════════════ */
    .footer {
      background: #101012;
      border-top: 1px solid var(--steel);
      padding: 3.5rem var(--gutter) 2rem;
    }

    .footer-grid {
      display: grid;
      grid-template-columns: minmax(0, 1.4fr) repeat(2, minmax(0, 1fr));
      gap: 3rem;
      padding-bottom: 2.5rem;
      border-bottom: 1px solid var(--steel);
    }

    .footer-logo img { width: 230px; height: auto; display: block; margin-bottom: 1.25rem; }

    .footer-social { display: flex; gap: 0.6rem; margin-top: 1.5rem; }

    .footer-social-btn {
      width: 42px;
      height: 42px;
      display: inline-flex;
      align-items: center;
      justify-content: center;
      border: 1px solid var(--steel);
      color: var(--mist);
      text-decoration: none;
      transition: background 0.2s ease, border-color 0.2s ease, color 0.2s ease;
    }

    .footer-social-btn:hover {
      background: var(--flame);
      border-color: var(--flame);
      color: #fff;
    }

    .footer-blurb {
      font-size: 0.86rem;
      font-weight: 300;
      color: var(--mist-dim);
      line-height: 1.7;
      max-width: 34ch;
    }

    .footer-col-title {
      font-family: var(--font-heading);
      font-size: 0.68rem;
      font-weight: 600;
      letter-spacing: 0.18em;
      text-transform: uppercase;
      color: var(--white);
      margin-bottom: 1.1rem;
    }

    .footer-list { list-style: none; display: flex; flex-direction: column; gap: 0.6rem; }

    .footer-list a,
    .footer-list span {
      font-size: 0.86rem;
      font-weight: 300;
      color: var(--mist-dim);
      text-decoration: none;
      transition: color 0.2s;
    }

    .footer-list a:hover { color: var(--flame-lite); }

    .footer-base {
      display: flex;
      align-items: center;
      justify-content: space-between;
      gap: 1rem;
      flex-wrap: wrap;
      padding-top: 1.75rem;
    }

    .footer-note { font-size: 0.76rem; color: #5F5F64; font-weight: 300; }

    /* ══ SCROLL REVEAL ════════════════════════════════════════════════════ */
    .js [data-reveal] {
      opacity: 0;
      transform: translateY(16px);
      transition: opacity 0.6s ease, transform 0.6s ease;
    }

    .js [data-reveal].is-inview { opacity: 1; transform: none; }

    /* ══ RESPONSIVE ═══════════════════════════════════════════════════════ */
    /* Six links, two social icons and two CTAs need ~1250px — collapse below that */
    @media (max-width: 1240px) {
      .nav {
        height: auto;
        min-height: 92px;
        flex-wrap: wrap;
        gap: 0.75rem;
        padding: 0.5rem var(--gutter);
      }

      .nav.is-scrolled,
      .nav.is-open { height: auto; min-height: 64px; }

      .nav-logo { flex: 1; min-width: 0; }
      .nav-logo img { width: min(56vw, 200px); }

      .nav.is-scrolled .nav-logo img,
      .nav.is-open .nav-logo img { width: 132px; }

      .nav-toggle { display: flex; position: relative; z-index: 2; }

      .nav-links {
        order: 3;
        width: 100%;
        flex-direction: column;
        align-items: stretch;
        gap: 0.25rem;
        max-height: 0;
        margin-top: 0;
        padding: 0;
        overflow: hidden;
        opacity: 0;
        visibility: hidden;
        pointer-events: none;
        background: #101012;
        border-top: 1px solid transparent;
        transition: max-height 0.28s ease, margin-top 0.28s ease, padding 0.28s ease, opacity 0.2s ease, visibility 0.2s ease, border-color 0.2s ease;
      }

      .nav.is-open .nav-links {
        max-height: 28rem;
        margin-top: 0.5rem;
        padding: 0.75rem;
        opacity: 1;
        visibility: visible;
        pointer-events: auto;
        border-top-color: var(--steel);
        box-shadow: 0 18px 34px rgba(0,0,0,0.5);
      }

      .nav-links a {
        display: block;
        padding: 0.9rem 0.75rem;
        background: var(--ash);
        border: 1px solid transparent;
        transition: background 0.2s ease, border-color 0.2s ease, color 0.2s ease;
      }

      .nav-links a:hover,
      .nav-links a.is-active {
        background: rgba(214,43,43,0.12);
        border-color: rgba(214,43,43,0.38);
      }

      .nav-links a::after { display: none; }

      .nav-actions {
        order: 4;
        width: 100%;
        flex-direction: column;
        gap: 0;
      }

      .nav-cta {
        display: block;
        width: 100%;
        max-height: 0;
        margin-top: 0;
        padding: 0;
        overflow: hidden;
        opacity: 0;
        visibility: hidden;
        pointer-events: none;
        border-color: transparent;
        transition: max-height 0.28s ease, margin-top 0.28s ease, padding 0.28s ease, opacity 0.2s ease, visibility 0.2s ease, background 0.2s ease;
      }

      .nav.is-open .nav-cta {
        max-height: 4rem;
        margin-top: 0.5rem;
        padding: 0.9rem 1rem;
        opacity: 1;
        visibility: visible;
        pointer-events: auto;
      }

      .nav.is-open .nav-cta--call {
        background: var(--ash);
        border-color: var(--flame);
      }

      .about,
      .contact,
      .section-head--split {
        grid-template-columns: minmax(0, 1fr);
        gap: 3rem;
      }

      .section-head--split { align-items: start; }
      .section-head--split .display { margin-bottom: 0; }

      .about-visual { min-height: clamp(24rem, 56vh, 34rem); }

      .fr-badge { right: 1rem; }

      .contact-info { margin-top: 0; }

      /* Bento reflows to two columns; the feature and banner stay full width */
      .bento {
        grid-template-columns: repeat(2, minmax(0, 1fr));
        grid-template-areas:
          "elec elec"
          "wir  out"
          "det  serv"
          "aud  aud"
          "bus  bus";
      }

      .tile--tall .tile-figure { flex: 0 0 11rem; }

      /* In the collapsed nav the social links behave like the other CTAs */
      .nav-cta--social { display: flex; }
      .nav-cta--social .nav-social-label { display: inline; }

    }

    @media (max-width: 620px) {
      .section { padding: 4.5rem var(--gutter); }
      .about, .contact { padding: 4.5rem var(--gutter); }

      .hero {
        min-height: 100svh;
        align-items: flex-start;
        padding-top: calc(92px + 2.5rem);
        padding-bottom: 4rem;
      }

      /* A portrait viewport crops this panorama down to ~20% of its width, so
         anchor right to keep the helm and technician in frame instead of the
         empty water. Order matches the three layers: scrim, scrim, photo. */
      .hero-bg {
        background-position: 0 0, 0 0, 70% center;
      }

      .hero-title { font-size: clamp(2.9rem, 17vw, 4.2rem); line-height: 0.88; }
      .hero-sub { margin-bottom: 1.25rem; }
      .hero-body { margin-bottom: 2rem; }
      .hero-actions { align-items: stretch; }
      .btn { width: 100%; padding: 0.95rem 1rem; }

      .trust-bar { justify-content: flex-start; gap: 1.25rem 2rem; }
      .trust-divider { display: none; }

      .bento {
        grid-template-columns: minmax(0, 1fr);
        grid-template-areas: "elec" "wir" "out" "det" "serv" "aud" "bus";
      }

      .tile-body { padding: 1.6rem 1.4rem 1.8rem; }
      .tile--feature .tile-body { min-height: 22rem; padding: 1.8rem 1.5rem; }
      .tile--feature .tile-list,
      .tile--wide .tile-list { grid-template-columns: minmax(0, 1fr); }
      .tile--wide { flex-direction: column; }
      .tile--wide .tile-figure { flex: 0 0 11rem; }
      .tile--wide .tile-body { padding: 1.6rem 1.4rem 1.8rem; }
      .bento-bus { padding: 1.5rem 1.4rem; }

      .quote-form { padding: 1.5rem; }
      .form-row { grid-template-columns: minmax(0, 1fr); }
      .faq-grid { grid-template-columns: minmax(0, 1fr); }
      .faq-item { padding: 1.6rem 1.4rem; }

      .shots { grid-template-columns: repeat(auto-fill, minmax(min(100%, 10rem), 1fr)); }
      .shot-tag { left: 0.7rem; right: 0.7rem; bottom: 0.7rem; font-size: 0.58rem; letter-spacing: 0.12em; }

      .lightbox-prev { left: 0.5rem; }
      .lightbox-next { right: 0.5rem; }
      .lightbox-figure img { max-height: 68vh; }

      .footer-grid { grid-template-columns: minmax(0, 1fr); gap: 2.25rem; }

      .sticky-call {
        left: var(--gutter);
        right: var(--gutter);
        bottom: 0.75rem;
        min-width: 0;
        transform: translateY(calc(100% + 1.5rem));
      }

      .sticky-call.is-visible { transform: translateY(0); }

      .fr-badge { right: 0.75rem; bottom: 0.75rem; max-width: calc(100% - 1.5rem); padding: 0.8rem 0.9rem; }
    }

    @media (prefers-reduced-motion: reduce) {
      html { scroll-behavior: auto; }
      *, *::before, *::after { transition-duration: 0.01ms !important; animation: none !important; }
      .js [data-reveal] { opacity: 1; transform: none; }
    }
  </style>
</head>
<body>

  <a class="skip-link" href="#main">Skip to content</a>

  <!-- ══ NAV ══════════════════════════════════════════════════════════════ -->
  <nav class="nav" id="site-nav">
    <a class="nav-logo" href="#hero" aria-label="Frontline Boat Services home">
      <img src="frontline-logo.png" alt="Frontline Boat Services" width="230" height="94">
    </a>
    <button class="nav-toggle" type="button" aria-label="Open navigation" aria-controls="primary-navigation" aria-expanded="false">
      <span aria-hidden="true"></span>
      <span aria-hidden="true"></span>
      <span aria-hidden="true"></span>
    </button>
    <ul class="nav-links" id="primary-navigation">
      <li><a href="#services">Services</a></li>
      <li><a href="#about">About</a></li>
      <li><a href="#reviews">Reviews</a></li>
      <li><a href="#work">Our Work</a></li>
      <li><a href="#areas">Areas</a></li>
      <li><a href="#contact">Contact</a></li>
    </ul>
    <div class="nav-actions">
      <a class="nav-cta nav-cta--social" href="https://instagram.com/frontlineboats" target="_blank" rel="noopener" aria-label="Frontline Boat Services on Instagram">
        <svg width="17" height="17" fill="none" stroke="currentColor" stroke-width="1.9" viewBox="0 0 24 24" aria-hidden="true"><rect x="2" y="2" width="20" height="20" rx="5"/><path d="M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z"/><line x1="17.5" y1="6.5" x2="17.51" y2="6.5"/></svg>
        <span class="nav-social-label">@FrontlineBoats</span>
      </a>
      <a class="nav-cta nav-cta--social" href="https://www.facebook.com/frontlineboats/" target="_blank" rel="noopener" aria-label="Frontline Boat Services on Facebook">
        <svg width="17" height="17" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path d="M18 2h-3a5 5 0 0 0-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 0 1 1-1h3z"/></svg>
        <span class="nav-social-label">Facebook</span>
      </a>
      <a class="nav-cta nav-cta--call" href="tel:+17862780478">Call (786) 278-0478</a>
      <a class="nav-cta" href="#contact">Get a Quote</a>
    </div>
  </nav>

  <main id="main">

    <!-- ══ HERO ═══════════════════════════════════════════════════════════ -->
    <section id="hero" class="hero">
      <div class="hero-bg"></div>
      <div class="hero-slash"></div>
      <div class="hero-content">
        <div class="hero-eyebrow">
          <span class="led" aria-hidden="true"></span>
          <span class="legend">Miami, FL — First Responder Owned &amp; Operated</span>
        </div>
        <h1 class="hero-title">MIAMI BOAT REPAIR<br>&amp; <span class="accent">MARINE</span> SERVICES</h1>
        <p class="hero-sub">Mobile Electronics · Outboards · Rewiring · Audio &amp; Lighting · Detailing</p>
        <p class="hero-body">
          <strong>Frontline Boat Services</strong> keeps South Florida boats running and looking right —
          from a single gauge to a full rewire, an outboard service, or a ceramic coating. NMEA certified,
          marine-grade parts, every circuit labeled and tested before you get the keys back.
        </p>
        <div class="hero-actions">
          <a class="btn btn--primary" href="#contact">Get a Free Quote</a>
          <a class="btn btn--ghost" href="#services">See What We Do</a>
        </div>
      </div>
    </section>

    <!-- ══ TRUST BAR ══════════════════════════════════════════════════════ -->
    <div class="trust-bar">
      <div class="trust-item">
        <svg width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/></svg>
        First Responder Owned
      </div>
      <div class="trust-divider" aria-hidden="true"></div>
      <div class="trust-item">
        <svg width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" aria-hidden="true"><path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"/><polyline points="22 4 12 14.01 9 11.01"/></svg>
        NMEA Certified
      </div>
      <div class="trust-divider" aria-hidden="true"></div>
      <div class="trust-item">
        <svg width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="10"/><path d="M12 6v6l4 2"/></svg>
        Mobile &amp; Dockside
      </div>
      <div class="trust-divider" aria-hidden="true"></div>
      <div class="trust-item">
        <svg width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" aria-hidden="true"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"/><circle cx="12" cy="10" r="3"/></svg>
        Miami-Dade &amp; Broward
      </div>
      <div class="trust-divider" aria-hidden="true"></div>
      <div class="trust-item">
        <svg width="16" height="16" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path d="m12 2 3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14l-5-4.87 6.91-1.01L12 2z"/></svg>
        5.0 Stars on Google
      </div>
    </div>

    <!-- ══ SERVICES ═══════════════════════════════════════════════════════ -->
    <section id="services" class="section">
      <div class="section-head section-head--split" data-reveal>
        <div>
          <p class="eyebrow">What We Do</p>
          <h2 class="display">MARINE SERVICES<br>IN MIAMI</h2>
        </div>
        <p class="lede">
          Six trades under one roof, so you are not chasing three vendors to finish one boat. Every
          job gets the same standard: diagnosed properly, built to marine spec, labeled and tested
          before it leaves.
        </p>
      </div>

      <div class="bento" data-reveal>

        <article id="marine-electronics" class="tile tile--feature b-elec">
          <div class="tile-figure">
            <img src="gallery/electronics-garmin-twin-display-acrylic.jpg" alt="Twin Garmin displays set into a custom-cut acrylic helm panel with engraved switch legends" loading="lazy">
          </div>
          <div class="tile-body">
            <span class="legend tile-legend">Installs · Upgrades · Custom Systems</span>
            <h3 class="tile-name">Marine Electronics</h3>
            <p class="tile-desc">
              Chartplotters, sonar, radar and comms on properly built NMEA 2000 backbones, set into a
              custom acrylic helm panel cut for your dash.
            </p>
            <ul class="tile-list">
              <li>Chartplotters &amp; MFDs</li>
              <li>Radar &amp; sonar</li>
              <li>VHF, AIS &amp; antennas</li>
              <li>Autopilot &amp; steering</li>
              <li>NMEA 2000 networks</li>
              <li>Custom acrylic helm panels</li>
            </ul>
          </div>
        </article>

        <article id="boat-wiring" class="tile tile--tall b-wir">
          <div class="tile-figure">
            <img src="gallery/wiring-rigging-board-bus-bars.jpg" alt="Custom rigging board with dual fuse blocks, bus bars, NMEA 2000 drops and labeled circuits" loading="lazy">
          </div>
          <div class="tile-body">
            <span class="legend tile-legend">Custom Wiring · Battery Systems · Acrylic Panels</span>
            <h3 class="tile-name">Wiring &amp; Rewiring</h3>
            <p class="tile-desc">
              Full rewires and custom distribution on tinned wire with proper fusing, finished with a
              custom acrylic switch panel. Every circuit labeled.
            </p>
            <ul class="tile-list">
              <li>Complete rewires</li>
              <li>Distribution &amp; fusing</li>
              <li>Battery banks &amp; switches</li>
              <li>Chargers &amp; isolators</li>
              <li>Custom acrylic switch panels</li>
              <li>Harness cleanup</li>
            </ul>
          </div>
        </article>

        <article id="outboard-service" class="tile tile--med b-out">
          <div class="tile-figure">
            <img src="gallery/outboard-service-oil-change.jpg" alt="Outboard tilted up on a bay boat for a scheduled oil and filter service" loading="lazy">
          </div>
          <div class="tile-body">
            <span class="legend tile-legend">Maintenance · Repairs · Diagnostics</span>
            <h3 class="tile-name">Outboard Services</h3>
            <p class="tile-desc">
              Scheduled service and real diagnostics on Yamaha, Mercury and Suzuki power.
            </p>
            <ul class="tile-list">
              <li>Scheduled servicing</li>
              <li>Oil &amp; gearcase lube</li>
              <li>Water pumps &amp; impellers</li>
              <li>Fault-code diagnostics</li>
              <li>Starters &amp; charging</li>
              <li>Rigging &amp; controls</li>
            </ul>
          </div>
        </article>

        <article id="boat-detailing" class="tile tile--med b-det">
          <div class="tile-figure">
            <img src="gallery/detailing-seavee-hull-gloss.jpg" alt="SeaVee hull compounded and polished to a mirror gloss at a Miami dock" loading="lazy">
          </div>
          <div class="tile-body">
            <span class="legend tile-legend">Interior · Exterior · Full Packages</span>
            <h3 class="tile-name">Detailing &amp; Coatings</h3>
            <p class="tile-desc">
              Wash-and-wax through full gelcoat restoration and ceramic coating, inside and out.
            </p>
            <ul class="tile-list">
              <li>Wash, wax &amp; sealants</li>
              <li>Compound &amp; polish</li>
              <li>Ceramic coatings</li>
              <li>Gelcoat restoration</li>
              <li>Interior, vinyl &amp; canvas</li>
              <li>Non-skid &amp; teak</li>
            </ul>
          </div>
        </article>

        <article id="boat-repair" class="tile tile--med b-serv">
          <div class="tile-figure">
            <img src="gallery/repair-bilge-pumps-seachest-battery.jpg" alt="Bilge compartment with washdown pump, sea chest plumbing and a properly protected battery switch" loading="lazy">
          </div>
          <div class="tile-body">
            <span class="legend tile-legend">Wiring · Lighting · Pumps · Sea Chests</span>
            <h3 class="tile-name">Service &amp; Repair</h3>
            <p class="tile-desc">
              The running list every boat builds up, cleared in one visit instead of one weekend at a time.
            </p>
            <ul class="tile-list">
              <li>Bilge &amp; livewell pumps</li>
              <li>Sea chests &amp; plumbing</li>
              <li>Nav &amp; courtesy lighting</li>
              <li>Shore power &amp; chargers</li>
              <li>Trim, tilt &amp; jack plates</li>
              <li>Electrical troubleshooting</li>
            </ul>
          </div>
        </article>

        <article id="marine-audio-lighting" class="tile tile--wide b-aud">
          <div class="tile-figure">
            <img src="gallery/lighting-night-helm-simrad-led.jpg" alt="Night helm with a Simrad chartplotter, Fusion stereo and green LED-lit marine speakers" loading="lazy">
          </div>
          <div class="tile-body">
            <span class="legend tile-legend">Marine Audio · LED Lighting · Custom Installs</span>
            <h3 class="tile-name">Audio &amp; Lighting</h3>
            <p class="tile-desc">
              Sound and light that survive saltwater, sun and vibration, mounted so nothing shakes
              itself loose offshore.
            </p>
            <ul class="tile-list">
              <li>Speakers &amp; subwoofers</li>
              <li>Amplifiers &amp; zones</li>
              <li>Head units &amp; controls</li>
              <li>Underwater lights</li>
              <li>LED accent &amp; spreaders</li>
              <li>Custom acrylic fabrication</li>
            </ul>
          </div>
        </article>

        <div class="bento-bus">
          <p>Not on the list? If it is on the boat, ask. Most of what we do started as somebody's odd job.</p>
          <a href="tel:+17862780478">Call or text (786) 278-0478</a>
        </div>
      </div>
    </section>

    <!-- ══ ABOUT ══════════════════════════════════════════════════════════ -->
    <section id="about" class="about">
      <div class="about-visual" data-reveal>
        <img class="about-img" src="frontline-about.jpg" alt="Frontline Boat Services technician washing down a center console at a Miami dock at sunset" loading="lazy">
        <div class="fr-badge">
          <svg class="fr-badge-flag" viewBox="0 0 60 36" fill="none" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Thin red line flag">
            <rect width="60" height="36" fill="#1A1A1A"/>
            <rect y="0"  width="60" height="4" fill="#555"/>
            <rect y="8"  width="60" height="4" fill="#555"/>
            <rect y="16" width="60" height="4" fill="#D62B2B"/>
            <rect y="24" width="60" height="4" fill="#555"/>
            <rect y="32" width="60" height="4" fill="#555"/>
            <rect width="24" height="20" fill="#1A1A1A" opacity="0.6"/>
          </svg>
          <div class="fr-badge-text">First Responder<br>Owned &amp; Operated</div>
        </div>
      </div>

      <div data-reveal>
        <p class="eyebrow">About Frontline</p>
        <h2 class="display">TRAINED TO<br>NEVER FAIL</h2>
        <p class="lede">
          Frontline Boat Services was founded by Brian Frias, an active firefighter who brought the same
          habits off the truck as on it: no shortcuts, no guesswork, no half-measures.
        </p>
        <p class="lede">
          Brian is NMEA certified as a Basic NMEA 2000 Installer and an Advanced Marine Electronics
          Installer (AMEI), so the standards behind every install, rewire and diagnostic job are the
          documented ones — not whatever the last guy felt like doing.
        </p>
        <p class="lede">
          We work out of Miami for boaters across South Florida who are tired of sloppy installs and
          chasing the same electrical gremlin season after season. When we hand your boat back, every
          system works — and keeps working.
        </p>
        <div class="credentials">
          <div class="credential">
            <span class="credential-mark credential-mark--gold">NMEA</span>
            <span class="credential-label">Certified NMEA 2000 Installer</span>
          </div>
          <div class="credential">
            <span class="credential-mark credential-mark--gold">AMEI</span>
            <span class="credential-label">Advanced Marine Electronics Installer</span>
          </div>
          <div class="credential">
            <span class="credential-mark">100%</span>
            <span class="credential-label">First Responder Owned &amp; Operated</span>
          </div>
        </div>
      </div>
    </section>

    <!-- ══ REVIEWS ════════════════════════════════════════════════════════ -->
    <section id="reviews" class="section section--band">
      <div class="section-head section-head--split" data-reveal>
        <div>
          <p class="eyebrow">What Boat Owners Say</p>
          <h2 class="display">RATED 5.0<br>ON GOOGLE</h2>
        </div>
        <div class="rating-summary">
          <span class="rating-score">5.0</span>
          <div>
            <span class="stars" role="img" aria-label="5 out of 5 stars">
              <svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="m12 2 3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14l-5-4.87 6.91-1.01L12 2z"/></svg>
              <svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="m12 2 3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14l-5-4.87 6.91-1.01L12 2z"/></svg>
              <svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="m12 2 3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14l-5-4.87 6.91-1.01L12 2z"/></svg>
              <svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="m12 2 3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14l-5-4.87 6.91-1.01L12 2z"/></svg>
              <svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="m12 2 3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14l-5-4.87 6.91-1.01L12 2z"/></svg>
            </span>
            <div class="rating-meta">19 reviews on Google</div>
          </div>
        </div>
      </div>

      <div class="reviews" data-reveal>
        <article class="review">
          <span class="stars" role="img" aria-label="5 out of 5 stars">
            <svg width="15" height="15" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="m12 2 3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14l-5-4.87 6.91-1.01L12 2z"/></svg>
            <svg width="15" height="15" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="m12 2 3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14l-5-4.87 6.91-1.01L12 2z"/></svg>
            <svg width="15" height="15" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="m12 2 3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14l-5-4.87 6.91-1.01L12 2z"/></svg>
            <svg width="15" height="15" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="m12 2 3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14l-5-4.87 6.91-1.01L12 2z"/></svg>
            <svg width="15" height="15" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="m12 2 3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14l-5-4.87 6.91-1.01L12 2z"/></svg>
          </span>
          <blockquote>
            “Recently had my Boat completely re-wired and panel re-done. Brian did an amazing clean
            job. I would reach out to his company if you're planning on upgrading your boat.”
          </blockquote>
          <div class="review-attrib">
            <div class="review-name">Pedro Figueroa</div>
            <div class="review-source">Google Review</div>
          </div>
        </article>

        <article class="review">
          <span class="stars" role="img" aria-label="5 out of 5 stars">
            <svg width="15" height="15" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="m12 2 3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14l-5-4.87 6.91-1.01L12 2z"/></svg>
            <svg width="15" height="15" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="m12 2 3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14l-5-4.87 6.91-1.01L12 2z"/></svg>
            <svg width="15" height="15" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="m12 2 3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14l-5-4.87 6.91-1.01L12 2z"/></svg>
            <svg width="15" height="15" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="m12 2 3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14l-5-4.87 6.91-1.01L12 2z"/></svg>
            <svg width="15" height="15" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="m12 2 3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14l-5-4.87 6.91-1.01L12 2z"/></svg>
          </span>
          <blockquote>
            “Greatest investment ive done to my boat. I have a 22ft Everglades and i had the entire
            boat rewired as well as put brand new pumps and other accessories. I highly recommend
            Frontline for the clean and detailed installation as well as great customer service.”
          </blockquote>
          <div class="review-attrib">
            <div class="review-name">Alejandro Brunet</div>
            <div class="review-source">Google Review</div>
          </div>
        </article>

        <article class="review">
          <span class="stars" role="img" aria-label="5 out of 5 stars">
            <svg width="15" height="15" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="m12 2 3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14l-5-4.87 6.91-1.01L12 2z"/></svg>
            <svg width="15" height="15" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="m12 2 3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14l-5-4.87 6.91-1.01L12 2z"/></svg>
            <svg width="15" height="15" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="m12 2 3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14l-5-4.87 6.91-1.01L12 2z"/></svg>
            <svg width="15" height="15" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="m12 2 3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14l-5-4.87 6.91-1.01L12 2z"/></svg>
            <svg width="15" height="15" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="m12 2 3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14l-5-4.87 6.91-1.01L12 2z"/></svg>
          </span>
          <blockquote>
            “Brian with Frontline came out and did my 100 hour service quickly and only used OEM
            products. I would highly recommend.”
          </blockquote>
          <div class="review-attrib">
            <div class="review-name">Matt Baker</div>
            <div class="review-source">Google Review</div>
          </div>
        </article>
      </div>

      <div class="gallery-more">
        <a class="btn btn--ghost" href="https://share.google/EpuaCoLlPrNN9mZjG" target="_blank" rel="noopener">Read all 19 reviews on Google</a>
      </div>
    </section>

    <!-- ══ OUR WORK ═══════════════════════════════════════════════════════ -->
    <section id="work" class="section">
      <div class="section-head section-head--split" data-reveal>
        <div>
          <p class="eyebrow">Recent Work</p>
          <h2 class="display">SYSTEMS BUILT<br>FOR THE WATER</h2>
        </div>
        <p class="lede">
          Real jobs off South Florida docks — helm rebuilds, full rewires, outboard service and
          finish work. Pick a trade to filter, or tap any photo to see it full size.
        </p>
      </div>

      <div class="filters" role="group" aria-label="Filter photos by trade" data-reveal>
        <button class="filter" type="button" data-filter="all" aria-pressed="true">All Work <span class="filter-count">30</span></button>
        <button class="filter" type="button" data-filter="electronics" aria-pressed="false">Electronics <span class="filter-count">8</span></button>
        <button class="filter" type="button" data-filter="wiring" aria-pressed="false">Wiring &amp; Repair <span class="filter-count">7</span></button>
        <button class="filter" type="button" data-filter="outboard" aria-pressed="false">Outboard <span class="filter-count">5</span></button>
        <button class="filter" type="button" data-filter="detailing" aria-pressed="false">Detailing <span class="filter-count">7</span></button>
        <button class="filter" type="button" data-filter="audio" aria-pressed="false">Audio &amp; Lighting <span class="filter-count">3</span></button>
      </div>

      <div class="shots" id="shots" data-gallery-manifest="gallery/gallery.json" data-reveal>
        <template id="legacy-gallery-items">

        <!-- Electronics -->
        <button class="shot" type="button" data-cat="electronics" data-full="gallery/electronics-seafox-helm-raymarine.jpg">
          <img class="shot-img" src="gallery/thumbs/electronics-seafox-helm-raymarine.jpg" alt="Sea Fox center console helm with a Raymarine multifunction display, analog gauges and a custom backlit switch panel" loading="lazy">
          <span class="shot-tag">Raymarine helm build</span>
        </button>

        <button class="shot" type="button" data-cat="electronics" data-full="gallery/electronics-garmin-twin-display-acrylic.jpg">
          <img class="shot-img" src="gallery/thumbs/electronics-garmin-twin-display-acrylic.jpg" alt="Twin Garmin displays set into a custom acrylic helm panel with a Fusion stereo and Lenco trim controls" loading="lazy">
          <span class="shot-tag">Custom acrylic helm panel</span>
        </button>

        <button class="shot" type="button" data-cat="electronics" data-full="gallery/electronics-sea-pro-twin-garmin-vhf.jpg">
          <img class="shot-img" src="gallery/thumbs/electronics-sea-pro-twin-garmin-vhf.jpg" alt="Sea Pro helm with twin Garmin displays, a VHF radio and a refreshed gauge cluster" loading="lazy">
          <span class="shot-tag">Twin display &amp; VHF</span>
        </button>

        <button class="shot" type="button" data-cat="electronics" data-full="gallery/electronics-action-craft-simrad-helm.jpg">
          <img class="shot-img" src="gallery/thumbs/electronics-action-craft-simrad-helm.jpg" alt="Action Craft helm fitted with a Simrad display, stereo head unit and new switch panel" loading="lazy">
          <span class="shot-tag">Simrad flats-boat helm</span>
        </button>

        <button class="shot" type="button" data-cat="electronics" data-full="gallery/electronics-wellcraft-garmin-upgrade.jpg">
          <img class="shot-img" src="gallery/thumbs/electronics-wellcraft-garmin-upgrade.jpg" alt="Wellcraft helm upgraded with a Garmin multifunction display and a secondary engine data screen" loading="lazy">
          <span class="shot-tag">Garmin MFD upgrade</span>
        </button>

        <button class="shot" type="button" data-cat="electronics" data-full="gallery/electronics-garmin-displays-switch-panel.jpg">
          <img class="shot-img" src="gallery/thumbs/electronics-garmin-displays-switch-panel.jpg" alt="Twin Garmin displays beside a labeled stainless switch panel and Suzuki trim controls" loading="lazy">
          <span class="shot-tag">Labeled switch panel</span>
        </button>

        <button class="shot" type="button" data-cat="electronics" data-full="gallery/electronics-garmin-yamaha-helm-rebuild.jpg">
          <img class="shot-img" src="gallery/thumbs/electronics-garmin-yamaha-helm-rebuild.jpg" alt="Helm rebuild with a Garmin display, Yamaha binnacle controls, tachometer and new push-button panel" loading="lazy">
          <span class="shot-tag">Full helm rebuild</span>
        </button>

        <button class="shot" type="button" data-cat="electronics" data-full="gallery/electronics-gauge-cluster-switch-panel.jpg">
          <img class="shot-img" src="gallery/thumbs/electronics-gauge-cluster-switch-panel.jpg" alt="Restored gauge cluster and lit switch panel on a center console dash" loading="lazy">
          <span class="shot-tag">Gauge cluster refit</span>
        </button>

        <!-- Wiring &amp; repair -->
        <button class="shot" type="button" data-cat="wiring" data-full="gallery/wiring-rigging-board-bus-bars.jpg">
          <img class="shot-img" src="gallery/thumbs/wiring-rigging-board-bus-bars.jpg" alt="Custom rigging board with dual fuse blocks, bus bars, NMEA 2000 drops and amplifiers" loading="lazy">
          <span class="shot-tag">Custom rigging board</span>
        </button>

        <button class="shot" type="button" data-cat="wiring" data-full="gallery/wiring-console-fuse-panel-nmea2000.jpg">
          <img class="shot-img" src="gallery/thumbs/wiring-console-fuse-panel-nmea2000.jpg" alt="Console rewire with a labeled fuse block, ignition-protected breakers and an NMEA 2000 backbone" loading="lazy">
          <span class="shot-tag">Console rewire</span>
        </button>

        <button class="shot" type="button" data-cat="wiring" data-full="gallery/wiring-full-rewire-panel-amp.jpg">
          <img class="shot-img" src="gallery/thumbs/wiring-full-rewire-panel-amp.jpg" alt="Complete rewire on a backing board with dual fuse blocks, labeled breakers, bus bars and an amplifier" loading="lazy">
          <span class="shot-tag">Complete rewire</span>
        </button>

        <button class="shot" type="button" data-cat="wiring" data-full="gallery/wiring-bench-built-fuse-block.jpg">
          <img class="shot-img" src="gallery/thumbs/wiring-bench-built-fuse-block.jpg" alt="Bench-built distribution panel with a Blue Sea fuse block and every circuit individually labeled" loading="lazy">
          <span class="shot-tag">Bench-built distribution</span>
        </button>

        <button class="shot" type="button" data-cat="wiring" data-full="gallery/wiring-switch-panel-fusing.jpg">
          <img class="shot-img" src="gallery/thumbs/wiring-switch-panel-fusing.jpg" alt="New helm switch panel with push-button switches, a USB charge port and proper circuit fusing" loading="lazy">
          <span class="shot-tag">New switch panel</span>
        </button>

        <button class="shot" type="button" data-cat="wiring" data-full="gallery/wiring-console-harness-cleanup.jpg">
          <img class="shot-img" src="gallery/thumbs/wiring-console-harness-cleanup.jpg" alt="Console harness cleanup with a new fuse block, bus bars and loomed, secured cable runs" loading="lazy">
          <span class="shot-tag">Harness cleanup</span>
        </button>

        <button class="shot" type="button" data-cat="wiring" data-full="gallery/repair-bilge-pumps-seachest-battery.jpg">
          <img class="shot-img" src="gallery/thumbs/repair-bilge-pumps-seachest-battery.jpg" alt="Bilge compartment with washdown pump, sea chest plumbing, battery switch and protected battery cabling" loading="lazy">
          <span class="shot-tag">Pumps &amp; sea chest</span>
        </button>

        <!-- Outboard -->
        <button class="shot" type="button" data-cat="outboard" data-full="gallery/outboard-service-oil-change.jpg">
          <img class="shot-img" src="gallery/thumbs/outboard-service-oil-change.jpg" alt="Outboard tilted up for a scheduled oil and filter service on a bay boat" loading="lazy">
          <span class="shot-tag">Scheduled service</span>
        </button>

        <button class="shot" type="button" data-cat="outboard" data-full="gallery/outboard-gearcase-lube-service.jpg">
          <img class="shot-img" src="gallery/thumbs/outboard-gearcase-lube-service.jpg" alt="Lower unit gearcase lube drained into a pan and refilled during routine outboard maintenance" loading="lazy">
          <span class="shot-tag">Gearcase service</span>
        </button>

        <button class="shot" type="button" data-cat="outboard" data-full="gallery/outboard-powerhead-repair.jpg">
          <img class="shot-img" src="gallery/thumbs/outboard-powerhead-repair.jpg" alt="Outboard with the cowling removed for powerhead diagnostics and repair" loading="lazy">
          <span class="shot-tag">Powerhead diagnostics</span>
        </button>

        <button class="shot" type="button" data-cat="outboard" data-full="gallery/outboard-yamaha-70-rigging.jpg">
          <img class="shot-img" src="gallery/thumbs/outboard-yamaha-70-rigging.jpg" alt="Yamaha 70 outboard rigged on a tender with new controls, fuel line and battery box" loading="lazy">
          <span class="shot-tag">Repower &amp; rigging</span>
        </button>

        <button class="shot" type="button" data-cat="outboard" data-full="gallery/outboard-starter-motor-replacement.jpg">
          <img class="shot-img" src="gallery/thumbs/outboard-starter-motor-replacement.jpg" alt="New starter motor and flywheel exposed during an outboard starting-system repair" loading="lazy">
          <span class="shot-tag">Starter replacement</span>
        </button>

        <!-- Detailing -->
        <button class="shot" type="button" data-cat="detailing" data-full="gallery/detailing-seavee-hull-gloss.jpg">
          <img class="shot-img" src="gallery/thumbs/detailing-seavee-hull-gloss.jpg" alt="SeaVee hull polished to a mirror gloss alongside a Miami dock" loading="lazy">
          <span class="shot-tag">Hull cut &amp; polish</span>
        </button>

        <button class="shot" type="button" data-cat="detailing" data-full="gallery/detailing-sea-ray-hull-polish.jpg">
          <img class="shot-img" src="gallery/thumbs/detailing-sea-ray-hull-polish.jpg" alt="Sea Ray blue hull compounded, polished and sealed on the hard" loading="lazy">
          <span class="shot-tag">Compound &amp; seal</span>
        </button>

        <button class="shot" type="button" data-cat="detailing" data-full="gallery/detailing-motor-yacht-exterior.jpg">
          <img class="shot-img" src="gallery/thumbs/detailing-motor-yacht-exterior.jpg" alt="Motor yacht topsides and stainless detailed and polished from the waterline up" loading="lazy">
          <span class="shot-tag">Full exterior package</span>
        </button>

        <button class="shot" type="button" data-cat="detailing" data-full="gallery/detailing-yacht-topsides-coating.jpg">
          <img class="shot-img" src="gallery/thumbs/detailing-yacht-topsides-coating.jpg" alt="Dark yacht topsides after a full exterior detail and protective ceramic coating" loading="lazy">
          <span class="shot-tag">Ceramic coating</span>
        </button>

        <button class="shot" type="button" data-cat="detailing" data-full="gallery/detailing-console-gelcoat-gloss.jpg">
          <img class="shot-img" src="gallery/thumbs/detailing-console-gelcoat-gloss.jpg" alt="Console and gunwale gelcoat restored to a deep even gloss" loading="lazy">
          <span class="shot-tag">Gelcoat restoration</span>
        </button>

        <button class="shot" type="button" data-cat="detailing" data-full="gallery/detailing-hull-side-waterline-gloss.jpg">
          <img class="shot-img" src="gallery/thumbs/detailing-hull-side-waterline-gloss.jpg" alt="Hull side and waterline finished to a clean gloss at the dock" loading="lazy">
          <span class="shot-tag">Waterline finish</span>
        </button>

        <button class="shot" type="button" data-cat="detailing" data-full="gallery/detailing-yacht-hull-mirror-finish.jpg">
          <img class="shot-img" src="gallery/thumbs/detailing-yacht-hull-mirror-finish.jpg" alt="Grey yacht hull polished to a mirror finish reflecting the teak deck" loading="lazy">
          <span class="shot-tag">Mirror finish</span>
        </button>

        <!-- Audio &amp; lighting -->
        <button class="shot" type="button" data-cat="audio" data-full="gallery/lighting-night-helm-simrad-led.jpg">
          <img class="shot-img" src="gallery/thumbs/lighting-night-helm-simrad-led.jpg" alt="Night helm with a Simrad chartplotter, Fusion stereo and green LED-lit speakers" loading="lazy">
          <span class="shot-tag">LED helm lighting</span>
        </button>

        <button class="shot" type="button" data-cat="audio" data-full="gallery/audio-boss-head-unit-switch-panel.jpg">
          <img class="shot-img" src="gallery/thumbs/audio-boss-head-unit-switch-panel.jpg" alt="Marine-grade Boss Audio head unit mounted beside a lit stainless switch panel at the helm" loading="lazy">
          <span class="shot-tag">Head unit install</span>
        </button>

        <button class="shot" type="button" data-cat="audio" data-full="gallery/audio-amplifier-fuse-block-install.jpg">
          <img class="shot-img" src="gallery/thumbs/audio-amplifier-fuse-block-install.jpg" alt="Marine amplifier and fuse block mounted under the console with loomed, strain-relieved cabling" loading="lazy">
          <span class="shot-tag">Amplifier &amp; fusing</span>
        </button>

        </template>
      </div>

      <p class="gallery-empty" id="gallery-empty" aria-live="polite" hidden>No photos in that trade yet.</p>
      <noscript><p class="gallery-empty">The project gallery requires JavaScript to load.</p></noscript>

      <div class="gallery-more">
        <button class="btn btn--ghost" type="button" id="gallery-toggle" aria-controls="shots">Show all photos</button>
      </div>
    </section>

    <!-- ══ SERVICE AREAS ══════════════════════════════════════════════════ -->
    <section id="areas" class="section section--band">
      <div class="section-head section-head--split" data-reveal>
        <div>
          <p class="eyebrow">Service Areas</p>
          <h2 class="display">MOBILE BOAT SERVICE<br>IN SOUTH FLORIDA</h2>
        </div>
        <p class="lede">
          We come to the boat. Home dock, dry storage, marina slip or driveway — most electronics,
          wiring, outboard and detailing work happens where your boat already sits.
        </p>
      </div>

      <div class="areas" data-reveal>
        <div class="area">
          <div class="area-name">Miami-Dade</div>
          <div class="area-label">Primary Service County</div>
          <p class="area-copy">
            Based in Miami and working with boat owners, marinas and dockside projects throughout
            Miami-Dade — from Haulover down through Coconut Grove, Key Biscayne and Homestead.
          </p>
        </div>
        <div class="area">
          <div class="area-name">Broward</div>
          <div class="area-label">North Coverage Area</div>
          <p class="area-copy">
            Available across Broward County for installs, rewires, outboard service, repairs and
            detailing — Fort Lauderdale, Dania, Hollywood, Pompano and the marinas in between.
          </p>
        </div>
      </div>
    </section>

    <!-- ══ LOCAL SERVICE FAQ ══════════════════════════════════════════════ -->
    <section id="faq" class="section" aria-labelledby="faq-heading">
      <div class="section-head section-head--split" data-reveal>
        <div>
          <p class="eyebrow">Local Boat Service FAQ</p>
          <h2 class="display" id="faq-heading">QUESTIONS FROM<br>MIAMI BOATERS</h2>
        </div>
        <p class="lede">
          Straight answers about mobile marine service, coverage and the work we handle throughout
          Miami-Dade and Broward.
        </p>
      </div>

      <div class="faq-grid" data-reveal>
        <article class="faq-item">
          <h3 class="faq-question">Do you provide mobile boat repair in Miami?</h3>
          <p class="faq-answer">
            Yes. Frontline is a mobile and dockside marine service. We work at home docks, marina
            slips, dry storage facilities and driveways throughout Miami-Dade, with service also
            available in Broward County.
          </p>
        </article>
        <article class="faq-item">
          <h3 class="faq-question">What areas do you serve near Miami?</h3>
          <p class="faq-answer">
            Our primary coverage includes Miami, Miami Beach, North Miami, Coconut Grove, Coral
            Gables, Key Biscayne and Homestead. We also serve Hollywood, Dania Beach, Fort
            Lauderdale and Pompano Beach for qualifying projects.
          </p>
        </article>
        <article class="faq-item">
          <h3 class="faq-question">Can you install Garmin, Simrad or Raymarine electronics?</h3>
          <p class="faq-answer">
            Yes. We install and upgrade chartplotters, sonar, radar, VHF, AIS, autopilot and NMEA
            2000 networks from leading marine electronics brands. Custom acrylic helm panels and
            clean integration with existing systems are available.
          </p>
        </article>
        <article class="faq-item">
          <h3 class="faq-question">Do you rewire older boats?</h3>
          <p class="faq-answer">
            Yes. We handle complete boat rewires, battery systems, distribution, fusing, switch
            panels and harness cleanup using tinned marine wire and properly protected,
            clearly labeled circuits.
          </p>
        </article>
        <article class="faq-item">
          <h3 class="faq-question">Which outboard motor brands do you service?</h3>
          <p class="faq-answer">
            We service Yamaha, Mercury and Suzuki outboards, including scheduled maintenance,
            oil and gearcase-lube changes, water pumps, impellers, charging systems, starters,
            rigging and fault-code diagnostics.
          </p>
        </article>
        <article class="faq-item">
          <h3 class="faq-question">How do I get a quote for boat service?</h3>
          <p class="faq-answer">
            Call or text <a href="tel:+17862780478">(786) 278-0478</a>, or send the
            <a href="#contact">quote form</a> with your boat's year, make, model, location and the
            work you need. Photos help us give you a faster, more useful response.
          </p>
        </article>
      </div>
    </section>

    <!-- ══ CONTACT ════════════════════════════════════════════════════════ -->
    <section id="contact" class="contact">
      <div data-reveal>
        <p class="eyebrow">Get In Touch</p>
        <h2 class="display">MESSAGE US<br>TODAY</h2>
        <p class="lede">
          Ready for a quote, or just want a straight answer about whether something is worth fixing?
          Call, text or send the form. We reply to every message.
        </p>

        <div class="contact-info">
          <div class="contact-row">
            <svg class="contact-icon" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" aria-hidden="true">
              <path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07A19.5 19.5 0 0 1 4.69 12 19.79 19.79 0 0 1 1.61 3.38C1.61 2.18 2.6 1 3.8 1h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L7.91 8.91a16 16 0 0 0 6.06 6.06l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z"/>
            </svg>
            <div>
              <div class="contact-label">Phone / Text</div>
              <a class="contact-value" href="tel:+17862780478">(786) 278-0478</a>
            </div>
          </div>

          <div class="contact-row">
            <svg class="contact-icon" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" aria-hidden="true">
              <path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z"/><polyline points="22,6 12,13 2,6"/>
            </svg>
            <div>
              <div class="contact-label">Email</div>
              <a class="contact-value" href="mailto:[email protected]">[email protected]</a>
            </div>
          </div>

          <div class="contact-row">
            <svg class="contact-icon" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" aria-hidden="true">
              <path d="M21 10c0 7-9 13-9 13S3 17 3 10a9 9 0 0 1 18 0z"/><circle cx="12" cy="10" r="3"/>
            </svg>
            <div>
              <div class="contact-label">Service Area</div>
              <span class="contact-value">Miami, FL — Miami-Dade &amp; Broward</span>
            </div>
          </div>

          <div class="social-row">
            <a class="social-btn" href="https://instagram.com/frontlineboats" target="_blank" rel="noopener">
              <svg width="16" height="16" fill="none" stroke="currentColor" stroke-width="1.9" viewBox="0 0 24 24" aria-hidden="true"><rect x="2" y="2" width="20" height="20" rx="5"/><path d="M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z"/><line x1="17.5" y1="6.5" x2="17.51" y2="6.5"/></svg>
              @FrontlineBoats
            </a>
            <a class="social-btn" href="https://www.facebook.com/frontlineboats/" target="_blank" rel="noopener">
              <svg width="16" height="16" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path d="M18 2h-3a5 5 0 0 0-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 0 1 1-1h3z"/></svg>
              Facebook
            </a>
            <a class="social-btn" href="https://share.google/EpuaCoLlPrNN9mZjG" target="_blank" rel="noopener">
              <svg width="16" height="16" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path d="m12 2 3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14l-5-4.87 6.91-1.01L12 2z"/></svg>
              5.0 on Google
            </a>
          </div>
        </div>
      </div>

      <div data-reveal>
        <form class="quote-form" id="quote-form" action="https://formspree.io/f/xeeywgwl" method="POST" novalidate>
          <div>
            <h2 class="form-title">Request a Quote</h2>
            <p class="form-note">The more you tell us about the boat, the tighter the number.</p>
          </div>

          <div class="form-row">
            <div class="form-field">
              <label class="form-label" for="fname">First Name</label>
              <input class="form-input" type="text" id="fname" name="fname" autocomplete="given-name" placeholder="John" required />
            </div>
            <div class="form-field">
              <label class="form-label" for="lname">Last Name</label>
              <input class="form-input" type="text" id="lname" name="lname" autocomplete="family-name" placeholder="Smith" required />
            </div>
          </div>

          <div class="form-field">
            <label class="form-label" for="email">Email</label>
            <input class="form-input" type="email" id="email" name="email" autocomplete="email" placeholder="[email protected]" required />
          </div>

          <div class="form-field">
            <label class="form-label" for="phone">Phone / Text</label>
            <input class="form-input" type="tel" id="phone" name="phone" autocomplete="tel" placeholder="(305) 000-0000" required />
          </div>

          <div class="form-field">
            <label class="form-label" for="service">Service Needed</label>
            <select class="form-select" id="service" name="service" required>
              <option value="" disabled selected>Select a service…</option>
              <option>Marine Electronics</option>
              <option>Outboard Services</option>
              <option>Detailing &amp; Coatings</option>
              <option>Service &amp; Repair</option>
              <option>Wiring &amp; Rewiring</option>
              <option>Audio &amp; Lighting</option>
              <option>Something else / Not sure</option>
            </select>
          </div>

          <div class="form-field">
            <label class="form-label" for="message">Tell Us About Your Boat</label>
            <textarea class="form-textarea" id="message" name="message" placeholder="Year, make, model, and what you're looking to have done…" required></textarea>
          </div>

          <button class="btn btn--primary form-submit" type="submit">Request a Free Quote</button>
          <p class="form-error" id="form-error" role="alert"></p>
          <p class="form-fine">In a hurry? Call or text <a class="contact-value" href="tel:+17862780478">(786) 278-0478</a>.</p>

          <div class="form-success" id="form-success" role="status" tabindex="-1">
            <h3>Quote Request Received</h3>
            <p>
              Thanks for reaching out. Your details have been sent to Frontline Boat Services, and
              we will get back to you as soon as possible.
            </p>
          </div>
        </form>
      </div>
    </section>

  </main>

  <!-- ══ FOOTER ═══════════════════════════════════════════════════════════ -->
  <footer class="footer">
    <div class="footer-grid">
      <div>
        <div class="footer-logo">
          <img src="frontline-logo.png" alt="Frontline Boat Services" width="230" height="94">
        </div>
        <p class="footer-blurb">
          First responder owned marine service out of Miami, FL. Electronics, outboards, wiring,
          audio and lighting, detailing and repair across Miami-Dade and Broward.
        </p>
        <div class="footer-social">
          <a class="footer-social-btn" href="https://instagram.com/frontlineboats" target="_blank" rel="noopener" aria-label="Instagram">
            <svg width="19" height="19" fill="none" stroke="currentColor" stroke-width="1.8" viewBox="0 0 24 24" aria-hidden="true"><rect x="2" y="2" width="20" height="20" rx="5"/><path d="M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z"/><line x1="17.5" y1="6.5" x2="17.51" y2="6.5"/></svg>
          </a>
          <a class="footer-social-btn" href="https://www.facebook.com/frontlineboats/" target="_blank" rel="noopener" aria-label="Facebook">
            <svg width="19" height="19" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path d="M18 2h-3a5 5 0 0 0-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 0 1 1-1h3z"/></svg>
          </a>
          <a class="footer-social-btn" href="https://share.google/EpuaCoLlPrNN9mZjG" target="_blank" rel="noopener" aria-label="Google reviews">
            <svg width="19" height="19" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true"><path d="m12 2 3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14l-5-4.87 6.91-1.01L12 2z"/></svg>
          </a>
        </div>
      </div>

      <div>
        <h2 class="footer-col-title">Services</h2>
        <ul class="footer-list">
          <li><a href="#marine-electronics">Marine Electronics</a></li>
          <li><a href="#outboard-service">Outboard Services</a></li>
          <li><a href="#boat-detailing">Detailing &amp; Coatings</a></li>
          <li><a href="#boat-repair">Service &amp; Repair</a></li>
          <li><a href="#boat-wiring">Wiring &amp; Rewiring</a></li>
          <li><a href="#marine-audio-lighting">Audio &amp; Lighting</a></li>
        </ul>
      </div>

      <div>
        <h2 class="footer-col-title">Contact</h2>
        <ul class="footer-list">
          <li><a href="tel:+17862780478">(786) 278-0478</a></li>
          <li><a href="mailto:[email protected]">[email protected]</a></li>
          <li><span>Miami, FL</span></li>
          <li><a href="https://instagram.com/frontlineboats" target="_blank" rel="noopener">@FrontlineBoats</a></li>
          <li><a href="https://share.google/EpuaCoLlPrNN9mZjG" target="_blank" rel="noopener">Google Reviews</a></li>
          <li><a href="#faq">Boat Service FAQ</a></li>
          <li><a href="#contact">Request a Quote</a></li>
        </ul>
      </div>
    </div>

    <div class="footer-base">
      <div class="footer-note">Miami, FL &nbsp;·&nbsp; First Responder Owned &nbsp;·&nbsp; NMEA Certified</div>
      <div class="footer-note">© <span id="year">2026</span> Frontline Boat Services. All rights reserved.</div>
    </div>
  </footer>

  <a class="sticky-call" href="tel:+17862780478" aria-hidden="true" tabindex="-1">
    <span class="sticky-call-icon" aria-hidden="true">
      <svg width="20" height="20" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24">
        <path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07A19.5 19.5 0 0 1 4.69 12 19.79 19.79 0 0 1 1.61 3.38C1.61 2.18 2.6 1 3.8 1h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L7.91 8.91a16 16 0 0 0 6.06 6.06l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z"/>
      </svg>
    </span>
    <span class="sticky-call-copy">
      <span class="sticky-call-label">Call or Text</span>
      <span class="sticky-call-number">(786) 278-0478</span>
    </span>
  </a>

  <!-- ══ LIGHTBOX ═════════════════════════════════════════════════════════ -->
  <div class="lightbox" id="lightbox" role="dialog" aria-modal="true" aria-hidden="true" aria-label="Project photo viewer">
    <button class="lightbox-btn lightbox-close" type="button" aria-label="Close photo viewer">
      <svg width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" aria-hidden="true"><path d="M18 6 6 18M6 6l12 12"/></svg>
    </button>
    <button class="lightbox-btn lightbox-prev" type="button" aria-label="Previous photo">
      <svg width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" aria-hidden="true"><path d="M15 18 9 12l6-6"/></svg>
    </button>
    <button class="lightbox-btn lightbox-next" type="button" aria-label="Next photo">
      <svg width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" aria-hidden="true"><path d="m9 18 6-6-6-6"/></svg>
    </button>
    <figure class="lightbox-figure">
      <img id="lightbox-img" src="" alt="">
      <figcaption class="lightbox-caption">
        <span class="lightbox-index" id="lightbox-index"></span>
        <span class="lightbox-text" id="lightbox-text"></span>
      </figcaption>
    </figure>
  </div>

  <script type="application/ld+json">
  {
    "@context": "https://schema.org",
    "@graph": [
      {
        "@type": "WebSite",
        "@id": "https://frontlineboats.com/#website",
        "url": "https://frontlineboats.com/",
        "name": "Frontline Boat Services",
        "inLanguage": "en-US",
        "publisher": { "@id": "https://frontlineboats.com/#business" }
      },
      {
        "@type": "LocalBusiness",
        "@id": "https://frontlineboats.com/#business",
        "name": "Frontline Boat Services",
        "url": "https://frontlineboats.com/",
        "description": "Mobile boat repair and marine service company serving Miami-Dade and Broward. Services include marine electronics, outboard service, boat wiring and rewiring, marine audio and lighting, detailing and coatings, and general boat repair.",
        "telephone": "+1-786-278-0478",
        "email": "[email protected]",
        "image": "https://frontlineboats.com/frontline-og_card.png",
        "logo": "https://frontlineboats.com/frontline-logo.png",
        "currenciesAccepted": "USD",
        "address": {
          "@type": "PostalAddress",
          "addressLocality": "Miami",
          "addressRegion": "FL",
          "addressCountry": "US"
        },
        "areaServed": [
          { "@type": "AdministrativeArea", "name": "Miami-Dade County, Florida" },
          { "@type": "AdministrativeArea", "name": "Broward County, Florida" },
          { "@type": "City", "name": "Miami, Florida" },
          { "@type": "City", "name": "Fort Lauderdale, Florida" }
        ],
        "sameAs": [
          "https://instagram.com/frontlineboats",
          "https://www.facebook.com/frontlineboats/",
          "https://share.google/EpuaCoLlPrNN9mZjG"
        ],
        "hasOfferCatalog": {
          "@type": "OfferCatalog",
          "name": "Mobile Boat Repair and Marine Services",
          "itemListElement": [
            {
              "@type": "Offer",
              "itemOffered": {
                "@type": "Service",
                "name": "Marine Electronics Installation",
                "url": "https://frontlineboats.com/#marine-electronics",
                "areaServed": "Miami-Dade and Broward Counties, Florida"
              }
            },
            {
              "@type": "Offer",
              "itemOffered": {
                "@type": "Service",
                "name": "Boat Wiring and Rewiring",
                "url": "https://frontlineboats.com/#boat-wiring",
                "areaServed": "Miami-Dade and Broward Counties, Florida"
              }
            },
            {
              "@type": "Offer",
              "itemOffered": {
                "@type": "Service",
                "name": "Outboard Motor Service and Repair",
                "url": "https://frontlineboats.com/#outboard-service",
                "areaServed": "Miami-Dade and Broward Counties, Florida"
              }
            },
            {
              "@type": "Offer",
              "itemOffered": {
                "@type": "Service",
                "name": "Boat Detailing and Ceramic Coatings",
                "url": "https://frontlineboats.com/#boat-detailing",
                "areaServed": "Miami-Dade and Broward Counties, Florida"
              }
            },
            {
              "@type": "Offer",
              "itemOffered": {
                "@type": "Service",
                "name": "Mobile Boat Repair",
                "url": "https://frontlineboats.com/#boat-repair",
                "areaServed": "Miami-Dade and Broward Counties, Florida"
              }
            },
            {
              "@type": "Offer",
              "itemOffered": {
                "@type": "Service",
                "name": "Marine Audio and Lighting Installation",
                "url": "https://frontlineboats.com/#marine-audio-lighting",
                "areaServed": "Miami-Dade and Broward Counties, Florida"
              }
            }
          ]
        }
      },
      {
        "@type": "FAQPage",
        "@id": "https://frontlineboats.com/#faq",
        "mainEntity": [
          {
            "@type": "Question",
            "name": "Do you provide mobile boat repair in Miami?",
            "acceptedAnswer": {
              "@type": "Answer",
              "text": "Yes. Frontline is a mobile and dockside marine service working at home docks, marina slips, dry storage facilities and driveways throughout Miami-Dade, with service also available in Broward County."
            }
          },
          {
            "@type": "Question",
            "name": "What areas do you serve near Miami?",
            "acceptedAnswer": {
              "@type": "Answer",
              "text": "Primary coverage includes Miami, Miami Beach, North Miami, Coconut Grove, Coral Gables, Key Biscayne and Homestead. Service is also available in Hollywood, Dania Beach, Fort Lauderdale and Pompano Beach for qualifying projects."
            }
          },
          {
            "@type": "Question",
            "name": "Can you install Garmin, Simrad or Raymarine electronics?",
            "acceptedAnswer": {
              "@type": "Answer",
              "text": "Yes. Frontline installs and upgrades chartplotters, sonar, radar, VHF, AIS, autopilot and NMEA 2000 networks from leading marine electronics brands."
            }
          },
          {
            "@type": "Question",
            "name": "Do you rewire older boats?",
            "acceptedAnswer": {
              "@type": "Answer",
              "text": "Yes. Frontline handles complete boat rewires, battery systems, distribution, fusing, switch panels and harness cleanup using tinned marine wire and properly protected, clearly labeled circuits."
            }
          },
          {
            "@type": "Question",
            "name": "Which outboard motor brands do you service?",
            "acceptedAnswer": {
              "@type": "Answer",
              "text": "Frontline services Yamaha, Mercury and Suzuki outboards, including scheduled maintenance, oil and gearcase-lube changes, water pumps, impellers, charging systems, starters, rigging and fault-code diagnostics."
            }
          },
          {
            "@type": "Question",
            "name": "How do I get a quote for boat service?",
            "acceptedAnswer": {
              "@type": "Answer",
              "text": "Call or text (786) 278-0478, or send the website quote form with the boat's year, make, model, location and the work needed."
            }
          }
        ]
      }
    ]
  }
  </script>

  <script>
  (function () {
    'use strict';

    var reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;

    /* ── Footer year ────────────────────────────────────────────────────── */
    var yearEl = document.getElementById('year');
    if (yearEl) { yearEl.textContent = new Date().getFullYear(); }

    /* ── Nav ────────────────────────────────────────────────────────────── */
    var nav = document.getElementById('site-nav');
    var navToggle = nav.querySelector('.nav-toggle');
    var navList = document.getElementById('primary-navigation');
    var mobileNav = window.matchMedia('(max-width: 1240px)');
    var hero = document.getElementById('hero');
    var footer = document.querySelector('.footer');
    var stickyCall = document.querySelector('.sticky-call');

    var navTargets = Array.prototype.slice.call(nav.querySelectorAll('.nav-links a[href^="#"]'))
      .map(function (link) { return { link: link, section: document.querySelector(link.getAttribute('href')) }; })
      .filter(function (pair) { return pair.section; });

    function syncNavA11y() {
      navList.setAttribute('aria-hidden', String(mobileNav.matches && !nav.classList.contains('is-open')));
    }

    function setMobileNav(open) {
      nav.classList.toggle('is-open', open);
      navToggle.setAttribute('aria-expanded', String(open));
      navToggle.setAttribute('aria-label', open ? 'Close navigation' : 'Open navigation');
      syncNavA11y();
    }

    function setActiveLink(id) {
      navTargets.forEach(function (pair) {
        var active = pair.section.id === id;
        pair.link.classList.toggle('is-active', active);
        if (active) { pair.link.setAttribute('aria-current', 'location'); }
        else { pair.link.removeAttribute('aria-current'); }
      });
    }

    function updateStickyCall() {
      var pastHero = hero.getBoundingClientRect().bottom <= 0;
      var footerVisible = footer.getBoundingClientRect().top < window.innerHeight;
      var show = pastHero && !footerVisible;
      stickyCall.classList.toggle('is-visible', show);
      stickyCall.setAttribute('aria-hidden', String(!show));
      stickyCall.tabIndex = show ? 0 : -1;
    }

    function onScroll() {
      var offset = nav.offsetHeight + 24;
      var atEnd = window.innerHeight + window.scrollY >= document.documentElement.scrollHeight - 2;
      var active = '';

      navTargets.forEach(function (pair) {
        if (pair.section.getBoundingClientRect().top <= offset) { active = pair.section.id; }
      });

      if (atEnd && navTargets.length) { active = navTargets[navTargets.length - 1].section.id; }

      setActiveLink(active);
      nav.classList.toggle('is-scrolled', window.scrollY > 40);
      updateStickyCall();
    }

    navToggle.addEventListener('click', function () {
      setMobileNav(!nav.classList.contains('is-open'));
    });

    nav.querySelectorAll('.nav-links a, .nav-cta').forEach(function (link) {
      link.addEventListener('click', function () {
        var href = link.getAttribute('href') || '';
        if (href.charAt(0) === '#') { setActiveLink(href.slice(1)); }
        setMobileNav(false);
      });
    });

    window.addEventListener('scroll', onScroll, { passive: true });
    window.addEventListener('resize', function () { onScroll(); syncNavA11y(); });
    window.addEventListener('load', onScroll);
    onScroll();
    syncNavA11y();

    /* ── Scroll reveal ──────────────────────────────────────────────────── */
    var revealTargets = document.querySelectorAll('[data-reveal]');

    if (reduceMotion || !('IntersectionObserver' in window)) {
      revealTargets.forEach(function (el) { el.classList.add('is-inview'); });
    } else {
      var revealObserver = new IntersectionObserver(function (entries) {
        entries.forEach(function (entry) {
          if (entry.isIntersecting) {
            entry.target.classList.add('is-inview');
            revealObserver.unobserve(entry.target);
          }
        });
      }, { rootMargin: '0px 0px -8% 0px', threshold: 0.05 });

      revealTargets.forEach(function (el) { revealObserver.observe(el); });
    }

    /* ── Gallery: filter + show more ────────────────────────────────────── */
    var shotsGrid = document.getElementById('shots');
    var filters = document.querySelector('.filters');
    var shots = [];
    var filterButtons = [];
    var galleryToggle = document.getElementById('gallery-toggle');
    var galleryEmpty = document.getElementById('gallery-empty');
    var INITIAL_SHOWN = 12;

    var currentFilter = 'all';
    var expanded = false;
    var visibleShots = [];

    function makeFilter(filter, label, count, pressed) {
      var button = document.createElement('button');
      var countLabel = document.createElement('span');
      button.className = 'filter';
      button.type = 'button';
      button.dataset.filter = filter;
      button.setAttribute('aria-pressed', String(pressed));
      button.appendChild(document.createTextNode(label + ' '));
      countLabel.className = 'filter-count';
      countLabel.textContent = count;
      button.appendChild(countLabel);
      return button;
    }

    function makeShot(item) {
      var shot = document.createElement('button');
      var image = document.createElement('img');
      var caption = document.createElement('span');
      shot.className = 'shot';
      shot.type = 'button';
      shot.dataset.cat = item.category || '';
      shot.dataset.full = item.src;
      image.className = 'shot-img';
      image.src = item.thumb;
      image.alt = item.alt;
      image.loading = 'lazy';
      caption.className = 'shot-tag';
      caption.textContent = item.caption;
      shot.appendChild(image);
      shot.appendChild(caption);
      shot.addEventListener('click', function () {
        var index = visibleShots.indexOf(shot);
        if (index !== -1) { openLightbox(index); }
      });
      return shot;
    }

    function renderGallery() {
      var matching = shots.filter(function (shot) {
        return currentFilter === 'all' || shot.dataset.cat === currentFilter;
      });

      var limit = expanded ? matching.length : Math.min(INITIAL_SHOWN, matching.length);
      visibleShots = matching.slice(0, limit);

      shots.forEach(function (shot) {
        shot.hidden = visibleShots.indexOf(shot) === -1;
      });

      visibleShots.forEach(function (shot, i) {
        shot.setAttribute('aria-label', 'View photo ' + (i + 1) + ' of ' + visibleShots.length +
          ': ' + shot.querySelector('.shot-img').alt);
      });

      galleryEmpty.hidden = matching.length > 0;

      if (matching.length > INITIAL_SHOWN) {
        galleryToggle.hidden = false;
        galleryToggle.textContent = expanded
          ? 'Show fewer photos'
          : 'Show all ' + matching.length + ' photos';
      } else {
        galleryToggle.hidden = true;
      }
    }

    function startGallery(manifest) {
      if (!manifest || manifest.version !== 1 ||
          !Array.isArray(manifest.categories) || !Array.isArray(manifest.images)) {
        throw new Error('Invalid gallery manifest');
      }

      shotsGrid.innerHTML = '';
      filters.innerHTML = '';
      manifest.images.forEach(function (item) {
        if (!item || !item.id || !item.src || !item.thumb || !item.caption || !item.alt) {
          throw new Error('Invalid gallery image');
        }
        var shot = makeShot(item);
        shotsGrid.appendChild(shot);
        shots.push(shot);
      });

      filterButtons.push(makeFilter('all', 'All Work', shots.length, true));
      manifest.categories.forEach(function (category) {
        var count = manifest.images.filter(function (item) {
          return item.category === category.id;
        }).length;
        filterButtons.push(makeFilter(category.id, category.label, count, false));
      });
      filterButtons.forEach(function (button) {
        filters.appendChild(button);
        button.addEventListener('click', function () {
          currentFilter = button.dataset.filter;
          expanded = false;
          filterButtons.forEach(function (other) {
            other.setAttribute('aria-pressed', String(other === button));
          });
          renderGallery();
        });
      });
      renderGallery();
    }

    galleryToggle.addEventListener('click', function () {
      expanded = !expanded;
      renderGallery();
      if (!expanded) {
        shotsGrid.scrollIntoView({ behavior: reduceMotion ? 'auto' : 'smooth', block: 'start' });
      }
    });

    fetch(shotsGrid.dataset.galleryManifest, { credentials: 'same-origin' })
      .then(function (response) {
        if (!response.ok) { throw new Error('Gallery request failed'); }
        return response.json();
      })
      .then(startGallery)
      .catch(function () {
        shotsGrid.innerHTML = '';
        filters.innerHTML = '';
        galleryToggle.hidden = true;
        galleryEmpty.textContent = 'The project gallery is temporarily unavailable. Please try again soon.';
        galleryEmpty.hidden = false;
      });

    /* ── Lightbox ───────────────────────────────────────────────────────── */
    var lightbox = document.getElementById('lightbox');
    var lightboxImg = document.getElementById('lightbox-img');
    var lightboxIndex = document.getElementById('lightbox-index');
    var lightboxText = document.getElementById('lightbox-text');
    var closeBtn = lightbox.querySelector('.lightbox-close');
    var prevBtn = lightbox.querySelector('.lightbox-prev');
    var nextBtn = lightbox.querySelector('.lightbox-next');
    var lastFocused = null;
    var activeIndex = 0;

    function showPhoto(index) {
      if (!visibleShots.length) { return; }
      activeIndex = (index + visibleShots.length) % visibleShots.length;

      var shot = visibleShots[activeIndex];
      var thumb = shot.querySelector('.shot-img');

      lightboxImg.src = shot.dataset.full;
      lightboxImg.alt = thumb.alt;
      lightboxIndex.textContent = (activeIndex + 1) + ' / ' + visibleShots.length;
      lightboxText.textContent = thumb.alt;

      var multiple = visibleShots.length > 1;
      prevBtn.hidden = !multiple;
      nextBtn.hidden = !multiple;
    }

    function openLightbox(index) {
      lastFocused = document.activeElement;
      showPhoto(index);
      lightbox.classList.add('is-open');
      lightbox.setAttribute('aria-hidden', 'false');
      document.body.classList.add('is-locked');
      closeBtn.focus();
    }

    function closeLightbox() {
      lightbox.classList.remove('is-open');
      lightbox.setAttribute('aria-hidden', 'true');
      document.body.classList.remove('is-locked');
      lightboxImg.removeAttribute('src');
      lightboxImg.alt = '';
      if (lastFocused) { lastFocused.focus(); }
    }

    closeBtn.addEventListener('click', closeLightbox);
    prevBtn.addEventListener('click', function () { showPhoto(activeIndex - 1); });
    nextBtn.addEventListener('click', function () { showPhoto(activeIndex + 1); });

    lightbox.addEventListener('click', function (event) {
      if (event.target === lightbox || event.target.classList.contains('lightbox-figure')) {
        closeLightbox();
      }
    });

    document.addEventListener('keydown', function (event) {
      if (lightbox.classList.contains('is-open')) {
        if (event.key === 'Escape') { closeLightbox(); }
        if (event.key === 'ArrowLeft') { showPhoto(activeIndex - 1); }
        if (event.key === 'ArrowRight') { showPhoto(activeIndex + 1); }
        return;
      }

      if (event.key === 'Escape' && nav.classList.contains('is-open')) {
        setMobileNav(false);
        navToggle.focus();
      }
    });

    /* ── Quote form ─────────────────────────────────────────────────────── */
    var form = document.getElementById('quote-form');
    var formSuccess = document.getElementById('form-success');
    var formError = document.getElementById('form-error');
    var submitButton = form.querySelector('.form-submit');
    var submitLabel = submitButton.textContent;

    form.addEventListener('submit', async function (event) {
      event.preventDefault();

      if (!form.checkValidity()) {
        form.reportValidity();
        return;
      }

      submitButton.disabled = true;
      submitButton.textContent = 'Sending…';
      formError.textContent = '';
      formError.classList.remove('is-visible');

      try {
        var response = await fetch(form.action, {
          method: form.method,
          body: new FormData(form),
          headers: { Accept: 'application/json' }
        });

        if (!response.ok) { throw new Error('Form submission failed'); }

        form.classList.add('is-sent');
        formSuccess.focus();
      } catch (error) {
        formError.textContent = 'Your request could not be sent. Please try again, or call or text (786) 278-0478.';
        formError.classList.add('is-visible');
        submitButton.disabled = false;
        submitButton.textContent = submitLabel;
      }
    });
  })();
  </script>
</body>
</html>