Nex AGI Nex N2.5 Mini – Home and Garden

via Nex AGI · Generated

  • AIMAC Debt 6.90
  • Cost $0.003
  • Total Violations 22
  • HTML Size 70 KB
  • Em Dashes 53

Screenshot

View Nex AGI Nex N2.5 Mini Home and Garden page View Live Page

Accessibility Issues Found

22 Serious

  • color-contrast serious 21 instances

    Elements must meet minimum color contrast ratio thresholds

    Example HTML <span class="eyebrow">01 — Plant Guides</span>
  • target-size serious 1 instance

    All touch targets must be 24px large, or leave sufficient space

    Example HTML <button class="faq-q" aria-expanded="false">Does the materials calculator work for contractor-scale projects?<span class="fx"><svg viewBox="0 0 24 ...

Artifacts

View Generated HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Terra &amp; Timber — Home Improvement &amp; Garden Wisdom</title>
<meta name="description" content="Expert-led home improvement, gardening, DIY guides, tool reviews, and a community of makers. Build a home that grows with you.">
<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=Fraunces:opsz,wght@9..144,400;9..144,500;9..144,600;9..144,700&family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
<style>
/* ============================================================
   TERRA & TIMBER — Design System
   ============================================================ */
:root{
  --forest:#1C3A2A;
  --forest-deep:#132A1E;
  --forest-2:#2C5540;
  --forest-3:#3E6B52;
  --cream:#F7F4EC;
  --cream-2:#FBF9F3;
  --sand:#EDE7D8;
  --line:#E3DDCD;
  --ink:#222B23;
  --muted:#5E685D;
  --terra:#C4693B;
  --terra-dark:#A9552C;
  --gold:#D9A441;
  --white:#FFFFFF;
  --shadow-sm:0 2px 10px rgba(28,58,42,.07);
  --shadow-md:0 14px 40px -12px rgba(28,58,42,.22);
  --shadow-lg:0 30px 70px -20px rgba(19,42,30,.35);
  --r-sm:10px;
  --r-md:16px;
  --r-lg:24px;
  --font-display:"Fraunces",Georgia,serif;
  --font-body:"Inter",system-ui,-apple-system,sans-serif;
  --header-h:78px;
}
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth}
body{
  font-family:var(--font-body);
  background:var(--cream);
  color:var(--ink);
  line-height:1.65;
  font-size:16px;
  -webkit-font-smoothing:antialiased;
  overflow-x:hidden;
}
::selection{background:var(--terra);color:#fff}
img{display:block;max-width:100%}
a{color:inherit;text-decoration:none}
button{font-family:inherit;cursor:pointer;border:none;background:none}
input,select{font-family:inherit}
section{scroll-margin-top:calc(var(--header-h) + 12px)}
.container{width:min(1180px,92%);margin-inline:auto}
h1,h2,h3,h4{font-family:var(--font-display);font-weight:600;line-height:1.12;color:var(--forest-deep);letter-spacing:-.01em}

/* Focus visibility */
a:focus-visible,button:focus-visible,input:focus-visible,select:focus-visible{
  outline:3px solid rgba(196,105,59,.55);outline-offset:3px;border-radius:6px;
}

/* Skip link */
.skip-link{position:absolute;left:-9999px;top:0;background:var(--forest);color:#fff;padding:.7rem 1.2rem;z-index:2000;border-radius:0 0 10px 0;font-weight:600}
.skip-link:focus{left:0}

/* Scroll progress */
.progress{position:fixed;top:0;left:0;height:3px;width:0;background:linear-gradient(90deg,var(--terra),var(--gold));z-index:1200}

/* ============ Buttons ============ */
.btn{
  display:inline-flex;align-items:center;gap:.6rem;
  padding:.95rem 1.7rem;border-radius:999px;
  font-weight:600;font-size:.95rem;letter-spacing:.01em;
  transition:transform .25s ease,box-shadow .25s ease,background .25s ease,color .25s ease;
  will-change:transform;
}
.btn svg{width:16px;height:16px;transition:transform .25s ease}
.btn:hover svg{transform:translateX(4px)}
.btn-primary{background:var(--forest);color:#fff;box-shadow:0 10px 24px -10px rgba(28,58,42,.5)}
.btn-primary:hover{background:var(--forest-2);transform:translateY(-2px);box-shadow:0 16px 30px -10px rgba(28,58,42,.55)}
.btn-terra{background:var(--terra);color:#fff;box-shadow:0 10px 24px -10px rgba(196,105,59,.55)}
.btn-terra:hover{background:var(--terra-dark);transform:translateY(-2px)}
.btn-ghost{border:1.5px solid rgba(255,255,255,.4);color:#fff}
.btn-ghost:hover{background:rgba(255,255,255,.12);transform:translateY(-2px)}
.btn-outline{border:1.5px solid var(--forest);color:var(--forest)}
.btn-outline:hover{background:var(--forest);color:#fff;transform:translateY(-2px)}
.btn-sm{padding:.65rem 1.2rem;font-size:.85rem}

/* ============ Header ============ */
.site-header{
  position:sticky;top:0;z-index:1000;
  background:rgba(247,244,236,.82);
  backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);
  border-bottom:1px solid transparent;
  transition:box-shadow .3s ease,border-color .3s ease,background .3s ease;
}
.site-header.scrolled{border-color:var(--line);box-shadow:0 8px 30px -14px rgba(28,58,42,.18);background:rgba(247,244,236,.95)}
.header-inner{display:flex;align-items:center;gap:2rem;height:var(--header-h)}
.brand{display:flex;align-items:center;gap:.8rem;flex-shrink:0}
.brand-mark{width:46px;height:46px;flex-shrink:0;transition:transform .3s ease}
.brand:hover .brand-mark{transform:rotate(-6deg)}
.brand-text{display:flex;flex-direction:column;line-height:1.15}
.brand-name{font-family:var(--font-display);font-size:1.32rem;font-weight:700;color:var(--forest-deep);letter-spacing:-.01em}
.brand-tag{font-size:.68rem;letter-spacing:.14em;text-transform:uppercase;color:var(--muted);font-weight:600}
.main-nav{margin-left:auto}
.main-nav ul{display:flex;gap:.35rem;list-style:none}
.main-nav a{
  display:block;padding:.55rem .85rem;border-radius:999px;
  font-size:.92rem;font-weight:500;color:var(--ink);
  transition:background .2s ease,color .2s ease;
}
.main-nav a:hover{background:rgba(28,58,42,.08);color:var(--forest)}
.main-nav a.active{background:var(--forest);color:#fff}
.header-cta{margin-left:.4rem}
.menu-toggle{display:none;flex-direction:column;gap:5px;padding:.6rem;margin-left:auto}
.menu-toggle span{width:24px;height:2px;background:var(--forest-deep);border-radius:2px;transition:transform .3s ease,opacity .3s ease}
.menu-toggle.open span:nth-child(1){transform:translateY(7px) rotate(45deg)}
.menu-toggle.open span:nth-child(2){opacity:0}
.menu-toggle.open span:nth-child(3){transform:translateY(-7px) rotate(-45deg)}

/* Mobile nav */
.mobile-nav{
  position:fixed;inset:0;z-index:990;background:var(--forest-deep);
  display:flex;flex-direction:column;justify-content:center;padding:6rem 8% 3rem;
  clip-path:circle(0 at calc(100% - 44px) 40px);
  transition:clip-path .55s cubic-bezier(.7,0,.3,1);
  visibility:hidden;
}
.mobile-nav.open{clip-path:circle(150% at calc(100% - 44px) 40px);visibility:visible}
.mobile-nav a{
  font-family:var(--font-display);font-size:clamp(1.8rem,6vw,2.6rem);color:var(--cream);
  padding:.5rem 0;border-bottom:1px solid rgba(255,255,255,.1);
  display:flex;justify-content:space-between;align-items:center;
}
.mobile-nav a small{font-family:var(--font-body);font-size:.75rem;letter-spacing:.2em;text-transform:uppercase;color:var(--gold)}
.mobile-nav .m-cta{margin-top:2rem;border:none}
.mobile-nav .m-cta .btn{width:100%;justify-content:center}

/* ============ Hero ============ */
.hero{position:relative;overflow:hidden;background:var(--cream-2)}
.hero::before{
  content:"";position:absolute;top:-260px;right:-200px;width:640px;height:640px;border-radius:50%;
  background:radial-gradient(circle,rgba(217,164,65,.22),transparent 65%);pointer-events:none;
}
.hero-grid{display:grid;grid-template-columns:1.05fr .95fr;gap:4rem;align-items:center;padding:5.2rem 0 4.5rem}
.eyebrow{
  display:inline-flex;align-items:center;gap:.55rem;
  font-size:.74rem;font-weight:700;letter-spacing:.18em;text-transform:uppercase;color:var(--terra);
  margin-bottom:1.3rem;
}
.eyebrow::before{content:"";width:26px;height:2px;background:var(--terra);border-radius:2px}
.hero h1{font-size:clamp(2.7rem,5.2vw,4.35rem);margin-bottom:1.4rem}
.hero h1 em{font-style:italic;color:var(--forest-2)}
.hero-lead{font-size:1.12rem;color:var(--muted);max-width:34rem;margin-bottom:2.1rem}
.hero-actions{display:flex;gap:1rem;flex-wrap:wrap;margin-bottom:1.6rem}
.hero-note{font-size:.83rem;color:var(--muted);display:flex;align-items:center;gap:.5rem}
.hero-note svg{width:15px;height:15px;color:var(--forest-2)}
.hero-media{position:relative}
.hero-frame{position:relative;border-radius:230px 230px 26px 26px;overflow:hidden;box-shadow:var(--shadow-lg);background:var(--sand)}
.hero-frame img{width:100%;height:100%;aspect-ratio:4/4.6;object-fit:cover}
.hero-frame::after{content:"";position:absolute;inset:0;border-radius:inherit;border:1px solid rgba(255,255,255,.25)}
.hero-badge{
  position:absolute;left:-34px;bottom:44px;background:var(--white);border-radius:var(--r-md);
  box-shadow:var(--shadow-md);padding:1rem 1.3rem;display:flex;align-items:center;gap:.9rem;
  border:1px solid var(--line);
}
.hero-badge .stars{color:var(--gold);font-size:.95rem;letter-spacing:.1em}
.hero-badge strong{display:block;font-size:.92rem;color:var(--forest-deep);line-height:1.25}
.hero-badge small{color:var(--muted);font-size:.74rem}
.hero-orb{position:absolute;right:-60px;top:-40px;width:150px;height:150px;border-radius:50%;background:var(--forest);opacity:.08;z-index:-1}

/* Stats strip */
.stats{border-top:1px solid var(--line);background:var(--cream-2)}
.stats-grid{display:grid;grid-template-columns:repeat(4,1fr)}
.stat{padding:2.1rem 1.5rem;text-align:center;border-left:1px solid var(--line)}
.stat:first-child{border-left:none}
.stat b{font-family:var(--font-display);font-size:clamp(1.7rem,2.6vw,2.3rem);color:var(--forest);display:block;line-height:1}
.stat span{font-size:.8rem;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);font-weight:600}

/* ============ Marquee ============ */
.marquee{background:var(--forest);color:var(--cream);overflow:hidden;padding:1rem 0;border-block:1px solid var(--forest-deep)}
.marquee-track{display:flex;gap:3.2rem;width:max-content;animation:marquee 32s linear infinite}
.marquee:hover .marquee-track{animation-play-state:paused}
.marquee-track span{font-family:var(--font-display);font-size:1rem;letter-spacing:.06em;white-space:nowrap;display:flex;align-items:center;gap:3.2rem}
.marquee-track i{width:6px;height:6px;border-radius:50%;background:var(--gold);display:inline-block;flex-shrink:0}
@keyframes marquee{to{transform:translateX(-50%)}}

/* ============ Section scaffolding ============ */
.section{padding:6.2rem 0}
.section-head{max-width:46rem;margin-bottom:3.4rem}
.section-head.center{margin-inline:auto;text-align:center}
.section-head.center .eyebrow{justify-content:center}
.section-head h2{font-size:clamp(1.95rem,3.6vw,2.9rem);margin-bottom:1.1rem}
.section-head p{color:var(--muted);font-size:1.05rem}
.dark .section-head h2{color:var(--cream)}
.dark .section-head p{color:rgba(255,255,255,.72)}

/* Reveal animation */
.reveal{opacity:0;transform:translateY(26px);transition:opacity .8s ease,transform .8s cubic-bezier(.2,.7,.3,1);transition-delay:var(--d,0s)}
.reveal.in{opacity:1;transform:none}

/* ============ Guides (cards) ============ */
.guide-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:1.5rem}
.guide-card{
  background:var(--white);border:1px solid var(--line);border-radius:var(--r-lg);overflow:hidden;
  display:flex;flex-direction:column;
  transition:transform .35s ease,box-shadow .35s ease;
}
.guide-card:hover{transform:translateY(-8px);box-shadow:var(--shadow-md)}
.guide-card figure{position:relative;overflow:hidden;aspect-ratio:4/3;background:var(--sand)}
.guide-card figure img{width:100%;height:100%;object-fit:cover;transition:transform .6s cubic-bezier(.2,.7,.3,1)}
.guide-card:hover figure img{transform:scale(1.07)}
.guide-body{padding:1.4rem 1.4rem 1.6rem;display:flex;flex-direction:column;gap:.85rem;flex:1}
.chips{display:flex;gap:.45rem;flex-wrap:wrap}
.chip{font-size:.68rem;font-weight:700;letter-spacing:.1em;text-transform:uppercase;padding:.32rem .7rem;border-radius:999px;background:var(--sand);color:var(--forest-2)}
.chip.hot{background:rgba(196,105,59,.14);color:var(--terra-dark)}
.guide-card h3{font-size:1.16rem;line-height:1.3}
.guide-card p{font-size:.9rem;color:var(--muted);flex:1}
.guide-link{display:inline-flex;align-items:center;gap:.45rem;font-size:.86rem;font-weight:700;color:var(--terra-dark);margin-top:.2rem}
.guide-link svg{width:14px;height:14px;transition:transform .25s ease}
.guide-card:hover .guide-link svg{transform:translateX(4px)}

/* ============ Shop / Reviews ============ */
.shop{background:var(--cream-2);border-block:1px solid var(--line)}
.review-list{display:flex;flex-direction:column;gap:1.2rem}
.review-row{
  display:grid;grid-template-columns:280px 1fr auto;gap:2rem;align-items:center;
  background:var(--white);border:1px solid var(--line);border-radius:var(--r-lg);
  padding:1.4rem 1.8rem;transition:transform .3s ease,box-shadow .3s ease;
}
.review-row:hover{transform:translateX(6px);box-shadow:var(--shadow-md)}
.review-row figure{border-radius:var(--r-md);overflow:hidden;aspect-ratio:4/3;background:var(--sand)}
.review-row figure img{width:100%;height:100%;object-fit:cover}
.review-row h3{font-size:1.3rem;margin-bottom:.35rem}
.review-row p{color:var(--muted);font-size:.94rem;max-width:44rem}
.verdict{display:inline-flex;align-items:center;gap:.45rem;font-size:.72rem;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:var(--forest-2);background:rgba(62,107,82,.12);padding:.35rem .8rem;border-radius:999px;margin-bottom:.6rem}
.verdict.pick{color:var(--terra-dark);background:rgba(196,105,59,.13)}
.review-meta{display:flex;align-items:center;gap:1.4rem}
.review-price{font-family:var(--font-display);font-size:1.35rem;color:var(--forest)}
.review-price small{display:block;font-family:var(--font-body);font-size:.7rem;color:var(--muted);letter-spacing:.06em;text-transform:uppercase}

/* ============ Estimator (dark) ============ */
.dark{background:var(--forest);color:var(--cream);position:relative;overflow:hidden}
.dark::before{content:"";position:absolute;bottom:-220px;left:-160px;width:520px;height:520px;border-radius:50%;background:radial-gradient(circle,rgba(217,164,65,.14),transparent 65%);pointer-events:none}
.est-grid{display:grid;grid-template-columns:1fr 1fr;gap:2.2rem;align-items:start;position:relative}
.est-card{background:var(--cream-2);color:var(--ink);border-radius:var(--r-lg);padding:2.2rem;box-shadow:var(--shadow-lg)}
.est-card h3{font-size:1.35rem;margin-bottom:1.5rem;display:flex;align-items:center;gap:.7rem}
.est-card h3 svg{width:22px;height:22px;color:var(--terra)}
.field{display:block;margin-bottom:1.3rem}
.field>span{display:flex;justify-content:space-between;align-items:baseline;font-size:.8rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--forest);margin-bottom:.5rem}
.field>span output{color:var(--terra-dark);font-size:.95rem;letter-spacing:0;text-transform:none;font-weight:700}
.field input[type=number],.field select{
  width:100%;padding:.85rem 1rem;border:1.5px solid var(--line);border-radius:var(--r-sm);
  font-size:.98rem;background:var(--white);color:var(--ink);transition:border-color .2s ease;
}
.field input[type=number]:focus,.field select:focus{border-color:var(--forest-2);outline:none}
.est-2col{display:grid;grid-template-columns:1fr 1fr;gap:1rem}
input[type=range]{width:100%;accent-color:var(--terra);height:26px}
.est-err{color:#B3261E;font-size:.85rem;font-weight:600;margin:.4rem 0 0;display:flex;align-items:center;gap:.4rem}
.est-err[hidden]{display:none}
.est-form .btn{width:100%;justify-content:center;margin-top:.4rem}
.est-note{font-size:.78rem;color:var(--muted);margin-top:1rem;text-align:center}

.results{background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.14);border-radius:var(--r-lg);padding:2.2rem;backdrop-filter:blur(6px)}
.results-top{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:1.6rem}
.results-top h3{color:var(--cream);font-size:1.3rem}
.results-top .r-name{font-size:.78rem;letter-spacing:.14em;text-transform:uppercase;color:var(--gold);font-weight:700}
.result-tiles{display:grid;grid-template-columns:1fr 1fr;gap:1rem}
.result-tile{background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.1);border-radius:var(--r-md);padding:1.1rem 1.2rem}
.result-tile b{font-family:var(--font-display);font-size:1.55rem;color:var(--cream);display:block;line-height:1.15}
.result-tile b small{font-size:.85rem;font-family:var(--font-body);font-weight:500;color:rgba(255,255,255,.6)}
.result-tile span{font-size:.72rem;letter-spacing:.12em;text-transform:uppercase;color:rgba(255,255,255,.55);font-weight:600}
.result-tile.total{grid-column:1/-1;background:rgba(217,164,65,.14);border-color:rgba(217,164,65,.35)}
.result-tile.total b{color:var(--gold)}
.results .btn{width:100%;justify-content:center;margin-top:1.6rem}
.results .fine{font-size:.75rem;color:rgba(255,255,255,.55);margin-top:.9rem;text-align:center}

/* ============ Sustainability ============ */
.sus-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:1.5rem}
.sus-card{background:var(--white);border:1px solid var(--line);border-radius:var(--r-lg);overflow:hidden;transition:transform .35s ease,box-shadow .35s ease}
.sus-card:hover{transform:translateY(-8px);box-shadow:var(--shadow-md)}
.sus-card figure{aspect-ratio:16/10;overflow:hidden;position:relative;background:var(--sand)}
.sus-card figure img{width:100%;height:100%;object-fit:cover;transition:transform .6s ease}
.sus-card:hover figure img{transform:scale(1.06)}
.sus-body{padding:1.7rem}
.sus-icon{width:46px;height:46px;border-radius:14px;background:rgba(62,107,82,.12);display:grid;place-items:center;margin-bottom:1.1rem}
.sus-icon svg{width:22px;height:22px;color:var(--forest-2)}
.sus-card h3{font-size:1.22rem;margin-bottom:.55rem}
.sus-card p{font-size:.92rem;color:var(--muted)}

/* ============ Experts ============ */
.experts{background:var(--cream-2);border-block:1px solid var(--line)}
.expert-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:1.5rem;margin-bottom:2.6rem}
.expert-card{
  background:var(--white);border:1px solid var(--line);border-radius:var(--r-lg);padding:2.2rem 1.8rem;
  text-align:center;transition:transform .35s ease,box-shadow .35s ease;position:relative;overflow:hidden;
}
.expert-card::before{content:"";position:absolute;top:0;left:0;right:0;height:4px;background:linear-gradient(90deg,var(--forest-2),var(--gold))}
.expert-card:hover{transform:translateY(-8px);box-shadow:var(--shadow-md)}
.expert-card img{width:110px;height:110px;border-radius:50%;object-fit:cover;margin:0 auto 1.2rem;border:3px solid var(--sand);box-shadow:var(--shadow-sm)}
.expert-card h3{font-size:1.18rem}
.expert-role{font-size:.74rem;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:var(--terra-dark);margin:.35rem 0 .9rem}
.expert-card p{font-size:.9rem;color:var(--muted);margin-bottom:1.2rem}
.expert-tags{display:flex;gap:.4rem;justify-content:center;flex-wrap:wrap}

