<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>JDB Landscape — Burlington, ON</title>
<meta name="description" content="JDB Landscape provides owner-operated hardscapes, lawn care, garden bed renovations, sod, mulch, clean-ups and junk removal across Burlington, Oakville, Hamilton, Mississauga, Milton and Niagara Region.">
<meta property="og:type" content="website">
<meta property="og:title" content="JDB Landscape — Burlington, ON">
<meta property="og:description" content="Owner-operated landscaping, hardscapes and lawn care across Burlington and nearby service areas.">
<meta property="og:image" content="jdb-og.webp">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta property="og:image:alt" content="JDB Landscape services in Burlington, Ontario">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="JDB Landscape — Burlington, ON">
<meta name="twitter:description" content="Owner-operated landscaping, hardscapes and lawn care across Burlington and nearby service areas.">
<meta name="twitter:image" content="jdb-og.webp">
<meta name="twitter:image:alt" content="JDB Landscape services in Burlington, Ontario">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,300;0,600;0,700;1,300;1,600&family=Inter:wght@300;400;500;600&display=swap" rel="stylesheet">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
:root {
--soil: #1B1F17;
--green: #4A7C59;
--green-d: #2E5240;
--concrete:#C8BFB0;
--bone: #F2EFE9;
--rust: #B85C38;
--rust-l: #D4714A;
--white: #FAFAF8;
}
html { scroll-behavior: smooth; font-size: 16px; }
section { scroll-margin-top: 86px; }
body {
font-family: 'Inter', sans-serif;
background: var(--white);
color: var(--soil);
overflow-x: hidden;
}
/* ─── NAV ─── */
nav {
position: fixed; top: 0; left: 0; right: 0; z-index: 100;
display: flex; align-items: center; justify-content: space-between;
padding: 28px 60px;
transition: padding .4s, background .4s;
}
nav.stuck,
nav.menu-open {
padding: 12px 60px;
background: rgba(27,31,23,.96);
backdrop-filter: blur(16px);
}
.nav-wordmark {
display: flex; align-items: center;
color: var(--white); text-decoration: none;
flex: 0 0 auto;
}
.nav-logo-image {
display: block;
width: auto; height: 120px;
transition: height .4s ease, transform .4s ease;
}
nav.stuck .nav-logo-image,
nav.menu-open .nav-logo-image {
height: 44px;
}
.nav-links {
display: flex; gap: 40px; list-style: none;
}
.nav-links a {
position: relative;
color: rgba(255,255,255,.6); text-decoration: none;
font-size: 12px; font-weight: 500; letter-spacing: .1em; text-transform: uppercase;
transition: color .2s;
}
.nav-links a::after {
content: "";
position: absolute; left: 0; right: 0; bottom: -8px; height: 1px;
background: var(--rust);
transform: scaleX(0);
transform-origin: left;
transition: transform .2s;
}
.nav-links a:hover,
.nav-links a.is-active { color: var(--white); }
.nav-links a:hover::after,
.nav-links a.is-active::after { transform: scaleX(1); }
.nav-mobile-estimate { display: none; }
.nav-actions {
display: flex; align-items: center; gap: 12px;
}
.nav-btn {
font-size: 11px; font-weight: 600; letter-spacing: .12em; text-transform: uppercase;
color: var(--soil); background: var(--concrete);
padding: 11px 24px; text-decoration: none;
transition: background .2s;
}
.nav-btn:hover,
.nav-btn.is-active { background: var(--white); }
.nav-phone {
display: inline-flex; align-items: center; gap: 9px;
padding: 10px 18px;
border: 1px solid rgba(255,255,255,.16);
color: var(--white);
text-decoration: none;
font-size: 12px; font-weight: 600; letter-spacing: .08em;
transition: border-color .2s, background .2s, color .2s;
}
.nav-phone:hover {
background: rgba(255,255,255,.08);
border-color: rgba(255,255,255,.32);
}
.nav-phone svg { flex: 0 0 auto; color: var(--rust-l); }
.nav-menu-toggle {
display: none; align-items: center; justify-content: center; flex-direction: column; gap: 5px;
width: 44px; height: 44px;
border: 1px solid rgba(255,255,255,.16);
background: rgba(255,255,255,.06);
color: var(--white);
cursor: pointer;
transition: background .2s, border-color .2s;
}
.nav-menu-toggle:hover {
background: rgba(255,255,255,.12);
border-color: rgba(255,255,255,.28);
}
.nav-menu-toggle span {
width: 18px; height: 2px;
background: currentColor;
transition: transform .2s, opacity .2s;
}
nav.menu-open .nav-menu-toggle span:nth-child(1) { transform: translateY(7px) rotate(45deg); }
nav.menu-open .nav-menu-toggle span:nth-child(2) { opacity: 0; }
nav.menu-open .nav-menu-toggle span:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }
.mobile-call-bar { display: none; }
.mobile-call-bar svg { flex: 0 0 auto; }
.mobile-call-bar-text {
display: flex; flex-direction: column; gap: 2px;
line-height: 1;
}
.mobile-call-bar-label {
font-size: 9px; font-weight: 600; letter-spacing: .16em; text-transform: uppercase;
color: rgba(255,255,255,.58);
}
.mobile-call-bar-number {
font-size: 15px; font-weight: 600; letter-spacing: .02em;
color: var(--white);
}
/* ─── HERO ─── */
#hero {
min-height: 100vh;
background: var(--soil);
display: flex; flex-direction: column; justify-content: flex-end;
position: relative; overflow: hidden;
isolation: isolate;
}
#hero::before {
content: "";
position: absolute; inset: 0; z-index: 1;
background:
linear-gradient(to bottom, rgba(27,31,23,.18) 0%, rgba(27,31,23,.54) 58%, rgba(27,31,23,.92) 100%),
linear-gradient(to right, rgba(27,31,23,.74) 0%, rgba(27,31,23,.45) 45%, rgba(27,31,23,.18) 100%);
pointer-events: none;
}
.hero-slideshow {
position: absolute; inset: 0;
z-index: 0;
overflow: hidden;
background: var(--soil);
}
.hero-slide {
position: absolute; inset: 0;
width: 100%; height: 100%;
object-fit: cover;
object-position: center;
opacity: 0;
transform: scale(1.12);
filter: saturate(.9) contrast(1.04);
animation: heroZoomFade 20s infinite ease-in-out;
will-change: opacity, transform;
}
.hero-slide:nth-child(1) { animation-delay: -.4s; }
.hero-slide:nth-child(2) { animation-delay: 9.6s; }
@keyframes heroZoomFade {
0% {
opacity: 0;
transform: scale(1.12);
}
3% {
opacity: 1;
}
45% {
opacity: 1;
}
52% {
opacity: 0;
transform: scale(1);
}
100% {
opacity: 0;
transform: scale(1);
}
}
.hero-content {
position: relative; z-index: 2;
padding: 0 60px 72px;
display: flex; align-items: flex-end; justify-content: space-between;
gap: 40px;
}
.hero-left { max-width: 600px; }
.hero-pill {
display: inline-flex; align-items: center; gap: 8px;
background: rgba(255,255,255,.08);
border: 1px solid rgba(255,255,255,.12);
padding: 7px 14px; margin-bottom: 28px;
font-size: 11px; letter-spacing: .14em; text-transform: uppercase;
color: var(--concrete); font-weight: 500;
}
.hero-pill-dot {
width: 6px; height: 6px; border-radius: 50%;
background: var(--rust); flex-shrink: 0;
animation: pulse 2.4s ease infinite;
}
@keyframes pulse {
0%,100% { opacity:1; transform:scale(1); }
50% { opacity:.5; transform:scale(.7); }
}
.hero-h1 {
font-family: 'Cormorant Garamond', serif;
font-size: clamp(42px, 5.5vw, 76px);
font-weight: 300;
line-height: 1.08;
color: var(--white);
margin-bottom: 0;
}
.hero-h1 em {
font-style: italic;
color: var(--concrete);
}
.hero-right {
display: flex; flex-direction: column; align-items: flex-end; gap: 28px;
flex-shrink: 0;
}
.hero-sub {
font-size: 14px; line-height: 1.8; font-weight: 300;
color: rgba(255,255,255,.5);
max-width: 280px; text-align: right;
}
.hero-cta {
display: inline-flex; align-items: center; gap: 12px;
background: var(--rust);
color: var(--white);
padding: 16px 32px;
font-size: 12px; font-weight: 600; letter-spacing: .12em; text-transform: uppercase;
text-decoration: none;
transition: background .2s, gap .2s;
}
.hero-cta:hover { background: var(--rust-l); gap: 18px; }
.hero-cta-arrow { font-size: 16px; }
.hero-rule {
position: absolute; bottom: 0; left: 0; right: 0; height: 1px;
background: rgba(255,255,255,.08);
z-index: 2;
}
/* ─── MARQUEE STRIP ─── */
.marquee-strip {
background: var(--rust);
overflow: hidden;
white-space: nowrap;
padding: 14px 0;
}
.marquee-inner {
display: inline-flex; gap: 0;
animation: marquee 22s linear infinite;
}
@keyframes marquee {
from { transform: translateX(0); }
to { transform: translateX(-50%); }
}
.marquee-item {
display: inline-flex; align-items: center; gap: 20px;
font-size: 11px; font-weight: 600; letter-spacing: .16em; text-transform: uppercase;
color: var(--white);
padding: 0 36px;
}
.marquee-sep { opacity: .5; font-size: 18px; line-height: 1; }
/* ─── SERVICES ─── */
#services {
padding: 110px 60px;
background: var(--white);
position: relative;
overflow: hidden;
}
.services-watermark {
position: absolute; top: 18px; right: 42px; z-index: 0;
font-family: 'Cormorant Garamond', serif;
font-size: clamp(120px, 18vw, 260px);
font-weight: 700;
line-height: .8;
letter-spacing: 0;
color: rgba(27,31,23,.045);
user-select: none;
pointer-events: none;
}
.services-header {
position: relative; z-index: 1;
display: grid; grid-template-columns: 1fr 1fr;
gap: 60px; align-items: end;
padding-bottom: 64px;
border-bottom: 1px solid var(--concrete);
margin-bottom: 0;
}
.eyebrow {
font-size: 11px; font-weight: 500; letter-spacing: .18em; text-transform: uppercase;
color: var(--rust); display: block; margin-bottom: 16px;
}
.section-h2 {
font-family: 'Cormorant Garamond', serif;
font-size: clamp(36px, 4vw, 56px);
font-weight: 300; line-height: 1.1;
color: var(--soil);
}
.section-h2 em { font-style: italic; color: var(--green); }
.section-desc {
font-size: 15px; line-height: 1.8; font-weight: 300;
color: rgba(27,31,23,.55);
max-width: 380px;
}
/* Service rows — editorial style, not cards */
.service-list { margin-top: 0; position: relative; z-index: 1; }
.service-row {
display: grid; grid-template-columns: 56px 1fr 1fr auto;
align-items: center; gap: 32px;
padding: 32px 0;
border-bottom: 1px solid rgba(200,191,176,.4);
transition: background .2s;
cursor: default;
}
.service-row:hover { background: var(--bone); margin: 0 -60px; padding: 32px 60px; }
.service-row:first-child { border-top: 1px solid rgba(200,191,176,.4); }
.service-icon-wrap {
width: 48px; height: 48px; border-radius: 50%;
background: var(--bone); border: 1px solid var(--concrete);
display: flex; align-items: center; justify-content: center;
color: var(--green); flex-shrink: 0;
transition: background .2s, border-color .2s;
}
.service-row:hover .service-icon-wrap { background: var(--green); color: var(--white); border-color: var(--green); }
.service-name-col {
font-family: 'Cormorant Garamond', serif;
font-size: 22px; font-weight: 600; color: var(--soil);
}
.service-desc-col {
font-size: 13px; line-height: 1.7; font-weight: 300;
color: rgba(27,31,23,.5);
}
.service-tag {
font-size: 10px; font-weight: 600; letter-spacing: .12em; text-transform: uppercase;
color: var(--concrete); white-space: nowrap;
transition: color .2s;
}
.service-row:hover .service-tag { color: var(--rust); }
/* ─── ABOUT ─── */
#about {
background: var(--soil);
display: grid; grid-template-columns: 1fr 1fr;
min-height: 680px;
}
.about-img-col {
position: relative; overflow: hidden;
}
.about-img-col img {
width: 100%; height: 100%; object-fit: cover; display: block;
filter: grayscale(30%) saturate(.9);
transition: transform 8s ease, filter 8s ease;
}
#about:hover .about-img-col img {
transform: scale(1.04); filter: grayscale(0%) saturate(1.05);
}
.about-img-overlay {
position: absolute; inset: 0;
background: linear-gradient(to right, transparent 55%, var(--soil) 100%);
}
.about-text-col {
padding: 80px 72px 80px 56px;
display: flex; flex-direction: column; justify-content: center;
}
.about-text-col .eyebrow { color: var(--rust); margin-bottom: 20px; }
.about-h2 {
font-family: 'Cormorant Garamond', serif;
font-size: clamp(34px, 3.5vw, 50px);
font-weight: 300; line-height: 1.12;
color: var(--white); margin-bottom: 28px;
}
.about-h2 em { font-style: italic; color: var(--concrete); }
.about-body {
font-size: 15px; line-height: 1.85; font-weight: 300;
color: rgba(255,255,255,.5);
margin-bottom: 44px;
}
.about-badges {
display: flex; flex-wrap: wrap; gap: 10px;
}
.badge {
display: inline-flex; align-items: center; gap: 8px;
border: 1px solid rgba(255,255,255,.12);
padding: 9px 16px;
font-size: 12px; font-weight: 400; letter-spacing: .04em;
color: rgba(255,255,255,.65);
}
.badge-icon { color: var(--rust); }
/* ─── GALLERY ─── */
#gallery {
background: var(--bone);
padding: 100px 60px;
}
.gallery-header {
display: flex; justify-content: space-between; align-items: flex-end;
margin-bottom: 52px;
}
.gallery-note {
font-size: 13px; font-weight: 300; color: rgba(27,31,23,.4);
max-width: 220px; text-align: right; line-height: 1.6;
}
.before-after {
--reveal: 50%;
position: relative;
aspect-ratio: 4 / 3;
margin-bottom: 52px;
overflow: hidden;
background: var(--soil);
border: 1px solid rgba(200,191,176,.55);
}
.before-after-img,
.before-after-overlay {
position: absolute; inset: 0;
width: 100%; height: 100%;
}
.before-after-img {
object-fit: cover;
display: block;
}
.before-after-overlay {
overflow: hidden;
clip-path: inset(0 calc(100% - var(--reveal)) 0 0);
}
.before-after-divider {
position: absolute; top: 0; bottom: 0; left: var(--reveal); z-index: 3;
width: 2px;
background: var(--white);
transform: translateX(-50%);
box-shadow: 0 0 0 1px rgba(27,31,23,.18);
pointer-events: none;
}
.before-after-handle {
position: absolute; top: 50%; left: var(--reveal); z-index: 4;
width: 48px; height: 48px;
display: flex; align-items: center; justify-content: center; gap: 4px;
background: var(--white);
color: var(--soil);
border: 1px solid rgba(27,31,23,.18);
border-radius: 50%;
transform: translate(-50%, -50%);
box-shadow: 0 14px 32px rgba(27,31,23,.24);
pointer-events: none;
}
.before-after-handle span {
width: 7px; height: 7px;
border-top: 2px solid currentColor;
border-left: 2px solid currentColor;
}
.before-after-handle span:first-child { transform: rotate(-45deg); }
.before-after-handle span:last-child { transform: rotate(135deg); }
.before-after-label {
position: absolute; top: 18px; z-index: 2;
padding: 8px 12px;
background: rgba(27,31,23,.72);
color: var(--white);
font-size: 10px; font-weight: 600; letter-spacing: .14em; text-transform: uppercase;
}
.before-after-label.before { left: 18px; }
.before-after-label.after { right: 18px; }
.before-after-range {
position: absolute; inset: 0; z-index: 5;
width: 100%; height: 100%;
opacity: 0;
cursor: ew-resize;
appearance: none;
-webkit-appearance: none;
}
.before-after-range::-webkit-slider-runnable-track {
width: 100%; height: 100%;
background: transparent;
}
.before-after-range::-webkit-slider-thumb {
width: 48px; height: 100%;
background: transparent;
border: 0;
-webkit-appearance: none;
}
.before-after-range::-moz-range-track {
width: 100%; height: 100%;
background: transparent;
border: 0;
}
.before-after-range::-moz-range-thumb {
width: 48px; height: 100%;
background: transparent;
border: 0;
}
.before-after-range:focus-visible + .before-after-focus {
opacity: 1;
}
.before-after-focus {
position: absolute; inset: 8px; z-index: 4;
border: 2px solid var(--rust);
opacity: 0;
pointer-events: none;
}
/* Bento-style gallery — feels like a portfolio sheet */
.gallery-bento {
display: grid;
grid-template-columns: repeat(12, 1fr);
grid-template-rows: 260px 280px;
gap: 8px;
}
.gitem {
overflow: hidden; position: relative;
background: var(--concrete);
cursor: zoom-in;
}
.gitem:focus-visible {
outline: 2px solid var(--rust);
outline-offset: 4px;
}
.gitem img {
width: 100%; height: 100%; object-fit: cover; display: block;
transition: transform .7s cubic-bezier(.25,.46,.45,.94), filter .5s;
filter: saturate(.8);
}
.gitem:hover img { transform: scale(1.06); filter: saturate(1.1); }
.gitem-label {
position: absolute; bottom: 0; left: 0; right: 0;
padding: 12px 16px;
background: linear-gradient(to top, rgba(27,31,23,.75) 0%, transparent 100%);
font-size: 11px; letter-spacing: .1em; text-transform: uppercase;
color: rgba(255,255,255,.8); font-weight: 500;
opacity: 0; transform: translateY(4px);
transition: opacity .3s, transform .3s;
}
.gitem:hover .gitem-label { opacity: 1; transform: translateY(0); }
.ga { grid-column: 1 / 5; grid-row: 1; }
.gb { grid-column: 5 / 9; grid-row: 1; }
.gc { grid-column: 9 / 13; grid-row: 1 / 3; }
.gd { grid-column: 1 / 7; grid-row: 2; }
.ge { grid-column: 7 / 9; grid-row: 2; }
.image-modal {
position: fixed; inset: 0; z-index: 1000;
display: grid; place-items: center;
padding: clamp(18px, 4vw, 56px);
background: rgba(27,31,23,.58);
backdrop-filter: blur(18px);
-webkit-backdrop-filter: blur(18px);
opacity: 0; visibility: hidden; pointer-events: none;
transition: opacity .2s, visibility .2s;
}
.image-modal.is-open {
opacity: 1; visibility: visible; pointer-events: auto;
}
.image-modal img {
max-width: 100%;
max-height: 92vh;
object-fit: contain;
box-shadow: 0 24px 80px rgba(0,0,0,.34);
}
.image-modal-close {
position: fixed; top: 18px; right: 18px; z-index: 1001;
width: 44px; height: 44px;
border: 1px solid rgba(255,255,255,.16);
background: rgba(27,31,23,.68);
color: var(--white);
font: 300 34px/1 'Inter', sans-serif;
cursor: pointer;
transition: background .2s, border-color .2s;
}
.image-modal-close:hover {
background: rgba(27,31,23,.92);
border-color: rgba(255,255,255,.32);
}
.image-modal-close:focus-visible {
outline: 2px solid var(--rust);
outline-offset: 4px;
}
body.modal-open { overflow: hidden; }
/* ─── AREAS ─── */
#areas {
background: var(--white);
padding: 100px 60px;
}
.areas-inner {
display: grid; grid-template-columns: 1fr 1fr; gap: 80px; align-items: start;
}
.areas-map {
position: relative;
overflow: hidden;
background: var(--bone);
border: 1px solid var(--concrete);
aspect-ratio: 4/3;
}
.areas-map iframe {
width: 100%; height: 100%;
display: block;
border: 0;
filter: saturate(.85) contrast(.96);
}
.areas-map-link {
position: absolute; left: 14px; bottom: 14px; z-index: 1;
display: inline-flex;
padding: 8px 12px;
background: rgba(27,31,23,.78);
color: var(--white);
text-decoration: none;
font-size: 10px; font-weight: 600; letter-spacing: .12em; text-transform: uppercase;
transition: background .2s;
}
.areas-map-link:hover { background: rgba(27,31,23,.94); }
.areas-list {
padding-top: 8px;
}
.areas-list .eyebrow { margin-bottom: 20px; }
.areas-list .section-h2 { margin-bottom: 36px; }
.area-items {
display: flex; flex-direction: column; gap: 0;
}
.area-item {
display: flex; align-items: center; justify-content: space-between;
padding: 18px 0;
border-bottom: 1px solid rgba(200,191,176,.5);
transition: padding-left .2s;
}
.area-item:first-child { border-top: 1px solid rgba(200,191,176,.5); }
.area-item:hover { padding-left: 8px; }
.area-item-left {
display: flex; align-items: center; gap: 12px;
}
.area-pin-icon { color: var(--rust); flex-shrink: 0; }
.area-name { font-size: 16px; font-weight: 400; color: var(--soil); }
.area-badge {
font-size: 10px; font-weight: 600; letter-spacing: .1em; text-transform: uppercase;
background: var(--bone); border: 1px solid var(--concrete);
color: rgba(27,31,23,.45);
padding: 4px 10px;
}
.area-badge.primary {
background: rgba(74,124,89,.1); border-color: rgba(74,124,89,.3);
color: var(--green-d);
}
/* ─── ESTIMATE ─── */
#estimate {
background: var(--bone);
padding: 100px 60px;
position: relative; overflow: hidden;
}
.estimate-texture {
position: absolute; inset: 0;
background-image: repeating-linear-gradient(
90deg,
rgba(200,191,176,.2) 0px, rgba(200,191,176,.2) 1px,
transparent 1px, transparent 80px
),
repeating-linear-gradient(
0deg,
rgba(200,191,176,.2) 0px, rgba(200,191,176,.2) 1px,
transparent 1px, transparent 80px
);
pointer-events: none;
}
.estimate-inner {
position: relative; z-index: 1;
display: grid; grid-template-columns: 1fr 1.2fr; gap: 80px; align-items: start;
}
.estimate-left .section-h2 { margin-bottom: 20px; }
.estimate-tagline {
font-size: 15px; line-height: 1.8; font-weight: 300;
color: rgba(27,31,23,.55); margin-bottom: 44px;
}
.contact-block {
display: flex; flex-direction: column; gap: 16px;
}
.contact-line {
display: flex; align-items: center; gap: 14px;
font-size: 15px; color: var(--soil); font-weight: 400;
}
.contact-line a { color: inherit; text-decoration: none; }
.contact-line a:hover { color: var(--rust); }
.contact-icon-wrap {
width: 36px; height: 36px;
background: var(--white); border: 1px solid var(--concrete);
display: flex; align-items: center; justify-content: center;
flex-shrink: 0; color: var(--rust);
}
/* Form */
.estimate-form { display: flex; flex-direction: column; gap: 0; }
.form-group { margin-bottom: 20px; }
.form-row-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
.form-label {
display: block; font-size: 10px; font-weight: 600; letter-spacing: .14em; text-transform: uppercase;
color: rgba(27,31,23,.45); margin-bottom: 8px;
}
.form-input, .form-select, .form-textarea {
width: 100%; display: block;
background: var(--white); border: 1px solid var(--concrete);
color: var(--soil); font-family: 'Inter', sans-serif;
font-size: 14px; font-weight: 300;
padding: 13px 16px; outline: none;
transition: border-color .2s;
-webkit-appearance: none; appearance: none;
}
.form-input::placeholder, .form-textarea::placeholder { color: rgba(27,31,23,.3); }
.form-input:focus, .form-select:focus, .form-textarea:focus {
border-color: var(--green);
}
.form-select { cursor: pointer; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%23C8BFB0' stroke-width='1.5' fill='none'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right 16px center; padding-right: 40px; }
.form-textarea { resize: vertical; min-height: 110px; }
.form-submit {
width: 100%; padding: 17px 32px;
background: var(--soil); color: var(--white); border: none; cursor: pointer;
font-family: 'Inter', sans-serif;
font-size: 12px; font-weight: 600; letter-spacing: .14em; text-transform: uppercase;
transition: background .2s;
margin-top: 8px;
}
.form-submit:hover { background: var(--green-d); }
.form-success {
display: none; padding: 14px 20px;
background: rgba(74,124,89,.1); border: 1px solid rgba(74,124,89,.3);
font-size: 13px; color: var(--green-d); font-weight: 400; margin-top: 12px;
}
.estimate-form.is-submitted {
justify-content: center;
min-height: 320px;
}
.estimate-form.is-submitted > :not(.form-success) {
display: none;
}
.estimate-form.is-submitted .form-success {
display: block;
margin-top: 0;
padding: 24px;
font-size: 15px;
line-height: 1.6;
}
/* ─── FOOTER ─── */
footer {
background: var(--soil);
padding: 72px 60px 40px;
}
.footer-top {
display: grid; grid-template-columns: 1.6fr 1fr 1fr 1fr;
gap: 60px; padding-bottom: 56px;
border-bottom: 1px solid rgba(255,255,255,.07);
}
.footer-logo-link {
display: inline-flex;
align-items: center;
margin-bottom: 14px;
}
.footer-logo-image {
display: block;
width: 96px;
height: auto;
}
.footer-tagline {
font-size: 13px; line-height: 1.7; font-weight: 300;
color: rgba(255,255,255,.35); margin-bottom: 28px;
}
.footer-social { display: flex; gap: 10px; }
.footer-social-link {
width: 34px; height: 34px;
border: 1px solid rgba(255,255,255,.1);
display: flex; align-items: center; justify-content: center;
color: rgba(255,255,255,.4); text-decoration: none;
font-size: 13px; transition: border-color .2s, color .2s;
}
.footer-social-link:hover { border-color: var(--rust); color: var(--rust); }
.footer-col-title {
font-size: 10px; font-weight: 600; letter-spacing: .18em; text-transform: uppercase;
color: rgba(255,255,255,.25); margin-bottom: 20px;
}
.footer-links { list-style: none; display: flex; flex-direction: column; gap: 12px; }
.footer-links a, li {
color: rgba(255,255,255,.45); text-decoration: none;
font-size: 13px; font-weight: 300; transition: color .2s;
}
.footer-links a:hover { color: rgba(255,255,255,.85); }
.footer-bottom {
padding-top: 32px;
display: flex; justify-content: space-between; align-items: center;
font-size: 11px; color: rgba(255,255,255,.2); font-weight: 300;
}
/* ─── SCROLL REVEAL ─── */
.sr {
opacity: 0; transform: translateY(28px);
transition: opacity .75s ease, transform .75s ease;
}
.sr.sr-left { transform: translateX(-28px); }
.sr.sr-right { transform: translateX(28px); }
.sr.sr-scale { transform: scale(.96); }
.sr.in { opacity: 1; transform: none; }
.sr-d1 { transition-delay: .08s; }
.sr-d2 { transition-delay: .16s; }
.sr-d3 { transition-delay: .24s; }
.sr-d4 { transition-delay: .32s; }
.sr-d5 { transition-delay: .40s; }
.sr-d6 { transition-delay: .48s; }
.sr-d7 { transition-delay: .56s; }
.sr-d8 { transition-delay: .64s; }
@media (prefers-reduced-motion: reduce) {
.sr { opacity: 1; transform: none; transition: none; }
.hero-slide {
animation: none;
transform: scale(1.03);
will-change: auto;
}
.hero-slide:first-child { opacity: 1; }
}
/* ─── RESPONSIVE ─── */
@media (max-width: 960px) {
section { scroll-margin-top: 76px; }
body { padding-bottom: calc(76px + env(safe-area-inset-bottom)); }
nav { padding: 20px 24px; }
nav.stuck { padding: 14px 24px; }
nav.menu-open { padding: 14px 24px; }
.nav-logo-image { height: 86px; }
nav.stuck .nav-logo-image,
nav.menu-open .nav-logo-image { height: 42px; }
.nav-actions { gap: 0; }
.nav-btn, .nav-phone { display: none; }
.nav-menu-toggle { display: flex; }
.nav-links {
position: absolute; top: calc(100% + 8px); left: 16px; right: 16px;
display: flex; flex-direction: column; gap: 0;
padding: 10px 16px;
background: rgba(27,31,23,.98);
border: 1px solid rgba(255,255,255,.1);
box-shadow: 0 24px 60px rgba(0,0,0,.28);
opacity: 0; visibility: hidden; pointer-events: none;
transform: translateY(-8px);
transition: opacity .2s, transform .2s, visibility .2s;
}
nav.menu-open .nav-links {
opacity: 1; visibility: visible; pointer-events: auto;
transform: translateY(0);
}
.nav-links li { width: 100%; }
.nav-links a {
display: flex; align-items: center; justify-content: space-between;
width: 100%;
padding: 15px 2px;
border-bottom: 1px solid rgba(255,255,255,.08);
color: rgba(255,255,255,.72);
}
.nav-links a::after {
position: static;
display: block;
width: 6px; height: 6px; border-radius: 50%;
background: var(--rust);
transform: scale(0);
flex: 0 0 6px;
}
.nav-links a.is-active::after { transform: scale(1); }
.nav-links li:last-child a { border-bottom: none; }
.nav-mobile-estimate { display: block; }
.mobile-call-bar {
position: fixed; left: 14px; right: 14px; bottom: 14px; z-index: 101;
display: flex; align-items: center; justify-content: center; gap: 12px;
min-height: 58px;
padding: 11px 18px calc(11px + env(safe-area-inset-bottom));
background: var(--rust);
color: var(--white);
text-decoration: none;
box-shadow: 0 18px 42px rgba(27,31,23,.24);
opacity: 0; visibility: hidden; pointer-events: none;
transform: translateY(calc(100% + 28px));
transition: background .2s, opacity .2s, transform .2s, visibility .2s;
}
.mobile-call-bar.is-visible {
opacity: 1; visibility: visible; pointer-events: auto;
transform: translateY(0);
}
.mobile-call-bar:hover { background: var(--rust-l); }
.mobile-call-bar.is-visible:active { transform: translateY(1px); }
#hero { min-height: 100dvh; }
.hero-content { padding: 0 24px 56px; flex-direction: column; align-items: flex-start; }
.hero-right { align-items: flex-start; }
.hero-sub { text-align: left; max-width: 100%; }
#services { padding: 72px 24px; }
.services-watermark { top: 26px; right: 18px; font-size: 118px; }
.services-header { grid-template-columns: 1fr; gap: 24px; }
.service-list {
display: grid;
gap: 12px;
}
.service-row {
position: relative;
grid-template-columns: 48px 1fr;
align-items: start;
gap: 14px 16px;
min-height: 94px;
padding: 22px 18px;
background: var(--white);
border: 1px solid rgba(200,191,176,.55);
border-radius: 8px;
box-shadow: 0 10px 26px rgba(27,31,23,.04);
cursor: pointer;
transform-origin: center;
transition: background .2s, border-color .2s, box-shadow .2s;
}
.service-row:first-child { border-top: 1px solid rgba(200,191,176,.55); }
.service-row:hover {
margin: 0;
padding: 22px 18px;
background: var(--white);
}
.service-row::after {
content: "+";
position: absolute; top: 18px; right: 18px;
width: 28px; height: 28px;
display: flex; align-items: center; justify-content: center;
border: 1px solid rgba(27,31,23,.16);
border-radius: 50%;
color: var(--green);
font-size: 19px; line-height: 1;
transition: transform .25s, background .2s, color .2s, border-color .2s;
}
.service-row.is-flipped {
background: var(--bone);
border-color: rgba(59,91,60,.28);
box-shadow: 0 16px 36px rgba(27,31,23,.08);
}
.service-row.is-flipping { animation: serviceMobileFlip .34s ease; }
.service-row.is-flipped::after {
content: "×";
transform: rotate(90deg);
background: var(--green);
color: var(--white);
border-color: var(--green);
}
.service-row.is-flipped .service-icon-wrap,
.service-row:hover .service-icon-wrap {
background: var(--green);
color: var(--white);
border-color: var(--green);
}
.service-name-col {
padding-right: 34px;
line-height: 1.1;
}
.service-desc-col,
.service-tag {
grid-column: 2 / -1;
display: block;
overflow: hidden;
max-height: 0;
opacity: 0;
transform: rotateX(-8deg) translateY(-4px);
transform-origin: top;
transition: max-height .28s ease, opacity .2s, transform .28s ease, margin .2s;
}
.service-row.is-flipped .service-desc-col {
max-height: 150px;
opacity: 1;
transform: none;
}
.service-tag {
width: fit-content;
margin-top: -8px;
padding: 7px 10px;
background: rgba(199,122,66,.12);
color: var(--rust);
border: 1px solid rgba(199,122,66,.18);
border-radius: 999px;
}
.service-row.is-flipped .service-tag {
max-height: 34px;
opacity: 1;
transform: none;
margin-top: -4px;
}
@keyframes serviceMobileFlip {
0% { transform: rotateX(0) scale(1); }
45% { transform: rotateX(7deg) scale(.985); }
100% { transform: rotateX(0) scale(1); }
}
@media (prefers-reduced-motion: reduce) {
.service-row.is-flipping { animation: none; }
.service-desc-col,
.service-tag { transition: none; }
}
#about { grid-template-columns: 1fr; }
.about-img-col { height: 300px; }
.about-text-col { padding: 56px 24px; }
#gallery { padding: 72px 24px; }
.gallery-header { flex-direction: column; align-items: flex-start; gap: 24px; }
.gallery-note { max-width: 100%; text-align: left; }
.before-after { margin-bottom: 32px; }
.before-after-label { top: 12px; padding: 7px 10px; }
.before-after-label.before { left: 12px; }
.before-after-label.after { right: 12px; }
.before-after-handle { width: 42px; height: 42px; }
.gallery-bento {
grid-template-columns: 1fr 1fr;
grid-template-rows: 180px 180px 180px;
}
.ga,.gb,.gc,.gd,.ge { grid-column: auto; grid-row: auto; }
#areas { padding: 72px 24px; }
.areas-inner { grid-template-columns: 1fr; }
.areas-map { aspect-ratio: 1 / 1; min-height: 300px; }
#estimate { padding: 72px 24px; }
.estimate-inner { grid-template-columns: 1fr; gap: 48px; }
.form-row-2 { grid-template-columns: 1fr; }
footer { padding: 56px 24px 32px; }
.footer-top { grid-template-columns: 1fr 1fr; gap: 36px; }
.footer-logo-image { width: 82px; }
.footer-bottom { flex-direction: column; gap: 12px; text-align: center; }
}
</style>
</head>
<body>
<!-- ─── NAV ─── -->
<nav id="mainNav" aria-label="Primary navigation">
<a href="#hero" class="nav-wordmark">
<img class="nav-logo-image" src="jdb-logo.webp" width="400" height="398" alt="JDB Landscape">
</a>
<ul class="nav-links" id="primaryNav">
<li><a href="#services" data-nav-link>Services</a></li>
<li><a href="#about" data-nav-link>About</a></li>
<li><a href="#gallery" data-nav-link>Work</a></li>
<li><a href="#areas" data-nav-link>Areas</a></li>
<li class="nav-mobile-estimate"><a href="#estimate" data-nav-link>Estimate</a></li>
</ul>
<div class="nav-actions">
<a href="#estimate" class="nav-btn" data-nav-link>Free Estimate</a>
<a href="tel:9054078567" class="nav-phone" aria-label="Call JDB Landscape at 905 407 8567">
<svg width="14" height="14" viewBox="0 0 16 16" fill="none" aria-hidden="true">
<path d="M2 2.5h3l1.5 3.5-1.5 1.5c1 2 2 3 4 4l1.5-1.5 3.5 1.5V14c0 .8-.7 1.4-1.5 1.3C5.5 14.7 1.3 10.5 1.2 5.5A1.5 1.5 0 012.5 4" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/>
</svg>
(905) 407-8567
</a>
<button class="nav-menu-toggle" type="button" aria-label="Open menu" aria-controls="primaryNav" aria-expanded="false">
<span aria-hidden="true"></span>
<span aria-hidden="true"></span>
<span aria-hidden="true"></span>
</button>
</div>
</nav>
<a href="tel:9054078567" class="mobile-call-bar" aria-label="Call JDB Landscape at 905 407 8567">
<svg width="18" height="18" viewBox="0 0 16 16" fill="none" aria-hidden="true">
<path d="M2 2.5h3l1.5 3.5-1.5 1.5c1 2 2 3 4 4l1.5-1.5 3.5 1.5V14c0 .8-.7 1.4-1.5 1.3C5.5 14.7 1.3 10.5 1.2 5.5A1.5 1.5 0 012.5 4" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/>
</svg>
<span class="mobile-call-bar-text">
<span class="mobile-call-bar-label">Tap to call</span>
<span class="mobile-call-bar-number">(905) 407-8567</span>
</span>
</a>
<!-- ─── HERO ─── -->
<section id="hero">
<div class="hero-slideshow" aria-hidden="true">
<img class="hero-slide" src="jdb-hero-after.webp" width="1320" height="990" alt="" fetchpriority="high" decoding="async">
<img class="hero-slide" src="jdb-11-hero.webp" width="1920" height="1080" alt="" decoding="async">
</div>
<div class="hero-content">
<div class="hero-left">
<div class="hero-pill">
<div class="hero-pill-dot"></div>
Now accepting new clients · Burlington, ON
</div>
<h1 class="hero-h1">
We shape<br>
land into<br>
<em>something lasting.</em>
</h1>
</div>
<div class="hero-right">
<p class="hero-sub">Hardscapes, lawn care, garden beds, sod & more. Built for clean edges, solid work, and lasting curb appeal.</p>
<a href="#estimate" class="hero-cta">
Get a free estimate
<span class="hero-cta-arrow">→</span>
</a>
</div>
</div>
<div class="hero-rule"></div>
</section>
<!-- ─── MARQUEE ─── -->
<div class="marquee-strip" aria-hidden="true">
<div class="marquee-inner">
<!-- doubled for infinite scroll illusion -->
<span class="marquee-item">Hardscapes & Interlock <span class="marquee-sep">·</span></span>
<span class="marquee-item">Lawn Maintenance <span class="marquee-sep">·</span></span>
<span class="marquee-item">Mulch Installation <span class="marquee-sep">·</span></span>
<span class="marquee-item">Sod Installation <span class="marquee-sep">·</span></span>
<span class="marquee-item">Garden Bed Renovations <span class="marquee-sep">·</span></span>
<span class="marquee-item">Junk Removal <span class="marquee-sep">·</span></span>
<span class="marquee-item">Seasonal Clean-Ups <span class="marquee-sep">·</span></span>
<span class="marquee-item">Free Estimates <span class="marquee-sep">·</span></span>
<span class="marquee-item">Hardscapes & Interlock <span class="marquee-sep">·</span></span>
<span class="marquee-item">Lawn Maintenance <span class="marquee-sep">·</span></span>
<span class="marquee-item">Mulch Installation <span class="marquee-sep">·</span></span>
<span class="marquee-item">Sod Installation <span class="marquee-sep">·</span></span>
<span class="marquee-item">Garden Bed Renovations <span class="marquee-sep">·</span></span>
<span class="marquee-item">Junk Removal <span class="marquee-sep">·</span></span>
<span class="marquee-item">Seasonal Clean-Ups <span class="marquee-sep">·</span></span>
<span class="marquee-item">Free Estimates <span class="marquee-sep">·</span></span>
</div>
</div>
<!-- ─── SERVICES ─── -->
<section id="services">
<div class="services-watermark" aria-hidden="true">JDB</div>
<div class="services-header">
<div class="sr">
<span class="eyebrow">What we do</span>
<h2 class="section-h2">Every service,<br><em>done properly.</em></h2>
</div>
<p class="section-desc sr sr-right">From the first consultation to the last stone set, the work stays clear, practical, and detail-focused. No surprises.</p>
</div>
<div class="service-list">
<div class="service-row sr sr-d1">
<div class="service-icon-wrap">
<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6"><rect x="3" y="14" width="18" height="4" rx=".5"/><rect x="5" y="9" width="14" height="5" rx=".5"/><path d="M7 9V6a5 5 0 0 1 10 0v3"/></svg>
</div>
<div class="service-name-col">Hardscapes & Interlock</div>
<div class="service-desc-col">Patios, walkways, retaining walls, and driveways that age beautifully and hold their shape.</div>
<div class="service-tag">Most popular</div>
</div>
<div class="service-row sr sr-d2">
<div class="service-icon-wrap">
<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6"><path d="M12 20V10"/><path d="M12 14c-3-4-8-4-9-2 3 0 6 2 9 5"/><path d="M12 12c3-5 8-5 10-3-3 .5-7 2-10 7"/></svg>
</div>
<div class="service-name-col">Lawn Maintenance</div>
<div class="service-desc-col">Regular mowing, edging, trimming, and seasonal care to keep your lawn looking its best year-round.</div>
<div class="service-tag">Recurring</div>
</div>
<div class="service-row sr sr-d3">
<div class="service-icon-wrap">
<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6"><ellipse cx="12" cy="19" rx="9" ry="2"/><path d="M5 19V9.5C5 6.5 8 4 12 4s7 2.5 7 5.5V19"/><path d="M9 12c0-1.7 1.3-3 3-3s3 1.3 3 3"/></svg>
</div>
<div class="service-name-col">Mulch Installation</div>
<div class="service-desc-col">Fresh mulch delivered and spread to protect plant beds, retain moisture, and define edges cleanly.</div>
<div class="service-tag">Seasonal</div>
</div>
<div class="service-row sr sr-d4">
<div class="service-icon-wrap">
<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6"><rect x="3" y="11" width="18" height="8" rx=".5"/><path d="M7 11V8a5 5 0 0 1 10 0v3"/><circle cx="12" cy="15" r="1.5"/></svg>
</div>
<div class="service-name-col">Garden Bed Renovations</div>
<div class="service-desc-col">Design, plant selection, and installation to bring tired or overgrown beds back to life.</div>
<div class="service-tag">Design included</div>
</div>
<div class="service-row sr sr-d5">
<div class="service-icon-wrap">
<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6"><path d="M3 17c0-5 4-10 9-13 5 3 9 8 9 13"/><line x1="3" y1="17" x2="21" y2="17"/></svg>
</div>
<div class="service-name-col">Sod Installation</div>
<div class="service-desc-col">Professionally graded and laid premium sod for an instant, full, healthy lawn.</div>
<div class="service-tag">Fast results</div>
</div>
<div class="service-row sr sr-d6">
<div class="service-icon-wrap">
<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6"><polyline points="3 6 5 6 21 6"/><path d="M19 6l-1 14H6L5 6"/><path d="M10 11v6M14 11v6"/><path d="M9 6V4h6v2"/></svg>
</div>
<div class="service-name-col">Junk Removal</div>
<div class="service-desc-col">Clearing old materials, yard debris, and unwanted items — fast, clean, and responsible disposal.</div>
<div class="service-tag">Quick turnaround</div>
</div>
<div class="service-row sr sr-d7">
<div class="service-icon-wrap">
<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6"><path d="M4 12C4 7.6 7.6 4 12 4s8 3.6 8 8-3.6 8-8 8"/><path d="M12 8v4l3 3"/><path d="M4 16l-1 4 4-1"/></svg>
</div>
<div class="service-name-col">Seasonal Clean-Ups</div>
<div class="service-desc-col">Spring and fall property clean-ups that prepare your outdoor space for the season ahead.</div>
<div class="service-tag">Spring & Fall</div>
</div>
</div>
</section>
<!-- ─── ABOUT ─── -->
<section id="about">
<div class="about-img-col sr sr-left">
<img src="jdb-15.webp" alt="Hands-on landscaping work" loading="lazy" style="max-height: 900px;">
<div class="about-img-overlay"></div>
</div>
<div class="about-text-col sr sr-right">
<span class="eyebrow">About JDB</span>
<h2 class="about-h2">
On Time,<br>
<em>Every Time.</em>
</h2>
<p class="about-body">
JDB Landscape is owner-operated by James B. — which means when you call, you talk to the person doing the work. Not a sales rep, not a dispatcher.
<br><br>
Built on word-of-mouth and repeat clients across Burlington and the surrounding region, JDB has earned a reputation for showing up on time, giving honest quotes, and not leaving until the job looks right.
</p>
<div class="about-badges">
<div class="badge"><span class="badge-icon">✓</span> Owner on every job</div>
<div class="badge"><span class="badge-icon">✓</span> Honest, flat-rate quotes</div>
<div class="badge"><span class="badge-icon">✓</span> No surprise add-ons</div>
<div class="badge"><span class="badge-icon">✓</span> Quality guaranteed</div>
<div class="badge"><span class="badge-icon">✓</span> Locally rooted</div>
</div>
</div>
</section>
<!-- ─── GALLERY ─── -->
<section id="gallery">
<div class="gallery-header sr">
<div>
<span class="eyebrow">Our work</span>
<h2 class="section-h2">Results that<br><em>speak clearly.</em></h2>
</div>
<p class="gallery-note">A sample of recent projects across Burlington and surrounding areas.</p>
</div>
<div class="before-after sr sr-scale" data-before-after>
<img class="before-after-img" src="jdb-after.webp" alt="Finished landscape project after JDB Landscape work">
<div class="before-after-overlay" aria-hidden="true">
<img class="before-after-img" src="jdb-before.webp" alt="">
</div>
<span class="before-after-label before">Before</span>
<span class="before-after-label after">After</span>
<div class="before-after-divider"></div>
<div class="before-after-handle" aria-hidden="true">
<span></span>
<span></span>
</div>
<input class="before-after-range" type="range" min="0" max="100" value="50" aria-label="Compare before and after landscape project">
<div class="before-after-focus"></div>
</div>
<div class="gallery-bento">
<div class="gitem ga sr sr-scale sr-d1" role="button" tabindex="0" aria-label="View full size image of Finished hardscape project">
<img src="jdb-11.webp" width="1320" height="1632" alt="Finished hardscape and landscape project" loading="lazy" decoding="async">
<div class="gitem-label">Hardscape Finish</div>
</div>
<div class="gitem gb sr sr-scale sr-d2" role="button" tabindex="0" aria-label="View full size image of Clean landscape edging">
<img src="jdb-12.webp" width="1320" height="1681" alt="Clean landscape edging and yard finish" loading="lazy" decoding="async">
<div class="gitem-label">Clean Edges</div>
</div>
<div class="gitem gc sr sr-scale sr-d3" role="button" tabindex="0" aria-label="View full size image of Landscape project detail">
<img src="jdb-13.webp" width="1320" height="1693" alt="Landscape project detail with finished outdoor work" loading="lazy" decoding="async">
<div class="gitem-label">Project Detail</div>
</div>
<div class="gitem gd sr sr-scale sr-d4" role="button" tabindex="0" aria-label="View full size image of Finished yard work">
<img src="jdb-14.webp" width="1299" height="1582" alt="Finished yard work and landscape cleanup" loading="lazy" decoding="async">
<div class="gitem-label">Yard Finish</div>
</div>
<div class="gitem ge sr sr-scale sr-d5" role="button" tabindex="0" aria-label="View full size image of Property cleanup">
<img src="jdb-15.webp" width="1193" height="1561" alt="Property cleanup and landscape refresh" loading="lazy" decoding="async">
<div class="gitem-label">Property Clean-Up</div>
</div>
</div>
</section>
<!-- ─── AREAS ─── -->
<section id="areas">
<div class="areas-inner">
<div class="areas-map sr sr-left">
<iframe
title="Map showing JDB Landscape service areas around Burlington, Oakville, Hamilton, Mississauga, Milton and Niagara Region"
src="https://www.openstreetmap.org/export/embed.html?bbox=-80.25%2C42.82%2C-79.00%2C43.75&layer=mapnik&marker=43.3255%2C-79.7990"
loading="lazy"
referrerpolicy="no-referrer-when-downgrade"></iframe>
<a class="areas-map-link" href="https://www.openstreetmap.org/?mlat=43.3255&mlon=-79.7990#map=9/43.3255/-79.7990" target="_blank" rel="noopener">View larger map</a>
</div>
<div class="areas-list sr sr-right">
<span class="eyebrow">Service area</span>
<h2 class="section-h2">Close to home.<br><em>Wherever that is.</em></h2>
<div class="area-items">
<div class="area-item">
<div class="area-item-left">
<svg class="area-pin-icon" width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M8 1.5C5.5 1.5 3.5 3.5 3.5 6c0 3.5 4.5 8.5 4.5 8.5S12.5 9.5 12.5 6c0-2.5-2-4.5-4.5-4.5z" stroke="currentColor" stroke-width="1.3"/><circle cx="8" cy="6" r="1.5" stroke="currentColor" stroke-width="1.3"/></svg>
<span class="area-name">Burlington</span>
</div>
<span class="area-badge primary">Primary area</span>
</div>
<div class="area-item">
<div class="area-item-left">
<svg class="area-pin-icon" width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M8 1.5C5.5 1.5 3.5 3.5 3.5 6c0 3.5 4.5 8.5 4.5 8.5S12.5 9.5 12.5 6c0-2.5-2-4.5-4.5-4.5z" stroke="currentColor" stroke-width="1.3"/><circle cx="8" cy="6" r="1.5" stroke="currentColor" stroke-width="1.3"/></svg>
<span class="area-name">Oakville</span>
</div>
<span class="area-badge">Available</span>
</div>
<div class="area-item">
<div class="area-item-left">
<svg class="area-pin-icon" width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M8 1.5C5.5 1.5 3.5 3.5 3.5 6c0 3.5 4.5 8.5 4.5 8.5S12.5 9.5 12.5 6c0-2.5-2-4.5-4.5-4.5z" stroke="currentColor" stroke-width="1.3"/><circle cx="8" cy="6" r="1.5" stroke="currentColor" stroke-width="1.3"/></svg>
<span class="area-name">Hamilton</span>
</div>
<span class="area-badge">Available</span>
</div>
<div class="area-item">
<div class="area-item-left">
<svg class="area-pin-icon" width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M8 1.5C5.5 1.5 3.5 3.5 3.5 6c0 3.5 4.5 8.5 4.5 8.5S12.5 9.5 12.5 6c0-2.5-2-4.5-4.5-4.5z" stroke="currentColor" stroke-width="1.3"/><circle cx="8" cy="6" r="1.5" stroke="currentColor" stroke-width="1.3"/></svg>
<span class="area-name">Mississauga</span>
</div>
<span class="area-badge">Available</span>
</div>
<div class="area-item">
<div class="area-item-left">
<svg class="area-pin-icon" width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M8 1.5C5.5 1.5 3.5 3.5 3.5 6c0 3.5 4.5 8.5 4.5 8.5S12.5 9.5 12.5 6c0-2.5-2-4.5-4.5-4.5z" stroke="currentColor" stroke-width="1.3"/><circle cx="8" cy="6" r="1.5" stroke="currentColor" stroke-width="1.3"/></svg>
<span class="area-name">Milton</span>
</div>
<span class="area-badge">Available</span>
</div>
<div class="area-item">
<div class="area-item-left">
<svg class="area-pin-icon" width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M8 1.5C5.5 1.5 3.5 3.5 3.5 6c0 3.5 4.5 8.5 4.5 8.5S12.5 9.5 12.5 6c0-2.5-2-4.5-4.5-4.5z" stroke="currentColor" stroke-width="1.3"/><circle cx="8" cy="6" r="1.5" stroke="currentColor" stroke-width="1.3"/></svg>
<span class="area-name">Niagara Region</span>
</div>
<span class="area-badge">Available</span>
</div>
<div class="area-item">
<div class="area-item-left">
<svg class="area-pin-icon" width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M8 1.5C5.5 1.5 3.5 3.5 3.5 6c0 3.5 4.5 8.5 4.5 8.5S12.5 9.5 12.5 6c0-2.5-2-4.5-4.5-4.5z" stroke="currentColor" stroke-width="1.3"/><circle cx="8" cy="6" r="1.5" stroke="currentColor" stroke-width="1.3"/></svg>
<span class="area-name">And more</span>
</div>
<span class="area-badge">Ask us</span>
</div>
</div>
</div>
</div>
</section>
<!-- ─── ESTIMATE ─── -->
<section id="estimate">
<div class="estimate-texture"></div>
<div class="estimate-inner">
<div class="estimate-left sr sr-left">
<span class="eyebrow">Free estimate</span>
<h2 class="section-h2">
Let's talk about<br>
<em>your property.</em>
</h2>
<p class="estimate-tagline">
No obligation. No sales pitch. Just a clear look at what your project needs and what it'll cost — before you commit to anything.
</p>
<div class="contact-block">
<div class="contact-line">
<div class="contact-icon-wrap">
<svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M2 2.5h3l1.5 3.5-1.5 1.5c1 2 2 3 4 4l1.5-1.5 3.5 1.5V14c0 .8-.7 1.4-1.5 1.3C5.5 14.7 1.3 10.5 1.2 5.5A1.5 1.5 0 012.5 4" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/></svg>
</div>
<a href="tel:9054078567">(905) 407-8567</a>
</div>
<div class="contact-line">
<div class="contact-icon-wrap">
<svg width="16" height="16" viewBox="0 0 16 16" fill="none"><rect x="1.5" y="3.5" width="13" height="9" rx="1" stroke="currentColor" stroke-width="1.3"/><path d="M1.5 5.5l6.5 4 6.5-4" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/></svg>
</div>
<a href="mailto:[email protected]">[email protected]</a>
</div>
<div class="contact-line">
<div class="contact-icon-wrap">
<svg width="16" height="16" viewBox="0 0 16 16" fill="none"><rect x="4" y="1" width="8" height="14" rx="1.5" stroke="currentColor" stroke-width="1.3"/><circle cx="8" cy="12" r=".8" fill="currentColor"/></svg>
</div>
<span>Responds within 24 hours</span>
</div>
</div>
</div>
<form class="estimate-form sr sr-right" onsubmit="submitForm(event)">
<div class="form-row-2">
<div class="form-group">
<label class="form-label">First name</label>
<input class="form-input" type="text" placeholder="Sarah" required>
</div>
<div class="form-group">
<label class="form-label">Last name</label>
<input class="form-input" type="text" placeholder="Thompson" required>
</div>
</div>
<div class="form-row-2">
<div class="form-group">
<label class="form-label">Phone</label>
<input class="form-input" type="tel" placeholder="(905) 000-0000">
</div>
<div class="form-group">
<label class="form-label">Email</label>
<input class="form-input" type="email" placeholder="[email protected]" required>
</div>
</div>
<div class="form-group">
<label class="form-label">Service needed</label>
<select class="form-select" required>
<option value="" disabled selected>Select a service…</option>
<option>Hardscapes & Interlock</option>
<option>Lawn Maintenance</option>
<option>Mulch Installation</option>
<option>Garden Bed Renovation</option>
<option>Sod Installation</option>
<option>Junk Removal</option>
<option>Seasonal Clean-Up</option>
<option>Multiple services</option>
<option>Not sure yet</option>
</select>
</div>
<div class="form-group">
<label class="form-label">City / Area</label>
<input class="form-input" type="text" placeholder="Burlington, Oakville, Hamilton…">
</div>
<div class="form-group">
<label class="form-label">Tell us about the project</label>
<textarea class="form-textarea" placeholder="Size of the area, current state, what you're hoping for — anything that helps us understand the project."></textarea>
</div>
<button type="submit" class="form-submit">Send Request — It's Free</button>
<div class="form-success" id="formSuccess" role="status" tabindex="-1">
✓ Request received. We'll be in touch within 24 hours.
</div>
</form>
</div>
</section>
<!-- ─── FOOTER ─── -->
<footer>
<div class="footer-top">
<div>
<a href="#hero" class="footer-logo-link" aria-label="JDB Landscape home">
<img class="footer-logo-image" src="jdb-logo.webp" width="400" height="398" alt="JDB Landscape">
</a>
<p class="footer-tagline">Quality work. Fair prices.<br>Expectations exceeded.</p>
<div class="footer-social">
<a href="https://www.instagram.com/jdb_landscape/" target="_blank" rel="noopener" class="footer-social-link" title="Instagram">
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8"><rect x="2" y="2" width="20" height="20" rx="5"/><circle cx="12" cy="12" r="5"/><circle cx="17.5" cy="6.5" r=".8" fill="currentColor" stroke="none"/></svg>
</a>
</div>
</div>
<div>
<div class="footer-col-title">Services</div>
<ul class="footer-links">
<li><a href="#services">Hardscapes & Interlock</a></li>
<li><a href="#services">Lawn Maintenance</a></li>
<li><a href="#services">Mulch Installation</a></li>
<li><a href="#services">Garden Bed Renovations</a></li>
<li><a href="#services">Sod Installation</a></li>
<li><a href="#services">Junk Removal</a></li>
</ul>
</div>
<div>
<div class="footer-col-title">Navigate</div>
<ul class="footer-links">
<li><a href="#about">About JDB</a></li>
<li><a href="#gallery">Our Work</a></li>
<li><a href="#areas">Service Areas</a></li>
<li><a href="#estimate">Free Estimate</a></li>
</ul>
</div>
<div>
<div class="footer-col-title">Contact</div>
<ul class="footer-links">
<li><a href="tel:9054078567">(905) 407-8567</a></li>
<li><a href="mailto:[email protected]">[email protected]</a></li>
<li><a href="https://www.instagram.com/jdb_landscape/">@jdb_landscape</a></li>
</ul>
<div style="margin-top:28px;">
<div class="footer-col-title">Hours</div>
<ul class="footer-links">
<li>Mon–Fri 7am – 7pm</li>
<li>Saturday 8am – 5pm</li>
<li>Sunday By appointment</li>
</ul>
</div>
</div>
</div>
<div class="footer-bottom">
<span>© 2025 JDB Landscape Services · Burlington, Ontario</span>
<span>Proudly serving Halton, Hamilton, Mississauga & Niagara Region</span>
</div>
</footer>
<div class="image-modal" id="image-modal" role="dialog" aria-modal="true" aria-hidden="true">
<button class="image-modal-close" type="button" aria-label="Close full screen image">×</button>
<img id="image-modal-img" src="" alt="">
</div>
<script>
// ─── NAV ───
const nav = document.getElementById('mainNav');
const navToggle = document.querySelector('.nav-menu-toggle');
const navWordmark = document.querySelector('.nav-wordmark');
const heroSection = document.getElementById('hero');
const mobileCallBar = document.querySelector('.mobile-call-bar');
const navLinks = Array.from(document.querySelectorAll('[data-nav-link]'));
const navSections = Array.from(
new Set(navLinks.map(link => link.hash.slice(1)).filter(Boolean))
).map(id => document.getElementById(id)).filter(Boolean);
const desktopNav = window.matchMedia('(min-width: 961px)');
let navTicking = false;
function setMenuOpen(open) {
nav.classList.toggle('menu-open', open);
navToggle.setAttribute('aria-expanded', String(open));
navToggle.setAttribute('aria-label', open ? 'Close menu' : 'Open menu');
}
function updateActiveNav() {
const offset = nav.offsetHeight + 48;
let activeId = '';
navSections.forEach(section => {
if (window.scrollY + offset >= section.offsetTop) activeId = section.id;
});
if (window.innerHeight + window.scrollY >= document.documentElement.scrollHeight - 4) {
activeId = 'estimate';
}
navLinks.forEach(link => {
const isActive = link.hash === `#${activeId}`;
link.classList.toggle('is-active', isActive);
if (isActive) {
link.setAttribute('aria-current', 'page');
} else {
link.removeAttribute('aria-current');
}
});
}
function updateNav() {
nav.classList.toggle('stuck', window.scrollY > 60);
mobileCallBar.classList.toggle('is-visible', heroSection.getBoundingClientRect().bottom <= 0);
updateActiveNav();
navTicking = false;
}
navToggle.addEventListener('click', () => {
setMenuOpen(!nav.classList.contains('menu-open'));
});
navLinks.forEach(link => {
link.addEventListener('click', () => setMenuOpen(false));
});
navWordmark.addEventListener('click', () => setMenuOpen(false));
document.addEventListener('click', e => {
if (nav.classList.contains('menu-open') && !nav.contains(e.target)) {
setMenuOpen(false);
}
});
document.addEventListener('keydown', e => {
if (e.key === 'Escape') setMenuOpen(false);
});
function handleNavBreakpoint(e) {
if (e.matches) setMenuOpen(false);
}
if (desktopNav.addEventListener) {
desktopNav.addEventListener('change', handleNavBreakpoint);
} else {
desktopNav.addListener(handleNavBreakpoint);
}
window.addEventListener('scroll', () => {
if (!navTicking) {
requestAnimationFrame(updateNav);
navTicking = true;
}
}, { passive: true });
window.addEventListener('resize', updateNav);
updateNav();
// ─── MOBILE SERVICE DETAILS ───
const serviceRows = Array.from(document.querySelectorAll('.service-row'));
const mobileServiceCards = window.matchMedia('(max-width: 960px)');
function setServiceRowOpen(row, open) {
row.classList.toggle('is-flipped', open);
row.setAttribute('aria-expanded', String(open));
row.querySelectorAll('.service-desc-col, .service-tag').forEach(detail => {
detail.setAttribute('aria-hidden', String(!open && mobileServiceCards.matches));
});
}
function toggleServiceRow(row) {
if (!mobileServiceCards.matches) return;
const shouldOpen = !row.classList.contains('is-flipped');
serviceRows.forEach(otherRow => {
if (otherRow !== row) setServiceRowOpen(otherRow, false);
});
setServiceRowOpen(row, shouldOpen);
row.classList.remove('is-flipping');
void row.offsetWidth;
row.classList.add('is-flipping');
}
function syncServiceRows() {
serviceRows.forEach(row => {
if (mobileServiceCards.matches) {
row.setAttribute('role', 'button');
row.setAttribute('tabindex', '0');
setServiceRowOpen(row, row.classList.contains('is-flipped'));
} else {
row.classList.remove('is-flipped', 'is-flipping');
row.removeAttribute('role');
row.removeAttribute('tabindex');
row.removeAttribute('aria-expanded');
row.querySelectorAll('.service-desc-col, .service-tag').forEach(detail => {
detail.removeAttribute('aria-hidden');
});
}
});
}
serviceRows.forEach(row => {
row.addEventListener('click', () => toggleServiceRow(row));
row.addEventListener('keydown', e => {
if (e.key !== 'Enter' && e.key !== ' ') return;
if (!mobileServiceCards.matches) return;
e.preventDefault();
toggleServiceRow(row);
});
row.addEventListener('animationend', () => row.classList.remove('is-flipping'));
});
if (mobileServiceCards.addEventListener) {
mobileServiceCards.addEventListener('change', syncServiceRows);
} else {
mobileServiceCards.addListener(syncServiceRows);
}
syncServiceRows();
// ─── BEFORE / AFTER SLIDER ───
document.querySelectorAll('[data-before-after]').forEach(slider => {
const range = slider.querySelector('.before-after-range');
function setReveal(value) {
const reveal = Math.min(100, Math.max(0, Number(value)));
slider.style.setProperty('--reveal', `${reveal}%`);
range.setAttribute('aria-valuetext', `${Math.round(reveal)}% before visible`);
}
range.addEventListener('input', e => setReveal(e.target.value));
setReveal(range.value);
});
// ─── IMAGE MODAL ───
const imageModal = document.getElementById('image-modal');
const imageModalImg = document.getElementById('image-modal-img');
const imageModalClose = imageModal.querySelector('.image-modal-close');
let lastFocusedElement = null;
function openImageModal(image) {
lastFocusedElement = document.activeElement;
imageModalImg.src = image.currentSrc || image.src;
imageModalImg.alt = image.alt;
imageModal.classList.add('is-open');
imageModal.setAttribute('aria-hidden', 'false');
document.body.classList.add('modal-open');
imageModalClose.focus();
}
function closeImageModal() {
imageModal.classList.remove('is-open');
imageModal.setAttribute('aria-hidden', 'true');
document.body.classList.remove('modal-open');
imageModalImg.removeAttribute('src');
imageModalImg.alt = '';
if (lastFocusedElement) {
lastFocusedElement.focus();
}
}
document.querySelectorAll('.gallery-bento .gitem').forEach(tile => {
tile.addEventListener('click', () => {
openImageModal(tile.querySelector('img'));
});
tile.addEventListener('keydown', event => {
if (event.key === 'Enter' || event.key === ' ') {
event.preventDefault();
openImageModal(tile.querySelector('img'));
}
});
});
imageModalClose.addEventListener('click', closeImageModal);
imageModal.addEventListener('click', event => {
if (event.target === imageModal) {
closeImageModal();
}
});
document.addEventListener('keydown', event => {
if (event.key === 'Escape' && imageModal.classList.contains('is-open')) {
closeImageModal();
}
});
// ─── SCROLL REVEAL ───
const srEls = document.querySelectorAll('.sr');
const obs = new IntersectionObserver(entries => {
entries.forEach(e => {
if (e.isIntersecting) {
e.target.classList.add('in');
obs.unobserve(e.target);
}
});
}, { threshold: 0.1, rootMargin: '0px 0px -50px 0px' });
srEls.forEach(el => obs.observe(el));
// ─── FORM ───
function submitForm(e) {
e.preventDefault();
const form = e.currentTarget;
const success = form.querySelector('.form-success');
form.classList.add('is-submitted');
success.focus();
}
</script>
</body>
</html>