Z.ai GLM 5.3 – Home and Garden
via Z.AI · Generated
- AIMAC Debt 5.06
- Cost $0.10
- Total Violations 25
- HTML Size 60 KB
- Em Dashes 48
Screenshot
View Live Page
Accessibility Issues Found
25 Serious
-
color-contrast serious 25 instances
Elements must meet minimum color contrast ratio thresholds
Example HTML
<span class="brand-tagline">Grow a home that gives back</span>
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 & Timber — Grow a Home That Gives Back | Home & Garden</title>
<meta name="description" content="Terra & Timber is your field guide to better living spaces — soil-first gardening, DIY carpentry, landscaping plans, and decor that weathers beautifully.">
<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=Karla:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<style>
/* ============ DESIGN TOKENS ============ */
:root{
--cream:#FAF7F0;
--paper:#FFFFFF;
--sand:#EFE8D8;
--sand-deep:#E4DAC4;
--forest:#2F4A34;
--forest-deep:#22382A;
--moss:#7A8B6F;
--clay:#B85C38;
--clay-deep:#9C4A2B;
--ink:#232821;
--muted:#5D6557;
--line:#DCD4C2;
--radius:18px;
--shadow-sm:0 2px 10px rgba(35,40,33,.06);
--shadow-md:0 12px 32px rgba(35,40,33,.12);
--font-head:"Fraunces", Georgia, serif;
--font-body:"Karla", "Segoe UI", sans-serif;
}
*{margin:0;padding:0;box-sizing:border-box}
html{scroll-behavior:smooth}
body{
font-family:var(--font-body);
background:var(--cream);
color:var(--ink);
line-height:1.65;
font-size:17px;
-webkit-font-smoothing:antialiased;
}
img{display:block;max-width:100%}
a{color:inherit}
h1,h2,h3,h4{font-family:var(--font-head);font-weight:600;line-height:1.15;color:var(--forest-deep)}
.container{width:min(1180px,92%);margin:0 auto}
.section{padding:88px 0}
.skip-link{position:absolute;left:-9999px;top:0;background:var(--forest);color:#fff;padding:10px 18px;z-index:200;border-radius:0 0 10px 0}
.skip-link:focus{left:0}
/* ============ ANNOUNCEMENT BAR ============ */
.announce{
background:var(--forest-deep);color:#EDE7D6;text-align:center;
font-size:.85rem;letter-spacing:.04em;padding:9px 16px;font-weight:600;
}
.announce a{color:#F2C9A0;text-decoration:none;border-bottom:1px dotted #F2C9A0}
.announce a:hover{color:#fff}
/* ============ HEADER / NAV ============ */
header.site-header{
position:sticky;top:0;z-index:100;
background:rgba(250,247,240,.92);
backdrop-filter:blur(10px);
border-bottom:1px solid var(--line);
}
.header-inner{display:flex;align-items:center;gap:28px;padding:16px 0}
.brand{display:flex;align-items:center;gap:14px;text-decoration:none}
.brand img{border-radius:12px;box-shadow:var(--shadow-sm)}
.brand-name{font-family:var(--font-head);font-size:1.5rem;font-weight:700;color:var(--forest-deep);letter-spacing:.01em;line-height:1.1}
.brand-tagline{font-size:.72rem;letter-spacing:.14em;text-transform:uppercase;color:var(--clay);font-weight:700}
nav.primary-nav{margin-left:auto}
nav.primary-nav ul{display:flex;gap:6px;list-style:none;align-items:center}
nav.primary-nav a{
text-decoration:none;font-weight:700;font-size:.92rem;padding:9px 12px;
border-radius:999px;color:var(--forest);transition:background .2s,color .2s;
}
nav.primary-nav a:hover{background:var(--sand);color:var(--forest-deep)}
.burger{display:none;margin-left:auto;background:none;border:1.5px solid var(--forest);border-radius:10px;padding:8px 10px;cursor:pointer}
.burger span{display:block;width:20px;height:2px;background:var(--forest);margin:4px 0}
/* ============ BUTTONS ============ */
.btn{
display:inline-flex;align-items:center;gap:9px;text-decoration:none;cursor:pointer;
padding:13px 24px;border-radius:999px;font-weight:800;font-size:.95rem;
border:2px solid transparent;transition:transform .15s,box-shadow .15s,background .2s;
font-family:var(--font-body);
}
.btn:hover{transform:translateY(-2px);box-shadow:var(--shadow-md)}
.btn-primary{background:var(--forest);color:#FDFBF5}
.btn-primary:hover{background:var(--forest-deep)}
.btn-accent{background:var(--clay);color:#fff}
.btn-accent:hover{background:var(--clay-deep)}
.btn-ghost{border-color:var(--forest);color:var(--forest);background:transparent}
.btn-ghost:hover{background:var(--forest);color:#fff}
.btn-sm{padding:9px 18px;font-size:.85rem}
.arrow{transition:transform .2s}
.btn:hover .arrow{transform:translateX(4px)}
/* ============ SECTION HEADS ============ */
.kicker{
display:inline-block;font-size:.78rem;font-weight:800;letter-spacing:.18em;
text-transform:uppercase;color:var(--clay);margin-bottom:14px;
}
.kicker::before{content:"";display:inline-block;width:26px;height:2px;background:var(--clay);vertical-align:middle;margin-right:10px;border-radius:2px}
.sec-head{max-width:720px;margin-bottom:48px}
.sec-head h2{font-size:clamp(1.9rem,3.6vw,2.7rem);margin-bottom:14px}
.sec-head .lede{color:var(--muted);font-size:1.08rem}
.sec-head.center{margin-left:auto;margin-right:auto;text-align:center}
.sec-head.center .kicker::before{display:none}
.sec-head.center .kicker::after{content:"";display:block;width:26px;height:2px;background:var(--clay);margin:12px auto 0;border-radius:2px}
/* ============ HERO ============ */
.hero{padding:72px 0 88px;overflow:hidden}
.hero-grid{display:grid;grid-template-columns:1.05fr .95fr;gap:64px;align-items:center}
.hero h1{font-size:clamp(2.6rem,5vw,4.2rem);font-weight:700;letter-spacing:-.01em;margin-bottom:22px}
.hero h1 em{font-style:italic;color:var(--clay)}
.hero .lede{font-size:1.15rem;color:var(--muted);margin-bottom:32px;max-width:34em}
.hero-ctas{display:flex;gap:14px;flex-wrap:wrap;margin-bottom:40px}
.hero-stats{display:flex;gap:0;border-top:1px solid var(--line);padding-top:26px}
.hero-stats .stat{padding:0 28px;border-left:1px solid var(--line)}
.hero-stats .stat:first-child{padding-left:0;border-left:none}
.stat-num{font-family:var(--font-head);font-size:1.7rem;font-weight:700;color:var(--forest-deep)}
.stat-label{font-size:.8rem;color:var(--muted);font-weight:600;letter-spacing:.03em}
.hero-visual{position:relative}
.hero-visual::before{
content:"";position:absolute;inset:22px -22px -22px 22px;
background:var(--sand-deep);border-radius:26px;z-index:0;
}
.hero-visual img{position:relative;z-index:1;border-radius:26px;box-shadow:var(--shadow-md);aspect-ratio:4/4.6;object-fit:cover;width:100%}
.hero-badge{
position:absolute;z-index:2;background:var(--paper);border-radius:16px;padding:14px 18px;
box-shadow:var(--shadow-md);display:flex;align-items:center;gap:12px;bottom:-18px;left:-28px;
}
.hero-badge .dot{width:12px;height:12px;border-radius:50%;background:var(--moss);box-shadow:0 0 0 4px rgba(122,139,111,.25)}
.hero-badge strong{display:block;font-size:.92rem;color:var(--forest-deep)}
.hero-badge span{font-size:.78rem;color:var(--muted)}
/* ============ SHOP CATEGORY GRID ============ */
.shop-section{background:var(--paper);border-top:1px solid var(--line);border-bottom:1px solid var(--line)}
.cat-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:26px}
.cat-card{
background:var(--cream);border:1px solid var(--line);border-radius:var(--radius);
overflow:hidden;transition:transform .2s,box-shadow .2s;display:flex;flex-direction:column;
}
.cat-card:hover{transform:translateY(-5px);box-shadow:var(--shadow-md)}
.cat-card img{aspect-ratio:4/3;object-fit:cover;width:100%}
.cat-card .cat-body{padding:22px 24px 24px;display:flex;flex-direction:column;flex:1}
.cat-card h3{font-size:1.25rem;margin-bottom:8px}
.cat-card p{font-size:.94rem;color:var(--muted);margin-bottom:16px;flex:1}
.cat-link{font-weight:800;font-size:.9rem;color:var(--clay);text-decoration:none;letter-spacing:.02em}
.cat-link:hover{color:var(--clay-deep)}
/* ============ OUTDOOR LIVING (EDITORIAL SPLIT) ============ */
.editorial-split{display:grid;grid-template-columns:1fr 1fr;gap:60px;align-items:center}
.editorial-split.reverse .ed-visual{order:2}
.ed-visual img{border-radius:var(--radius);box-shadow:var(--shadow-md);width:100%;object-fit:cover}
.ed-copy h2{font-size:clamp(1.8rem,3.2vw,2.5rem);margin-bottom:18px}
.ed-copy p{color:var(--muted);margin-bottom:18px}
.ed-copy p strong{color:var(--ink)}
.ed-inline-img{margin:26px 0;border-radius:14px;overflow:hidden;box-shadow:var(--shadow-sm)}
.mini-caption{font-size:.8rem;color:var(--muted);margin-top:8px;font-style:italic}
.checklist{list-style:none;margin:20px 0 26px}
.checklist li{padding:9px 0 9px 34px;position:relative;border-bottom:1px dashed var(--line);font-weight:600;font-size:.95rem}
.checklist li::before{
content:"✓";position:absolute;left:0;top:9px;width:22px;height:22px;border-radius:50%;
background:var(--sand);color:var(--forest);font-weight:800;display:flex;align-items:center;justify-content:center;font-size:.8rem;
}
/* ============ LANDSCAPING + SIDEBAR ============ */
.tips-section{background:var(--paper);border-top:1px solid var(--line);border-bottom:1px solid var(--line)}
.tips-layout{display:grid;grid-template-columns:1fr 340px;gap:56px;align-items:start}
.tips-article h2{font-size:clamp(1.8rem,3.2vw,2.4rem);margin-bottom:18px}
.tips-article p{color:var(--muted);margin-bottom:18px}
.tips-article figure{margin:26px 0}
.tips-article figure img{border-radius:var(--radius);width:100%;object-fit:cover;box-shadow:var(--shadow-sm)}
.step-list{counter-reset:steps;list-style:none;margin:24px 0}
.step-list li{counter-increment:steps;position:relative;padding:14px 0 14px 64px;border-bottom:1px solid var(--line)}
.step-list li::before{
content:counter(steps,decimal-leading-zero);position:absolute;left:0;top:12px;
font-family:var(--font-head);font-weight:700;font-size:1.25rem;color:var(--clay);
}
.step-list li h4{font-size:1.05rem;margin-bottom:4px}
.step-list li p{font-size:.92rem;margin:0;color:var(--muted)}
blockquote.pull-quote{
border-left:4px solid var(--clay);padding:6px 0 6px 24px;margin:28px 0;
font-family:var(--font-head);font-style:italic;font-size:1.3rem;color:var(--forest-deep);line-height:1.4;
}
/* sidebar */
.sidebar{display:flex;flex-direction:column;gap:26px;position:sticky;top:110px}
.side-card{background:var(--cream);border:1px solid var(--line);border-radius:var(--radius);padding:26px}
.side-card h3{font-size:1.15rem;margin-bottom:16px;padding-bottom:12px;border-bottom:2px solid var(--sand-deep)}
.guide-list{list-style:none}
.guide-list li{border-bottom:1px dashed var(--line)}
.guide-list li:last-child{border-bottom:none}
.guide-list a{display:flex;justify-content:space-between;align-items:center;gap:10px;text-decoration:none;padding:11px 0;font-weight:700;font-size:.92rem;color:var(--ink)}
.guide-list a:hover{color:var(--clay)}
.guide-list .meta{font-size:.74rem;color:var(--muted);font-weight:600;white-space:nowrap}
.expert-card{display:flex;gap:16px;align-items:flex-start}
.expert-card img{width:64px;height:64px;border-radius:50%;flex-shrink:0;box-shadow:var(--shadow-sm)}
.expert-card .who strong{display:block;font-size:1rem;color:var(--forest-deep)}
.expert-card .who span{font-size:.78rem;color:var(--clay);font-weight:700;letter-spacing:.05em;text-transform:uppercase}
.expert-card p{font-size:.9rem;color:var(--muted);margin-top:8px;font-style:italic}
.featured-project img{border-radius:12px;margin-bottom:14px;aspect-ratio:4/3;object-fit:cover;width:100%}
.featured-project p{font-size:.9rem;color:var(--muted);margin-bottom:12px}
/* ============ PLANNER ============ */
.planner-section{background:var(--forest-deep);color:#EDE7D6}
.planner-section .kicker{color:#E8A87C}
.planner-section .kicker::before,.planner-section .kicker::after{background:#E8A87C}
.planner-section .sec-head h2{color:#FDFBF3}
.planner-section .sec-head .lede{color:#B9C4AE}
.planner-wrap{
background:var(--paper);border-radius:24px;padding:34px;color:var(--ink);
display:grid;grid-template-columns:340px 1fr;gap:34px;box-shadow:0 24px 60px rgba(0,0,0,.3);
}
.planner-controls label{display:block;font-size:.8rem;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);margin:0 0 7px}
.planner-controls .field{margin-bottom:20px}
.planner-controls input[type=number],.planner-controls select{
width:100%;padding:12px 14px;border:1.5px solid var(--line);border-radius:12px;
font-family:var(--font-body);font-size:1rem;font-weight:600;color:var(--ink);background:#fff;
}
.planner-controls input:focus,.planner-controls select:focus{outline:none;border-color:var(--clay)}
.dims{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.preset-label{font-size:.8rem;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);margin:4px 0 10px}
.preset-chips{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:22px}
.chip{
border:1.5px solid var(--line);background:#fff;border-radius:999px;padding:7px 14px;
font-size:.82rem;font-weight:700;cursor:pointer;font-family:var(--font-body);color:var(--forest);
transition:all .2s;
}
.chip:hover{border-color:var(--clay);color:var(--clay)}
.chip.active{background:var(--forest);border-color:var(--forest);color:#fff}
.plan-stats{border-top:1px dashed var(--line);padding-top:18px}
.stat-row{display:flex;justify-content:space-between;padding:7px 0;font-size:.93rem;border-bottom:1px dashed var(--line)}
.stat-row:last-of-type{border-bottom:none}
.stat-row .k{color:var(--muted);font-weight:600}
.stat-row .v{font-weight:800;color:var(--forest-deep)}
.big-count{text-align:center;background:var(--sand);border-radius:14px;padding:14px;margin-bottom:14px}
.big-count .num{font-family:var(--font-head);font-size:2.4rem;font-weight:700;color:var(--forest-deep);line-height:1}
.big-count .lbl{font-size:.78rem;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:var(--muted)}
.tip-box{background:#FBF3E4;border-left:4px solid var(--clay);border-radius:0 12px 12px 0;padding:14px 16px;font-size:.88rem;color:#6B5138;margin-top:16px}
.tip-box strong{display:block;margin-bottom:4px;color:var(--clay-deep)}
.canvas-wrap{background:var(--cream);border:1px solid var(--line);border-radius:16px;padding:14px;display:flex;flex-direction:column}
#bedCanvas{width:100%;display:block;border-radius:10px}
.canvas-note{font-size:.78rem;color:var(--muted);text-align:center;margin-top:12px;font-style:italic}
/* ============ DESIGN IDEAS GALLERY ============ */
.ideas-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:22px}
.idea-card{
position:relative;border-radius:var(--radius);overflow:hidden;box-shadow:var(--shadow-sm);
transition:transform .2s,box-shadow .2s;
}
.idea-card:hover{transform:translateY(-5px);box-shadow:var(--shadow-md)}
.idea-card img{aspect-ratio:3/4;object-fit:cover;width:100%;transition:transform .4s}
.idea-card:hover img{transform:scale(1.05)}
.idea-overlay{
position:absolute;inset:auto 0 0 0;padding:70px 20px 20px;
background:linear-gradient(to top,rgba(34,56,42,.92),rgba(34,56,42,0));
color:#fff;
}
.idea-overlay h3{color:#fff;font-size:1.15rem;margin-bottom:5px}
.idea-overlay p{font-size:.85rem;color:#D8DFCE;line-height:1.45}
.idea-overlay .zone{display:inline-block;font-size:.7rem;font-weight:800;letter-spacing:.1em;text-transform:uppercase;background:rgba(255,255,255,.18);border-radius:999px;padding:3px 10px;margin-bottom:8px}
/* ============ ABOUT ============ */
.about-section{background:var(--paper);border-top:1px solid var(--line);border-bottom:1px solid var(--line)}
.about-grid{display:grid;grid-template-columns:1fr 1.1fr;gap:60px;align-items:center}
.about-grid .ed-visual img{aspect-ratio:4/3.2}
.about-sign{font-family:var(--font-head);font-style:italic;font-size:1.15rem;color:var(--clay);margin-top:6px}
/* ============ TESTIMONIALS ============ */
.testi-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:26px}
.testi-card{
background:var(--paper);border:1px solid var(--line);border-radius:var(--radius);
padding:30px;position:relative;display:flex;flex-direction:column;gap:16px;
transition:transform .2s,box-shadow .2s;
}
.testi-card:hover{transform:translateY(-4px);box-shadow:var(--shadow-md)}
.testi-card .quote-mark{font-family:var(--font-head);font-size:3.4rem;line-height:.6;color:var(--sand-deep);height:24px}
.testi-card p{font-size:.97rem;color:var(--muted);flex:1}
.testi-card p em{color:var(--clay);font-style:normal;font-weight:700}
.testi-who{display:flex;align-items:center;gap:14px;border-top:1px dashed var(--line);padding-top:16px}
.testi-who img{width:52px;height:52px;border-radius:50%;box-shadow:var(--shadow-sm)}
.testi-who strong{display:block;font-size:.95rem;color:var(--forest-deep)}
.testi-who span{font-size:.8rem;color:var(--muted)}
.stars{color:#D9A441;letter-spacing:2px;font-size:.9rem}
/* ============ FAQ ============ */
.faq-section{background:var(--paper);border-top:1px solid var(--line)}
.faq-list{max-width:820px;margin:0 auto}
details.faq-item{
border:1px solid var(--line);border-radius:14px;margin-bottom:14px;background:var(--cream);
overflow:hidden;transition:box-shadow .2s;
}
details.faq-item[open]{box-shadow:var(--shadow-sm);border-color:var(--sand-deep)}
details.faq-item summary{
list-style:none;cursor:pointer;display:flex;justify-content:space-between;align-items:center;gap:16px;
padding:20px 24px;font-weight:800;font-size:1.02rem;color:var(--forest-deep);font-family:var(--font-body);
}
details.faq-item summary::-webkit-details-marker{display:none}
.faq-icon{
width:28px;height:28px;border-radius:50%;background:var(--sand);flex-shrink:0;
display:flex;align-items:center;justify-content:center;font-weight:800;color:var(--forest);
transition:transform .25s,background .25s;font-size:1.1rem;
}
details.faq-item[open] .faq-icon{transform:rotate(45deg);background:var(--clay);color:#fff}
.faq-body{padding:0 24px 22px;color:var(--muted);font-size:.96rem}
/* ============ NEWSLETTER ============ */
.newsletter{
background:linear-gradient(135deg,var(--forest) 0%,var(--forest-deep) 100%);
border-radius:28px;padding:64px 56px;color:#EDE7D6;position:relative;overflow:hidden;
}
.newsletter::after{
content:"🌿";position:absolute;right:36px;bottom:-24px;font-size:9rem;opacity:.12;transform:rotate(-12deg);
}
.newsletter h2{color:#FDFBF3;font-size:clamp(1.7rem,3vw,2.4rem);margin-bottom:14px;max-width:14em}
.newsletter p{color:#B9C4AE;max-width:38em;margin-bottom:30px}
.newsletter-form{display:flex;gap:12px;max-width:520px;flex-wrap:wrap;position:relative;z-index:1}
.newsletter-form input{
flex:1;min-width:240px;padding:14px 20px;border-radius:999px;border:2px solid rgba(255,255,255,.25);
background:rgba(255,255,255,.1);color:#fff;font-family:var(--font-body);font-size:1rem;font-weight:600;
}
.newsletter-form input::placeholder{color:#AEBBA5}
.newsletter-form input:focus{outline:none;border-color:#E8A87C;background:rgba(255,255,255,.16)}
.form-msg{margin-top:14px;font-weight:700;font-size:.92rem;color:#BFE3B2;display:none;position:relative;z-index:1}
.form-msg.error{color:#F2B8A0}
/* ============ FOOTER ============ */
footer.site-footer{background:var(--forest-deep);color:#C6CDB9;padding:72px 0 0;margin-top:96px}
.footer-grid{display:grid;grid-template-columns:1.4fr 1fr 1fr 1.2fr;gap:48px;padding-bottom:56px}
.footer-brand .brand-name{color:#FDFBF3}
.footer-brand .brand-tagline{color:#E8A87C}
.footer-brand p{font-size:.92rem;margin:18px 0 22px;max-width:32em}
.socials{display:flex;gap:10px}
.socials a{
width:40px;height:40px;border-radius:50%;border:1.5px solid rgba(255,255,255,.25);
display:flex;align-items:center;justify-content:center;color:#EDE7D6;text-decoration:none;
transition:all .2s;font-weight:800;font-size:.85rem;
}
.socials a:hover{background:var(--clay);border-color:var(--clay);color:#fff;transform:translateY(-3px)}
.footer-grid h4{color:#FDFBF3;font-family:var(--font-body);font-size:.82rem;font-weight:800;letter-spacing:.14em;text-transform:uppercase;margin-bottom:20px}
.footer-grid ul{list-style:none}
.footer-grid ul li{margin-bottom:11px}
.footer-grid ul a{text-decoration:none;font-size:.93rem;color:#C6CDB9;transition:color .2s}
.footer-grid ul a:hover{color:#fff}
.footer-contact li{display:flex;gap:11px;align-items:flex-start;font-size:.93rem}
.footer-contact .ic{color:#E8A87C;font-weight:800}
.footer-bottom{
border-top:1px solid rgba(255,255,255,.12);padding:24px 0;
display:flex;justify-content:space-between;align-items:center;gap:16px;flex-wrap:wrap;
font-size:.85rem;
}
.footer-bottom nav{display:flex;gap:22px}
.footer-bottom a{text-decoration:none;color:#9DA990}
.footer-bottom a:hover{color:#fff}
/* ============ REVEAL ANIMATION ============ */
.reveal{opacity:0;transform:translateY(26px);transition:opacity .7s ease,transform .7s ease}
.reveal.in{opacity:1;transform:none}
/* ============ RESPONSIVE ============ */
@media (max-width:1020px){
.hero-grid{grid-template-columns:1fr;gap:48px}
.hero-visual{max-width:520px}
.cat-grid{grid-template-columns:repeat(2,1fr)}
.tips-layout{grid-template-columns:1fr}
.sidebar{position:static;flex-direction:row;flex-wrap:wrap}
.sidebar .side-card{flex:1 1 300px}
.planner-wrap{grid-template-columns:1fr}
.ideas-grid{grid-template-columns:repeat(2,1fr)}
.about-grid{grid-template-columns:1fr}
.footer-grid{grid-template-columns:1fr 1fr}
}
@media (max-width:720px){
.burger{display:block}
nav.primary-nav{
display:none;position:absolute;top:100%;left:0;right:0;background:var(--cream);
border-bottom:1px solid var(--line);padding:12px 4%;
}
header.site-header.nav-open nav.primary-nav{display:block}
nav.primary-nav ul{flex-direction:column;align-items:stretch;gap:2px}
nav.primary-nav a{display:block;padding:12px 14px}
.section{padding:64px 0}
.cat-grid,.testi-grid{grid-template-columns:1fr}
.editorial-split{grid-template-columns:1fr;gap:36px}
.editorial-split.reverse .ed-visual{order:0}
.ideas-grid{grid-template-columns:1fr}
.hero-stats{flex-wrap:wrap;gap:16px}
.hero-stats .stat{border-left:none;padding:0}
.newsletter{padding:44px 28px}
.footer-grid{grid-template-columns:1fr}
.footer-bottom{flex-direction:column;text-align:center}
}
</style>
</head>
<body id="top">
<a class="skip-link" href="#main">Skip to main content</a>
<div class="announce">
🌱 Free shipping on orders over $75 · New: The Fall Planting Guide is live — <a href="#plant-care">read it here</a>
</div>
<!-- ================= HEADER ================= -->
<header class="site-header" id="siteHeader">
<div class="container header-inner">
<a class="brand" href="#top">
<img src="https://placehold.co/64x64/2F4A34/FAF7F0?text=T%26T&font=playfair+display" alt="Terra & Timber logo" width="52" height="52">
<span>
<span class="brand-name">Terra & Timber</span><br>
<span class="brand-tagline">Grow a home that gives back</span>
</span>
</a>
<button class="burger" id="burgerBtn" aria-label="Toggle navigation" aria-expanded="false">
<span></span><span></span><span></span>
</button>
<nav class="primary-nav" id="primaryNav" aria-label="Primary">
<ul>
<li><a href="#top">Home</a></li>
<li><a href="#shop">Shop</a></li>
<li><a href="#plant-care">Plant Care</a></li>
<li><a href="#ideas">Design Ideas</a></li>
<li><a href="#landscaping">Landscaping</a></li>
<li><a href="#outdoor-living">Outdoor Living</a></li>
<li><a href="#about">About</a></li>
<li><a class="btn btn-accent btn-sm" href="#newsletter">Newsletter</a></li>
</ul>
</nav>
</div>
</header>
<main id="main">
<!-- ================= HERO ================= -->
<section class="hero">
<div class="container hero-grid">
<div class="hero-copy">
<span class="kicker">Home & Garden, done right</span>
<h1>Grow a home that <em>gives back</em>.</h1>
<p class="lede">
Terra & Timber is your field guide to better living spaces — soil-first gardening,
honest DIY carpentry, landscaping plans that survive winter, and decor that weathers
beautifully. Every guide is tested in real dirt by real gardeners, not written for search engines.
</p>
<div class="hero-ctas">
<a class="btn btn-primary" href="#ideas">Browse Ideas <span class="arrow">→</span></a>
<a class="btn btn-ghost" href="#plant-care">Read Guide</a>
</div>
<div class="hero-stats">
<div class="stat">
<div class="stat-num">140+</div>
<div class="stat-label">Plant care guides</div>
</div>
<div class="stat">
<div class="stat-num">38k</div>
<div class="stat-label">DIYers in the community</div>
</div>
<div class="stat">
<div class="stat-num">25 yrs</div>
<div class="stat-label">Combined field experience</div>
</div>
</div>
</div>
<div class="hero-visual">
<img src="https://picsum.photos/seed/terra-hero-garden/900/1100" alt="A sunlit kitchen garden with raised cedar beds and mature vegetable plants">
<div class="hero-badge">
<span class="dot"></span>
<div>
<strong>Zone finder is live</strong>
<span>Enter your ZIP on any guide page</span>
</div>
</div>
</div>
</div>
</section>
<!-- ================= SHOP CATEGORIES ================= -->
<section class="section shop-section" id="shop">
<div class="container">
<div class="sec-head reveal">
<span class="kicker">The General Store</span>
<h2>Shop by category — only what we'd use ourselves</h2>
<p class="lede">
We stock a tight, opinionated catalog. Every tool, seed packet, and bag of soil amendment
has been run through a full growing season by our team before it earns a spot on the shelf.
If it fails in the field, it never makes it to the store.
</p>
</div>
<div class="cat-grid">
<article class="cat-card reveal">
<img src="https://picsum.photos/seed/cat-raisedbed/600/450" alt="Cedar raised garden bed kit">
<div class="cat-body">
<h3>Raised Beds & Structures</h3>
<p>Rot-resistant cedar and galvanized steel bed kits, trellises, cold frames, and cloches built for a decade of seasons.</p>
<a class="cat-link" href="#shop">Shop beds →</a>
</div>
</article>
<article class="cat-card reveal">
<img src="https://picsum.photos/seed/cat-soil/600/450" alt="Bags of compost and soil amendments">
<div class="cat-body">
<h3>Soil & Amendments</h3>
<p>Screened compost, aged manure, coco coir, worm castings, and mineral soil amendments blended for your bed or border.</p>
<a class="cat-link" href="#shop">Shop soil →</a>
</div>
</article>
<article class="cat-card reveal">
<img src="https://picsum.photos/seed/cat-tools/600/450" alt="Garden hand tools arranged on a bench">
<div class="cat-body">
<h3>Tools & Gear</h3>
<p>Forged hand tools, bypass pruners, hoes sharpened by hand, and gloves that actually last past August.</p>
<a class="cat-link" href="#shop">Shop tools →</a>
</div>
</article>
<article class="cat-card reveal">
<img src="https://picsum.photos/seed/cat-seeds/600/450" alt="Open seed packets and garden twine">
<div class="cat-body">
<h3>Seeds & Plants</h3>
<p>Open-pollinated and heirloom seed, plus nursery-grown annuals, perennials, and bare-root stock for your hardiness zone.</p>
<a class="cat-link" href="#shop">Shop seeds →</a>
</div>
</article>
<article class="cat-card reveal">
<img src="https://picsum.photos/seed/cat-decor/600/450" alt="Patio with planters and outdoor decor">
<div class="cat-body">
<h3>Outdoor Decor</h3>
<p>Weatherproof planters, lanterns, outdoor textiles, and statement pieces that look better with a little patina.</p>
<a class="cat-link" href="#shop">Shop decor →</a>
</div>
</article>
<article class="cat-card reveal">
<img src="https://picsum.photos/seed/cat-water/600/450" alt="Drip irrigation lines in a garden bed">
<div class="cat-body">
<h3>Irrigation & Watering</h3>
<p>Drip kits, soaker hoses, rain barrels, and timers that cut summer water use by up to 50% — measured, not marketing.</p>
<a class="cat-link" href="#shop">Shop irrigation →</a>
</div>
</article>
</div>
</div>
</section>
<!-- ================= OUTDOOR LIVING ================= -->
<section class="section" id="outdoor-living">
<div class="container editorial-split">
<div class="ed-visual reveal">
<img src="https://picsum.photos/seed/pergola-deck/820/620" alt="A timber pergola shading an outdoor dining area">
<p class="mini-caption">A 12×16 ft freestanding pergola in untreated Douglas fir, two summers after install.</p>
</div>
<div class="ed-copy reveal">
<span class="kicker">Outdoor Living</span>
<h2>Build rooms without walls</h2>
<p>
The best backyards aren't decorated — they're <strong>composed</strong>. A pergola that frames
the evening sun, a deck that steps down into the garden instead of away from it, a fire pit
placed where the prevailing breeze carries smoke away from the seating. Outdoor living is
architecture at the scale of a lawn chair, and it rewards planning far more than budget.
</p>
<p>
Before you sink a single post, understand what <strong>load-bearing</strong> really means for
overhead structures. A pergola carrying only its own weight can get by with 4×4 posts and
modest footings — but the moment you plan to train a mature wisteria over it, hang a swing,
or carry a shade sail in wind, your posts, beams, and connection hardware all need to be
upsized. We walk through the load math in plain language in our three-part timber structures series.
</p>
<div class="ed-inline-img">
<img src="https://picsum.photos/seed/deck-detail/760/380" alt="Close-up of deck board fastening detail">
</div>
<ul class="checklist">
<li>Set posts below the frost line, never on top of concrete pads</li>
<li>Use stainless or hot-dip galvanized hardware near treated lumber</li>
<li>Plan for drainage — a deck that traps water fails from the bottom up</li>
<li>Design sightlines first, structure second</li>
</ul>
<a class="btn btn-primary" href="#ideas">Get Design Ideas <span class="arrow">→</span></a>
</div>
</div>
</section>
<!-- ================= LANDSCAPING TIPS + SIDEBAR ================= -->
<section class="section tips-section" id="landscaping">
<div class="container">
<div class="sec-head reveal">
<span class="kicker">Landscaping Tips</span>
<h2>Work with your yard, not against it</h2>
<p class="lede">
Great landscaping starts underground. Here's our four-season framework for turning
a generic yard into a landscape that looks like it belongs where it is.
</p>
</div>
<div class="tips-layout">
<article class="tips-article reveal">
<p>
Most failing landscapes share one root cause: soil that was never asked to do what the
plants demand of it. Before a single plant goes in, we run a simple jar test and a pH
strip — ten minutes of work that saves hundreds of dollars in replacements. Heavy clay
needs organic matter and grit; sandy loam needs organic matter and mulch to hold moisture;
compacted builder's soil needs deep tilling, compost, and patience.
</p>
<p>
A proper <strong>soil amendment</strong> routine is the highest-return investment in your
entire garden. Working two to three inches of finished compost into the top eight inches
of a new bed improves both drainage <em>and</em> water retention, feeds the soil food web,
and buffers pH swings. Amend whole beds, never individual planting holes — a lone pocket
of rich soil inside clay is a bathtub with no drain, and roots will circle it and drown.
</p>
<figure>
<img src="https://picsum.photos/seed/terraced-yard/900/560" alt="Terraced garden beds on a sloped yard">
<p class="mini-caption">A sloped lot terraced into three usable levels — erosion control disguised as garden design.</p>
</figure>
<h3 style="margin:26px 0 6px">The four-step landscape audit</h3>
<ol class="step-list">
<li>
<h4>Map sun and water</h4>
<p>Track shade patterns across a full growing season. Where water pools after rain is where your moisture-loving plants belong.</p>
</li>
<li>
<h4>Fix the soil, then the grade</h4>
<p>Amend beds broadly, and slope ground away from foundations at roughly 1 inch per foot to manage runoff and erosion.</p>
</li>
<li>
<h4>Plant in layers</h4>
<p>Canopy, shrub, perennial, groundcover. Layered planting needs less mulch, less weeding, and far less watering over time.</p>
</li>
<li>
<h4>Choose the right annual for the gap</h4>
<p>While perennials and shrubs mature, tuck annuals into the open ground — instant color that earns its keep for one honest season.</p>
</li>
</ol>
<blockquote class="pull-quote">
"Amend the whole bed, plant in layers, and mulch like you mean it. Everything else is decoration."
</blockquote>
<p>
Finally, be realistic about maintenance. A landscape you can't sustain becomes a burden by
year three. We design every plan in our Design Ideas library with a stated upkeep budget —
hours per month, honestly counted — so you know exactly what you're signing up for before
the first shovel hits the soil.
</p>
<figure>
<img src="https://picsum.photos/seed/gravel-path/900/520" alt="Gravel path winding through a mixed border">
</figure>
<a class="btn btn-accent" href="#ideas">Get Design Ideas <span class="arrow">→</span></a>
<a class="btn btn-ghost" href="#planner" style="margin-left:8px">Try the Bed Planner</a>
</article>
<!-- ===== SIDEBAR ===== -->
<aside class="sidebar" id="plant-care">
<div class="side-card reveal">
<h3>Plant Care Quick Guides</h3>
<ul class="guide-list">
<li><a href="#plant-care">Tomatoes: staking & side-dressing <span class="meta">Annual · 8 min</span></a></li>
<li><a href="#plant-care">Hydrangeas: pruning by type <span class="meta">Perennial · 6 min</span></a></li>
<li><a href="#plant-care">Deadheading 101: more blooms <span class="meta">Annuals · 5 min</span></a></li>
<li><a href="#plant-care">Roses without the chemicals <span class="meta">Shrub · 12 min</span></a></li>
<li><a href="#plant-care">Winter mulching timeline <span class="meta">Seasonal · 4 min</span></a></li>
<li><a href="#plant-care">Houseplant repotting signals <span class="meta">Indoor · 7 min</span></a></li>
</ul>
</div>
<div class="side-card reveal">
<h3>Expert Advice</h3>
<div class="expert-card">
<img src="https://i.pravatar.cc/128?u=mayagardener" alt="Maya Okonkwo, Certified Master Gardener">
<div class="who">
<strong>Maya Okonkwo</strong>
<span>Certified Master Gardener</span>
</div>
</div>
<p>"People ask me for the secret. There isn't one. Compost every fall, mulch every spring,
and walk your garden with coffee in hand every morning — you'll catch problems when
they're still small enough to squish."</p>
<a class="cat-link" href="#faq">Ask our experts →</a>
</div>
<div class="side-card featured-project reveal">
<h3>Featured Project</h3>
<img src="https://picsum.photos/seed/courtyard-project/520/400" alt="Completed courtyard kitchen garden project">
<strong style="font-family:var(--font-head);font-size:1.05rem;color:var(--forest-deep)">The Hawthorne Kitchen Garden</strong>
<p>320 sq ft · Zone 7b. A blank side yard turned into a productive kitchen garden with four
cedar beds, espaliered apples, and drip irrigation on a single timer — designed, built, and
planted in six weeks.</p>
<a class="cat-link" href="#ideas">See the full project →</a>
</div>
</aside>
</div>
</div>
</section>
<!-- ================= RAISED BED PLANNER (INTERACTIVE) ================= -->
<section class="section planner-section" id="planner">
<div class="container">
<div class="sec-head center reveal">
<span class="kicker">Interactive Tool</span>
<h2>Raised Bed Planner</h2>
<p class="lede">
Enter your bed dimensions and pick a crop — we'll show you exactly how many plants fit,
using square-foot gardening spacing, and draw the layout for you.
</p>
</div>
<div class="planner-wrap reveal">
<div class="planner-controls">
<div class="dims">
<div class="field">
<label for="bedLength">Bed length (ft)</label>
<input type="number" id="bedLength" min="1" max="20" step="1" value="8">
</div>
<div class="field">
<label for="bedWidth">Bed width (ft)</label>
<input type="number" id="bedWidth" min="1" max="12" step="1" value="4">
</div>
</div>
<div class="field">
<label for="plantSelect">Choose your crop</label>
<select id="plantSelect">
<option value="tomato">Tomato (indeterminate)</option>
<option value="pepper">Pepper</option>
<option value="zucchini">Zucchini / summer squash</option>
<option value="kale">Kale</option>
<option value="lettuce" selected>Leaf lettuce</option>
<option value="basil">Basil</option>
<option value="beans">Bush beans</option>
<option value="carrots">Carrots</option>
</select>
</div>
<div>
<div class="preset-label">Quick presets</div>
<div class="preset-chips">
<button class="chip" data-plant="lettuce" data-l="4" data-w="4">Salad Bed</button>
<button class="chip" data-plant="tomato" data-l="4" data-w="4">Salsa Garden</button>
<button class="chip" data-plant="carrots" data-l="8" data-w="2">Root Row</button>
<button class="chip" data-plant="beans" data-l="6" data-w="3">Bean Patch</button>
</div>
</div>
<div class="plan-stats" id="planStats">
<div class="big-count">
<div class="num" id="statCount">—</div>
<div class="lbl" id="statPlant">plants fit</div>
</div>
<div class="stat-row"><span class="k">Bed size</span><span class="v" id="statSize">—</span></div>
<div class="stat-row"><span class="k">Total area</span><span class="v" id="statArea">—</span></div>
<div class="stat-row"><span class="k">Spacing used</span><span class="v" id="statSpacing">—</span></div>
<div class="stat-row"><span class="k">Plants per sq ft</span><span class="v" id="statDensity">—</span></div>
<div class="stat-row"><span class="k">Sun needs</span><span class="v" id="statSun">—</span></div>
<div class="stat-row"><span class="k">Days to harvest</span><span class="v" id="statDays">—</span></div>
<div class="tip-box" id="planTip"><strong>Grower's tip</strong><span>—</span></div>
</div>
</div>
<div class="canvas-wrap">
<canvas id="bedCanvas" aria-label="Visual planting layout of the raised bed" role="img"></canvas>
<p class="canvas-note">Grid lines mark one square foot. Circles show each plant's spacing footprint — update the numbers and the plan redraws instantly.</p>
</div>
</div>
</div>
</section>
<!-- ================= DESIGN IDEAS GALLERY ================= -->
<section class="section" id="ideas">
<div class="container">
<div class="sec-head reveal">
<span class="kicker">Design Ideas</span>
<h2>Steal these landscapes</h2>
<p class="lede">
Real yards, real budgets, full plant lists included. Every project in our library lists
its hardiness zone, sun exposure, and honest monthly upkeep hours.
</p>
</div>
<div class="ideas-grid">
<article class="idea-card reveal">
<img src="https://picsum.photos/seed/gal-cottage/700/900" alt="Cottage-style flower border in full bloom">
<div class="idea-overlay">
<span class="zone">Zone 6 · Full sun</span>
<h3>Cottage Border</h3>
<p>A layered perennial border with self-seeding annuals woven through for season-long color.</p>
</div>
</article>
<article class="idea-card reveal">
<img src="https://picsum.photos/seed/gal-courtyard/700/900" alt="Modern courtyard with planters and gravel">
<div class="idea-overlay">
<span class="zone">Zone 8 · Part shade</span>
<h3>Modern Courtyard</h3>
<p>Gravel, steel planters, and a pollinator strip — low-water design that still hums with life.</p>
</div>
</article>
<article class="idea-card reveal">
<img src="https://picsum.photos/seed/gal-kitchen/700/900" alt="Raised bed kitchen garden with gravel paths">
<div class="idea-overlay">
<span class="zone">Zone 5 · Full sun</span>
<h3>Raised Kitchen Garden</h3>
<p>Four cedar beds, drip irrigation, and a trellis wall — 200 sq ft that feeds a family of four.</p>
</div>
</article>
<article class="idea-card reveal">
<img src="https://picsum.photos/seed/gal-pollinator/700/900" alt="Native wildflower strip along a fence line">
<div class="idea-overlay">
<span class="zone">Zone 7 · Full sun</span>
<h3>Native Pollinator Strip</h3>
<p>Replace a stretch of lawn with natives: blooms April to frost, mow once a year.</p>
</div>
</article>
</div>
<div style="text-align:center;margin-top:40px">
<a class="btn btn-primary" href="#ideas">Browse Ideas <span class="arrow">→</span></a>
</div>
</div>
</section>
<!-- ================= ABOUT ================= -->
<section class="section about-section" id="about">
<div class="container about-grid">
<div class="ed-copy reveal">
<span class="kicker">Our Story</span>
<h2>Founded in a failing backyard</h2>
<p>
Terra & Timber began in 2016 when two neighbors — a carpenter and a master gardener —
compared notes over a fence and discovered they were both tired of the same thing: garden
advice that ignored how homes actually work. Beds that rotted because nobody talked about
drainage. Pergolas that sagged because load ratings were treated as fine print. "Full sun"
plants sold to people whose yards got four hours of it.
</p>
<p>
So we built the resource we wanted: guides written after the project, not before it; a store
that stocks only field-tested gear; and a planner that tells you the truth about how many
tomatoes actually fit in an eight-foot bed. Today our team of horticulturists, builders, and
landscape designers publishes weekly from our two-acre trial garden in the Willamette Valley —
where everything we recommend has already survived at least one winter.
</p>
<p class="about-sign">— June & Ray, founders</p>
<a class="btn btn-ghost" href="#about">Meet the team</a>
</div>
<div class="ed-visual reveal">
<img src="https://picsum.photos/seed/team-garden/820/640" alt="The Terra & Timber trial garden with staff working among the beds">
</div>
</div>
</section>
<!-- ================= TESTIMONIALS ================= -->
<section class="section">
<div class="container">
<div class="sec-head center reveal">
<span class="kicker">From the Community</span>
<h2>38,000 backyards and counting</h2>
</div>
<div class="testi-grid">
<article class="testi-card reveal">
<div class="quote-mark">“</div>
<div class="stars">★★★★★</div>
<p>The soil amendment guide changed everything. My clay yard went from brick in August to
something I can actually dig in. First season I've grown a <em>real</em> carrot, not a stub.</p>
<div class="testi-who">
<img src="https://i.pravatar.cc/104?u=marisolg" alt="Marisol G.">
<div><strong>Marisol G.</strong><span>Portland, OR · Zone 8b</span></div>
</div>
</article>
<article class="testi-card reveal">
<div class="quote-mark">“</div>
<div class="stars">★★★★★</div>
<p>I built their pergola plan last spring. The article walked me through the
<em>load-bearing</em> math for a swing, step by step, and it doesn't move a millimeter.
My inspector neighbor was impressed. That's the review.</p>
<div class="testi-who">
<img src="https://i.pravatar.cc/104?u=devpawlak" alt="Dev P.">
<div><strong>Dev P.</strong><span>Madison, WI · Zone 5a</span></div>
</div>
</article>
<article class="testi-card reveal">
<div class="quote-mark">“</div>
<div class="stars">★★★★★</div>
<p>The bed planner told me I'd been cramming twice as many peppers as I should. Corrected
the spacing, and I harvested <em>more</em> from fewer plants. Should've listened to the
tool years ago.</p>
<div class="testi-who">
<img src="https://i.pravatar.cc/104?u=elenavargas" alt="Elena V.">
<div><strong>Elena V.</strong><span>Austin, TX · Zone 9a</span></div>
</div>
</article>
</div>
</div>
</section>
<!-- ================= FAQ ================= -->
<section class="section faq-section" id="faq">
<div class="container">
<div class="sec-head center reveal">
<span class="kicker">Questions, Answered</span>
<h2>Frequently asked</h2>
</div>
<div class="faq-list reveal">
<details class="faq-item">
<summary>When and how should I amend my soil? <span class="faq-icon">+</span></summary>
<div class="faq-body">
For new beds, amend before planting: work 2–3 inches of finished compost into the top
8 inches of soil across the entire bed. For established beds, top-dress with an inch of
compost each spring and fall and let worms work it in — never till around established
perennials. Always amend the whole bed, not individual holes, so roots have somewhere to go.
</div>
</details>
<details class="faq-item">
<summary>What's the difference between an annual and a perennial? <span class="faq-icon">+</span></summary>
<div class="faq-body">
An annual completes its whole life cycle — sprout, bloom, seed, die — in one season and
needs replanting each year (tomatoes, zinnias, basil). A perennial comes back from the same
roots for several years (hostas, coneflowers, fruit trees). Most resilient gardens combine
both: perennials and shrubs as the permanent structure, annuals tucked in for nonstop color
while the long-term plants mature.
</div>
</details>
<details class="faq-item">
<summary>Do I need a permit for a pergola or deck? <span class="faq-icon">+</span></summary>
<div class="faq-body">
Often, yes — especially for anything attached to the house, elevated more than 30 inches,
or carrying structural load such as a swing or shade sail. Requirements vary by municipality,
but expect to show footings depth, member sizes, and how the structure handles load-bearing
connections. Our timber series includes a checklist of what most building departments ask for.
Always verify with your local office before breaking ground.
</div>
</details>
<details class="faq-item">
<summary>How often should I water a raised bed? <span class="faq-icon">+</span></summary>
<div class="faq-body">
Raised beds drain faster than in-ground gardens, so in peak summer expect deep watering
3–4 times per week — enough to keep the top 6 inches evenly moist — rather than a daily
sprinkle. Mulch with 2 inches of straw or shredded leaves to cut evaporation dramatically.
Drip irrigation on a timer is the single best upgrade for a vegetable garden: it waters the
soil, not the leaves, which keeps fungal disease down.
</div>
</details>
<details class="faq-item">
<summary>What's your return policy on plants and seeds? <span class="faq-icon">+</span></summary>
<div class="faq-body">
Live plants are guaranteed for 90 days from delivery: if a plant fails despite the care
instructions for your zone, we replace it or refund you — no interrogation. Seeds are
guaranteed for one full germination season. Tools carry the manufacturer's warranty, and
we handle the paperwork for you. Full details are on our Terms page.
</div>
</details>
</div>
</div>
</section>
<!-- ================= NEWSLETTER ================= -->
<section class="section" id="newsletter" style="padding-bottom:0">
<div class="container">
<div class="newsletter reveal">
<h2>One honest email a week. Dirt included.</h2>
<p>
Join 38,000 growers and builders who get our seasonal task lists, new project plans, and
first access to seed drops. No spam, no filler — unsubscribe any time and we'll part as friends.
</p>
<form class="newsletter-form" id="newsletterForm" novalidate>
<input type="email" id="newsletterEmail" placeholder="you@example.com" aria-label="Email address" required>
<button class="btn btn-accent" type="submit">Join the List</button>
</form>
<p class="form-msg" id="formMsg"></p>
</div>
</div>
</section>
</main>
<!-- ================= FOOTER ================= -->
<footer class="site-footer" id="contact">
<div class="container">
<div class="footer-grid">
<div class="footer-brand">
<a class="brand" href="#top" style="text-decoration:none">
<img src="https://placehold.co/64x64/FAF7F0/2F4A34?text=T%26T&font=playfair+display" alt="Terra & Timber logo" width="48" height="48">
<span>
<span class="brand-name">Terra & Timber</span><br>
<span class="brand-tagline">Grow a home that gives back</span>
</span>
</a>
<p>
Field-tested gardening, DIY carpentry, and landscaping resources from our two-acre trial
garden in the Willamette Valley. If we wouldn't use it, we don't sell it, and if it
hasn't survived a winter, we don't recommend it.
</p>
<div class="socials">
<a href="#contact" aria-label="Instagram">IG</a>
<a href="#contact" aria-label="Pinterest">PIN</a>
<a href="#contact" aria-label="YouTube">YT</a>
<a href="#contact" aria-label="Facebook">FB</a>
</div>
</div>
<div>
<h4>Shop</h4>
<ul>
<li><a href="#shop">Raised Beds</a></li>
<li><a href="#shop">Soil & Amendments</a></li>
<li><a href="#shop">Tools & Gear</a></li>
<li><a href="#shop">Seeds & Plants</a></li>
<li><a href="#shop">Irrigation</a></li>
<li><a href="#shop">Gift Cards</a></li>
</ul>
</div>
<div>
<h4>Resources</h4>
<ul>
<li><a href="#plant-care">Plant Care Guides</a></li>
<li><a href="#ideas">Design Ideas</a></li>
<li><a href="#landscaping">Landscaping Tips</a></li>
<li><a href="#outdoor-living">DIY Projects</a></li>
<li><a href="#planner">Bed Planner</a></li>
<li><a href="#about">Our Story</a></li>
</ul>
</div>
<div>
<h4>Contact</h4>
<ul class="footer-contact">
<li><span class="ic">📍</span> 418 Meadowlark Lane<br>Corvallis, OR 97330</li>
<li><span class="ic">📞</span> (541) 555-0182</li>
<li><span class="ic">✉️</span> hello@terraandtimber.com</li>
<li><span class="ic">🕘</span> Store: Mon–Sat, 9am–6pm</li>
</ul>
</div>
</div>
<div class="footer-bottom">
<span>© <span id="year">2025</span> Terra & Timber LLC. All rights reserved.</span>
<nav aria-label="Legal">
<a href="#contact">Privacy Policy</a>
<a href="#contact">Terms of Service</a>
<a href="#contact">Accessibility</a>
<a href="#top">Back to Top ↑</a>
</nav>
</div>
</div>
</footer>
<script>
/* ============ CURRENT YEAR ============ */
document.getElementById('year').textContent = new Date().getFullYear();
/* ============ MOBILE NAV ============ */
const header = document.getElementById('siteHeader');
const burger = document.getElementById('burgerBtn');
burger.addEventListener('click', () => {
const open = header.classList.toggle('nav-open');
burger.setAttribute('aria-expanded', open ? 'true' : 'false');
});
document.querySelectorAll('#primaryNav a').forEach(a => {
a.addEventListener('click', () => header.classList.remove('nav-open'));
});
/* ============ SCROLL REVEAL ============ */
const io = new IntersectionObserver(entries => {
entries.forEach(e => { if (e.isIntersecting) { e.target.classList.add('in'); io.unobserve(e.target); } });
}, { threshold: 0.12 });
document.querySelectorAll('.reveal').forEach(el => io.observe(el));
/* ============ FAQ — one open at a time ============ */
document.querySelectorAll('details.faq-item').forEach(item => {
item.addEventListener('toggle', () => {
if (item.open) {
document.querySelectorAll('details.faq-item').forEach(o => { if (o !== item) o.open = false; });
}
});
});
/* ============ NEWSLETTER FORM ============ */
document.getElementById('newsletterForm').addEventListener('submit', e => {
e.preventDefault();
const email = document.getElementById('newsletterEmail').value.trim();
const msg = document.getElementById('formMsg');
msg.style.display = 'block';
if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
msg.textContent = 'Hmm — that email doesn\u2019t look quite right. Mind checking it?';
msg.classList.add('error');
return;
}
msg.classList.remove('error');
msg.textContent = '\u{1F331} Welcome aboard! Your first seasonal task list lands this Friday.';
e.target.reset();
});
/* ============ RAISED BED PLANNER ============ */
const PLANTS = {
tomato: { name:'Tomatoes', spacing:24, color:'#D95D39', sun:'Full sun · 8+ hrs', days:'60–85 days',
tip:'Stake or cage at planting time — waiting until they lean means rooting along the stem. Pair with basil: same water needs, and it seems to discourage hornworms.' },
pepper: { name:'Peppers', spacing:18, color:'#E2A23B', sun:'Full sun · 6–8 hrs', days:'65–85 days',
tip:'Peppers like it warm. Wait until nights hold above 55°F to transplant, and don\u2019t over-feed nitrogen or you\u2019ll grow a leafy bush with no fruit.' },
zucchini:{ name:'Zucchini', spacing:36, color:'#57845B', sun:'Full sun · 6+ hrs', days:'45–60 days',
tip:'One or two plants feed a household. Give them the spacing — crowded squash mildews fast. Harvest at 6–8 inches for the best texture.' },
kale: { name:'Kale', spacing:15, color:'#3E6B4A', sun:'Full sun · 4+ hrs', days:'50–65 days',
tip:'Harvest outer leaves and let the center keep growing — one plant produces for months. Flavor actually improves after the first light frost.' },
lettuce: { name:'Leaf lettuce', spacing:10, color:'#7FA35C', sun:'Sun–part shade', days:'30–50 days',
tip:'Cut-and-come-again is the move: shear the whole head an inch above the soil and it regrows 2–3 times. Shade it in summer heat to prevent bolting.' },
basil: { name:'Basil', spacing:12, color:'#4E7A46', sun:'Full sun · 6+ hrs', days:'35–50 days',
tip:'Pinch the top two leaves off every branch tip weekly. You\u2019ll delay flowering, double your yield, and the plant becomes a bushy little hedge.' },
beans: { name:'Bush beans', spacing:6, color:'#6C8F5A', sun:'Full sun · 6+ hrs', days:'45–60 days',
tip:'Beans fix their own nitrogen, so skip the fertilizer — too much grows leaves, not pods. Succession-plant a new row every 3 weeks for steady harvest.' },
carrots: { name:'Carrots', spacing:3, color:'#C97B3D', sun:'Full sun · 6+ hrs', days:'60–80 days',
tip:'Carrots hate crust. Cover seed with fine compost instead of soil, keep it moist for 10 days straight, and thin ruthlessly at 2 inches — crowded carrots stay stunted.' }
};
const canvas = document.getElementById('bedCanvas');
const ctx = canvas.getContext('2d');
const lenInput = document.getElementById('bedLength');
const widInput = document.getElementById('bedWidth');
const plantSelect = document.getElementById('plantSelect');
let resizeTimer = null;
function clampNum(v, min, max, fallback) {
v = parseFloat(v);
if (isNaN(v)) return fallback;
return Math.min(max, Math.max(min, v));
}
function drawPlan() {
const L = clampNum(lenInput.value, 1, 20, 8);
const W = clampNum(widInput.value, 1, 12, 4);
const plant = PLANTS[plantSelect.value];
const s = plant.spacing / 12; // spacing in feet
const dpr = window.devicePixelRatio || 1;
const cssW = canvas.parentElement.clientWidth - 28;
const cssH = Math.max(240, Math.min(460, cssW * (W / L)));
canvas.style.height = cssH + 'px';
canvas.width = Math.round(cssW * dpr);
canvas.height = Math.round(cssH * dpr);
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
ctx.clearRect(0, 0, cssW, cssH);
const pad = 26;
const scale = Math.min((cssW - 2 * pad) / L, (cssH - 2 * pad) / W);
const bedW = L * scale, bedH = W * scale;
const ox = (cssW - bedW) / 2, oy = (cssH - bedH) / 2;
// soil
ctx.fillStyle = '#EFE8D6';
ctx.strokeStyle = '#2F4A34';
ctx.lineWidth = 2.5;
roundRect(ox, oy, bedW, bedH, 8); ctx.fill(); ctx.stroke();
// 1-ft grid
ctx.strokeStyle = 'rgba(47,74,52,0.18)';
ctx.lineWidth = 1;
for (let i = 1; i < L; i++) {
ctx.beginPath(); ctx.moveTo(ox + i * scale, oy); ctx.lineTo(ox + i * scale, oy + bedH); ctx.stroke();
}
for (let j = 1; j < W; j++) {
ctx.beginPath(); ctx.moveTo(ox, oy + j * scale); ctx.lineTo(ox + bedW, oy + j * scale); ctx.stroke();
}
// plant layout
const nx = Math.max(1, Math.floor(L / s + 1e-9));
const ny = Math.max(1, Math.floor(W / s + 1e-9));
const startX = ox + (bedW - (nx - 1) * s * scale) / 2;
const startY = oy + (bedH - (ny - 1) * s * scale) / 2;
const r = Math.min(s * scale * 0.46, Math.min(bedW, bedH) * 0.48);
ctx.fillStyle = plant.color;
ctx.strokeStyle = 'rgba(255,255,255,0.85)';
ctx.lineWidth = 1.5;
for (let i = 0; i < nx; i++) {
for (let j = 0; j < ny; j++) {
const cx = startX + i * s * scale;
const cy = startY + j * s * scale;
ctx.beginPath(); ctx.arc(cx, cy, r, 0, Math.PI * 2); ctx.fill(); ctx.stroke();
}
}
// dimension labels
ctx.fillStyle = '#5D6557';
ctx.font = '700 11px Karla, sans-serif';
ctx.textAlign = 'center';
ctx.fillText(L + ' ft', ox + bedW / 2, oy + bedH + 17);
ctx.save();
ctx.translate(ox - 15, oy + bedH / 2);
ctx.rotate(-Math.PI / 2);
ctx.fillText(W + ' ft', 0, 0);
ctx.restore();
// stats
const count = nx * ny;
const area = L * W;
document.getElementById('statCount').textContent = count;
document.getElementById('statPlant').textContent = plant.name.toLowerCase() + ' fit';
document.getElementById('statSize').textContent = L + ' ft × ' + W + ' ft';
document.getElementById('statArea').textContent = area + ' sq ft';
document.getElementById('statSpacing').textContent = plant.spacing + '" centers';
document.getElementById('statDensity').textContent = (count / area).toFixed(1);
document.getElementById('statSun').textContent = plant.sun;
document.getElementById('statDays').textContent = plant.days;
document.getElementById('planTip').innerHTML = '<strong>Grower\u2019s tip</strong><span>' + plant.tip + '</span>';
}
function roundRect(x, y, w, h, r) {
ctx.beginPath();
ctx.moveTo(x + r, y);
ctx.arcTo(x + w, y, x + w, y + h, r);
ctx.arcTo(x + w, y + h, x, y + h, r);
ctx.arcTo(x, y + h, x, y, r);
ctx.arcTo(x, y, x + w, y, r);
ctx.closePath();
}
[lenInput, widInput, plantSelect].forEach(el => el.addEventListener('input', () => {
document.querySelectorAll('.preset-chips .chip').forEach(c => c.classList.remove('active'));
drawPlan();
}));
document.querySelectorAll('.preset-chips .chip').forEach(chip => {
chip.addEventListener('click', () => {
lenInput.value = chip.dataset.l;
widInput.value = chip.dataset.w;
plantSelect.value = chip.dataset.plant;
document.querySelectorAll('.preset-chips .chip').forEach(c => c.classList.remove('active'));
chip.classList.add('active');
drawPlan();
});
});
window.addEventListener('resize', () => {
clearTimeout(resizeTimer);
resizeTimer = setTimeout(drawPlan, 150);
});
drawPlan();
</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:50:52.323Z",
"url": "https://benchmark.aimac.invalid/1383f6a77f3bd2652318d79f1d1f24bf3745e3648f1772670dfffacb91dffb4e.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-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": []
},
{
"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": "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": []
},
{
"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": "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": "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": "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": "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": "<nav class=\"primary-nav\" id=\"primaryNav\" aria-label=\"Primary\">",
"target": [
"#primaryNav"
]
}
]
},
{
"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": "<nav class=\"primary-nav\" id=\"primaryNav\" aria-label=\"Primary\">",
"target": [
"#primaryNav"
]
}
]
},
{
"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": "<canvas id=\"bedCanvas\" aria-label=\"Visual planting layout of the raised bed\" role=\"img\" width=\"706\" height=\"353\" style=\"height: 353px;\"></canvas>",
"target": [
"#bedCanvas"
]
}
]
},
{
"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 id=\"top\">",
"target": [
"#top"
]
}
]
},
{
"id": "aria-prohibited-attr",
"impact": null,
"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": "<nav class=\"primary-nav\" id=\"primaryNav\" aria-label=\"Primary\">",
"target": [
"#primaryNav"
]
}
]
},
{
"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": "<canvas id=\"bedCanvas\" aria-label=\"Visual planting layout of the raised bed\" role=\"img\" width=\"706\" height=\"353\" style=\"height: 353px;\"></canvas>",
"target": [
"#bedCanvas"
]
}
]
},
{
"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": "<canvas id=\"bedCanvas\" aria-label=\"Visual planting layout of the raised bed\" role=\"img\" width=\"706\" height=\"353\" style=\"height: 353px;\"></canvas>",
"target": [
"#bedCanvas"
]
}
]
},
{
"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": "<nav class=\"primary-nav\" id=\"primaryNav\" aria-label=\"Primary\">",
"target": [
"#primaryNav"
]
}
]
},
{
"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": "<nav class=\"primary-nav\" id=\"primaryNav\" aria-label=\"Primary\">",
"target": [
"#primaryNav"
]
}
]
},
{
"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 style=\"text-align:center;margin-top:40px\">\n <a class=\"btn btn-primary\" href=\"#ideas\">Browse Ideas <span class=\"arrow\">\u2192</span></a>\n </div>",
"target": [
".container > div:nth-child(3)"
]
}
]
},
{
"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 class=\"chip\" data-plant=\"lettuce\" data-l=\"4\" data-w=\"4\">Salad Bed</button>",
"target": [
"button[data-plant=\"lettuce\"]"
]
}
]
},
{
"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>Grow a home that <em>gives back</em>.</h1>",
"target": [
"h1"
]
},
{
"html": "<h2>Shop by category \u2014 only what we'd use ourselves</h2>",
"target": [
"#shop > .container > .sec-head.reveal > h2"
]
},
{
"html": "<h3>Raised Beds & Structures</h3>",
"target": [
".cat-card:nth-child(1) > .cat-body > h3"
]
},
{
"html": "<h3>Soil & Amendments</h3>",
"target": [
".cat-card:nth-child(2) > .cat-body > h3"
]
},
{
"html": "<h3>Tools & Gear</h3>",
"target": [
".cat-card:nth-child(3) > .cat-body > h3"
]
},
{
"html": "<h3>Seeds & Plants</h3>",
"target": [
".cat-card:nth-child(4) > .cat-body > h3"
]
},
{
"html": "<h3>Outdoor Decor</h3>",
"target": [
".cat-card:nth-child(5) > .cat-body > h3"
]
},
{
"html": "<h3>Irrigation & Watering</h3>",
"target": [
".cat-card:nth-child(6) > .cat-body > h3"
]
},
{
"html": "<h2>Build rooms without walls</h2>",
"target": [
".editorial-split > .ed-copy.reveal > h2"
]
},
{
"html": "<h2>Work with your yard, not against it</h2>",
"target": [
"#landscaping > .container > .sec-head.reveal > h2"
]
},
{
"html": "<h3 style=\"margin:26px 0 6px\">The four-step landscape audit</h3>",
"target": [
".tips-article > h3"
]
},
{
"html": "<h4>Map sun and water</h4>",
"target": [
"li:nth-child(1) > h4"
]
},
{
"html": "<h4>Fix the soil, then the grade</h4>",
"target": [
"li:nth-child(2) > h4"
]
},
{
"html": "<h4>Plant in layers</h4>",
"target": [
"li:nth-child(3) > h4"
]
},
{
"html": "<h4>Choose the right annual for the gap</h4>",
"target": [
"li:nth-child(4) > h4"
]
},
{
"html": "<h3>Plant Care Quick Guides</h3>",
"target": [
".side-card.reveal:nth-child(1) > h3"
]
},
{
"html": "<h3>Expert Advice</h3>",
"target": [
".side-card.reveal:nth-child(2) > h3"
]
},
{
"html": "<h3>Featured Project</h3>",
"target": [
".featured-project > h3"
]
},
{
"html": "<h2>Raised Bed Planner</h2>",
"target": [
"#planner > .container > .center.sec-head.reveal > h2"
]
},
{
"html": "<h2>Steal these landscapes</h2>",
"target": [
"#ideas > .container > .sec-head.reveal > h2"
]
},
{
"html": "<h3>Cottage Border</h3>",
"target": [
".idea-card:nth-child(1) > .idea-overlay > h3"
]
},
{
"html": "<h3>Modern Courtyard</h3>",
"target": [
".idea-card:nth-child(2) > .idea-overlay > h3"
]
},
{
"html": "<h3>Raised Kitchen Garden</h3>",
"target": [
".idea-card:nth-child(3) > .idea-overlay > h3"
]
},
{
"html": "<h3>Native Pollinator Strip</h3>",
"target": [
".idea-card:nth-child(4) > .idea-overlay > h3"
]
},
{
"html": "<h2>Founded in a failing backyard</h2>",
"target": [
".about-grid > .ed-copy.reveal > h2"
]
},
{
"html": "<h2>38,000 backyards and counting</h2>",
"target": [
".section:nth-child(8) > .container > .center.sec-head.reveal > h2"
]
},
{
"html": "<h2>Frequently asked</h2>",
"target": [
"#faq > .container > .center.sec-head.reveal > h2"
]
},
{
"html": "<h2>One honest email a week. Dirt included.</h2>",
"target": [
".newsletter > h2"
]
},
{
"html": "<h4>Shop</h4>",
"target": [
"div:nth-child(2) > h4"
]
},
{
"html": "<h4>Resources</h4>",
"target": [
"div:nth-child(3) > h4"
]
},
{
"html": "<h4>Contact</h4>",
"target": [
"div: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": "#ede7d6",
"bgColor": "#22382a",
"contrastRatio": 10.19,
"fontSize": "10.2pt (13.6px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [],
"impact": "serious",
"message": "Element has sufficient color contrast of 10.19"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<div class=\"announce\">\n \ud83c\udf31 Free shipping on orders over $75 \u00b7 New: The Fall Planting Guide is live \u2014 <a href=\"#plant-care\">read it here</a>\n</div>",
"target": [
".announce"
]
}
]
},
{
"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": "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": [
{
"any": [
{
"id": "duplicate-id-aria",
"data": "bedLength",
"relatedNodes": [],
"impact": "critical",
"message": "Document has no elements referenced with ARIA or labels that share the same id attribute"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<input type=\"number\" id=\"bedLength\" min=\"1\" max=\"20\" step=\"1\" value=\"8\">",
"target": [
"#bedLength"
]
}
]
},
{
"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 for=\"bedLength\">Bed length (ft)</label>",
"target": [
"label[for=\"bedLength\"]"
]
}
],
"impact": "moderate",
"message": "Form field does not have multiple label elements"
}
],
"impact": null,
"html": "<input type=\"number\" id=\"bedLength\" min=\"1\" max=\"20\" step=\"1\" value=\"8\">",
"target": [
"#bedLength"
]
}
]
},
{
"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://placehold.co/64x64/2F4A34/FAF7F0?text=T%26T&font=playfair+display\" alt=\"Terra & Timber logo\" width=\"52\" height=\"52\">",
"target": [
"img[width=\"52\"]"
]
}
]
},
{
"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": "explicit-label",
"data": null,
"relatedNodes": [
{
"html": "<label for=\"bedLength\">Bed length (ft)</label>",
"target": [
"label[for=\"bedLength\"]"
]
}
],
"impact": "critical",
"message": "Element has an explicit <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=\"bedLength\" min=\"1\" max=\"20\" step=\"1\" value=\"8\">",
"target": [
"#bedLength"
]
}
]
},
{
"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": [
{
"any": [
{
"id": "link-in-text-block-style",
"data": null,
"relatedNodes": [
{
"html": "<div class=\"announce\">\n \ud83c\udf31 Free shipping on orders over $75 \u00b7 New: The Fall Planting Guide is live \u2014 <a href=\"#plant-care\">read it here</a>\n</div>",
"target": [
".announce"
]
}
],
"impact": "serious",
"message": "Links can be distinguished from surrounding text by visual styling"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<a href=\"#plant-care\">read it here</a>",
"target": [
".announce > a[href$=\"#plant-care\"]"
]
}
]
},
{
"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": [
"#primaryNav > 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=\"#top\">Home</a></li>",
"target": [
"#primaryNav > 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://placehold.co/64x64/2F4A34/FAF7F0?text=T%26T&font=playfair+display\" alt=\"Terra & Timber logo\" width=\"52\" height=\"52\">",
"target": [
"img[width=\"52\"]"
]
}
]
},
{
"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": [
{
"any": [
{
"id": "aria-label",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "aria-label attribute exists and is not empty"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<canvas id=\"bedCanvas\" aria-label=\"Visual planting layout of the raised bed\" role=\"img\" width=\"706\" height=\"353\" style=\"height: 353px;\"></canvas>",
"target": [
"#bedCanvas"
]
}
]
},
{
"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": "explicit-label",
"data": null,
"relatedNodes": [
{
"html": "<label for=\"plantSelect\">Choose your crop</label>",
"target": [
"label[for=\"plantSelect\"]"
]
}
],
"impact": "critical",
"message": "Element has an explicit <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=\"plantSelect\">",
"target": [
"#plantSelect"
]
}
]
},
{
"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": [
{
"any": [
{
"id": "has-visible-text",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "Element has text that is visible to screen readers"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<summary>When and how should I amend my soil? <span class=\"faq-icon\">+</span></summary>",
"target": [
"details:nth-child(1) > summary"
]
}
]
},
{
"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": 199.3,
"height": 48
},
"relatedNodes": [],
"impact": "serious",
"message": "Control has sufficient size (199.3px by 48px, 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": "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": {
"messageKey": "nonBmp"
},
"relatedNodes": [],
"impact": "serious",
"message": "Element content contains only non-text characters"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"arrow\">\u2192</span>",
"target": [
".hero-ctas > .btn-primary.btn[href$=\"#ideas\"] > .arrow"
],
"failureSummary": "Fix any of the following:\n Element content contains only non-text characters"
}
]
}
],
"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": "#b85c38",
"bgColor": "#faf7f0",
"contrastRatio": 4.24,
"fontSize": "8.6pt (11.52px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<header class=\"site-header\" id=\"siteHeader\">",
"target": [
"#siteHeader"
]
},
{
"html": "<body id=\"top\">",
"target": [
"#top"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 8.6pt (11.52px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"brand-tagline\">Grow a home that gives back</span>",
"target": [
".header-inner > .brand[href$=\"#top\"] > span > .brand-tagline"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 8.6pt (11.52px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#2f4a34",
"bgColor": "#b85c38",
"contrastRatio": 2.15,
"fontSize": "11.0pt (14.72px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<a class=\"btn btn-accent btn-sm\" href=\"#newsletter\">Newsletter</a>",
"target": [
".btn-sm"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 2.15 (foreground color: #2f4a34, background color: #b85c38, font size: 11.0pt (14.72px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a class=\"btn btn-accent btn-sm\" href=\"#newsletter\">Newsletter</a>",
"target": [
".btn-sm"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 2.15 (foreground color: #2f4a34, background color: #b85c38, font size: 11.0pt (14.72px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#b85c38",
"bgColor": "#faf7f0",
"contrastRatio": 4.24,
"fontSize": "9.4pt (12.48px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<body id=\"top\">",
"target": [
"#top"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 9.4pt (12.48px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"kicker\">Home & Garden, done right</span>",
"target": [
".hero-copy > .kicker"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 9.4pt (12.48px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#b85c38",
"bgColor": "#faf7f0",
"contrastRatio": 4.24,
"fontSize": "10.8pt (14.4px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<article class=\"cat-card reveal in\">",
"target": [
".cat-card.in:nth-child(1)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 10.8pt (14.4px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a class=\"cat-link\" href=\"#shop\">Shop beds \u2192</a>",
"target": [
".cat-card.in:nth-child(1) > .cat-body > .cat-link[href$=\"#shop\"]"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 10.8pt (14.4px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#b85c38",
"bgColor": "#faf7f0",
"contrastRatio": 4.24,
"fontSize": "10.8pt (14.4px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<article class=\"cat-card reveal in\">",
"target": [
".cat-card.in:nth-child(2)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 10.8pt (14.4px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a class=\"cat-link\" href=\"#shop\">Shop soil \u2192</a>",
"target": [
".cat-card.in:nth-child(2) > .cat-body > .cat-link[href$=\"#shop\"]"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 10.8pt (14.4px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#b85c38",
"bgColor": "#faf7f0",
"contrastRatio": 4.24,
"fontSize": "10.8pt (14.4px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<article class=\"cat-card reveal in\">",
"target": [
".cat-card.in:nth-child(3)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 10.8pt (14.4px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a class=\"cat-link\" href=\"#shop\">Shop tools \u2192</a>",
"target": [
".cat-card.in:nth-child(3) > .cat-body > .cat-link[href$=\"#shop\"]"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 10.8pt (14.4px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#b85c38",
"bgColor": "#faf7f0",
"contrastRatio": 4.24,
"fontSize": "10.8pt (14.4px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<article class=\"cat-card reveal in\">",
"target": [
".cat-card.in:nth-child(4)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 10.8pt (14.4px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a class=\"cat-link\" href=\"#shop\">Shop seeds \u2192</a>",
"target": [
".cat-card.in:nth-child(4) > .cat-body > .cat-link[href$=\"#shop\"]"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 10.8pt (14.4px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#b85c38",
"bgColor": "#faf7f0",
"contrastRatio": 4.24,
"fontSize": "10.8pt (14.4px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<article class=\"cat-card reveal in\">",
"target": [
".cat-card.in:nth-child(5)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 10.8pt (14.4px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a class=\"cat-link\" href=\"#shop\">Shop decor \u2192</a>",
"target": [
".cat-card.in:nth-child(5) > .cat-body > .cat-link[href$=\"#shop\"]"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 10.8pt (14.4px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#b85c38",
"bgColor": "#faf7f0",
"contrastRatio": 4.24,
"fontSize": "10.8pt (14.4px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<article class=\"cat-card reveal in\">",
"target": [
".cat-card.in:nth-child(6)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 10.8pt (14.4px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a class=\"cat-link\" href=\"#shop\">Shop irrigation \u2192</a>",
"target": [
".cat-card.in:nth-child(6) > .cat-body > .cat-link[href$=\"#shop\"]"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 10.8pt (14.4px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#b85c38",
"bgColor": "#faf7f0",
"contrastRatio": 4.24,
"fontSize": "9.4pt (12.48px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<body id=\"top\">",
"target": [
"#top"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 9.4pt (12.48px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"kicker\">Outdoor Living</span>",
"target": [
".ed-copy.in.reveal > .kicker"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 9.4pt (12.48px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#b85c38",
"bgColor": "#faf7f0",
"contrastRatio": 4.24,
"fontSize": "9.4pt (12.48px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"side-card reveal in\">",
"target": [
".side-card.in.reveal:nth-child(2)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 9.4pt (12.48px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>Certified Master Gardener</span>",
"target": [
".who > span"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 9.4pt (12.48px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#b85c38",
"bgColor": "#faf7f0",
"contrastRatio": 4.24,
"fontSize": "10.8pt (14.4px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"side-card reveal in\">",
"target": [
".side-card.in.reveal:nth-child(2)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 10.8pt (14.4px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a class=\"cat-link\" href=\"#faq\">Ask our experts \u2192</a>",
"target": [
"a[href$=\"#faq\"]"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 10.8pt (14.4px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#b85c38",
"bgColor": "#faf7f0",
"contrastRatio": 4.24,
"fontSize": "10.8pt (14.4px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<article class=\"cat-card reveal in\">",
"target": [
".cat-card:nth-child(1)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 10.8pt (14.4px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a class=\"cat-link\" href=\"#shop\">Shop beds \u2192</a>",
"target": [
".cat-card:nth-child(1) > .cat-body > .cat-link[href$=\"#shop\"]"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 10.8pt (14.4px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#b85c38",
"bgColor": "#faf7f0",
"contrastRatio": 4.24,
"fontSize": "10.8pt (14.4px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<article class=\"cat-card reveal in\">",
"target": [
".cat-card:nth-child(2)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 10.8pt (14.4px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a class=\"cat-link\" href=\"#shop\">Shop soil \u2192</a>",
"target": [
".cat-card:nth-child(2) > .cat-body > .cat-link[href$=\"#shop\"]"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 10.8pt (14.4px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#b85c38",
"bgColor": "#faf7f0",
"contrastRatio": 4.24,
"fontSize": "10.8pt (14.4px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<article class=\"cat-card reveal in\">",
"target": [
".cat-card:nth-child(3)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 10.8pt (14.4px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a class=\"cat-link\" href=\"#shop\">Shop tools \u2192</a>",
"target": [
".cat-card:nth-child(3) > .cat-body > .cat-link[href$=\"#shop\"]"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 10.8pt (14.4px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#b85c38",
"bgColor": "#faf7f0",
"contrastRatio": 4.24,
"fontSize": "10.8pt (14.4px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<article class=\"cat-card reveal in\">",
"target": [
".cat-card:nth-child(4)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 10.8pt (14.4px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a class=\"cat-link\" href=\"#shop\">Shop seeds \u2192</a>",
"target": [
".cat-card:nth-child(4) > .cat-body > .cat-link[href$=\"#shop\"]"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 10.8pt (14.4px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#b85c38",
"bgColor": "#faf7f0",
"contrastRatio": 4.24,
"fontSize": "10.8pt (14.4px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<article class=\"cat-card reveal in\">",
"target": [
".cat-card:nth-child(5)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 10.8pt (14.4px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a class=\"cat-link\" href=\"#shop\">Shop decor \u2192</a>",
"target": [
".cat-card:nth-child(5) > .cat-body > .cat-link[href$=\"#shop\"]"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 10.8pt (14.4px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#b85c38",
"bgColor": "#faf7f0",
"contrastRatio": 4.24,
"fontSize": "10.8pt (14.4px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<article class=\"cat-card reveal in\">",
"target": [
".cat-card:nth-child(6)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 10.8pt (14.4px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a class=\"cat-link\" href=\"#shop\">Shop irrigation \u2192</a>",
"target": [
".cat-card:nth-child(6) > .cat-body > .cat-link[href$=\"#shop\"]"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 10.8pt (14.4px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#b85c38",
"bgColor": "#faf7f0",
"contrastRatio": 4.24,
"fontSize": "10.8pt (14.4px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"side-card featured-project reveal in\">",
"target": [
".featured-project"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 10.8pt (14.4px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a class=\"cat-link\" href=\"#ideas\">See the full project \u2192</a>",
"target": [
".cat-link[href$=\"#ideas\"]"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 10.8pt (14.4px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#b85c38",
"bgColor": "#faf7f0",
"contrastRatio": 4.24,
"fontSize": "9.4pt (12.48px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<body id=\"top\">",
"target": [
"#top"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 9.4pt (12.48px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"kicker\">Design Ideas</span>",
"target": [
"#ideas > .container > .sec-head.in.reveal > .kicker"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 9.4pt (12.48px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#b85c38",
"bgColor": "#faf7f0",
"contrastRatio": 4.24,
"fontSize": "9.4pt (12.48px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<body id=\"top\">",
"target": [
"#top"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 9.4pt (12.48px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"kicker\">Outdoor Living</span>",
"target": [
".editorial-split > .ed-copy.in.reveal > .kicker"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 9.4pt (12.48px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#b85c38",
"bgColor": "#faf7f0",
"contrastRatio": 4.24,
"fontSize": "9.4pt (12.48px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<body id=\"top\">",
"target": [
"#top"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 9.4pt (12.48px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"kicker\">From the Community</span>",
"target": [
".section:nth-child(8) > .container > .center.sec-head.in > .kicker"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 9.4pt (12.48px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#b85c38",
"bgColor": "#faf7f0",
"contrastRatio": 4.24,
"fontSize": "9.4pt (12.48px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<body id=\"top\">",
"target": [
"#top"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 9.4pt (12.48px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"kicker\">Outdoor Living</span>",
"target": [
".editorial-split > .ed-copy.reveal.in > .kicker"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 9.4pt (12.48px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#b85c38",
"bgColor": "#faf7f0",
"contrastRatio": 4.24,
"fontSize": "9.4pt (12.48px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<body id=\"top\">",
"target": [
"#top"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 9.4pt (12.48px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"kicker\">Design Ideas</span>",
"target": [
"#ideas > .container > .sec-head.reveal.in > .kicker"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 9.4pt (12.48px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#b85c38",
"bgColor": "#faf7f0",
"contrastRatio": 4.24,
"fontSize": "9.4pt (12.48px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<body id=\"top\">",
"target": [
"#top"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 9.4pt (12.48px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"kicker\">From the Community</span>",
"target": [
".section:nth-child(8) > .container > .center.sec-head.reveal > .kicker"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.24 (foreground color: #b85c38, background color: #faf7f0, font size: 9.4pt (12.48px), font weight: bold). Expected contrast ratio of 4.5:1"
}
]
}
],
"coverage": {
"contract": "main-document-vertical-scroll",
"complete": true,
"positions": [
{
"y": 0,
"height": 11554
},
{
"y": 576,
"height": 11554
},
{
"y": 1152,
"height": 11554
},
{
"y": 1728,
"height": 11554
},
{
"y": 2304,
"height": 11554
},
{
"y": 2880,
"height": 11554
},
{
"y": 3456,
"height": 11554
},
{
"y": 4032,
"height": 11554
},
{
"y": 4608,
"height": 11554
},
{
"y": 5184,
"height": 11554
},
{
"y": 5760,
"height": 11554
},
{
"y": 6336,
"height": 11554
},
{
"y": 6912,
"height": 11554
},
{
"y": 7488,
"height": 11554
},
{
"y": 8064,
"height": 11554
},
{
"y": 8640,
"height": 11554
},
{
"y": 9216,
"height": 11554
},
{
"y": 9792,
"height": 11554
},
{
"y": 10368,
"height": 11554
},
{
"y": 10834,
"height": 11554
}
],
"scans": 21,
"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: "Shop", "About", "Plant Care".
- **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: "Outdoor Living", "Design Ideas", "Landscaping Tips".
- **Content Depth:** Populate each section with **substantial, realistic text** (multiple sentences/paragraphs). Use authentic industry language and terminology like: "soil amendment", "load-bearing", "annual".
- **Visuals:** Integrate relevant placeholder images logically within the content sections.
- **Calls to Action:** Include clear and contextually relevant CTAs. Use strong verbs similar to: "Read Guide", "Get Design Ideas", "Browse Ideas".
- **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: "garden layout planner".
- **SIDEBAR (Optional):** If your design includes a sidebar, populate it with **useful, relevant content**. Ideas: "plant care guides", "expert advice", "featured projects".
- **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.