/* ============ Testimonials ============ */
.tst-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:1.5rem}
.tst-card{background:var(--white);border:1px solid var(--line);border-radius:var(--r-lg);padding:2rem;position:relative}
.tst-card::before{
  content:"\201C";position:absolute;top:.4rem;left:1.4rem;font-family:var(--font-display);
  font-size:4.6rem;line-height:1;color:rgba(196,105,59,.18);pointer-events:none;
}
.tst-card blockquote{font-size:.98rem;color:var(--ink);margin-bottom:1.4rem;position:relative}
.tst-card .stars{color:var(--gold);letter-spacing:.15em;font-size:.9rem;margin-bottom:1rem}
.tst-who{display:flex;align-items:center;gap:.85rem;border-top:1px solid var(--line);padding-top:1.1rem}
.tst-who img{width:46px;height:46px;border-radius:50%;object-fit:cover}
.tst-who strong{display:block;font-size:.9rem;color:var(--forest-deep)}
.tst-who small{font-size:.76rem;color:var(--muted)}

/* ============ FAQ ============ */
.faq-wrap{max-width:52rem;margin-inline:auto}
.faq-item{border-bottom:1px solid var(--line);background:transparent}
.faq-q{
  width:100%;display:flex;justify-content:space-between;align-items:center;gap:1.5rem;
  padding:1.5rem .3rem;text-align:left;font-family:var(--font-display);font-size:1.12rem;font-weight:600;color:var(--forest-deep);
  transition:color .2s ease;
}
.faq-q:hover{color:var(--terra-dark)}
.faq-q .fx{flex-shrink:0;width:34px;height:34px;border-radius:50%;border:1.5px solid var(--line);display:grid;place-items:center;transition:transform .35s ease,background .3s ease,border-color .3s ease}
.faq-q .fx svg{width:14px;height:14px;transition:transform .35s ease}
.faq-item.open .fx{transform:rotate(45deg);background:var(--forest);border-color:var(--forest)}
.faq-item.open .fx svg{stroke:#fff}
.faq-a{display:grid;grid-template-rows:0fr;transition:grid-template-rows .4s cubic-bezier(.2,.7,.3,1)}
.faq-item.open .faq-a{grid-template-rows:1fr}
.faq-a>div{overflow:hidden}
.faq-a p{padding:0 .3rem 1.6rem;color:var(--muted);font-size:.96rem;max-width:44rem}

/* ============ Newsletter band ============ */
.newsletter{background:linear-gradient(135deg,var(--forest) 0%,var(--forest-2) 100%);color:var(--cream);border-radius:var(--r-lg);padding:3.4rem 3rem;position:relative;overflow:hidden;display:grid;grid-template-columns:1.1fr .9fr;gap:2.5rem;align-items:center}
.newsletter::before{content:"";position:absolute;right:-90px;top:-90px;width:280px;height:280px;border-radius:50%;border:40px solid rgba(217,164,65,.14)}
.newsletter h2{color:var(--cream);font-size:clamp(1.6rem,2.6vw,2.2rem);margin-bottom:.7rem}
.newsletter p{color:rgba(255,255,255,.72);font-size:.98rem;max-width:30rem}
.nl-form{display:flex;gap:.7rem;position:relative;z-index:1}
.nl-form input{
  flex:1;padding:1rem 1.3rem;border-radius:999px;border:1.5px solid rgba(255,255,255,.25);
  background:rgba(255,255,255,.1);color:#fff;font-size:.95rem;transition:border-color .2s ease;
}
.nl-form input::placeholder{color:rgba(255,255,255,.55)}
.nl-form input:focus{outline:none;border-color:var(--gold)}
.nl-msg{font-size:.85rem;margin-top:.8rem;min-height:1.3em;color:var(--gold)}
.nl-msg.ok{color:#A8E6B0}

/* ============ About ============ */
.about-grid{display:grid;grid-template-columns:.9fr 1.1fr;gap:3.5rem;align-items:center}
.about-media{border-radius:var(--r-lg);overflow:hidden;box-shadow:var(--shadow-md);position:relative;background:var(--sand)}
.about-media img{aspect-ratio:4/4.4;width:100%;object-fit:cover}
.about-media figcaption{position:absolute;left:1.2rem;bottom:1.2rem;background:rgba(19,42,30,.85);color:#fff;padding:.7rem 1.2rem;border-radius:999px;font-size:.8rem;backdrop-filter:blur(4px)}
.pillars{display:grid;grid-template-columns:repeat(3,1fr);gap:1.1rem;margin-top:2.4rem}
.pillar{background:var(--white);border:1px solid var(--line);border-radius:var(--r-md);padding:1.3rem;transition:transform .3s ease}
.pillar:hover{transform:translateY(-5px)}
.pillar b{font-family:var(--font-display);font-size:1.02rem;display:block;margin-bottom:.35rem;color:var(--forest-deep)}
.pillar span{font-size:.83rem;color:var(--muted)}

/* ============ Footer ============ */
.site-footer{background:var(--forest-deep);color:rgba(255,255,255,.75);padding:4.5rem 0 0;margin-top:6.2rem}
.footer-grid{display:grid;grid-template-columns:1.4fr 1fr 1fr 1.2fr;gap:2.5rem;padding-bottom:3.2rem}
.footer-brand .brand-name{color:#fff}
.footer-brand .brand-tag{color:rgba(255,255,255,.5)}
.footer-brand p{font-size:.9rem;margin:1.1rem 0 1.4rem;max-width:22rem}
.socials{display:flex;gap:.6rem}
.socials a{
  width:40px;height:40px;border-radius:50%;border:1.5px solid rgba(255,255,255,.22);
  display:grid;place-items:center;transition:background .25s ease,transform .25s ease,border-color .25s ease;
}
.socials a:hover{background:var(--terra);border-color:var(--terra);transform:translateY(-3px)}
.socials svg{width:17px;height:17px;fill:rgba(255,255,255,.85)}
.socials a:hover svg{fill:#fff}
.footer-col h4{color:#fff;font-size:1rem;margin-bottom:1.2rem;font-family:var(--font-body);font-weight:700;letter-spacing:.04em}
.footer-col ul{list-style:none;display:flex;flex-direction:column;gap:.65rem}
.footer-col a{font-size:.9rem;transition:color .2s ease;display:inline-flex;align-items:center;gap:.5rem}
.footer-col a:hover{color:var(--gold)}
.footer-col li svg{width:15px;height:15px;color:var(--gold);flex-shrink:0}
.footer-bottom{border-top:1px solid rgba(255,255,255,.12);padding:1.4rem 0;display:flex;justify-content:space-between;align-items:center;gap:1rem;flex-wrap:wrap;font-size:.82rem}
.footer-bottom nav{display:flex;gap:1.6rem}
.footer-bottom a:hover{color:var(--gold)}

/* ============ Responsive ============ */
@media (max-width:1080px){
  .guide-grid{grid-template-columns:repeat(2,1fr)}
  .sus-grid{grid-template-columns:1fr 1fr}
  .sus-card:last-child{grid-column:1/-1}
  .expert-grid,.tst-grid{grid-template-columns:1fr 1fr}
  .footer-grid{grid-template-columns:1fr 1fr}
}
@media (max-width:920px){
  .main-nav,.header-cta{display:none}
  .menu-toggle{display:flex}
  .hero-grid{grid-template-columns:1fr;gap:3rem;padding:3.6rem 0 3.4rem}
  .hero-media{max-width:520px;margin-inline:auto;width:100%}
  .hero-badge{left:14px}
  .est-grid,.newsletter,.about-grid{grid-template-columns:1fr}
  .review-row{grid-template-columns:1fr;gap:1.2rem}
  .review-meta{justify-content:space-between}
  .stats-grid{grid-template-columns:repeat(2,1fr)}
  .stat:nth-child(3){border-left:none}
  .stat{border-top:1px solid var(--line)}
  .stat:nth-child(-n+2){border-top:none}
}
@media (max-width:640px){
  .section{padding:4.2rem 0}
  .guide-grid,.sus-grid,.expert-grid,.tst-grid,.pillar{grid-template-columns:1fr}
  .sus-card:last-child{grid-column:auto}
  .est-2col{grid-template-columns:1fr}
  .result-tiles{grid-template-columns:1fr 1fr}
  .newsletter{padding:2.4rem 1.6rem}
  .nl-form{flex-direction:column}
  .nl-form .btn{justify-content:center}
  .footer-grid{grid-template-columns:1fr;gap:2rem}
  .hero-actions .btn{width:100%;justify-content:center}
  .footer-bottom{justify-content:center;text-align:center}
}
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.01ms!important;transition-duration:.01ms!important}
  html{scroll-behavior:auto}
}
</style>
</head>
<body>

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

<!-- ================= HEADER ================= -->
<header class="site-header" id="siteHeader">
  <div class="container header-inner">
    <a href="#home" class="brand" aria-label="Terra and Timber — home">
      <svg class="brand-mark" viewBox="0 0 48 48" aria-hidden="true">
        <rect width="48" height="48" rx="13" fill="#1C3A2A"/>
        <path d="M11 24 L24 12 L37 24" fill="none" stroke="#F7F4EC" stroke-width="3.2" stroke-linecap="round" stroke-linejoin="round"/>
        <path d="M15 23.5 V33 H33 V23.5" fill="none" stroke="#F7F4EC" stroke-width="3.2" stroke-linecap="round" stroke-linejoin="round"/>
        <path d="M24 33 C24 28 26.5 25.5 30 24.5 C29.5 29 27 31.5 24 33 Z" fill="#C4693B"/>
        <path d="M24 33 C24 30 22.5 28 19.5 27 C20 30.5 21.8 32.4 24 33 Z" fill="#D9A441"/>
      </svg>
      <span class="brand-text">
        <span class="brand-name">Terra &amp; Timber</span>
        <span class="brand-tag">Home improvement &amp; garden wisdom</span>
      </span>
    </a>

    <nav class="main-nav" aria-label="Primary">
      <ul>
        <li><a href="#home" class="active">Home</a></li>
        <li><a href="#guides">Plant Guides</a></li>
        <li><a href="#shop">Shop</a></li>
        <li><a href="#experts">Experts</a></li>
        <li><a href="#sustainability">Sustainability</a></li>
        <li><a href="#about">About</a></li>
      </ul>
    </nav>

    <a href="#estimator" class="btn btn-primary btn-sm header-cta">Start a Project</a>

    <button class="menu-toggle" id="menuToggle" aria-label="Open menu" aria-expanded="false">
      <span></span><span></span><span></span>
    </button>
  </div>
</header>

<!-- Mobile nav -->
<nav class="mobile-nav" id="mobileNav" aria-label="Mobile">
  <a href="#home">Home <small>01</small></a>
  <a href="#guides">Plant Guides <small>02</small></a>
  <a href="#shop">Shop <small>03</small></a>
  <a href="#experts">Experts <small>04</small></a>
  <a href="#sustainability">Sustainability <small>05</small></a>
  <a href="#about">About <small>06</small></a>
  <div class="m-cta"><a href="#estimator" class="btn btn-terra">Start a Project</a></div>
</nav>

<main id="main">

<!-- ================= HERO ================= -->
<section class="hero" id="home">
  <div class="container hero-grid">
    <div>
      <span class="eyebrow">Home improvement · Garden wisdom · Trusted since 2013</span>
      <h1>Build a home that <em>grows</em> with you.</h1>
      <p class="hero-lead">Terra &amp; Timber unites expert-led renovation guides, season-tested plant libraries, and honest tool reviews — so every deck you frame, bed you amend, and backyard you reshape starts with confidence and ends with pride.</p>
      <div class="hero-actions">
        <a href="#estimator" class="btn btn-primary">Plan Your Project
          <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14M13 6l6 6-6 6"/></svg>
        </a>
        <a href="#guides" class="btn btn-outline">Browse Plant Guides</a>
      </div>
      <p class="hero-note">
        <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6L9 17l-5-5"/></svg>
        Free delivery on orders over $75 · 30-day garden guarantee
      </p>
    </div>

    <div class="hero-media">
      <div class="hero-frame">
        <img src="https://picsum.photos/seed/terrahome/1100/1250" alt="Sunlit cottage garden with a freshly renovated brick patio and raised planting beds" loading="eager">
      </div>
      <div class="hero-badge">
        <div>
          <div class="stars" aria-label="Rated 4.9 out of 5">★★★★★</div>
          <strong>4.9 average rating</strong>
          <small>From 18,400+ member reviews</small>
        </div>
      </div>
    </div>
  </div>

  <div class="stats">
    <div class="container stats-grid">
      <div class="stat"><b><span class="count" data-target="1240">0</span>+</b><span>Guided projects</span></div>
      <div class="stat"><b><span class="count" data-target="62">0</span></b><span>Certified experts</span></div>
      <div class="stat"><b><span class="count" data-target="98">0</span>%</b><span>Project success rate</span></div>
      <div class="stat"><b><span class="count" data-target="12">0</span> yrs</b><span>Field research</span></div>
    </div>
  </div>
</section>

<!-- ================= MARQUEE ================= -->
<div class="marquee" aria-hidden="true">
  <div class="marquee-track">
    <span>Raised Beds <i></i> Composting <i></i> Permaculture <i></i> Native Pollinators <i></i> Kitchen Gardens <i></i> Water-Wise Landscaping <i></i> Seasonal Planting <i></i> Home Workshops <i></i> Soil Amendment <i></i> Load-Bearing Framing <i></i></span>
    <span>Raised Beds <i></i> Composting <i></i> Permaculture <i></i> Native Pollinators <i></i> Kitchen Gardens <i></i> Water-Wise Landscaping <i></i> Seasonal Planting <i></i> Home Workshops <i></i> Soil Amendment <i></i> Load-Bearing Framing <i></i></span>
  </div>
</div>

<!-- ================= SECTION 1: PLANT GUIDES ================= -->
<section class="section" id="guides">
  <div class="container">
    <div class="section-head reveal">
      <span class="eyebrow">01 — Plant Guides</span>
      <h2>Plant guides that meet you where you garden</h2>
      <p>Our plant library is built on a simple belief: a thriving garden starts with understanding your site before you buy a single seedling. Each guide walks you through soil testing, pH balancing with targeted soil amendment, hardiness-zone selection, and a month-by-month care calendar — written by horticulturists and tested in real backyards across twelve growing regions.</p>
      <p>Whether you are converting a clay-heavy corner into an edible bed or giving a north-facing fence a second life, our step-by-step plans include material lists, estimated timelines, and troubleshooting notes drawn from a decade of field notes. No filler, no wishful thinking — just techniques that hold up from spring thaw to first frost.</p>
    </div>

    <div class="guide-grid">
      <article class="guide-card reveal" style="--d:.05s">
        <figure><img src="https://picsum.photos/seed/raisedbed/800/600" alt="Freshly built cedar raised garden bed filled with dark compost-rich soil" loading="lazy"></figure>
        <div class="guide-body">
          <div class="chips"><span class="chip">Edible Garden</span><span class="chip hot">6-week plan</span></div>
          <h3>The Beginner's Raised Bed Blueprint</h3>
          <p>Start with eight feet of square footage and a sun log. We show you how to layer compost, calculate bed depth for root crops, and space tomatoes so airflow prevents blight before it starts.</p>
          <a class="guide-link" href="#estimator">Read the Guide <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
        </div>
      </article>

      <article class="guide-card reveal" style="--d:.12s">
        <figure><img src="https://picsum.photos/seed/shadegarden/800/600" alt="Lush ferns and hostas thriving in a shaded woodland garden" loading="lazy"></figure>
        <div class="guide-body">
          <div class="chips"><span class="chip">Shade</span><span class="chip">Perennials</span></div>
          <h3>Shade Garden Rescue: Growing Under Canopy</h3>
          <p>Tree roots compete fiercely for water and nutrients. Learn how to select shade-tolerant perennials, when to divide overcrowded hostas, and how to amend soil without girdling mature trees.</p>
          <a class="guide-link" href="#estimator">Read the Guide <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
        </div>
      </article>

      <article class="guide-card reveal" style="--d:.19s">
        <figure><img src="https://picsum.photos/seed/nativepollinators/800/600" alt="Native wildflowers in full bloom attracting butterflies and bees" loading="lazy"></figure>
        <div class="guide-body">
          <div class="chips"><span class="chip">Sustainability</span><span class="chip">Regional</span></div>
          <h3>Native Plants for Pollinator Corridors</h3>
          <p>Plant in layers — canopy, understory, and meadow — and choose local ecotypes with staggered bloom times. Your yard becomes a stopover on the regional migration route, not a green island.</p>
          <a class="guide-link" href="#estimator">Read the Guide <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
        </div>
      </article>

      <article class="guide-card reveal" style="--d:.26s">
        <figure><img src="https://picsum.photos/seed/herbs/800/600" alt="Healthy basil, thyme and mint herbs growing in kitchen window planters" loading="lazy"></figure>
        <div class="guide-body">
          <div class="chips"><span class="chip">Indoor</span><span class="chip">Containers</span></div>
          <h3>The Year-Round Indoor Herb System</h3>
          <p>Light meters, self-watering reservoirs, and pruning schedules that keep basil from bolting. Build a compact herb wall that feeds a family of four through the darkest months of winter.</p>
          <a class="guide-link" href="#estimator">Read the Guide <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
        </div>
      </article>
    </div>
  </div>
</section>

<!-- ================= SECTION 2: SHOP / TOOL REVIEWS ================= -->
<section class="section shop" id="shop">
  <div class="container">
    <div class="section-head reveal">
      <span class="eyebrow">02 — Shop &amp; Reviews</span>
      <h2>Honest reviews. Tools that earn their keep.</h2>
      <p>Every tool on our bench is stress-tested through real renovation seasons — dropped from scaffolding, run dry, and pushed past spec by our workshop crew before it earns a verdict. We publish our test protocols alongside each review, including battery life under continuous load, warranty claims history, and long-term parts availability.</p>
      <p>When a product falls short, you will read it plainly. When a $40 spade outperforms one triple its price, you will hear about that too. Our shop pairing is curated to match the materials each guide recommends, so your project list and your tool list always agree.</p>
    </div>

    <div class="review-list">
      <article class="review-row reveal">
        <figure><img src="https://picsum.photos/seed/drillbench/800/600" alt="Professional cordless hammer drill on a well-used workshop bench" loading="lazy"></figure>
        <div>
          <span class="verdict">Best for framing</span>
          <h3>ForceField 18V Hammer Drill — 9.4 / 10</h3>
          <p>Holds torque through 3-inch structural screws in LVL beams with zero bogging, and the brushless motor stayed cool during a full weekend of load-bearing wall assembly. Battery platform is shared across 22 tools.</p>
        </div>
        <div class="review-meta">
          <div class="review-price">$179<small>As reviewed</small></div>
          <a href="#estimator" class="btn btn-outline btn-sm">Read the Review</a>
        </div>
      </article>

      <article class="review-row reveal" style="--d:.08s">
        <figure><img src="https://picsum.photos/seed/spade/800/600" alt="Heavy-duty forged spade standing upright in rich dark garden soil" loading="lazy"></figure>
        <div>
          <span class="verdict pick">Editor's Pick</span>
          <h3>TerraCure Ergonomic Spade — 9.7 / 10</h3>
          <p>A forged carbon-steel blade that bites into compacted clay without bending, paired with a D-grip that respects your wrists through a full hour of bed amendment. The #1 tool recommendation in our raised-bed guides.</p>
        </div>
        <div class="review-meta">
          <div class="review-price">$58<small>As reviewed</small></div>
          <a href="#estimator" class="btn btn-outline btn-sm">Read the Review</a>
        </div>
      </article>

      <article class="review-row reveal" style="--d:.16s">
        <figure><img src="https://picsum.photos/seed/mower/800/600" alt="Modern smart robotic mower working across a neat green lawn" loading="lazy"></figure>
        <div>
          <span class="verdict">Best smart mower</span>
          <h3>EverEdge 21" Smart Mower — 8.9 / 10</h3>
          <p>GPS-assisted navigation maps your lawn in one pass and never misses a strip. The mulching blade leaves clippings under an eighth of an inch — effectively a free nitrogen feed for your turf.</p>
        </div>
        <div class="review-meta">
          <div class="review-price">$899<small>As reviewed</small></div>
          <a href="#estimator" class="btn btn-outline btn-sm">Read the Review</a>
        </div>
      </article>
    </div>
  </div>
</section>

<!-- ================= SECTION 3: MATERIAL ESTIMATOR ================= -->
<section class="section dark" id="estimator">
  <div class="container">
    <div class="section-head reveal">
      <span class="eyebrow" style="color:var(--gold)">03 — Interactive Tool</span>
      <h2>Calculate materials before you cut a single board</h2>
      <p>Whether you are spreading topsoil across a new lawn bed, laying gravel for a drainage run, or mulching around mature maples, our estimator translates square footage into bags, rolls, and real dollars — including a 10% waste allowance for cuts, spills, and mis-measured corners.</p>
    </div>

    <div class="est-grid">
      <form class="est-card reveal" id="estForm" novalidate>
        <h3><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 9l9-7 9 7v11a2 2 0 01-2 2H5a2 2 0 01-2-2z"/><path d="M9 22V12h6v10"/></svg>Project Material Calculator</h3>

        <label class="field">
          <span>Project type</span>
          <select id="matType">
            <option value="mulch">Mulch — around beds &amp; trees</option>
            <option value="topsoil">Topsoil — new beds &amp; lawn repair</option>
            <option value="gravel">Gravel — paths &amp; drainage runs</option>
            <option value="sod">Sod — instant lawn coverage</option>
          </select>
        </label>

        <div class="est-2col">
          <label class="field">
            <span>Length (ft)</span>
            <input type="number" id="estLen" min="1" max="500" value="14" inputmode="decimal">
          </label>
          <label class="field">
            <span>Width (ft)</span>
            <input type="number" id="estWid" min="1" max="500" value="10" inputmode="decimal">
          </label>
        </div>

        <label class="field" id="depthField">
          <span>Depth <output id="depthVal">3 in</output></span>
          <input type="range" id="estDepth" min="1" max="6" value="3" step="0.5">
        </label>

        <p class="est-err" id="estErr" hidden>
          <svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round"><circle cx="12" cy="12" r="10"/><path d="M12 8v5M12 16.5v.01"/></svg>
          Please enter positive dimensions for both length and width.
        </p>

        <button type="button" class="btn btn-terra" id="estUpdate">Calculate Materials</button>
        <p class="est-note">Figures include a 10% waste allowance. Bulk-delivery discounts apply at 2+ cubic yards.</p>
      </form>

      <div class="results reveal" style="--d:.12s" aria-live="polite">
        <div class="results-top">
          <h3>Your Project Summary</h3>
          <span class="r-name" id="rName">Mulch</span>
        </div>
        <div class="result-tiles">
          <div class="result-tile"><b id="rArea">—</b><span>Area to cover</span></div>
          <div class="result-tile"><b id="rVolume">—</b><span>Material volume</span></div>
          <div class="result-tile"><b id="rQty">—</b><span>Quantity needed</span></div>
          <div class="result-tile"><b id="rTime">—</b><span>Est. labor time</span></div>
          <div class="result-tile total"><b id="rCost">—</b><span>Estimated cost</span></div>
        </div>
        <button class="btn btn-terra" id="estPlan">Plan This Project</button>
        <p class="fine">Our experts will turn this summary into a timed work plan and shopping list.</p>
      </div>
    </div>
  </div>
</section>

<!-- ================= SECTION 4: SUSTAINABILITY ================= -->
<section class="section" id="sustainability">
  <div class="container">
    <div class="section-head reveal">
      <span class="eyebrow">04 — Sustainability</span>
      <h2>A garden that gives back</h2>
      <p>Sustainable landscaping is not a style — it is a system. We design every recommendation around three principles that compound over time: building living soil, closing the water loop, and planting for the ecology that already belongs here.</p>
      <p>From composting programs that divert kitchen scraps from landfill to rainwater harvesting that cuts outdoor consumption by half, these practices lower your footprint and your maintenance bill, year after year.</p>
    </div>

    <div class="sus-grid">
      <article class="sus-card reveal" style="--d:.05s">
        <figure><img src="https://picsum.photos/seed/soilcompost/800/500" alt="Rich dark compost being turned with a garden fork" loading="lazy"></figure>
        <div class="sus-body">
          <div class="sus-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 22v-8"/><path d="M12 14C12 9 9 6 4 6c0 5 3 8 8 8z"/><path d="M12 11c0-4 3-7 8-7 0 5-3 8-8 8z"/></svg></div>
          <h3>Soil First</h3>
          <p>Healthy soil stores carbon, filters runoff, and feeds plants better than any synthetic fertilizer. Our amendment guides teach you to read a soil test, balance pH with lime or sulfur, and rebuild topsoil lost to erosion — layer by layer.</p>
        </div>
      </article>

      <article class="sus-card reveal" style="--d:.12s">
        <figure><img src="https://picsum.photos/seed/raingarden/800/500" alt="Rain garden with swale channeling stormwater toward water-loving plants" loading="lazy"></figure>
        <div class="sus-body">
          <div class="sus-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3s6 6.5 6 11a6 6 0 01-12 0c0-4.5 6-11 6-11z"/></svg></div>
          <h3>Water Wisely</h3>
          <p>Rain barrels, permeable pavers, and drip irrigation deliver water where roots actually are. Learn to size a rainwater system for your roof catchment and design a swale that turns your wettest corner into your garden's greatest asset.</p>
        </div>
      </article>

      <article class="sus-card reveal" style="--d:.19s">
        <figure><img src="https://picsum.photos/seed/nativefield/800/500" alt="Tall grass prairie with native flowers under a wide sky" loading="lazy"></figure>
        <div class="sus-body">
          <div class="sus-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M2 12h20M12 2a15 15 0 010 20 15 15 0 010-20z"/></svg></div>
          <h3>Native by Design</h3>
          <p>Local plants evolved with local rainfall, pests, and pollinators — which means far less watering and zero pesticides. Our regional plant databases match ecotypes to your zip code, so restoration projects start on day one.</p>
        </div>
      </article>
    </div>
  </div>
</section>

<!-- ================= SECTION 5: EXPERTS ================= -->
<section class="section experts" id="experts">
  <div class="container">
    <div class="section-head center reveal">
      <span class="eyebrow">05 — Experts</span>
      <h2>Learn from the people who get their hands dirty</h2>
      <p>Every guide on Terra &amp; Timber is reviewed by a credentialed practitioner — extension agronomists, certified arborists, and licensed landscape designers who answer member questions in our weekly office hours.</p>
    </div>

    <div class="expert-grid">
      <article class="expert-card reveal" style="--d:.05s">
        <img src="https://i.pravatar.cc/180?img=32" alt="Portrait of Dr. Maya Okonkwo" loading="lazy">
        <h3>Dr. Maya Okonkwo</h3>
        <p class="expert-role">Head of Horticulture</p>
        <p>Fifteen years translating university extension research into backyard-ready plant advice. Maya leads our soil-health and edible-garden programs.</p>
        <div class="expert-tags"><span class="chip">Soil Science</span><span class="chip">Edible Gardens</span></div>
      </article>

      <article class="expert-card reveal" style="--d:.12s">
        <img src="https://i.pravatar.cc/180?img=12" alt="Portrait of Sam Whitfield" loading="lazy">
        <h3>Sam Whitfield, CSA</h3>
        <p class="expert-role">Certified Arborist</p>
        <p>Tree health, structural pruning, and storm-damage recovery. Sam has consulted on over 400 residential properties across the Pacific Northwest.</p>
        <div class="expert-tags"><span class="chip">Arboriculture</span><span class="chip">Storm Recovery</span></div>
      </article>

      <article class="expert-card reveal" style="--d:.19s">
        <img src="https://i.pravatar.cc/180?img=47" alt="Portrait of June Park" loading="lazy">
        <h3>June Park</h3>
        <p class="expert-role">Lead Landscape Designer</p>
        <p>Small-space design, hardscaping, and water-wise yards. June has won three regional landscape awards and never met a slope she couldn't terraced.</p>
        <div class="expert-tags"><span class="chip">Hardscaping</span><span class="chip">Small Spaces</span></div>
      </article>
    </div>

    <div style="text-align:center" class="reveal">
      <a href="#newsletter" class="btn btn-primary">Find an Expert
        <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14M13 6l6 6-6 6"/></svg>
      </a>
      <p style="font-size:.85rem;color:var(--muted);margin-top:.9rem">Book a 15-minute consultation — free for new members.</p>
    </div>
  </div>
</section>

<!-- ================= SECTION 6: TESTIMONIALS ================= -->
<section class="section" id="stories">
  <div class="container">
    <div class="section-head center reveal">
      <span class="eyebrow">06 — Member Stories</span>
      <h2>Yards transformed, one project at a time</h2>
    </div>

    <div class="tst-grid">
      <article class="tst-card reveal" style="--d:.05s">
        <div class="stars" aria-label="5 out of 5 stars">★★★★★</div>
        <blockquote>We rebuilt our deck using the load-bearing beam guide and never second-guessed a cut. The engineer-reviewed diagrams caught a code issue our contractor would have missed — and the material calculator saved us $300 in over-ordering.</blockquote>
        <div class="tst-who">
          <img src="https://i.pravatar.cc/80?img=5" alt="Rachel Ellis" loading="lazy">
          <div><strong>Rachel &amp; Tom Ellis</strong><small>Portland, OR · Deck renovation</small></div>
        </div>
      </article>

      <article class="tst-card reveal" style="--d:.12s">
        <div class="stars" aria-label="5 out of 5 stars">★★★★★</div>
        <blockquote>Our backyard was solid clay that drowned every rain. The soil amendment plan and rain-garden layout turned it into the most productive vegetable patch in the neighborhood. Neighbors keep asking for the source.</blockquote>
        <div class="tst-who">
          <img src="https://i.pravatar.cc/80?img=13" alt="Marcus Webb" loading="lazy">
          <div><strong>Marcus Webb</strong><small>Austin, TX · Landscape overhaul</small></div>
        </div>
      </article>

      <article class="tst-card reveal" style="--d:.19s">
        <div class="stars" aria-label="5 out of 5 stars">★★★★★</div>
        <blockquote>As a first-time homeowner, the step-by-step framing videos paid for the membership ten times over. I installed my first fence, built a shed, and now I am halfway through the herb wall from the indoor guide.</blockquote>
        <div class="tst-who">
          <img src="https://i.pravatar.cc/80?img=31" alt="Priya Nair" loading="lazy">
          <div><strong>Priya Nair</strong><small>Denver, CO · First-home DIY</small></div>
        </div>
      </article>
    </div>
  </div>
</section>

<!-- ================= SECTION 7: FAQ ================= -->
<section class="section" id="faq" style="padding-top:2rem">
  <div class="container">
    <div class="section-head center reveal">
      <span class="eyebrow">07 — FAQ</span>
      <h2>Questions, answered honestly</h2>
    </div>

    <div class="faq-wrap reveal">
      <div class="faq-item">
        <button class="faq-q" aria-expanded="false">Do your guides match my USDA hardiness zone?<span class="fx"><svg viewBox="0 0 24 24" fill="none" stroke="#1C3A2A" stroke-width="2.4" stroke-linecap="round"><path d="M12 5v14M5 12h14"/></svg></span></button>
        <div class="faq-a"><div><p>Yes. Every plant guide is tagged by hardiness zone (3 through 10), and our planting calendars adjust sowing dates to your last-frost window. When you join, we use your zip code to tailor the entire library — including pest alerts and seasonal task reminders specific to your region.</p></div></div>
      </div>

      <div class="faq-item">
        <button class="faq-q" aria-expanded="false">Can I book a one-on-one session with an expert?<span class="fx"><svg viewBox="0 0 24 24" fill="none" stroke="#1C3A2A" stroke-width="2.4" stroke-linecap="round"><path d="M12 5v14M5 12h14"/></svg></span></button>
        <div class="faq-a"><div><p>Absolutely. Members can schedule a free 15-minute video consultation with our horticulture, arborist, or design teams. Bring photos, a soil test, or a sketch of your site — our experts walk away with an action plan you can start that weekend.</p></div></div>
      </div>

      <div class="faq-item">
        <button class="faq-q" aria-expanded="false">Does the materials calculator work for contractor-scale projects?<span class="fx"><svg viewBox="0 0 24 24" fill="none" stroke="#1C3A2A" stroke-width="2.4" stroke-linecap="round"><path d="M12 5v14M5 12h14"/></svg></span></button>
        <div class="faq-a"><div><p>It does. The estimator scales from a single mulch bed to multi-cubic-yard orders and automatically flags when bulk delivery pricing applies. Contractor accounts also unlock wholesale pricing on the shop and volume discounts on bulk soil, gravel, and sod rolls.</p></div></div>
      </div>

      <div class="faq-item">
        <button class="faq-q" aria-expanded="false">What is your return policy on garden stock?<span class="fx"><svg viewBox="0 0 24 24" fill="none" stroke="#1C3A2A" stroke-width="2.4" stroke-linecap="round"><path d="M12 5v14M5 12h14"/></svg></span></button>
        <div class="faq-a"><div><p>Plants and sod arrive with a 30-day garden guarantee. If a plant fails to establish under normal care, send a photo and we replace it or refund you — no restocking fees. Tools carry a minimum two-year warranty, and our reviewed products are tested against the manufacturer's own claims.</p></div></div>
      </div>

      <div class="faq-item">
        <button class="faq-q" aria-expanded="false">Are your product reviews sponsored?<span class="fx"><svg viewBox="0 0 24 24" fill="none" stroke="#1C3A2A" stroke-width="2.4" stroke-linecap="round"><path d="M12 5v14M5 12h14"/></svg></span></button>
        <div class="faq-a"><div><p>Never. Tools are purchased at full retail by our review team and evaluated without manufacturer input. We publish our scoring rubric, and any affiliate links in the shop are clearly labeled — but sponsorship never influences a verdict, and products that fail our test never appear in our recommendations.</p></div></div>
      </div>
    </div>
  </div>
</section>

<!-- ================= NEWSLETTER ================= -->
<section class="section" id="newsletter" style="padding-top:1rem">
  <div class="container">
    <div class="newsletter reveal">
      <div>
        <h2>The Sunday Soil Report</h2>
        <p>One email a week: what to plant, prune, and build for your zone — plus new guides, tool drops, and member project photos. Read by 42,000 gardeners and counting.</p>
      </div>
      <div>
        <form class="nl-form" id="nlForm" novalidate>
          <input type="email" id="nlEmail" placeholder="you@example.com" aria-label="Email address" autocomplete="email">
          <button type="submit" class="btn btn-terra">Subscribe</button>
        </form>
        <p class="nl-msg" id="nlMsg" role="status"></p>
      </div>
    </div>
  </div>
</section>

<!-- ================= ABOUT ================= -->
<section class="section" id="about" style="padding-top:1rem">
  <div class="container about-grid">
    <figure class="about-media reveal">
      <img src="https://picsum.photos/seed/terraworkshop/900/990" alt="Sunlit workshop with hand tools neatly arranged and lumber stacked for a weekend project" loading="lazy">
      <figcaption>Our workshop — Portland, Oregon</figcaption>
    </figure>
    <div>
      <div class="section-head reveal" style="margin-bottom:1.4rem">
        <span class="eyebrow">08 — About Terra &amp; Timber</span>
        <h2>Built by builders, grown by gardeners</h2>
        <p>Terra &amp; Timber began in 2013 as a two-person blog documenting one couple's very public mistakes rebuilding their farmhouse garden. Twelve years and thousands of reader-submitted project photos later, our mission is unchanged: make expert home improvement and horticulture knowledge feel reachable, not intimidating.</p>
        <p>We still publish every test protocol, every soil amendment recipe, and every renovation checklist in plain language. Because a beautiful home and a thriving garden should never require a degree — just good guidance and a weekend.</p>
      </div>
      <div class="pillars">
        <div class="pillar reveal" style="--d:.05s"><b>Field-tested, not theory</b><span>Every guide survives a season of real use before it reaches your screen.</span></div>
        <div class="pillar reveal" style="--d:.12s"><b>Transparent by default</b><span>No sponsored verdicts, full test data, and pricing you can verify.</span></div>
        <div class="pillar reveal" style="--d:.19s"><b>Built to last</b><span>We recommend materials and methods that age gracefully — not trends that expire.</span></div>
      </div>
    </div>
  </div>
</section>

</main>

<!-- ================= FOOTER ================= -->
<footer class="site-footer">
  <div class="container">
    <div class="footer-grid">
      <div class="footer-brand">
        <a href="#home" class="brand" aria-label="Terra and Timber — back to top">
          <svg class="brand-mark" viewBox="0 0 48 48" aria-hidden="true">
            <rect width="48" height="48" rx="13" fill="#F7F4EC"/>
            <path d="M11 24 L24 12 L37 24" fill="none" stroke="#1C3A2A" stroke-width="3.2" stroke-linecap="round" stroke-linejoin="round"/>
            <path d="M15 23.5 V33 H33 V23.5" fill="none" stroke="#1C3A2A" stroke-width="3.2" stroke-linecap="round" stroke-linejoin="round"/>
            <path d="M24 33 C24 28 26.5 25.5 30 24.5 C29.5 29 27 31.5 24 33 Z" fill="#C4693B"/>
            <path d="M24 33 C24 30 22.5 28 19.5 27 C20 30.5 21.8 32.4 24 33 Z" fill="#D9A441"/>
          </svg>
          <span class="brand-text">
            <span class="brand-name">Terra &amp; Timber</span>
            <span class="brand-tag">Home improvement &amp; garden wisdom</span>
          </span>
        </a>
        <p>Expert-led guides, honest tool reviews, and a community of makers building homes and gardens they are proud of.</p>
        <div class="socials">
          <a href="#" aria-label="Instagram"><svg viewBox="0 0 24 24"><path d="M12 2.2c3.2 0 3.6 0 4.9.1 3.3.1 4.8 1.7 4.9 4.9.1 1.3.1 1.6.1 4.8s0 3.6-.1 4.8c-.1 3.2-1.7 4.8-4.9 4.9-1.3.1-1.6.1-4.9.1s-3.6 0-4.8-.1c-3.3-.1-4.8-1.7-4.9-4.9C2.2 15.6 2.2 15.2 2.2 12s0-3.6.1-4.8C2.4 4 4 2.4 7.2 2.3 8.4 2.2 8.8 2.2 12 2.2zm0 3.6a6.2 6.2 0 100 12.4 6.2 6.2 0 000-12.4zm0 10.2a4 4 0 110-8 4 4 0 010 8zm6.4-10.5a1.4 1.4 0 100 2.9 1.4 1.4 0 000-2.9z"/></svg></a>
          <a href="#" aria-label="Pinterest"><svg viewBox="0 0 24 24"><path d="M12 2a10 10 0 00-3.6 19.3c-.1-.8-.2-2 0-2.9l1.2-5s-.3-.6-.3-1.5c0-1.4.8-2.4 1.8-2.4.9 0 1.3.6 1.3 1.4 0 .9-.6 2.2-.9 3.4-.2 1 .5 1.9 1.6 1.9 1.9 0 3.3-2 3.3-4.9 0-2.5-1.8-4.3-4.4-4.3a4.6 4.6 0 00-4.8 4.6c0 .9.3 1.9.8 2.4.1.1.1.2.1.3l-.3 1.1c0 .2-.2.2-.4.1-1.3-.6-2.1-2.5-2.1-4 0-3.3 2.4-6.3 6.9-6.3 3.6 0 6.4 2.6 6.4 6 0 3.6-2.3 6.5-5.4 6.5-1.1 0-2.1-.6-2.4-1.2l-.7 2.5c-.2.9-.9 2-1.3 2.6A10 10 0 1012 2z"/></svg></a>
          <a href="#" aria-label="YouTube"><svg viewBox="0 0 24 24"><path d="M23.5 6.2a3 3 0 00-2.1-2.1C19.5 3.5 12 3.5 12 3.5s-7.5 0-9.4.6A3 3 0 00.5 6.2 31.3 31.3 0 000 12a31.3 31.3 0 00.5 5.8 3 3 0 002.1 2.1c1.9.6 9.4.6 9.4.6s7.5 0 9.4-.6a3 3 0 002.1-2.1A31.3 31.3 0 0024 12a31.3 31.3 0 00-.5-5.8zM9.6 15.6V8.4L15.8 12l-6.2 3.6z"/></svg></a>
          <a href="#" aria-label="Facebook"><svg viewBox="0 0 24 24"><path d="M24 12a12 12 0 10-13.9 11.9v-8.4h-3v-3.5h3V9.4c0-3 1.8-4.7 4.5-4.7 1.3 0 2.7.2 2.7.2v3h-1.5c-1.5 0-2 .9-2 1.9V12h3.3l-.5 3.5h-2.8v8.4A12 12 0 0024 12z"/></svg></a>
        </div>
      </div>

      <div class="footer-col">
        <h4>Explore</h4>
        <ul>
          <li><a href="#guides">Plant Guides</a></li>
          <li><a href="#shop">Shop &amp; Reviews</a></li>
          <li><a href="#estimator">Material Calculator</a></li>
          <li><a href="#experts">Our Experts</a></li>
          <li><a href="#sustainability">Sustainability</a></li>
        </ul>
      </div>

      <div class="footer-col">
        <h4>Company</h4>
        <ul>
          <li><a href="#about">About Us</a></li>
          <li><a href="#stories">Member Stories</a></li>
          <li><a href="#faq">FAQ</a></li>
          <li><a href="#newsletter">Newsletter</a></li>
          <li><a href="#">Careers</a></li>
        </ul>
      </div>

      <div class="footer-col">
        <h4>Contact</h4>
        <ul>
          <li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 10c0 7-9 12-9 12s-9-5-9-12a9 9 0 0118 0z"/><circle cx="12" cy="10" r="3"/></svg>1247 Willow Creek Lane<br>Portland, OR 97205</li>
          <li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 16.9v3a2 2 0 01-2.2 2 19.8 19.8 0 01-8.6-3 19.5 19.5 0 01-6-6 19.8 19.8 0 01-3-8.7A2 2 0 014.1 2h3a2 2 0 012 1.7c.1 1 .4 2 .7 2.8a2 2 0 01-.5 2.1L8.1 9.9a16 16 0 006 6l1.3-1.2a2 2 0 012.1-.5c.9.3 1.9.6 2.8.7a2 2 0 011.7 2z"/></svg>(503) 555-0184</li>
          <li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="4" width="20" height="16" rx="2"/><path d="M22 7l-10 6L2 7"/></svg>hello@terraandtimber.com</li>
          <li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M12 6v6l4 2"/></svg>Mon–Sat, 8am–6pm PT</li>
        </ul>
      </div>
    </div>

    <div class="footer-bottom">
      <p>© <span id="year">2025</span> Terra &amp; Timber. All rights reserved. Grown with care in Portland, Oregon.</p>
      <nav aria-label="Legal">
        <a href="#">Privacy Policy</a>
        <a href="#">Terms of Service</a>
        <a href="#">Accessibility</a>
      </nav>
    </div>
  </div>
</footer>

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

  /* ---------- Footer year ---------- */
  document.getElementById('year').textContent = new Date().getFullYear();

  /* ---------- Header state + scroll progress ---------- */
  var header = document.getElementById('siteHeader');
  var progress = document.getElementById('progress');
  function onScroll(){
    header.classList.toggle('scrolled', window.scrollY > 12);
    var h = document.documentElement;
    var max = h.scrollHeight - h.clientHeight;
    progress.style.width = (max > 0 ? (h.scrollTop / max) * 100 : 0) + '%';
  }
  window.addEventListener('scroll', onScroll, {passive:true});
  onScroll();

  /* ---------- Mobile nav ---------- */
  var toggle = document.getElementById('menuToggle');
  var mobileNav = document.getElementById('mobileNav');
  function closeMenu(){
    toggle.classList.remove('open');
    mobileNav.classList.remove('open');
    toggle.setAttribute('aria-expanded','false');
    toggle.setAttribute('aria-label','Open menu');
    document.body.style.overflow = '';
  }
  toggle.addEventListener('click', function(){
    var open = mobileNav.classList.toggle('open');
    toggle.classList.toggle('open', open);
    toggle.setAttribute('aria-expanded', String(open));
    toggle.setAttribute('aria-label', open ? 'Close menu' : 'Open menu');
    document.body.style.overflow = open ? 'hidden' : '';
  });
  mobileNav.querySelectorAll('a').forEach(function(a){ a.addEventListener('click', closeMenu); });
  window.addEventListener('resize', function(){ if(window.innerWidth > 920) closeMenu(); });

  /* ---------- Reveal on scroll ---------- */
  var revealEls = document.querySelectorAll('.reveal');
  if('IntersectionObserver' in window){
    var ro = new IntersectionObserver(function(entries){
      entries.forEach(function(e){
        if(e.isIntersecting){ e.target.classList.add('in'); ro.unobserve(e.target); }
      });
    }, {threshold:.12, rootMargin:'0px 0px -40px 0px'});
    revealEls.forEach(function(el){ ro.observe(el); });
  } else {
    revealEls.forEach(function(el){ el.classList.add('in'); });
  }

  /* ---------- Animated counters ---------- */
  function animateCount(el){
    var target = parseInt(el.getAttribute('data-target'), 10);
    var dur = 1500, start = null;
    function step(ts){
      if(!start) start = ts;
      var p = Math.min((ts - start) / dur, 1);
      var eased = 1 - Math.pow(1 - p, 3);
      el.textContent = Math.round(target * eased).toLocaleString();
      if(p < 1) requestAnimationFrame(step);
    }
    requestAnimationFrame(step);
  }
  var counters = document.querySelectorAll('.count');
  if('IntersectionObserver' in window){
    var co = new IntersectionObserver(function(entries){
      entries.forEach(function(e){
        if(e.isIntersecting){ animateCount(e.target); co.unobserve(e.target); }
      });
    }, {threshold:.5});
    counters.forEach(function(c){ co.observe(c); });
  } else {
    counters.forEach(animateCount);
  }

  /* ---------- Scrollspy for nav ---------- */
  var navLinks = document.querySelectorAll('.main-nav a');
  var sectionIds = ['home','guides','shop','experts','sustainability','about'];
  if('IntersectionObserver' in window){
    var so = new IntersectionObserver(function(entries){
      entries.forEach(function(e){
        if(e.isIntersecting){
          navLinks.forEach(function(a){
            a.classList.toggle('active', a.getAttribute('href') === '#' + e.target.id);
          });
        }
      });
    }, {rootMargin:'-40% 0px -55% 0px'});
    sectionIds.forEach(function(id){
      var s = document.getElementById(id);
      if(s) so.observe(s);
    });
  }

  /* ---------- Material estimator ---------- */
  var MATS = {
    mulch:  {label:'Mulch',       unit:'bags',  bagCf:2.0,  price:6.50,  depthMin:2, depthMax:4, defDepth:3, rate:140},
    topsoil:{label:'Topsoil',     unit:'bags',  bagCf:1.5,  price:4.25,  depthMin:1, depthMax:3, defDepth:2, rate:110},
    gravel: {label:'Gravel',      unit:'tons',  tonsPerYd:1.35, price:58, depthMin:2, depthMax:4, defDepth:3, rate:160},
    sod:    {label:'Sod',         unit:'rolls', rollSqft:2.25, price:1.80, depthMin:null, depthMax:null, defDepth:null, rate:90}
  };
  var form      = document.getElementById('estForm');
  var matType   = document.getElementById('matType');
  var estLen    = document.getElementById('estLen');
  var estWid    = document.getElementById('estWid');
  var estDepth  = document.getElementById('estDepth');
  var depthVal  = document.getElementById('depthVal');
  var depthField= document.getElementById('depthField');
  var estErr    = document.getElementById('estErr');
  var rName     = document.getElementById('rName');
  var rArea     = document.getElementById('rArea');
  var rVolume   = document.getElementById('rVolume');
  var rQty      = document.getElementById('rQty');
  var rTime     = document.getElementById('rTime');
  var rCost     = document.getElementById('rCost');

  function fmt(n, d){ return n.toLocaleString(undefined, {maximumFractionDigits: d === undefined ? 0 : d}); }

  function applyType(){
    var m = MATS[matType.value];
    estDepth.disabled = (m.depthMin === null);
    depthField.style.opacity = m.depthMin === null ? '.45' : '1';
    if(m.depthMin !== null){
      estDepth.min = m.depthMin;
      estDepth.max = m.depthMax;
      estDepth.value = m.defDepth;
      depthVal.textContent = m.defDepth + ' in';
    } else {
      depthVal.textContent = 'standard';
    }
    rName.textContent = m.label;
    updateEstimator();
  }

  function updateEstimator(){
    var m = MATS[matType.value];
    var len = parseFloat(estLen.value);
    var wid = parseFloat(estWid.value);
    var depth = parseFloat(estDepth.value);

    if(isNaN(len) || isNaN(wid) || len <= 0 || wid <= 0){
      estErr.hidden = false;
      rArea.textContent = '—'; rVolume.textContent = '—';
      rQty.textContent = '—'; rTime.textContent = '—'; rCost.textContent = '—';
      return;
    }
    estErr.hidden = true;

    var area = len * wid;
    var waste = 1.10;
    var qty, cost, timeHrs, volText;

    if(m.depthMin === null){
      /* Sod — sold by coverage */
      qty = Math.ceil((area * waste) / m.rollSqft);
      cost = qty * m.price;
      timeHrs = area / m.rate;
      volText = (area * waste).toFixed(0) + ' <small>sq ft</small>';
    } else {
      var yd = (area * depth / 324) * waste; /* cu yd incl. waste */
      volText = yd.toFixed(1) + ' <small>cu yd</small>';
      if(m.unit === 'bags'){
        qty = Math.ceil((yd * 27) / m.bagCf);
        cost = qty * m.price;
      } else {
        qty = Math.ceil((yd * m.tonsPerYd) * 10) / 10;
        cost = qty * m.price;
      }
    }
    timeHrs = area / m.rate;
    var timeTxt = timeHrs >= 1 ? fmt(timeHrs, timeHrs < 10 ? 1 : 0) + ' <small>hrs</small>'
                               : Math.round(timeHrs * 60) + ' <small>min</small>';

    rArea.innerHTML = fmt(area) + ' <small>sq ft</small>';
    rVolume.innerHTML = volText;
    rQty.innerHTML = fmt(qty) + ' <small>' + m.unit + '</small>';
    rTime.innerHTML = timeTxt;
    rCost.innerHTML = '$' + fmt(cost);
  }

  matType.addEventListener('change', applyType);
  estDepth.addEventListener('input', function(){
    if(estDepth.disabled) return;
    depthVal.textContent = parseFloat(estDepth.value).toFixed(1).replace('.0','') + ' in';
    updateEstimator();
  });
  [estLen, estWid].forEach(function(inp){
    inp.addEventListener('input', updateEstimator);
  });
  document.getElementById('estUpdate').addEventListener('click', updateEstimator);
  document.getElementById('estPlan').addEventListener('click', function(){
    var btn = this;
    var original = btn.textContent;
    btn.textContent = 'Project Saved — Check Your Plan';
    btn.style.background = '#2C5540';
    setTimeout(function(){ btn.textContent = original; btn.style.background = ''; }, 2200);
  });
  applyType();

  /* ---------- FAQ accordion ---------- */
  var faqItems = document.querySelectorAll('.faq-item');
  faqItems.forEach(function(item){
    var btn = item.querySelector('.faq-q');
    btn.addEventListener('click', function(){
      var wasOpen = item.classList.contains('open');
      faqItems.forEach(function(i){
        i.classList.remove('open');
        i.querySelector('.faq-q').setAttribute('aria-expanded','false');
      });
      if(!wasOpen){
        item.classList.add('open');
        btn.setAttribute('aria-expanded','true');
      }
    });
  });

  /* ---------- Newsletter ---------- */
  var nlForm = document.getElementById('nlForm');
  var nlEmail = document.getElementById('nlEmail');
  var nlMsg = document.getElementById('nlMsg');
  nlForm.addEventListener('submit', function(e){
    e.preventDefault();
    var val = nlEmail.value.trim();
    var valid = /^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/.test(val);
    if(!valid){
      nlMsg.textContent = 'Please enter a valid email address to subscribe.';
      nlMsg.classList.remove('ok');
      nlEmail.focus();
      return;
    }
    nlMsg.textContent = 'Welcome aboard! Your first Soil Report arrives Sunday.';
    nlMsg.classList.add('ok');
    nlForm.reset();
  });
})();
</script>
</body>
</html>
View Axe Report (JSON)
{
  "testEngine": {
    "name": "axe-core",
    "version": "4.10.2"
  },
  "testRunner": {
    "name": "axe"
  },
  "testEnvironment": {
    "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36",
    "windowWidth": 1280,
    "windowHeight": 720,
    "orientationAngle": 0,
    "orientationType": "landscape-primary"
  },
  "timestamp": "2026-11-12T09:55:47.904Z",
  "url": "https://benchmark.aimac.invalid/2ab0f228286282ac09179bb5bf2c4dc09a6a5d7c7782d48e483af782a6e79ba2.html",
  "toolOptions": {
    "runOnly": {
      "type": "tag",
      "values": [
        "wcag2a",
        "wcag2aa",
        "wcag21a",
        "wcag21aa",
        "wcag22a",
        "wcag22aa"
      ]
    },
    "resultTypes": [
      "violations"
    ],
    "reporter": "v1"
  },
  "inapplicable": [
    {
      "id": "area-alt",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag244",
        "wcag412",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT6.a",
        "EN-301-549",
        "EN-9.2.4.4",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure <area> elements of image maps have alternative text",
      "help": "Active <area> elements must have alternative text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/area-alt?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-braille-equivalent",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure aria-braillelabel and aria-brailleroledescription have a non-braille equivalent",
      "help": "aria-braille attributes must have a non-braille equivalent",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-braille-equivalent?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-command-name",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "TTv5",
        "TT6.a",
        "EN-301-549",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure every ARIA button, link and menuitem has an accessible name",
      "help": "ARIA commands must have an accessible name",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-command-name?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-input-field-name",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "TTv5",
        "TT5.c",
        "EN-301-549",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure every ARIA input field has an accessible name",
      "help": "ARIA input fields must have an accessible name",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-input-field-name?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-meter-name",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag111",
        "EN-301-549",
        "EN-9.1.1.1"
      ],
      "description": "Ensure every ARIA meter node has an accessible name",
      "help": "ARIA meter nodes must have an accessible name",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-meter-name?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-progressbar-name",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag111",
        "EN-301-549",
        "EN-9.1.1.1"
      ],
      "description": "Ensure every ARIA progressbar node has an accessible name",
      "help": "ARIA progressbar nodes must have an accessible name",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-progressbar-name?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-required-children",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag131",
        "EN-301-549",
        "EN-9.1.3.1"
      ],
      "description": "Ensure elements with an ARIA role that require child roles contain them",
      "help": "Certain ARIA roles must contain particular children",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-required-children?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-required-parent",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag131",
        "EN-301-549",
        "EN-9.1.3.1"
      ],
      "description": "Ensure elements with an ARIA role that require parent roles are contained by them",
      "help": "Certain ARIA roles must be contained by particular parents",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-required-parent?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-toggle-field-name",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "TTv5",
        "TT5.c",
        "EN-301-549",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure every ARIA toggle field has an accessible name",
      "help": "ARIA toggle fields must have an accessible name",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-toggle-field-name?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-tooltip-name",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure every ARIA tooltip node has an accessible name",
      "help": "ARIA tooltip nodes must have an accessible name",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-tooltip-name?application=axeAPI",
      "nodes": []
    },
    {
      "id": "blink",
      "impact": null,
      "tags": [
        "cat.time-and-media",
        "wcag2a",
        "wcag222",
        "section508",
        "section508.22.j",
        "TTv5",
        "TT2.b",
        "EN-301-549",
        "EN-9.2.2.2"
      ],
      "description": "Ensure <blink> elements are not used",
      "help": "<blink> elements are deprecated and must not be used",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/blink?application=axeAPI",
      "nodes": []
    },
    {
      "id": "definition-list",
      "impact": null,
      "tags": [
        "cat.structure",
        "wcag2a",
        "wcag131",
        "EN-301-549",
        "EN-9.1.3.1"
      ],
      "description": "Ensure <dl> elements are structured correctly",
      "help": "<dl> elements must only directly contain properly-ordered <dt> and <dd> groups, <script>, <template> or <div> elements",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/definition-list?application=axeAPI",
      "nodes": []
    },
    {
      "id": "dlitem",
      "impact": null,
      "tags": [
        "cat.structure",
        "wcag2a",
        "wcag131",
        "EN-301-549",
        "EN-9.1.3.1"
      ],
      "description": "Ensure <dt> and <dd> elements are contained by a <dl>",
      "help": "<dt> and <dd> elements must be contained by a <dl>",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/dlitem?application=axeAPI",
      "nodes": []
    },
    {
      "id": "duplicate-id-aria",
      "impact": null,
      "tags": [
        "cat.parsing",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure every id attribute value used in ARIA and in labels is unique",
      "help": "IDs used in ARIA and labels must be unique",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/duplicate-id-aria?application=axeAPI",
      "nodes": []
    },
    {
      "id": "frame-focusable-content",
      "impact": null,
      "tags": [
        "cat.keyboard",
        "wcag2a",
        "wcag211",
        "TTv5",
        "TT4.a",
        "EN-301-549",
        "EN-9.2.1.1"
      ],
      "description": "Ensure <frame> and <iframe> elements with focusable content do not have tabindex=-1",
      "help": "Frames with focusable content must not have tabindex=-1",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/frame-focusable-content?application=axeAPI",
      "nodes": []
    },
    {
      "id": "frame-title-unique",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag412",
        "TTv5",
        "TT12.d",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure <iframe> and <frame> elements contain a unique title attribute",
      "help": "Frames must have a unique title attribute",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/frame-title-unique?application=axeAPI",
      "nodes": []
    },
    {
      "id": "frame-title",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag412",
        "section508",
        "section508.22.i",
        "TTv5",
        "TT12.d",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure <iframe> and <frame> elements have an accessible name",
      "help": "Frames must have an accessible name",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/frame-title?application=axeAPI",
      "nodes": []
    },
    {
      "id": "html-xml-lang-mismatch",
      "impact": null,
      "tags": [
        "cat.language",
        "wcag2a",
        "wcag311",
        "EN-301-549",
        "EN-9.3.1.1",
        "ACT"
      ],
      "description": "Ensure that HTML elements with both valid lang and xml:lang attributes agree on the base language of the page",
      "help": "HTML elements with lang and xml:lang must have the same base language",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/html-xml-lang-mismatch?application=axeAPI",
      "nodes": []
    },
    {
      "id": "input-button-name",
      "impact": null,
      "tags": [
        "cat.name-role-value",
        "wcag2a",
        "wcag412",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT5.c",
        "EN-301-549",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure input buttons have discernible text",
      "help": "Input buttons must have discernible text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/input-button-name?application=axeAPI",
      "nodes": []
    },
    {
      "id": "input-image-alt",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag111",
        "wcag412",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT7.a",
        "EN-301-549",
        "EN-9.1.1.1",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure <input type=\"image\"> elements have alternative text",
      "help": "Image buttons must have alternative text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/input-image-alt?application=axeAPI",
      "nodes": []
    },
    {
      "id": "link-in-text-block",
      "impact": null,
      "tags": [
        "cat.color",
        "wcag2a",
        "wcag141",
        "TTv5",
        "TT13.a",
        "EN-301-549",
        "EN-9.1.4.1"
      ],
      "description": "Ensure links are distinguished from surrounding text in a way that does not rely on color",
      "help": "Links must be distinguishable without relying on color",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/link-in-text-block?application=axeAPI",
      "nodes": []
    },
    {
      "id": "marquee",
      "impact": null,
      "tags": [
        "cat.parsing",
        "wcag2a",
        "wcag222",
        "TTv5",
        "TT2.b",
        "EN-301-549",
        "EN-9.2.2.2"
      ],
      "description": "Ensure <marquee> elements are not used",
      "help": "<marquee> elements are deprecated and must not be used",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/marquee?application=axeAPI",
      "nodes": []
    },
    {
      "id": "meta-refresh",
      "impact": null,
      "tags": [
        "cat.time-and-media",
        "wcag2a",
        "wcag221",
        "TTv5",
        "TT8.a",
        "EN-301-549",
        "EN-9.2.2.1"
      ],
      "description": "Ensure <meta http-equiv=\"refresh\"> is not used for delayed refresh",
      "help": "Delayed refresh under 20 hours must not be used",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/meta-refresh?application=axeAPI",
      "nodes": []
    },
    {
      "id": "object-alt",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag111",
        "section508",
        "section508.22.a",
        "EN-301-549",
        "EN-9.1.1.1"
      ],
      "description": "Ensure <object> elements have alternative text",
      "help": "<object> elements must have alternative text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/object-alt?application=axeAPI",
      "nodes": []
    },
    {
      "id": "role-img-alt",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag111",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT7.a",
        "EN-301-549",
        "EN-9.1.1.1",
        "ACT"
      ],
      "description": "Ensure [role=\"img\"] elements have alternative text",
      "help": "[role=\"img\"] elements must have an alternative text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/role-img-alt?application=axeAPI",
      "nodes": []
    },
    {
      "id": "scrollable-region-focusable",
      "impact": null,
      "tags": [
        "cat.keyboard",
        "wcag2a",
        "wcag211",
        "wcag213",
        "TTv5",
        "TT4.a",
        "EN-301-549",
        "EN-9.2.1.1",
        "EN-9.2.1.3"
      ],
      "description": "Ensure elements that have scrollable content are accessible by keyboard",
      "help": "Scrollable region must have keyboard access",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/scrollable-region-focusable?application=axeAPI",
      "nodes": []
    },
    {
      "id": "server-side-image-map",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag211",
        "section508",
        "section508.22.f",
        "TTv5",
        "TT4.a",
        "EN-301-549",
        "EN-9.2.1.1"
      ],
      "description": "Ensure that server-side image maps are not used",
      "help": "Server-side image maps must not be used",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/server-side-image-map?application=axeAPI",
      "nodes": []
    },
    {
      "id": "summary-name",
      "impact": null,
      "tags": [
        "cat.name-role-value",
        "wcag2a",
        "wcag412",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT6.a",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure summary elements have discernible text",
      "help": "Summary elements must have discernible text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/summary-name?application=axeAPI",
      "nodes": []
    },
    {
      "id": "svg-img-alt",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag111",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT7.a",
        "EN-301-549",
        "EN-9.1.1.1",
        "ACT"
      ],
      "description": "Ensure <svg> elements with an img, graphics-document or graphics-symbol role have an accessible text",
      "help": "<svg> elements with an img role must have an alternative text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/svg-img-alt?application=axeAPI",
      "nodes": []
    },
    {
      "id": "td-headers-attr",
      "impact": null,
      "tags": [
        "cat.tables",
        "wcag2a",
        "wcag131",
        "section508",
        "section508.22.g",
        "TTv5",
        "TT14.b",
        "EN-301-549",
        "EN-9.1.3.1"
      ],
      "description": "Ensure that each cell in a table that uses the headers attribute refers only to other cells in that table",
      "help": "Table cells that use the headers attribute must only refer to cells in the same table",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/td-headers-attr?application=axeAPI",
      "nodes": []
    },
    {
      "id": "th-has-data-cells",
      "impact": null,
      "tags": [
        "cat.tables",
        "wcag2a",
        "wcag131",
        "section508",
        "section508.22.g",
        "TTv5",
        "TT14.b",
        "EN-301-549",
        "EN-9.1.3.1"
      ],
      "description": "Ensure that <th> elements and elements with role=columnheader/rowheader have data cells they describe",
      "help": "Table headers in a data table must refer to data cells",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/th-has-data-cells?application=axeAPI",
      "nodes": []
    },
    {
      "id": "valid-lang",
      "impact": null,
      "tags": [
        "cat.language",
        "wcag2aa",
        "wcag312",
        "TTv5",
        "TT11.b",
        "EN-301-549",
        "EN-9.3.1.2",
        "ACT"
      ],
      "description": "Ensure lang attributes have valid values",
      "help": "lang attribute must have a valid value",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/valid-lang?application=axeAPI",
      "nodes": []
    },
    {
      "id": "video-caption",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag122",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT17.a",
        "EN-301-549",
        "EN-9.1.2.2"
      ],
      "description": "Ensure <video> elements have captions",
      "help": "<video> elements must have captions",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/video-caption?application=axeAPI",
      "nodes": []
    },
    {
      "id": "no-autoplay-audio",
      "impact": null,
      "tags": [
        "cat.time-and-media",
        "wcag2a",
        "wcag142",
        "TTv5",
        "TT2.a",
        "EN-301-549",
        "EN-9.1.4.2",
        "ACT"
      ],
      "description": "Ensure <video> or <audio> elements do not autoplay audio for more than 3 seconds without a control mechanism to stop or mute the audio",
      "help": "<video> or <audio> elements must not play automatically",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/no-autoplay-audio?application=axeAPI",
      "nodes": []
    }
  ],
  "passes": [
    {
      "id": "aria-allowed-attr",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure an element's role supports its ARIA attributes",
      "help": "Elements must only use supported ARIA attributes",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-allowed-attr?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [
            {
              "id": "aria-allowed-attr",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "ARIA attributes are used correctly for the defined role"
            }
          ],
          "none": [
            {
              "id": "aria-unsupported-attr",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "ARIA attribute is supported"
            }
          ],
          "impact": null,
          "html": "<a href=\"#home\" class=\"brand\" aria-label=\"Terra and Timber \u2014 home\">",
          "target": [
            "a[aria-label=\"Terra and Timber \u2014 home\"]"
          ]
        }
      ]
    },
    {
      "id": "aria-conditional-attr",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure ARIA attributes are used as described in the specification of the element's role",
      "help": "ARIA attributes must be used as specified for the element's role",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-conditional-attr?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [
            {
              "id": "aria-conditional-attr",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "ARIA attribute is allowed"
            }
          ],
          "none": [],
          "impact": null,
          "html": "<a href=\"#home\" class=\"brand\" aria-label=\"Terra and Timber \u2014 home\">",
          "target": [
            "a[aria-label=\"Terra and Timber \u2014 home\"]"
          ]
        }
      ]
    },
    {
      "id": "aria-deprecated-role",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure elements do not use deprecated roles",
      "help": "Deprecated ARIA roles must not be used",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-deprecated-role?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [],
          "none": [
            {
              "id": "deprecatedrole",
              "data": null,
              "relatedNodes": [],
              "impact": "minor",
              "message": "ARIA role is not deprecated"
            }
          ],
          "impact": null,
          "html": "<p class=\"nl-msg\" id=\"nlMsg\" role=\"status\"></p>",
          "target": [
            "#nlMsg"
          ]
        }
      ]
    },
    {
      "id": "aria-hidden-body",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag131",
        "wcag412",
        "EN-301-549",
        "EN-9.1.3.1",
        "EN-9.4.1.2"
      ],
      "description": "Ensure aria-hidden=\"true\" is not present on the document body.",
      "help": "aria-hidden=\"true\" must not be present on the document body",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-hidden-body?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "aria-hidden-body",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "No aria-hidden attribute is present on document body"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<body>",
          "target": [
            "body"
          ]
        }
      ]
    },
    {
      "id": "aria-hidden-focus",
      "impact": null,
      "tags": [
        "cat.name-role-value",
        "wcag2a",
        "wcag412",
        "TTv5",
        "TT6.a",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure aria-hidden elements are not focusable nor contain focusable elements",
      "help": "ARIA hidden element must not be focusable or contain focusable elements",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-hidden-focus?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [
            {
              "id": "focusable-modal-open",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "No focusable elements while a modal is open"
            },
            {
              "id": "focusable-disabled",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "No focusable elements contained within element"
            },
            {
              "id": "focusable-not-tabbable",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "No focusable elements contained within element"
            }
          ],
          "none": [],
          "impact": null,
          "html": "<svg class=\"brand-mark\" viewBox=\"0 0 48 48\" aria-hidden=\"true\">",
          "target": [
            "a[aria-label=\"Terra and Timber \u2014 home\"] > .brand-mark[viewBox=\"0 0 48 48\"][aria-hidden=\"true\"]"
          ]
        }
      ]
    },
    {
      "id": "aria-prohibited-attr",
      "impact": "serious",
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure ARIA attributes are not prohibited for an element's role",
      "help": "Elements must only use permitted ARIA attributes",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-prohibited-attr?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [],
          "none": [
            {
              "id": "aria-prohibited-attr",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "ARIA attribute is allowed"
            }
          ],
          "impact": null,
          "html": "<a href=\"#home\" class=\"brand\" aria-label=\"Terra and Timber \u2014 home\">",
          "target": [
            "a[aria-label=\"Terra and Timber \u2014 home\"]"
          ]
        }
      ]
    },
    {
      "id": "aria-required-attr",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure elements with ARIA roles have all required ARIA attributes",
      "help": "Required ARIA attributes must be provided",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-required-attr?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "aria-required-attr",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "All required ARIA attributes are present"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<p class=\"nl-msg\" id=\"nlMsg\" role=\"status\"></p>",
          "target": [
            "#nlMsg"
          ]
        }
      ]
    },
    {
      "id": "aria-roles",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure all elements with a role attribute use a valid value",
      "help": "ARIA roles used must conform to valid values",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-roles?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [],
          "none": [
            {
              "id": "invalidrole",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "ARIA role is valid"
            },
            {
              "id": "abstractrole",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "Abstract roles are not used"
            },
            {
              "id": "unsupportedrole",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "ARIA role is supported"
            }
          ],
          "impact": null,
          "html": "<p class=\"nl-msg\" id=\"nlMsg\" role=\"status\"></p>",
          "target": [
            "#nlMsg"
          ]
        }
      ]
    },
    {
      "id": "aria-valid-attr-value",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure all ARIA attributes have valid values",
      "help": "ARIA attributes must conform to valid values",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-valid-attr-value?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [
            {
              "id": "aria-valid-attr-value",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "ARIA attribute values are valid"
            },
            {
              "id": "aria-errormessage",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "aria-errormessage exists and references elements visible to screen readers that use a supported aria-errormessage technique"
            },
            {
              "id": "aria-level",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "aria-level values are valid"
            }
          ],
          "none": [],
          "impact": null,
          "html": "<a href=\"#home\" class=\"brand\" aria-label=\"Terra and Timber \u2014 home\">",
          "target": [
            "a[aria-label=\"Terra and Timber \u2014 home\"]"
          ]
        }
      ]
    },
    {
      "id": "aria-valid-attr",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure attributes that begin with aria- are valid ARIA attributes",
      "help": "ARIA attributes must conform to valid names",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-valid-attr?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "aria-valid-attr",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "ARIA attribute name is valid"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<a href=\"#home\" class=\"brand\" aria-label=\"Terra and Timber \u2014 home\">",
          "target": [
            "a[aria-label=\"Terra and Timber \u2014 home\"]"
          ]
        }
      ]
    },
    {
      "id": "autocomplete-valid",
      "impact": null,
      "tags": [
        "cat.forms",
        "wcag21aa",
        "wcag135",
        "EN-301-549",
        "EN-9.1.3.5",
        "ACT"
      ],
      "description": "Ensure the autocomplete attribute is correct and suitable for the form field",
      "help": "autocomplete attribute must be used correctly",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/autocomplete-valid?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [
            {
              "id": "autocomplete-valid",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "the autocomplete attribute is correctly formatted"
            }
          ],
          "none": [],
          "impact": null,
          "html": "<input type=\"email\" id=\"nlEmail\" placeholder=\"you@example.com\" aria-label=\"Email address\" autocomplete=\"email\">",
          "target": [
            "#nlEmail"
          ]
        }
      ]
    },
    {
      "id": "avoid-inline-spacing",
      "impact": null,
      "tags": [
        "cat.structure",
        "wcag21aa",
        "wcag1412",
        "EN-301-549",
        "EN-9.1.4.12",
        "ACT"
      ],
      "description": "Ensure that text spacing set through style attributes can be adjusted with custom stylesheets",
      "help": "Inline text spacing must be adjustable with custom stylesheets",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/avoid-inline-spacing?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [
            {
              "id": "important-letter-spacing",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "Letter-spacing in the style attribute is not set to !important, or meets the minimum"
            },
            {
              "id": "important-word-spacing",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "word-spacing in the style attribute is not set to !important, or meets the minimum"
            },
            {
              "id": "important-line-height",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "line-height in the style attribute is not set to !important, or meets the minimum"
            }
          ],
          "none": [],
          "impact": null,
          "html": "<div class=\"progress\" id=\"progress\" style=\"width: 0%;\"></div>",
          "target": [
            "#progress"
          ]
        }
      ]
    },
    {
      "id": "button-name",
      "impact": null,
      "tags": [
        "cat.name-role-value",
        "wcag2a",
        "wcag412",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT6.a",
        "EN-301-549",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure buttons have discernible text",
      "help": "Buttons must have discernible text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/button-name?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "button-has-visible-text",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "Element has inner text that is visible to screen readers"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<button type=\"button\" class=\"btn btn-terra\" id=\"estUpdate\">Calculate Materials</button>",
          "target": [
            "#estUpdate"
          ]
        }
      ]
    },
    {
      "id": "bypass",
      "impact": null,
      "tags": [
        "cat.keyboard",
        "wcag2a",
        "wcag241",
        "section508",
        "section508.22.o",
        "TTv5",
        "TT9.a",
        "EN-301-549",
        "EN-9.2.4.1"
      ],
      "description": "Ensure each page has at least one mechanism for a user to bypass navigation and jump straight to the content",
      "help": "Page must have means to bypass repeated blocks",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/bypass?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "internal-link-present",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "Valid skip link found"
            },
            {
              "id": "header-present",
              "data": null,
              "relatedNodes": [
                {
                  "html": "<h1>Build a home that <em>grows</em> with you.</h1>",
                  "target": [
                    "h1"
                  ]
                },
                {
                  "html": "<h2>Plant guides that meet you where you garden</h2>",
                  "target": [
                    "#guides > .container > .section-head.reveal > h2"
                  ]
                },
                {
                  "html": "<h3>The Beginner's Raised Bed Blueprint</h3>",
                  "target": [
                    ".guide-card:nth-child(1) > .guide-body > h3"
                  ]
                },
                {
                  "html": "<h3>Shade Garden Rescue: Growing Under Canopy</h3>",
                  "target": [
                    ".guide-card:nth-child(2) > .guide-body > h3"
                  ]
                },
                {
                  "html": "<h3>Native Plants for Pollinator Corridors</h3>",
                  "target": [
                    ".guide-card:nth-child(3) > .guide-body > h3"
                  ]
                },
                {
                  "html": "<h3>The Year-Round Indoor Herb System</h3>",
                  "target": [
                    ".guide-card:nth-child(4) > .guide-body > h3"
                  ]
                },
                {
                  "html": "<h2>Honest reviews. Tools that earn their keep.</h2>",
                  "target": [
                    "#shop > .container > .section-head.reveal > h2"
                  ]
                },
                {
                  "html": "<h3>ForceField 18V Hammer Drill \u2014 9.4 / 10</h3>",
                  "target": [
                    ".review-row:nth-child(1) > div:nth-child(2) > h3"
                  ]
                },
                {
                  "html": "<h3>TerraCure Ergonomic Spade \u2014 9.7 / 10</h3>",
                  "target": [
                    ".review-row:nth-child(2) > div:nth-child(2) > h3"
                  ]
                },
                {
                  "html": "<h3>EverEdge 21\" Smart Mower \u2014 8.9 / 10</h3>",
                  "target": [
                    ".review-row:nth-child(3) > div:nth-child(2) > h3"
                  ]
                },
                {
                  "html": "<h2>Calculate materials before you cut a single board</h2>",
                  "target": [
                    "#estimator > .container > .section-head.reveal > h2"
                  ]
                },
                {
                  "html": "<h3><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 9l9-7 9 7v11a2 2 0 01-2 2H5a2 2 0 01-2-2z\"></path><path d=\"M9 22V12h6v10\"></path></svg>Project Material Calculator</h3>",
                  "target": [
                    "#estForm > h3"
                  ]
                },
                {
                  "html": "<h3>Your Project Summary</h3>",
                  "target": [
                    ".results-top > h3"
                  ]
                },
                {
                  "html": "<h2>A garden that gives back</h2>",
                  "target": [
                    "#sustainability > .container > .section-head.reveal > h2"
                  ]
                },
                {
                  "html": "<h3>Soil First</h3>",
                  "target": [
                    ".sus-card:nth-child(1) > .sus-body > h3"
                  ]
                },
                {
                  "html": "<h3>Water Wisely</h3>",
                  "target": [
                    ".sus-card:nth-child(2) > .sus-body > h3"
                  ]
                },
                {
                  "html": "<h3>Native by Design</h3>",
                  "target": [
                    ".sus-card:nth-child(3) > .sus-body > h3"
                  ]
                },
                {
                  "html": "<h2>Learn from the people who get their hands dirty</h2>",
                  "target": [
                    "#experts > .container > .center.section-head.reveal > h2"
                  ]
                },
                {
                  "html": "<h3>Dr. Maya Okonkwo</h3>",
                  "target": [
                    ".expert-card:nth-child(1) > h3"
                  ]
                },
                {
                  "html": "<h3>Sam Whitfield, CSA</h3>",
                  "target": [
                    ".expert-card:nth-child(2) > h3"
                  ]
                },
                {
                  "html": "<h3>June Park</h3>",
                  "target": [
                    ".expert-card:nth-child(3) > h3"
                  ]
                },
                {
                  "html": "<h2>Yards transformed, one project at a time</h2>",
                  "target": [
                    "#stories > .container > .center.section-head.reveal > h2"
                  ]
                },
                {
                  "html": "<h2>Questions, answered honestly</h2>",
                  "target": [
                    "#faq > .container > .center.section-head.reveal > h2"
                  ]
                },
                {
                  "html": "<h2>The Sunday Soil Report</h2>",
                  "target": [
                    ".newsletter > div:nth-child(1) > h2"
                  ]
                },
                {
                  "html": "<h2>Built by builders, grown by gardeners</h2>",
                  "target": [
                    ".about-grid > div > .section-head.reveal > h2"
                  ]
                },
                {
                  "html": "<h4>Explore</h4>",
                  "target": [
                    ".footer-col:nth-child(2) > h4"
                  ]
                },
                {
                  "html": "<h4>Company</h4>",
                  "target": [
                    ".footer-col:nth-child(3) > h4"
                  ]
                },
                {
                  "html": "<h4>Contact</h4>",
                  "target": [
                    ".footer-col:nth-child(4) > h4"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Page has a heading"
            },
            {
              "id": "landmark",
              "data": null,
              "relatedNodes": [
                {
                  "html": "<main id=\"main\">",
                  "target": [
                    "#main"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Page has a landmark region"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<html lang=\"en\">",
          "target": [
            "html"
          ]
        }
      ]
    },
    {
      "id": "color-contrast",
      "impact": "serious",
      "tags": [
        "cat.color",
        "wcag2aa",
        "wcag143",
        "TTv5",
        "TT13.c",
        "EN-301-549",
        "EN-9.1.4.3",
        "ACT"
      ],
      "description": "Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds",
      "help": "Elements must meet minimum color contrast ratio thresholds",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/color-contrast?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#132a1e",
                "bgColor": "#f7f4ec",
                "contrastRatio": 13.86,
                "fontSize": "15.8pt (21.12px)",
                "fontWeight": "bold",
                "messageKey": null,
                "expectedContrastRatio": "3:1",
                "shadowColor": null
              },
              "relatedNodes": [],
              "impact": "serious",
              "message": "Element has sufficient color contrast of 13.86"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<span class=\"brand-name\">Terra &amp; Timber</span>",
          "target": [
            "a[aria-label=\"Terra and Timber \u2014 home\"] > .brand-text > .brand-name"
          ]
        }
      ]
    },
    {
      "id": "document-title",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag242",
        "TTv5",
        "TT12.a",
        "EN-301-549",
        "EN-9.2.4.2",
        "ACT"
      ],
      "description": "Ensure each HTML document contains a non-empty <title> element",
      "help": "Documents must have <title> element to aid in navigation",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/document-title?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "doc-has-title",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "Document has a non-empty <title> element"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<html lang=\"en\">",
          "target": [
            "html"
          ]
        }
      ]
    },
    {
      "id": "form-field-multiple-labels",
      "impact": null,
      "tags": [
        "cat.forms",
        "wcag2a",
        "wcag332",
        "TTv5",
        "TT5.c",
        "EN-301-549",
        "EN-9.3.3.2"
      ],
      "description": "Ensure form field does not have multiple label elements",
      "help": "Form field must not have multiple label elements",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/form-field-multiple-labels?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [],
          "none": [
            {
              "id": "multiple-label",
              "data": null,
              "relatedNodes": [
                {
                  "html": "<label class=\"field\">",
                  "target": [
                    "#estForm > label:nth-child(2)"
                  ]
                }
              ],
              "impact": "moderate",
              "message": "Form field does not have multiple label elements"
            }
          ],
          "impact": null,
          "html": "<select id=\"matType\">",
          "target": [
            "#matType"
          ]
        }
      ]
    },
    {
      "id": "html-has-lang",
      "impact": null,
      "tags": [
        "cat.language",
        "wcag2a",
        "wcag311",
        "TTv5",
        "TT11.a",
        "EN-301-549",
        "EN-9.3.1.1",
        "ACT"
      ],
      "description": "Ensure every HTML document has a lang attribute",
      "help": "<html> element must have a lang attribute",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/html-has-lang?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "has-lang",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "The <html> element has a lang attribute"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<html lang=\"en\">",
          "target": [
            "html"
          ]
        }
      ]
    },
    {
      "id": "html-lang-valid",
      "impact": null,
      "tags": [
        "cat.language",
        "wcag2a",
        "wcag311",
        "TTv5",
        "TT11.a",
        "EN-301-549",
        "EN-9.3.1.1",
        "ACT"
      ],
      "description": "Ensure the lang attribute of the <html> element has a valid value",
      "help": "<html> element must have a valid value for the lang attribute",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/html-lang-valid?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [],
          "none": [
            {
              "id": "valid-lang",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "Value of lang attribute is included in the list of valid languages"
            }
          ],
          "impact": null,
          "html": "<html lang=\"en\">",
          "target": [
            "html"
          ]
        }
      ]
    },
    {
      "id": "image-alt",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag111",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT7.a",
        "TT7.b",
        "EN-301-549",
        "EN-9.1.1.1",
        "ACT"
      ],
      "description": "Ensure <img> elements have alternative text or a role of none or presentation",
      "help": "Images must have alternative text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/image-alt?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "has-alt",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "Element has an alt attribute"
            }
          ],
          "all": [],
          "none": [
            {
              "id": "alt-space-value",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "Element has a valid alt attribute value"
            }
          ],
          "impact": null,
          "html": "<img src=\"https://picsum.photos/seed/terrahome/1100/1250\" alt=\"Sunlit cottage garden with a freshly renovated brick patio and raised planting beds\" loading=\"eager\">",
          "target": [
            "img[loading=\"eager\"]"
          ]
        }
      ]
    },
    {
      "id": "label",
      "impact": null,
      "tags": [
        "cat.forms",
        "wcag2a",
        "wcag412",
        "section508",
        "section508.22.n",
        "TTv5",
        "TT5.c",
        "EN-301-549",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure every form element has a label",
      "help": "Form elements must have labels",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/label?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "implicit-label",
              "data": {
                "implicitLabel": "Length (ft)"
              },
              "relatedNodes": [
                {
                  "html": "<label class=\"field\">\n            <span>Length (ft)</span>\n            <input type=\"number\" id=\"estLen\" min=\"1\" max=\"500\" value=\"14\" inputmode=\"decimal\">\n          </label>",
                  "target": [
                    "label:nth-child(1)"
                  ]
                }
              ],
              "impact": "critical",
              "message": "Element has an implicit (wrapped) <label>"
            }
          ],
          "all": [],
          "none": [
            {
              "id": "hidden-explicit-label",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "Form element has a visible explicit <label>"
            }
          ],
          "impact": null,
          "html": "<input type=\"number\" id=\"estLen\" min=\"1\" max=\"500\" value=\"14\" inputmode=\"decimal\">",
          "target": [
            "#estLen"
          ]
        }
      ]
    },
    {
      "id": "link-name",
      "impact": null,
      "tags": [
        "cat.name-role-value",
        "wcag2a",
        "wcag244",
        "wcag412",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT6.a",
        "EN-301-549",
        "EN-9.2.4.4",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure links have discernible text",
      "help": "Links must have discernible text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/link-name?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "has-visible-text",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "Element has text that is visible to screen readers"
            }
          ],
          "all": [],
          "none": [
            {
              "id": "focusable-no-name",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "Element is not in tab order or has accessible text"
            }
          ],
          "impact": null,
          "html": "<a class=\"skip-link\" href=\"#main\">Skip to main content</a>",
          "target": [
            ".skip-link"
          ]
        }
      ]
    },
    {
      "id": "list",
      "impact": null,
      "tags": [
        "cat.structure",
        "wcag2a",
        "wcag131",
        "EN-301-549",
        "EN-9.1.3.1"
      ],
      "description": "Ensure that lists are structured correctly",
      "help": "<ul> and <ol> must only directly contain <li>, <script> or <template> elements",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/list?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [],
          "none": [
            {
              "id": "only-listitems",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "List element only has direct children that are allowed inside <li> elements"
            }
          ],
          "impact": null,
          "html": "<ul>",
          "target": [
            ".main-nav > ul"
          ]
        }
      ]
    },
    {
      "id": "listitem",
      "impact": null,
      "tags": [
        "cat.structure",
        "wcag2a",
        "wcag131",
        "EN-301-549",
        "EN-9.1.3.1"
      ],
      "description": "Ensure <li> elements are used semantically",
      "help": "<li> elements must be contained in a <ul> or <ol>",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/listitem?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "listitem",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "List item has a <ul>, <ol> or role=\"list\" parent element"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<li><a href=\"#home\" class=\"active\">Home</a></li>",
          "target": [
            ".main-nav > ul > li:nth-child(1)"
          ]
        }
      ]
    },
    {
      "id": "meta-viewport",
      "impact": null,
      "tags": [
        "cat.sensory-and-visual-cues",
        "wcag2aa",
        "wcag144",
        "EN-301-549",
        "EN-9.1.4.4",
        "ACT"
      ],
      "description": "Ensure <meta name=\"viewport\"> does not disable text scaling and zooming",
      "help": "Zooming and scaling must not be disabled",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/meta-viewport?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "meta-viewport",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "<meta> tag does not disable zooming on mobile devices"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">",
          "target": [
            "meta[name=\"viewport\"]"
          ]
        }
      ]
    },
    {
      "id": "nested-interactive",
      "impact": null,
      "tags": [
        "cat.keyboard",
        "wcag2a",
        "wcag412",
        "TTv5",
        "TT6.a",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure interactive controls are not nested as they are not always announced by screen readers or can cause focus problems for assistive technologies",
      "help": "Interactive controls must not be nested",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/nested-interactive?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "no-focusable-content",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "Element does not have focusable descendants"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<img src=\"https://picsum.photos/seed/terrahome/1100/1250\" alt=\"Sunlit cottage garden with a freshly renovated brick patio and raised planting beds\" loading=\"eager\">",
          "target": [
            "img[loading=\"eager\"]"
          ]
        }
      ]
    },
    {
      "id": "select-name",
      "impact": null,
      "tags": [
        "cat.forms",
        "wcag2a",
        "wcag412",
        "section508",
        "section508.22.n",
        "TTv5",
        "TT5.c",
        "EN-301-549",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure select element has an accessible name",
      "help": "Select element must have an accessible name",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/select-name?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "implicit-label",
              "data": {
                "implicitLabel": "Project type"
              },
              "relatedNodes": [
                {
                  "html": "<label class=\"field\">",
                  "target": [
                    "#estForm > label:nth-child(2)"
                  ]
                }
              ],
              "impact": "critical",
              "message": "Element has an implicit (wrapped) <label>"
            }
          ],
          "all": [],
          "none": [
            {
              "id": "hidden-explicit-label",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "Form element has a visible explicit <label>"
            }
          ],
          "impact": null,
          "html": "<select id=\"matType\">",
          "target": [
            "#matType"
          ]
        }
      ]
    },
    {
      "id": "target-size",
      "impact": null,
      "tags": [
        "cat.sensory-and-visual-cues",
        "wcag22aa",
        "wcag258"
      ],
      "description": "Ensure touch targets have sufficient size and space",
      "help": "All touch targets must be 24px large, or leave sufficient space",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/target-size?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "target-size",
              "data": {
                "minSize": 24,
                "width": 196.2,
                "height": 48.8
              },
              "relatedNodes": [],
              "impact": "serious",
              "message": "Control has sufficient size (196.2px by 48.8px, should be at least 24px by 24px)"
            },
            {
              "id": "target-offset",
              "data": {
                "closestOffset": 24,
                "minOffset": 24
              },
              "relatedNodes": [],
              "impact": "serious",
              "message": "Target has sufficient space from its closest neighbors. Safe clickable space has a diameter of 24px which is at least 24px."
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<a class=\"skip-link\" href=\"#main\">Skip to main content</a>",
          "target": [
            ".skip-link"
          ]
        }
      ]
    }
  ],
  "incomplete": [
    {
      "id": "aria-prohibited-attr",
      "impact": "serious",
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure ARIA attributes are not prohibited for an element's role",
      "help": "Elements must only use permitted ARIA attributes",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-prohibited-attr?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [],
          "none": [
            {
              "id": "aria-prohibited-attr",
              "data": {
                "role": null,
                "nodeName": "div",
                "messageKey": "noRoleSingular",
                "prohibited": [
                  "aria-label"
                ]
              },
              "relatedNodes": [],
              "impact": "serious",
              "message": "aria-label attribute is not well supported on a div with no valid role attribute."
            }
          ],
          "impact": "serious",
          "html": "<div class=\"stars\" aria-label=\"Rated 4.9 out of 5\">\u2605\u2605\u2605\u2605\u2605</div>",
          "target": [
            "div[aria-label=\"Rated 4.9 out of 5\"]"
          ],
          "failureSummary": "Fix all of the following:\n  aria-label attribute is not well supported on a div with no valid role attribute."
        }
      ]
    },
    {
      "id": "color-contrast",
      "impact": "serious",
      "tags": [
        "cat.color",
        "wcag2aa",
        "wcag143",
        "TTv5",
        "TT13.c",
        "EN-301-549",
        "EN-9.1.4.3",
        "ACT"
      ],
      "description": "Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds",
      "help": "Elements must meet minimum color contrast ratio thresholds",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/color-contrast?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fontSize": "8.9pt (11.84px)",
                "fontWeight": "bold",
                "messageKey": "pseudoContent",
                "expectedContrastRatio": "4.5:1"
              },
              "relatedNodes": [
                {
                  "html": "<section class=\"hero\" id=\"home\">",
                  "target": [
                    "#home"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element's background color could not be determined due to a pseudo element"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"eyebrow\">Home improvement \u00b7 Garden wisdom \u00b7 Trusted since 2013</span>",
          "target": [
            ".hero-grid > div:nth-child(1) > .eyebrow"
          ],
          "failureSummary": "Fix any of the following:\n  Element's background color could not be determined due to a pseudo element"
        }
      ]
    }
  ],
  "violations": [
    {
      "id": "color-contrast",
      "impact": "serious",
      "tags": [
        "cat.color",
        "wcag2aa",
        "wcag143",
        "TTv5",
        "TT13.c",
        "EN-301-549",
        "EN-9.1.4.3",
        "ACT"
      ],
      "description": "Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds",
      "help": "Elements must meet minimum color contrast ratio thresholds",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/color-contrast?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#c4693b",
                "bgColor": "#f7f4ec",
                "contrastRatio": 3.51,
                "fontSize": "8.9pt (11.84px)",
                "fontWeight": "bold",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<body>",
                  "target": [
                    "body"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.51 (foreground color: #c4693b, background color: #f7f4ec, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"eyebrow\">01 \u2014 Plant Guides</span>",
          "target": [
            ".in > .eyebrow"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.51 (foreground color: #c4693b, background color: #f7f4ec, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#c4693b",
                "bgColor": "#f7f4ec",
                "contrastRatio": 3.51,
                "fontSize": "8.9pt (11.84px)",
                "fontWeight": "bold",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<body>",
                  "target": [
                    "body"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.51 (foreground color: #c4693b, background color: #f7f4ec, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"eyebrow\">01 \u2014 Plant Guides</span>",
          "target": [
            ".in.section-head.reveal > .eyebrow"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.51 (foreground color: #c4693b, background color: #f7f4ec, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#a9552c",
                "bgColor": "#f7eae4",
                "contrastRatio": 4.43,
                "fontSize": "8.2pt (10.88px)",
                "fontWeight": "bold",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<span class=\"chip hot\">6-week plan</span>",
                  "target": [
                    ".hot"
                  ]
                },
                {
                  "html": "<article class=\"guide-card reveal in\" style=\"--d:.05s\">",
                  "target": [
                    ".guide-card.in:nth-child(1)"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 4.43 (foreground color: #a9552c, background color: #f7eae4, font size: 8.2pt (10.88px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"chip hot\">6-week plan</span>",
          "target": [
            ".hot"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 4.43 (foreground color: #a9552c, background color: #f7eae4, font size: 8.2pt (10.88px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#c4693b",
                "bgColor": "#f7f4ec",
                "contrastRatio": 3.51,
                "fontSize": "8.9pt (11.84px)",
                "fontWeight": "bold",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<body>",
                  "target": [
                    "body"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.51 (foreground color: #c4693b, background color: #f7f4ec, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"eyebrow\">01 \u2014 Plant Guides</span>",
          "target": [
            "#guides > .container > .in.section-head.reveal > .eyebrow"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.51 (foreground color: #c4693b, background color: #f7f4ec, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#c4693b",
                "bgColor": "#fbf9f3",
                "contrastRatio": 3.67,
                "fontSize": "8.9pt (11.84px)",
                "fontWeight": "bold",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<section class=\"section shop\" id=\"shop\">",
                  "target": [
                    "#shop"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.67 (foreground color: #c4693b, background color: #fbf9f3, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"eyebrow\">02 \u2014 Shop &amp; Reviews</span>",
          "target": [
            "#shop > .container > .in.section-head.reveal > .eyebrow"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.67 (foreground color: #c4693b, background color: #fbf9f3, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#c4693b",
                "bgColor": "#f7f4ec",
                "contrastRatio": 3.51,
                "fontSize": "8.9pt (11.84px)",
                "fontWeight": "bold",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<body>",
                  "target": [
                    "body"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.51 (foreground color: #c4693b, background color: #f7f4ec, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"eyebrow\">01 \u2014 Plant Guides</span>",
          "target": [
            "#guides > .container > .section-head.in.reveal > .eyebrow"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.51 (foreground color: #c4693b, background color: #f7f4ec, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#c4693b",
                "bgColor": "#fbf9f3",
                "contrastRatio": 3.67,
                "fontSize": "8.9pt (11.84px)",
                "fontWeight": "bold",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<section class=\"section shop\" id=\"shop\">",
                  "target": [
                    "#shop"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.67 (foreground color: #c4693b, background color: #fbf9f3, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"eyebrow\">02 \u2014 Shop &amp; Reviews</span>",
          "target": [
            "#shop > .container > .section-head.in.reveal > .eyebrow"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.67 (foreground color: #c4693b, background color: #fbf9f3, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#a9552c",
                "bgColor": "#f7ece6",
                "contrastRatio": 4.49,
                "fontSize": "8.6pt (11.52px)",
                "fontWeight": "bold",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<span class=\"verdict pick\">Editor's Pick</span>",
                  "target": [
                    ".pick"
                  ]
                },
                {
                  "html": "<article class=\"review-row reveal in\" style=\"--d:.08s\">",
                  "target": [
                    ".review-row.in:nth-child(2)"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 4.49 (foreground color: #a9552c, background color: #f7ece6, font size: 8.6pt (11.52px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"verdict pick\">Editor's Pick</span>",
          "target": [
            ".pick"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 4.49 (foreground color: #a9552c, background color: #f7ece6, font size: 8.6pt (11.52px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#c4693b",
                "bgColor": "#f7f4ec",
                "contrastRatio": 3.51,
                "fontSize": "8.9pt (11.84px)",
                "fontWeight": "bold",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<body>",
                  "target": [
                    "body"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.51 (foreground color: #c4693b, background color: #f7f4ec, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"eyebrow\">04 \u2014 Sustainability</span>",
          "target": [
            "#sustainability > .container > .section-head.in.reveal > .eyebrow"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.51 (foreground color: #c4693b, background color: #f7f4ec, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#c4693b",
                "bgColor": "#fbf9f3",
                "contrastRatio": 3.67,
                "fontSize": "8.9pt (11.84px)",
                "fontWeight": "bold",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<section class=\"section experts\" id=\"experts\">",
                  "target": [
                    "#experts"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.67 (foreground color: #c4693b, background color: #fbf9f3, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"eyebrow\">05 \u2014 Experts</span>",
          "target": [
            ".center.section-head.in > .eyebrow"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.67 (foreground color: #c4693b, background color: #fbf9f3, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#c4693b",
                "bgColor": "#fbf9f3",
                "contrastRatio": 3.67,
                "fontSize": "8.9pt (11.84px)",
                "fontWeight": "bold",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<section class=\"section experts\" id=\"experts\">",
                  "target": [
                    "#experts"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.67 (foreground color: #c4693b, background color: #fbf9f3, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"eyebrow\">05 \u2014 Experts</span>",
          "target": [
            "#experts > .container > .center.section-head.in > .eyebrow"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.67 (foreground color: #c4693b, background color: #fbf9f3, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#c4693b",
                "bgColor": "#f7f4ec",
                "contrastRatio": 3.51,
                "fontSize": "8.9pt (11.84px)",
                "fontWeight": "bold",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<body>",
                  "target": [
                    "body"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.51 (foreground color: #c4693b, background color: #f7f4ec, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"eyebrow\">06 \u2014 Member Stories</span>",
          "target": [
            "#stories > .container > .center.section-head.in > .eyebrow"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.51 (foreground color: #c4693b, background color: #f7f4ec, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#c4693b",
                "bgColor": "#f7f4ec",
                "contrastRatio": 3.51,
                "fontSize": "8.9pt (11.84px)",
                "fontWeight": "bold",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<body>",
                  "target": [
                    "body"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.51 (foreground color: #c4693b, background color: #f7f4ec, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"eyebrow\">07 \u2014 FAQ</span>",
          "target": [
            "#faq > .container > .center.section-head.in > .eyebrow"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.51 (foreground color: #c4693b, background color: #f7f4ec, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#ffffff",
                "bgColor": "#c4693b",
                "contrastRatio": 3.86,
                "fontSize": "11.4pt (15.2px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<button type=\"submit\" class=\"btn btn-terra\">Subscribe</button>",
                  "target": [
                    "button[type=\"submit\"]"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.86 (foreground color: #ffffff, background color: #c4693b, font size: 11.4pt (15.2px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<button type=\"submit\" class=\"btn btn-terra\">Subscribe</button>",
          "target": [
            "button[type=\"submit\"]"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.86 (foreground color: #ffffff, background color: #c4693b, font size: 11.4pt (15.2px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#c4693b",
                "bgColor": "#f7f4ec",
                "contrastRatio": 3.51,
                "fontSize": "8.9pt (11.84px)",
                "fontWeight": "bold",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<body>",
                  "target": [
                    "body"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.51 (foreground color: #c4693b, background color: #f7f4ec, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"eyebrow\">01 \u2014 Plant Guides</span>",
          "target": [
            "#guides > .container > .section-head.reveal.in > .eyebrow"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.51 (foreground color: #c4693b, background color: #f7f4ec, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#c4693b",
                "bgColor": "#fbf9f3",
                "contrastRatio": 3.67,
                "fontSize": "8.9pt (11.84px)",
                "fontWeight": "bold",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<section class=\"section shop\" id=\"shop\">",
                  "target": [
                    "#shop"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.67 (foreground color: #c4693b, background color: #fbf9f3, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"eyebrow\">02 \u2014 Shop &amp; Reviews</span>",
          "target": [
            "#shop > .container > .section-head.reveal.in > .eyebrow"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.67 (foreground color: #c4693b, background color: #fbf9f3, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#c4693b",
                "bgColor": "#f7f4ec",
                "contrastRatio": 3.51,
                "fontSize": "8.9pt (11.84px)",
                "fontWeight": "bold",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<body>",
                  "target": [
                    "body"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.51 (foreground color: #c4693b, background color: #f7f4ec, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"eyebrow\">04 \u2014 Sustainability</span>",
          "target": [
            "#sustainability > .container > .section-head.reveal.in > .eyebrow"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.51 (foreground color: #c4693b, background color: #f7f4ec, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#c4693b",
                "bgColor": "#fbf9f3",
                "contrastRatio": 3.67,
                "fontSize": "8.9pt (11.84px)",
                "fontWeight": "bold",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<section class=\"section experts\" id=\"experts\">",
                  "target": [
                    "#experts"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.67 (foreground color: #c4693b, background color: #fbf9f3, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"eyebrow\">05 \u2014 Experts</span>",
          "target": [
            "#experts > .container > .center.section-head.reveal > .eyebrow"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.67 (foreground color: #c4693b, background color: #fbf9f3, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#c4693b",
                "bgColor": "#f7f4ec",
                "contrastRatio": 3.51,
                "fontSize": "8.9pt (11.84px)",
                "fontWeight": "bold",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<body>",
                  "target": [
                    "body"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.51 (foreground color: #c4693b, background color: #f7f4ec, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"eyebrow\">06 \u2014 Member Stories</span>",
          "target": [
            "#stories > .container > .center.section-head.reveal > .eyebrow"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.51 (foreground color: #c4693b, background color: #f7f4ec, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#c4693b",
                "bgColor": "#f7f4ec",
                "contrastRatio": 3.51,
                "fontSize": "8.9pt (11.84px)",
                "fontWeight": "bold",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<body>",
                  "target": [
                    "body"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.51 (foreground color: #c4693b, background color: #f7f4ec, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"eyebrow\">07 \u2014 FAQ</span>",
          "target": [
            "#faq > .container > .center.section-head.reveal > .eyebrow"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.51 (foreground color: #c4693b, background color: #f7f4ec, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#c4693b",
                "bgColor": "#f7f4ec",
                "contrastRatio": 3.51,
                "fontSize": "8.9pt (11.84px)",
                "fontWeight": "bold",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<body>",
                  "target": [
                    "body"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.51 (foreground color: #c4693b, background color: #f7f4ec, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"eyebrow\">08 \u2014 About Terra &amp; Timber</span>",
          "target": [
            ".about-grid > div > .section-head.reveal.in > .eyebrow"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.51 (foreground color: #c4693b, background color: #f7f4ec, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
        }
      ]
    },
    {
      "id": "target-size",
      "impact": "serious",
      "tags": [
        "cat.sensory-and-visual-cues",
        "wcag22aa",
        "wcag258"
      ],
      "description": "Ensure touch targets have sufficient size and space",
      "help": "All touch targets must be 24px large, or leave sufficient space",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/target-size?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "target-size",
              "data": {
                "messageKey": "partiallyObscured",
                "minSize": 24,
                "width": 832,
                "height": 19.7
              },
              "relatedNodes": [
                {
                  "html": "<a href=\"#home\" class=\"brand\" aria-label=\"Terra and Timber \u2014 home\">",
                  "target": [
                    "a[aria-label=\"Terra and Timber \u2014 home\"]"
                  ]
                },
                {
                  "html": "<a href=\"#home\" class=\"\">Home</a>",
                  "target": [
                    "li:nth-child(1) > a[href$=\"#home\"]"
                  ]
                },
                {
                  "html": "<a href=\"#guides\" class=\"\">Plant Guides</a>",
                  "target": [
                    "li:nth-child(2) > a[href$=\"#guides\"]"
                  ]
                },
                {
                  "html": "<a href=\"#shop\" class=\"\">Shop</a>",
                  "target": [
                    "li:nth-child(3) > a[href$=\"#shop\"]"
                  ]
                },
                {
                  "html": "<a href=\"#experts\" class=\"active\">Experts</a>",
                  "target": [
                    ".active"
                  ]
                },
                {
                  "html": "<a href=\"#sustainability\" class=\"\">Sustainability</a>",
                  "target": [
                    ".main-nav > ul > li:nth-child(5) > a[href$=\"#sustainability\"]"
                  ]
                },
                {
                  "html": "<a href=\"#about\">About</a>",
                  "target": [
                    "li:nth-child(6) > a[href$=\"#about\"]"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Target has insufficient size because it is partially obscured (smallest space is 832px by 19.7px, should be at least 24px by 24px)"
            },
            {
              "id": "target-offset",
              "data": {
                "closestOffset": 5.6,
                "minOffset": 24
              },
              "relatedNodes": [
                {
                  "html": "<button class=\"faq-q\" aria-expanded=\"false\">Can I book a one-on-one session with an expert?<span class=\"fx\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#1C3A2A\" stroke-width=\"2.4\" stroke-linecap=\"round\"><path d=\"M12 5v14M5 12h14\"></path></svg></span></button>",
                  "target": [
                    ".faq-item:nth-child(2) > .faq-q"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 5.6px instead of at least 24px."
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<button class=\"faq-q\" aria-expanded=\"false\">Does the materials calculator work for contractor-scale projects?<span class=\"fx\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#1C3A2A\" stroke-width=\"2.4\" stroke-linecap=\"round\"><path d=\"M12 5v14M5 12h14\"></path></svg></span></button>",
          "target": [
            ".faq-item:nth-child(3) > .faq-q"
          ],
          "failureSummary": "Fix any of the following:\n  Target has insufficient size because it is partially obscured (smallest space is 832px by 19.7px, should be at least 24px by 24px)\n  Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 5.6px instead of at least 24px."
        }
      ]
    }
  ],
  "coverage": {
    "contract": "main-document-vertical-scroll",
    "complete": true,
    "positions": [
      {
        "y": 0,
        "height": 10040
      },
      {
        "y": 576,
        "height": 10040
      },
      {
        "y": 1152,
        "height": 10040
      },
      {
        "y": 1728,
        "height": 10040
      },
      {
        "y": 2304,
        "height": 10040
      },
      {
        "y": 2880,
        "height": 10040
      },
      {
        "y": 3456,
        "height": 10040
      },
      {
        "y": 4032,
        "height": 10040
      },
      {
        "y": 4608,
        "height": 10040
      },
      {
        "y": 5184,
        "height": 10040
      },
      {
        "y": 5760,
        "height": 10040
      },
      {
        "y": 6336,
        "height": 10040
      },
      {
        "y": 6912,
        "height": 10040
      },
      {
        "y": 7488,
        "height": 10040
      },
      {
        "y": 8064,
        "height": 10040
      },
      {
        "y": 8640,
        "height": 10040
      },
      {
        "y": 9216,
        "height": 10040
      },
      {
        "y": 9320,
        "height": 10040
      }
    ],
    "scans": 19,
    "max_states": 512,
    "settle_ms": 5000,
    "page_timeout_seconds": 150,
    "layout_stability": "consecutive 100ms size samples within one CSS pixel",
    "animation_settling": "finite animations present when scroll resources are ready finish or are cancelled",
    "interactive_states": "not exercised",
    "horizontal_scroll": "not exercised"
  }
}
System Prompt
You are a lead web developer at a top digital agency, tasked with creating a one-page website for a new client based on the given specifications, delivered as an HTML file. First non-whitespace char '<', last non-whitespace char '>'. Use the following services to generate placeholder images where needed:
- placehold.co (text): https://placehold.co/[{w}x{h}|{size}][/{bg-color}/{text-color}]?text={text}&font=[lato|lora|montserrat|noto sans|open sans|oswald|playfair display|poppins|pt sans|raleway|roboto|source sans|source sans pro]
- picsum.photos (photos): https://picsum.photos/[{w}/{h}|{size}]?[grayscale][&blur={1-10}]
- pravatar.cc (avatars): https://i.pravatar.cc/{size}?u={identifier}
Choose sizes appropriate to layout.
User Prompt
Create a **complete, polished, production-quality** primary web page for a new client in the "Home and Garden" sector.
Your goal is to generate the full HTML code for a page that is not just functional but also visually compelling, content-rich, and feels like a finished product ready for launch.

**Client & Category:**
- Industry: "Home and Garden"
- Description: Home improvement, gardening, DIY guides, landscaping, and decor resources.

**Your Creative Task:**
1.  **Invent:** Create a unique, professional-sounding site name and a strong tagline fitting the "Home and Garden" category.
2.  **Define Page:** Determine the most effective primary page type (e.g., homepage, service landing page, category portal) to showcase this fictional entity.
3.  **Design:** Develop an opinionated, modern, and professional layout. Make distinct choices about structure and flow.

**Content & Structure Requirements (Deliver a COMPLETE page):**
-   **Overall:** The final page must feel substantial and complete, with realistic amounts of text (multiple paragraphs per section where appropriate, avoid single sentences), well-integrated placeholder images, and logical flow. It should look like a real website a business would proudly use.
-   **HEADER:** Include the invented site name, tagline, a logo placeholder image, and a primary navigation bar. Ensure the navigation has **at least 5-7 clearly defined, relevant links** including: "About", "Shop", "Experts".
-   **MAIN CONTENT:** Structure this area with **at least 3-4 distinct, well-developed sections**.
    -   Address key topics relevant to the "Home and Garden" category. Consider themes similar to: "Plant Guides", "Tool Reviews", "Sustainability".
    -   **Content Depth:** Populate each section with **substantial, realistic text** (multiple sentences/paragraphs). Use authentic industry language and terminology like: "load-bearing", "soil amendment", "renovation".
    -   **Visuals:** Integrate relevant placeholder images logically within the content sections.
    -   **Calls to Action:** Include clear and contextually relevant CTAs. Use strong verbs similar to: "Plan Project", "Find Expert", "Calculate Materials".
-   **ENGAGEMENT (Recommended):** Strongly consider incorporating **one meaningful interactive element** that would genuinely benefit a user in the "Home and Garden" sector. Ideas similar but not limited to: "material estimator".
-   **SIDEBAR (Optional):** If your design includes a sidebar, populate it with **useful, relevant content**. Ideas: "DIY success stories", "trending ideas", "expert advice".
-   **FOOTER:** Include a professional footer with invented contact details, copyright (current year), social media links, and standard links (Privacy, Terms).
-   **MODERN WEB PATTERNS:** Include modern web patterns like testimonial cards, feature grids, or FAQ accordions where appropriate.