Anthropic Claude Sonnet 5.5 – Hobbies and Interests
via Anthropic · Generated
- AIMAC Debt 8.76
- Cost $0.25
- Total Violations 31
- HTML Size 54 KB
- Em Dashes 14
Screenshot
View Live Page
Accessibility Issues Found
31 Serious
-
color-contrast serious 28 instances
Elements must meet minimum color contrast ratio thresholds
Example HTML
<a href="#tutorials" class="btn btn-primary">Find a Tutorial</a> -
target-size serious 3 instances
All touch targets must be 24px large, or leave sufficient space
Example HTML
<a href="#tutorials">#zines</a>
Artifacts
View Generated HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Tinkerleaf — Make Slowly. Collect Joyfully. Belong.</title>
<meta name="description" content="Tinkerleaf is a home for makers, crafters, collectors and restorers: step-by-step craft tutorials, trend reports, local clubs and a curated supply shop.">
<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=DM+Sans:wght@400;500;700&family=Fraunces:opsz,wght@9..144,500;9..144,700;9..144,800&display=swap" rel="stylesheet">
<style>
:root{
--cream:#fbf6ee;
--paper:#fffdf9;
--sand:#f1e7d6;
--forest:#1f4d3f;
--forest-d:#143328;
--terra:#c9512b;
--terra-d:#a53e1d;
--mustard:#e9b44c;
--ink:#23201c;
--muted:#6a6358;
--line:#e4d9c6;
--radius:16px;
--shadow:0 10px 30px -12px rgba(35,32,28,.25);
--serif:'Fraunces',Georgia,serif;
--sans:'DM Sans',system-ui,-apple-system,Segoe UI,sans-serif;
}
*{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth;scroll-padding-top:90px}
body{font-family:var(--sans);background:var(--cream);color:var(--ink);line-height:1.65;font-size:17px}
img{max-width:100%;display:block}
a{color:inherit}
h1,h2,h3,h4{font-family:var(--serif);line-height:1.15;color:var(--forest-d)}
h2{font-size:clamp(2rem,4vw,2.9rem);margin-bottom:14px;letter-spacing:-.01em}
h3{font-size:1.3rem}
p{margin-bottom:1em}
.container{width:min(1200px,92%);margin-inline:auto}
section{padding:96px 0}
.eyebrow{display:inline-block;font-size:.8rem;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:var(--terra);margin-bottom:12px}
.lead{font-size:1.15rem;color:var(--muted);max-width:660px}
.sec-head{margin-bottom:44px}
.sec-head.center{text-align:center}
.sec-head.center .lead{margin-inline:auto}
.skip{position:absolute;left:-999px;top:0;background:var(--forest);color:#fff;padding:10px 16px;z-index:200}
.skip:focus{left:10px;top:10px}
:focus-visible{outline:3px solid var(--mustard);outline-offset:2px}
/* buttons */
.btn{display:inline-flex;align-items:center;gap:8px;padding:13px 26px;border-radius:999px;font-weight:700;font-size:.97rem;text-decoration:none;border:2px solid transparent;cursor:pointer;transition:.2s;font-family:var(--sans)}
.btn-primary{background:var(--terra);color:#fff}
.btn-primary:hover{background:var(--terra-d);transform:translateY(-2px)}
.btn-dark{background:var(--forest);color:#fff}
.btn-dark:hover{background:var(--forest-d);transform:translateY(-2px)}
.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:.88rem}
/* header */
.topbar{background:var(--forest-d);color:#f3e9d6;font-size:.88rem;text-align:center;padding:9px 12px}
.topbar a{color:var(--mustard);font-weight:700}
header.site{background:rgba(251,246,238,.94);backdrop-filter:blur(10px);position:sticky;top:0;z-index:100;border-bottom:1px solid var(--line)}
.header-in{display:flex;align-items:center;justify-content:space-between;gap:20px;padding:12px 0}
.brand{display:flex;align-items:center;gap:12px;text-decoration:none}
.brand img{width:52px;height:52px;border-radius:14px}
.brand-name{font-family:var(--serif);font-weight:800;font-size:1.55rem;color:var(--forest-d);line-height:1}
.brand-tag{display:block;font-family:var(--sans);font-size:.72rem;color:var(--muted);font-weight:500;letter-spacing:.03em;margin-top:4px}
nav ul{display:flex;list-style:none;gap:4px;align-items:center}
nav a{text-decoration:none;font-weight:500;font-size:.96rem;padding:8px 12px;border-radius:999px;transition:.2s}
nav a:hover{background:var(--sand)}
nav a.shop-link{background:var(--forest);color:#fff}
nav a.shop-link:hover{background:var(--terra)}
.cart-count{background:var(--mustard);color:var(--ink);border-radius:999px;padding:1px 8px;font-size:.78rem;font-weight:700;margin-left:4px}
.menu-btn{display:none;background:none;border:2px solid var(--forest);border-radius:10px;padding:8px 12px;font-weight:700;color:var(--forest);cursor:pointer;font-family:var(--sans)}
/* hero */
.hero{padding:70px 0 90px;background:
radial-gradient(circle at 90% 10%,rgba(233,180,76,.25),transparent 40%),
radial-gradient(circle at 5% 90%,rgba(201,81,43,.12),transparent 40%),var(--cream)}
.hero-grid{display:grid;grid-template-columns:1.05fr .95fr;gap:56px;align-items:center}
.hero h1{font-size:clamp(2.6rem,6vw,4.6rem);letter-spacing:-.025em;margin-bottom:22px}
.hero h1 em{color:var(--terra);font-style:italic}
.hero p.lead{margin-bottom:30px}
.hero-cta{display:flex;flex-wrap:wrap;gap:14px;margin-bottom:40px}
.stats{display:flex;gap:36px;flex-wrap:wrap;padding-top:26px;border-top:1px solid var(--line)}
.stats strong{display:block;font-family:var(--serif);font-size:2rem;color:var(--forest)}
.stats span{font-size:.88rem;color:var(--muted)}
.collage{position:relative;height:560px}
.collage img{position:absolute;border-radius:var(--radius);box-shadow:var(--shadow);object-fit:cover;border:6px solid var(--paper)}
.collage .c1{width:62%;height:62%;top:0;right:0}
.collage .c2{width:50%;height:44%;bottom:0;left:0}
.collage .c3{width:38%;height:34%;bottom:6%;right:4%;transform:rotate(4deg)}
.collage .badge{position:absolute;top:44%;left:4%;background:var(--mustard);padding:14px 18px;border-radius:14px;font-weight:700;font-size:.9rem;box-shadow:var(--shadow);transform:rotate(-5deg);z-index:2;max-width:180px;line-height:1.3}
/* marquee interests */
.interests{background:var(--forest);color:#f6ecd8;padding:20px 0;overflow:hidden}
.interests ul{display:flex;gap:44px;list-style:none;justify-content:center;flex-wrap:wrap;font-family:var(--serif);font-size:1.15rem;font-style:italic}
.interests li::before{content:"✦ ";color:var(--mustard);font-style:normal}
/* about */
.about-grid{display:grid;grid-template-columns:1fr 1fr;gap:64px;align-items:center}
.about-img{position:relative}
.about-img img{border-radius:var(--radius);box-shadow:var(--shadow);width:100%;height:520px;object-fit:cover}
.about-img .note{position:absolute;right:-18px;bottom:30px;background:var(--paper);padding:18px 22px;border-radius:14px;box-shadow:var(--shadow);max-width:240px;font-size:.9rem;border-left:5px solid var(--terra)}
.features{display:grid;grid-template-columns:repeat(4,1fr);gap:22px;margin-top:64px}
.feature{background:var(--paper);border:1px solid var(--line);border-radius:var(--radius);padding:28px 24px;transition:.25s}
.feature:hover{transform:translateY(-5px);box-shadow:var(--shadow)}
.feature .ico{width:54px;height:54px;border-radius:14px;background:var(--sand);display:grid;place-items:center;font-size:1.6rem;margin-bottom:16px}
.feature h3{margin-bottom:8px;font-size:1.15rem}
.feature p{font-size:.95rem;color:var(--muted);margin:0}
/* tutorial finder */
#tutorials{background:var(--sand)}
.finder{background:var(--paper);border-radius:22px;padding:30px;box-shadow:var(--shadow);margin-bottom:34px;border:1px solid var(--line)}
.finder-row{display:grid;grid-template-columns:2fr 1fr 1fr;gap:18px;margin-bottom:18px}
label.fl{display:block;font-size:.78rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);margin-bottom:6px}
.finder input[type=search],.finder select,.news-form input,.club-search input{width:100%;padding:13px 16px;border:2px solid var(--line);border-radius:12px;font:inherit;background:#fff;color:var(--ink)}
.finder input:focus,.finder select:focus,.news-form input:focus,.club-search input:focus{border-color:var(--forest);outline:none}
.chips{display:flex;flex-wrap:wrap;gap:10px;align-items:center}
.chip{border:2px solid var(--line);background:#fff;border-radius:999px;padding:7px 18px;font:inherit;font-size:.9rem;font-weight:500;cursor:pointer;transition:.2s}
.chip:hover{border-color:var(--forest)}
.chip.active{background:var(--forest);border-color:var(--forest);color:#fff}
.result-bar{display:flex;justify-content:space-between;align-items:center;margin-bottom:22px;flex-wrap:wrap;gap:10px}
.result-bar button{background:none;border:none;color:var(--terra);font-weight:700;cursor:pointer;font:inherit;font-weight:700;text-decoration:underline}
.tut-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:26px}
.card{background:var(--paper);border-radius:var(--radius);overflow:hidden;border:1px solid var(--line);display:flex;flex-direction:column;transition:.25s}
.card:hover{transform:translateY(-5px);box-shadow:var(--shadow)}
.card .thumb{position:relative;aspect-ratio:3/2;overflow:hidden}
.card .thumb img{width:100%;height:100%;object-fit:cover;transition:.4s}
.card:hover .thumb img{transform:scale(1.05)}
.tag{position:absolute;top:12px;left:12px;background:var(--mustard);font-size:.74rem;font-weight:700;padding:4px 12px;border-radius:999px;color:var(--ink)}
.card .body{padding:22px;display:flex;flex-direction:column;flex:1}
.meta{display:flex;gap:14px;font-size:.82rem;color:var(--muted);margin-bottom:10px;flex-wrap:wrap}
.card h3{margin-bottom:8px}
.card p{font-size:.95rem;color:var(--muted);flex:1}
.card .btn{align-self:flex-start}
.empty{display:none;text-align:center;padding:50px 20px;background:var(--paper);border-radius:var(--radius);border:2px dashed var(--line)}
.empty.show{display:block}
/* trends + sidebar */
.trend-layout{display:grid;grid-template-columns:2fr 1fr;gap:48px;align-items:start}
.featured-trend{position:relative;border-radius:22px;overflow:hidden;margin-bottom:30px;color:#fff;min-height:440px;display:flex;align-items:flex-end}
.featured-trend img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.featured-trend::after{content:"";position:absolute;inset:0;background:linear-gradient(to top,rgba(20,51,40,.95),rgba(20,51,40,.1) 70%)}
.featured-trend .txt{position:relative;z-index:2;padding:34px}
.featured-trend h3{color:#fff;font-size:2rem;margin:8px 0 12px}
.featured-trend p{color:#efe6d3;margin-bottom:18px}
.featured-trend .eyebrow{color:var(--mustard)}
.trend-list{display:grid;gap:22px}
.trend-item{display:grid;grid-template-columns:200px 1fr;gap:22px;background:var(--paper);border:1px solid var(--line);border-radius:var(--radius);overflow:hidden}
.trend-item img{width:100%;height:100%;object-fit:cover;min-height:160px}
.trend-item div{padding:20px 22px 20px 0}
.trend-item h3{margin:4px 0 8px;font-size:1.2rem}
.trend-item p{font-size:.94rem;color:var(--muted);margin-bottom:8px}
.trend-item a.more{color:var(--terra);font-weight:700;text-decoration:none;font-size:.92rem}
.trend-item a.more:hover{text-decoration:underline}
aside{display:grid;gap:26px;position:sticky;top:100px}
.widget{background:var(--paper);border:1px solid var(--line);border-radius:var(--radius);padding:26px}
.widget h4{font-size:1.2rem;margin-bottom:16px;padding-bottom:12px;border-bottom:2px solid var(--sand)}
.rank{list-style:none;counter-reset:r}
.rank li{counter-increment:r;display:flex;gap:14px;padding:10px 0;border-bottom:1px dashed var(--line);font-size:.95rem;align-items:flex-start}
.rank li:last-child{border:none}
.rank li::before{content:counter(r);font-family:var(--serif);font-weight:800;color:var(--terra);font-size:1.3rem;line-height:1.2;min-width:20px}
.rank small{display:block;color:var(--muted)}
.maker{display:flex;gap:14px;align-items:center;padding:10px 0}
.maker img{width:56px;height:56px;border-radius:50%;border:3px solid var(--mustard)}
.maker strong{display:block;line-height:1.2}
.maker span{font-size:.85rem;color:var(--muted)}
.pattern-w{background:var(--forest);color:#f3e9d6;border:none}
.pattern-w h4{color:#fff;border-color:rgba(255,255,255,.2)}
.pattern-w p{font-size:.94rem}
.pattern-w img{border-radius:12px;margin-bottom:14px;width:100%;height:150px;object-fit:cover}
.tagcloud{display:flex;flex-wrap:wrap;gap:8px}
.tagcloud a{background:var(--sand);padding:5px 13px;border-radius:999px;font-size:.85rem;text-decoration:none}
.tagcloud a:hover{background:var(--mustard)}
/* clubs */
#clubs{background:var(--forest-d);color:#efe6d3}
#clubs h2{color:#fff}
#clubs .lead{color:#cfc5b0}
#clubs .eyebrow{color:var(--mustard)}
.club-top{display:grid;grid-template-columns:1fr 1fr;gap:40px;align-items:end;margin-bottom:34px}
.club-search input{background:#fff}
.club-filters{display:flex;flex-wrap:wrap;gap:10px;margin-top:14px}
#clubs .chip{background:transparent;color:#efe6d3;border-color:rgba(255,255,255,.25)}
#clubs .chip.active{background:var(--mustard);color:var(--ink);border-color:var(--mustard)}
.club-layout{display:grid;grid-template-columns:1.4fr 1fr;gap:34px}
.club-list{display:grid;gap:16px;max-height:600px;overflow:auto;padding-right:6px}
.club{display:grid;grid-template-columns:96px 1fr auto;gap:18px;align-items:center;background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.12);border-radius:var(--radius);padding:16px}
.club img{width:96px;height:96px;border-radius:12px;object-fit:cover}
.club h3{color:#fff;font-size:1.15rem;margin-bottom:4px}
.club p{font-size:.88rem;color:#cfc5b0;margin:0}
.club .when{color:var(--mustard);font-weight:700;font-size:.85rem}
.club-side{background:var(--paper);color:var(--ink);border-radius:22px;overflow:hidden;align-self:start}
.club-side img{width:100%;height:240px;object-fit:cover}
.club-side div{padding:26px}
.club-side h3{margin-bottom:10px}
.club-side p{color:var(--muted);font-size:.95rem}
/* shop */
.shop-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:24px}
.product{background:var(--paper);border:1px solid var(--line);border-radius:var(--radius);overflow:hidden;transition:.25s}
.product:hover{box-shadow:var(--shadow);transform:translateY(-5px)}
.product img{width:100%;aspect-ratio:1;object-fit:cover}
.product .pb{padding:18px}
.product .cat{font-size:.74rem;text-transform:uppercase;letter-spacing:.1em;color:var(--terra);font-weight:700}
.product h3{font-size:1.08rem;margin:4px 0 6px}
.product .price{display:flex;justify-content:space-between;align-items:center;margin-top:12px}
.product .price strong{font-family:var(--serif);font-size:1.3rem;color:var(--forest)}
.product button.added{background:var(--forest);color:#fff;border-color:var(--forest)}
.shop-banner{margin-top:40px;background:var(--mustard);border-radius:22px;padding:34px 40px;display:flex;justify-content:space-between;align-items:center;gap:24px;flex-wrap:wrap}
.shop-banner h3{font-size:1.6rem;margin-bottom:4px}
.shop-banner p{margin:0}
/* testimonials */
#community{background:var(--sand)}
.testi-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:26px}
.testi{background:var(--paper);border-radius:var(--radius);padding:32px 28px;position:relative;border:1px solid var(--line)}
.testi::before{content:"“";position:absolute;top:6px;right:22px;font-family:var(--serif);font-size:5.5rem;color:var(--mustard);line-height:1}
.stars{color:var(--mustard);letter-spacing:3px;margin-bottom:10px}
.testi p{font-size:1rem}
.who{display:flex;gap:14px;align-items:center;margin-top:20px}
.who img{width:52px;height:52px;border-radius:50%}
.who strong{display:block;line-height:1.2}
.who span{font-size:.85rem;color:var(--muted)}
.join-strip{margin-top:48px;display:grid;grid-template-columns:repeat(3,1fr);gap:22px}
.join-strip div{text-align:center;padding:24px;border-radius:var(--radius);background:rgba(255,255,255,.55)}
.join-strip strong{font-family:var(--serif);font-size:2.2rem;color:var(--terra);display:block}
/* faq */
.faq-wrap{display:grid;grid-template-columns:1fr 1.4fr;gap:60px;align-items:start}
.faq-list{display:grid;gap:14px}
details{background:var(--paper);border:1px solid var(--line);border-radius:14px;padding:0 24px;transition:.2s}
details[open]{box-shadow:var(--shadow);border-color:var(--forest)}
summary{cursor:pointer;list-style:none;padding:20px 0;font-weight:700;font-size:1.05rem;display:flex;justify-content:space-between;gap:16px;align-items:center}
summary::-webkit-details-marker{display:none}
summary::after{content:"+";font-size:1.6rem;color:var(--terra);transition:.2s;line-height:1}
details[open] summary::after{transform:rotate(45deg)}
details p{color:var(--muted);padding-bottom:20px;margin:0}
/* newsletter */
.news{padding:0 0 96px}
.news-box{background:linear-gradient(120deg,var(--terra),#a73c1b);border-radius:28px;padding:60px;display:grid;grid-template-columns:1.2fr 1fr;gap:40px;align-items:center;color:#fff;position:relative;overflow:hidden}
.news-box h2{color:#fff}
.news-box p{color:#ffe7da}
.news-form{display:flex;gap:10px;flex-wrap:wrap}
.news-form input{flex:1;min-width:200px;border:none}
.news-form .btn{background:var(--forest-d);color:#fff}
.news-form .btn:hover{background:#000}
.form-msg{margin-top:12px;font-weight:700;min-height:1.5em;color:#fff}
.small{font-size:.82rem;color:#ffd9c7 !important}
/* footer */
footer{background:var(--forest-d);color:#cfc5b0;padding:72px 0 28px}
.foot-grid{display:grid;grid-template-columns:1.5fr 1fr 1fr 1.2fr;gap:44px;margin-bottom:48px}
footer h4{color:#fff;font-size:1.1rem;margin-bottom:16px}
footer ul{list-style:none;display:grid;gap:9px;font-size:.95rem}
footer a{text-decoration:none}
footer a:hover{color:var(--mustard)}
.foot-brand .brand-name{color:#fff}
.foot-brand .brand-tag{color:#a89f8b}
.foot-brand p{margin-top:16px;font-size:.95rem}
.social{display:flex;gap:10px;margin-top:18px;flex-wrap:wrap}
.social a{border:1px solid rgba(255,255,255,.25);border-radius:999px;padding:6px 14px;font-size:.85rem}
.social a:hover{background:var(--mustard);color:var(--ink);border-color:var(--mustard)}
.foot-bottom{border-top:1px solid rgba(255,255,255,.12);padding-top:24px;display:flex;justify-content:space-between;flex-wrap:wrap;gap:12px;font-size:.88rem}
.foot-bottom div{display:flex;gap:20px}
/* responsive */
@media(max-width:1060px){
.features,.shop-grid{grid-template-columns:repeat(2,1fr)}
.tut-grid{grid-template-columns:repeat(2,1fr)}
.trend-layout{grid-template-columns:1fr}
aside{position:static;grid-template-columns:1fr 1fr}
.foot-grid{grid-template-columns:1fr 1fr}
.club-layout{grid-template-columns:1fr}
}
@media(max-width:900px){
.menu-btn{display:block}
nav{position:absolute;top:100%;left:0;right:0;background:var(--cream);border-bottom:1px solid var(--line);display:none;padding:14px 4%}
nav.open{display:block}
nav ul{flex-direction:column;align-items:stretch}
nav a{display:block}
header.site{position:sticky}
.header-in{position:relative}
.hero-grid,.about-grid,.faq-wrap,.club-top,.news-box{grid-template-columns:1fr}
.collage{height:440px}
.about-img .note{right:10px}
.testi-grid,.join-strip{grid-template-columns:1fr}
.news-box{padding:36px 26px}
.brand-tag{display:none}
}
@media(max-width:640px){
section{padding:70px 0}
.features,.shop-grid,.tut-grid,aside{grid-template-columns:1fr}
.finder-row{grid-template-columns:1fr}
.trend-item{grid-template-columns:1fr}
.trend-item div{padding:0 20px 20px}
.trend-item img{height:180px}
.club{grid-template-columns:72px 1fr}
.club img{width:72px;height:72px}
.club .btn{grid-column:1/-1;justify-content:center}
.foot-grid{grid-template-columns:1fr}
.interests ul{gap:18px;font-size:1rem}
.shop-banner{padding:28px 24px}
}
@media(prefers-reduced-motion:reduce){*{transition:none !important;scroll-behavior:auto !important}}
</style>
</head>
<body>
<a href="#main" class="skip">Skip to content</a>
<div class="topbar">🌿 Spring Swap Season is here — free shipping on Maker Kits over $60. <a href="#shop">Get Supplies →</a></div>
<header class="site">
<div class="container header-in">
<a href="#top" class="brand" aria-label="Tinkerleaf home">
<img src="https://placehold.co/104x104/1f4d3f/e9b44c?text=T&font=lora" alt="Tinkerleaf logo" width="52" height="52">
<span>
<span class="brand-name">Tinkerleaf</span>
<span class="brand-tag">Make slowly. Collect joyfully. Belong.</span>
</span>
</a>
<button class="menu-btn" id="menuBtn" aria-expanded="false" aria-controls="mainNav">Menu</button>
<nav id="mainNav" aria-label="Primary">
<ul>
<li><a href="#about">About</a></li>
<li><a href="#tutorials">Craft Tutorials</a></li>
<li><a href="#trends">Trend Reports</a></li>
<li><a href="#clubs">Local Clubs</a></li>
<li><a href="#community">Community</a></li>
<li><a href="#faq">FAQ</a></li>
<li><a href="#shop" class="shop-link">Shop <span class="cart-count" id="cartCount" aria-label="Items in kit">0</span></a></li>
</ul>
</nav>
</div>
</header>
<main id="main">
<div id="top"></div>
<!-- HERO -->
<section class="hero" style="padding-bottom:90px">
<div class="container hero-grid">
<div>
<span class="eyebrow">The home for hands-on hobbies</span>
<h1>Make slowly. Collect <em>joyfully.</em> Belong.</h1>
<p class="lead">Tinkerleaf brings together weekend woodworkers, yarn obsessives, vintage-radio restorers, pressed-flower artists and everyone in between. Learn a new craft with clear step-by-step tutorials, find a club that meets near you, and stock your bench with supplies chosen by people who actually use them.</p>
<div class="hero-cta">
<a href="#tutorials" class="btn btn-primary">Find a Tutorial</a>
<a href="#clubs" class="btn btn-ghost">Join Community</a>
</div>
<div class="stats">
<div><strong>480+</strong><span>Step-by-step tutorials</span></div>
<div><strong>126</strong><span>Local clubs in 31 states</span></div>
<div><strong>52k</strong><span>Makers & collectors</span></div>
</div>
</div>
<div class="collage" aria-hidden="true">
<img class="c1" src="https://picsum.photos/seed/tinker-hero1/640/640" alt="" width="640" height="640">
<img class="c2" src="https://picsum.photos/seed/tinker-hero2/560/440" alt="" width="560" height="440">
<img class="c3" src="https://picsum.photos/seed/tinker-hero3/400/340" alt="" width="400" height="340">
<div class="badge">New this week: 14 upcycling projects under $15</div>
</div>
</div>
</section>
<div class="interests" aria-label="Interests we cover">
<ul>
<li>Upcycling</li><li>Woodworking</li><li>Knitting & Crochet</li><li>Restoration</li><li>Ceramics</li><li>Collecting</li><li>Paper Craft</li><li>Custom Design</li>
</ul>
</div>
<!-- ABOUT -->
<section id="about">
<div class="container">
<div class="about-grid">
<div class="about-img">
<img src="https://picsum.photos/seed/tinker-about/720/860" alt="A maker's workbench covered with tools, fabric and hand-built projects" width="720" height="860" loading="lazy">
<div class="note"><strong>Founded in 2016</strong> in a rented garage with one lathe, a sewing machine and a shared pot of coffee.</div>
</div>
<div>
<span class="eyebrow">About Tinkerleaf</span>
<h2>A workshop, a library and a village square — all for hobbyists.</h2>
<p>Tinkerleaf began when three friends — a furniture restorer, a textile designer and a vintage-camera collector — realised that the best part of any hobby is rarely the finished object. It's the swapping of tips at a club table, the satisfaction of rescuing a battered chair, the quiet hour at the bench after a long day.</p>
<p>Today we publish carefully tested tutorials, seasonal trend reports, and local club listings so beginners never have to learn alone. Every project is built, photographed and troubleshot by our in-house makers before it reaches you, and every supply in our shop has been bench-tested for quality, ethics and value.</p>
<p>Whether you're drawn to upcycling thrifted finds, commissioning a custom design, or tracking down the last piece in a collection, you belong here. No gatekeeping, no "right" way to be a hobbyist — just good materials, honest guidance and generous people.</p>
<a href="#community" class="btn btn-dark">Meet the Community</a>
</div>
</div>
<div class="features">
<article class="feature"><div class="ico">🪡</div><h3>Tested Tutorials</h3><p>Every guide is made twice by different people. If we get stuck, we rewrite it until a first-timer can follow along.</p></article>
<article class="feature"><div class="ico">♻️</div><h3>Sustainable by Default</h3><p>Our upcycling and restoration projects favour reclaimed materials, low-waste patterns and repairable tools.</p></article>
<article class="feature"><div class="ico">📍</div><h3>Local Connections</h3><p>Our club directory helps you find swap meets, sewing circles, repair cafés and collector societies nearby.</p></article>
<article class="feature"><div class="ico">🧰</div><h3>Curated Supplies</h3><p>No endless catalogues. Just the tools, fibres, paints and hardware our makers trust, bundled into ready-to-go kits.</p></article>
</div>
</div>
</section>
<!-- TUTORIAL FINDER -->
<section id="tutorials">
<div class="container">
<div class="sec-head">
<span class="eyebrow">Craft Tutorials · Interactive Finder</span>
<h2>Find your next weekend project in seconds.</h2>
<p class="lead">Tell us what you're into, how much time you have and how confident you feel with your tools. We'll narrow nearly 500 tutorials down to the ones that fit your bench — and your schedule.</p>
</div>
<div class="finder" role="search" aria-label="Tutorial finder">
<div class="finder-row">
<div>
<label class="fl" for="q">Search</label>
<input type="search" id="q" placeholder="Try “macramé”, “chair”, “resin”…">
</div>
<div>
<label class="fl" for="craft">Craft</label>
<select id="craft">
<option value="all">All crafts</option>
<option>Woodworking</option>
<option>Textiles</option>
<option>Upcycling</option>
<option>Ceramics</option>
<option>Paper & Print</option>
<option>Restoration</option>
</select>
</div>
<div>
<label class="fl" for="time">Time available</label>
<select id="time">
<option value="all">Any length</option>
<option value="60">Under 1 hour</option>
<option value="180">Under 3 hours</option>
<option value="999">A full weekend</option>
</select>
</div>
</div>
<div>
<span class="fl" style="display:block">Skill level</span>
<div class="chips" id="levelChips">
<button class="chip active" data-level="all">All levels</button>
<button class="chip" data-level="Beginner">Beginner</button>
<button class="chip" data-level="Intermediate">Intermediate</button>
<button class="chip" data-level="Advanced">Advanced</button>
</div>
</div>
</div>
<div class="result-bar">
<strong id="resultCount" aria-live="polite">Showing 9 tutorials</strong>
<button id="resetBtn" type="button">Reset filters</button>
</div>
<div class="tut-grid" id="tutGrid"></div>
<div class="empty" id="tutEmpty">
<h3>No tutorials match just yet</h3>
<p>Try a broader search or reset the filters. Can't find what you're after? Tell us what you'd like to learn and we'll add it to the schedule.</p>
</div>
</div>
</section>
<!-- TRENDS -->
<section id="trends">
<div class="container">
<div class="sec-head">
<span class="eyebrow">Trend Reports</span>
<h2>What's moving on makers' benches this season.</h2>
<p class="lead">Our editors survey craft fairs, swap meets, supplier orders and thousands of community posts to spot the techniques, colours and collectables on the rise — so you can get ahead of the curve or simply enjoy the ride.</p>
</div>
<div class="trend-layout">
<div>
<article class="featured-trend">
<img src="https://picsum.photos/seed/tinker-trend-main/900/600" alt="Hand-dyed textiles and natural dye materials" width="900" height="600" loading="lazy">
<div class="txt">
<span class="eyebrow">Spring Report · 9 min read</span>
<h3>The Return of Slow Dyeing: Botanical Colour Goes Mainstream</h3>
<p>Avocado pits, onion skins and marigold heads are leaving the kitchen and heading into the dye pot. Search interest in natural dyeing has climbed 63% year-over-year, and we break down the mordants, fibres and colour palettes driving the revival.</p>
<a href="#" class="btn btn-primary btn-sm">Read the Report</a>
</div>
</article>
<div class="trend-list">
<article class="trend-item">
<img src="https://picsum.photos/seed/tinker-trend-a/400/300" alt="Reclaimed wooden furniture being refinished" width="400" height="300" loading="lazy">
<div>
<span class="eyebrow" style="margin:0">Upcycling</span>
<h3>Restoration Over Replacement</h3>
<p>Mid-century sideboards and school-desk chairs are fetching record prices on swap boards. We explain why hobbyists are choosing sympathetic restoration — keeping the patina, fixing the joinery — over full refinishing.</p>
<a href="#" class="more">Read more →</a>
</div>
</article>
<article class="trend-item">
<img src="https://picsum.photos/seed/tinker-trend-b/400/300" alt="Colourful yarn balls and crochet projects" width="400" height="300" loading="lazy">
<div>
<span class="eyebrow" style="margin:0">Textiles</span>
<h3>Chunky Crochet Meets Custom Design</h3>
<p>Oversized stitches, bold colour-blocking and made-to-measure garments are dominating this year's craft fairs. Learn how makers are adapting classic granny-square patterns into modern homewares.</p>
<a href="#" class="more">Read more →</a>
</div>
</article>
<article class="trend-item">
<img src="https://picsum.photos/seed/tinker-trend-c/400/300" alt="A shelf of vintage collectible cameras" width="400" height="300" loading="lazy">
<div>
<span class="eyebrow" style="margin:0">Collecting</span>
<h3>Analogue Revival: Cameras, Radios & Typewriters</h3>
<p>Collectors are seeking working, serviceable pieces rather than shelf ornaments. Our guide covers the models to watch, fair prices, and the basic repair skills that protect your investment.</p>
<a href="#" class="more">Read more →</a>
</div>
</article>
</div>
</div>
<aside aria-label="Sidebar">
<div class="widget">
<h4>Trending Now</h4>
<ol class="rank">
<li><div>Visible mending & sashiko<small>+112% this quarter</small></div></li>
<li><div>Air-dry clay homewares<small>+84% this quarter</small></div></li>
<li><div>Pressed-flower resin art<small>+71% this quarter</small></div></li>
<li><div>Hand-bound journals<small>+58% this quarter</small></div></li>
<li><div>Wood-turned pens<small>+43% this quarter</small></div></li>
</ol>
</div>
<div class="widget pattern-w">
<img src="https://picsum.photos/seed/tinker-pattern/500/300" alt="Preview of a free downloadable crochet pattern" width="500" height="300" loading="lazy">
<h4>Free Pattern of the Month</h4>
<p>The Fernhollow Market Tote — a sturdy, reclaimed-yarn crochet bag with an adjustable strap. Includes written and charted instructions.</p>
<a href="#" class="btn btn-primary btn-sm">Download Pattern</a>
</div>
<div class="widget">
<h4>Featured Makers</h4>
<div class="maker"><img src="https://i.pravatar.cc/112?u=maker-priya" alt="Priya N." width="56" height="56"><div><strong>Priya Nandakumar</strong><span>Block-print textiles · Portland</span></div></div>
<div class="maker"><img src="https://i.pravatar.cc/112?u=maker-tomas" alt="Tomás R." width="56" height="56"><div><strong>Tomás Rivera</strong><span>Chair restoration · Austin</span></div></div>
<div class="maker"><img src="https://i.pravatar.cc/112?u=maker-edith" alt="Edith W." width="56" height="56"><div><strong>Edith Whitlock</strong><span>Miniature dioramas · Leeds</span></div></div>
</div>
<div class="widget">
<h4>Browse by Topic</h4>
<div class="tagcloud">
<a href="#tutorials">#upcycling</a><a href="#tutorials">#restoration</a><a href="#tutorials">#natural-dye</a><a href="#tutorials">#joinery</a><a href="#tutorials">#kintsugi</a><a href="#tutorials">#zines</a><a href="#tutorials">#custom-design</a><a href="#tutorials">#miniatures</a>
</div>
</div>
</aside>
</div>
</div>
</section>
<!-- CLUBS -->
<section id="clubs">
<div class="container">
<div class="club-top">
<div>
<span class="eyebrow">Local Clubs</span>
<h2>Your people are closer than you think.</h2>
<p class="lead">From Tuesday-night knitting circles to monthly restoration clinics, our directory lists 126 welcoming groups. Most offer a free first visit, shared tools, and plenty of tea.</p>
</div>
<div class="club-search">
<label class="fl" for="clubQ" style="color:#cfc5b0">Search by city or club name</label>
<input type="search" id="clubQ" placeholder="e.g. Portland, Leeds, Chicago…">
<div class="club-filters" id="clubChips">
<button class="chip active" data-type="all">All</button>
<button class="chip" data-type="Textiles">Textiles</button>
<button class="chip" data-type="Woodworking">Woodworking</button>
<button class="chip" data-type="Collecting">Collecting</button>
<button class="chip" data-type="Repair">Repair & Restore</button>
</div>
</div>
</div>
<div class="club-layout">
<div class="club-list" id="clubList" aria-live="polite"></div>
<div class="club-side">
<img src="https://picsum.photos/seed/tinker-club-side/700/480" alt="Members of a craft club working around a large table" width="700" height="480" loading="lazy">
<div>
<h3>Start a Tinkerleaf Circle</h3>
<p>Can't find a club nearby? We'll help you launch one. Our Organiser Pack includes a venue checklist, welcome-night agenda, insurance guidance and a starter box of supplies for your first six meetings.</p>
<p>Hundreds of clubs began with just three people and a library meeting room.</p>
<a href="#" class="btn btn-primary">Start a Circle</a>
</div>
</div>
</div>
</div>
</section>
<!-- SHOP -->
<section id="shop">
<div class="container">
<div class="sec-head center">
<span class="eyebrow">Shop</span>
<h2>Supplies chosen by people who use them.</h2>
<p class="lead">Every tool, fibre and finish in our shop has survived months of real workshop abuse. Build your own kit or pick a ready-made bundle that matches a tutorial.</p>
</div>
<div class="shop-grid" id="shopGrid">
<article class="product">
<img src="https://picsum.photos/seed/tinker-prod1/500/500" alt="Beginner woodcarving kit" width="500" height="500" loading="lazy">
<div class="pb"><span class="cat">Woodworking</span><h3>Beginner Whittling Kit</h3><p style="font-size:.9rem;color:var(--muted);margin:0">Three carbon-steel knives, basswood blanks and a cut-resistant glove.</p>
<div class="price"><strong>$38</strong><button class="btn btn-ghost btn-sm add">Add to Kit</button></div></div>
</article>
<article class="product">
<img src="https://picsum.photos/seed/tinker-prod2/500/500" alt="Natural dye starter set" width="500" height="500" loading="lazy">
<div class="pb"><span class="cat">Textiles</span><h3>Botanical Dye Starter Set</h3><p style="font-size:.9rem;color:var(--muted);margin:0">Madder, weld, indigo, alum mordant and a pre-scoured cotton sampler.</p>
<div class="price"><strong>$54</strong><button class="btn btn-ghost btn-sm add">Add to Kit</button></div></div>
</article>
<article class="product">
<img src="https://picsum.photos/seed/tinker-prod3/500/500" alt="Furniture restoration set" width="500" height="500" loading="lazy">
<div class="pb"><span class="cat">Restoration</span><h3>Heirloom Restoration Set</h3><p style="font-size:.9rem;color:var(--muted);margin:0">Natural wax, shellac flakes, brass-bristle brushes and fine abrasives.</p>
<div class="price"><strong>$46</strong><button class="btn btn-ghost btn-sm add">Add to Kit</button></div></div>
</article>
<article class="product">
<img src="https://picsum.photos/seed/tinker-prod4/500/500" alt="Bookbinding supply kit" width="500" height="500" loading="lazy">
<div class="pb"><span class="cat">Paper & Print</span><h3>Hand-Bookbinding Bundle</h3><p style="font-size:.9rem;color:var(--muted);margin:0">Bone folder, waxed linen thread, awl, board and 40 sheets of cream paper.</p>
<div class="price"><strong>$32</strong><button class="btn btn-ghost btn-sm add">Add to Kit</button></div></div>
</article>
</div>
<div class="shop-banner">
<div>
<h3>Not sure what you need? Get the matching kit.</h3>
<p>Every tutorial links to a one-click supply bundle with 10% off. Free shipping over $60.</p>
</div>
<a href="#" class="btn btn-dark">Get Supplies</a>
</div>
</div>
</section>
<!-- COMMUNITY -->
<section id="community">
<div class="container">
<div class="sec-head center">
<span class="eyebrow">Community Stories</span>
<h2>Hobbies change lives, quietly.</h2>
<p class="lead">Our members range from retirees picking up their first chisel to professional designers rediscovering play. Here's what they say about finding their place at Tinkerleaf.</p>
</div>
<div class="testi-grid">
<article class="testi">
<div class="stars" aria-label="5 out of 5 stars">★★★★★</div>
<p>I'd inherited my grandfather's wobbly rocking chair and was terrified of ruining it. The restoration tutorial walked me through every joint and glue-up. It now sits proudly in my living room, and I've joined the local restorers' club.</p>
<div class="who"><img src="https://i.pravatar.cc/104?u=testi-marcus" alt="Marcus L." width="52" height="52"><div><strong>Marcus Lindqvist</strong><span>Restoration hobbyist, Minneapolis</span></div></div>
</article>
<article class="testi">
<div class="stars" aria-label="5 out of 5 stars">★★★★★</div>
<p>After a stressful year, the Tuesday knitting circle I found through the club finder became my anchor. We swap patterns, laugh loudly and nobody minds dropped stitches. The free patterns are gorgeous, too.</p>
<div class="who"><img src="https://i.pravatar.cc/104?u=testi-amara" alt="Amara O." width="52" height="52"><div><strong>Amara Okafor</strong><span>Knitter & club member, Atlanta</span></div></div>
</article>
<article class="testi">
<div class="stars" aria-label="5 out of 5 stars">★★★★★</div>
<p>As a collector of vintage enamel signs, I needed honest advice on cleaning without damaging the finish. The collector's guide and the community forum saved me from a costly mistake. Best resource I've found in years.</p>
<div class="who"><img src="https://i.pravatar.cc/104?u=testi-jonah" alt="Jonah B." width="52" height="52"><div><strong>Jonah Beckett</strong><span>Collector, Bristol UK</span></div></div>
</article>
</div>
<div class="join-strip">
<div><strong>1,900+</strong>Member projects shared each month</div>
<div><strong>340</strong>Free workshops hosted last year</div>
<div><strong>4.9/5</strong>Average tutorial rating</div>
</div>
<div style="text-align:center;margin-top:40px">
<a href="#" class="btn btn-primary">Join Community</a>
</div>
</div>
</section>
<!-- FAQ -->
<section id="faq">
<div class="container faq-wrap">
<div>
<span class="eyebrow">FAQ</span>
<h2>Questions from new makers</h2>
<p class="lead">Starting a new hobby can feel like a lot. Here are straight answers to the things beginners ask us most.</p>
<img src="https://picsum.photos/seed/tinker-faq/600/420" alt="Beginner crafting at a kitchen table" width="600" height="420" loading="lazy" style="border-radius:16px;margin-top:20px;box-shadow:var(--shadow)">
</div>
<div class="faq-list">
<details open>
<summary>I've never made anything before. Where do I start?</summary>
<p>Use the tutorial finder above and select "Beginner" with "Under 1 hour." Our most popular first projects are hand-stitched pouches, air-dry clay trinket dishes and simple upcycled planters. Each tutorial lists exact tools and materials, and includes a troubleshooting section for common mistakes.</p>
</details>
<details>
<summary>Are the tutorials and patterns really free?</summary>
<p>Yes — all 480+ tutorials are free to read, and we release a free downloadable pattern each month. Premium Member plans add printable PDF workbooks, video masterclasses and early access to new patterns, but you'll never be paywalled out of a core technique.</p>
</details>
<details>
<summary>How do I find or join a local club?</summary>
<p>Search the directory by city or craft, then use the "Join" button to message the organiser. Most clubs welcome drop-ins for a first visit. If nothing is nearby, join our online circles or start your own with the free Organiser Pack.</p>
</details>
<details>
<summary>What's your approach to sustainable materials?</summary>
<p>We prioritise reclaimed wood, deadstock fabric, natural fibres and low-toxicity finishes. Our shop labels items by material origin, and every upcycling tutorial offers alternatives using things you may already have at home.</p>
</details>
<details>
<summary>Can I submit my own tutorial or pattern?</summary>
<p>Absolutely. We love publishing community-made projects. Send us a short outline and photos of your finished piece, and our editors will help you shape it into a published guide with full credit and a feature on your maker profile.</p>
</details>
<details>
<summary>What's your returns policy on supplies?</summary>
<p>Unused tools and kits can be returned within 45 days for a full refund. If a material doesn't perform as described in a tutorial, contact us and we'll replace it or refund you, no questions asked.</p>
</details>
</div>
</div>
</section>
<!-- NEWSLETTER -->
<div class="news">
<div class="container">
<div class="news-box">
<div>
<h2>The Weekend Bench Letter</h2>
<p>One friendly email every Friday: a new tutorial, a trend worth knowing, an upcoming club event and a maker to follow. Plus a free starter pattern bundle when you join.</p>
</div>
<div>
<form class="news-form" id="newsForm" novalidate>
<label class="fl" for="email" style="position:absolute;left:-999px">Email address</label>
<input type="email" id="email" placeholder="you@example.com" required>
<button type="submit" class="btn">Subscribe</button>
</form>
<div class="form-msg" id="formMsg" role="status"></div>
<p class="small">Join 38,000 subscribers. Unsubscribe anytime — we never share your details.</p>
</div>
</div>
</div>
</div>
</main>
<footer>
<div class="container">
<div class="foot-grid">
<div class="foot-brand">
<a href="#top" class="brand">
<img src="https://placehold.co/104x104/e9b44c/143328?text=T&font=lora" alt="Tinkerleaf logo" width="52" height="52">
<span><span class="brand-name">Tinkerleaf</span><span class="brand-tag" style="display:block">Make slowly. Collect joyfully. Belong.</span></span>
</a>
<p>A community-powered home for crafters, DIYers, restorers and collectors. Built by makers, for makers.</p>
<div class="social">
<a href="#" aria-label="Instagram">Instagram</a>
<a href="#" aria-label="Pinterest">Pinterest</a>
<a href="#" aria-label="YouTube">YouTube</a>
<a href="#" aria-label="Facebook">Facebook</a>
</div>
</div>
<div>
<h4>Explore</h4>
<ul>
<li><a href="#about">About</a></li>
<li><a href="#tutorials">Craft Tutorials</a></li>
<li><a href="#trends">Trend Reports</a></li>
<li><a href="#clubs">Local Clubs</a></li>
<li><a href="#shop">Shop</a></li>
</ul>
</div>
<div>
<h4>Support</h4>
<ul>
<li><a href="#faq">FAQ</a></li>
<li><a href="#">Shipping & Returns</a></li>
<li><a href="#">Submit a Tutorial</a></li>
<li><a href="#">Organiser Pack</a></li>
<li><a href="#">Press</a></li>
</ul>
</div>
<div>
<h4>Contact</h4>
<ul>
<li>214 Millwright Lane, Suite 3<br>Asheville, NC 28801</li>
<li><a href="tel:+18285550142">(828) 555-0142</a></li>
<li><a href="mailto:hello@tinkerleaf.example">hello@tinkerleaf.example</a></li>
<li>Mon–Fri, 9am–5pm ET</li>
</ul>
</div>
</div>
<div class="foot-bottom">
<span>© <span id="year">2025</span> Tinkerleaf Collective, Inc. All rights reserved.</span>
<div><a href="#">Privacy Policy</a><a href="#">Terms of Service</a><a href="#">Cookie Settings</a></div>
</div>
</div>
</footer>
<script>
(function(){
// Year
document.getElementById('year').textContent = new Date().getFullYear();
// Mobile nav
var menuBtn = document.getElementById('menuBtn'), nav = document.getElementById('mainNav');
menuBtn.addEventListener('click', function(){
var open = nav.classList.toggle('open');
menuBtn.setAttribute('aria-expanded', open);
});
nav.addEventListener('click', function(e){ if(e.target.tagName==='A'){ nav.classList.remove('open'); menuBtn.setAttribute('aria-expanded','false'); }});
// Tutorials data
var tutorials = [
{t:'Hand-Carved Spoon from Green Wood',c:'Woodworking',l:'Beginner',m:150,d:'Learn to read grain, rough out a bowl and finish with food-safe oil using only a hatchet and a hook knife.',s:'t1'},
{t:'Shaker-Style Wall Peg Rail',c:'Woodworking',l:'Intermediate',m:240,d:'Cut mortises, turn simple pegs and mount a timeless peg rail that handles coats, baskets and plants.',s:'t2'},
{t:'Dovetail Keepsake Box',c:'Woodworking',l:'Advanced',m:600,d:'Master hand-cut dovetails and a lift-off lid with mitred splines. A full weekend of satisfying precision.',s:'t3'},
{t:'Visible Mending with Sashiko',c:'Textiles',l:'Beginner',m:60,d:'Rescue favourite denim with geometric running stitches that turn repairs into design features.',s:'t4'},
{t:'Chunky Crochet Market Tote',c:'Textiles',l:'Beginner',m:180,d:'A sturdy bag in reclaimed cotton yarn, written and charted instructions included. Great first project.',s:'t5'},
{t:'Botanical Dyeing with Kitchen Scraps',c:'Textiles',l:'Intermediate',m:180,d:'Extract rich colour from onion skins and avocado pits, and learn mordanting for lasting results.',s:'t6'},
{t:'Thrifted Jar to Pendant Lamp',c:'Upcycling',l:'Beginner',m:60,d:'Turn a glass storage jar into a warm pendant light with a safe, certified cord set and no special tools.',s:'t7'},
{t:'Pallet Wood Vertical Planter',c:'Upcycling',l:'Intermediate',m:240,d:'Dismantle, sand and reassemble reclaimed pallet boards into a space-saving herb garden.',s:'t8'},
{t:'Suitcase Pet Bed Makeover',c:'Upcycling',l:'Beginner',m:180,d:'Give a vintage suitcase a second life with a cushioned insert and sturdy leg mounts.',s:'t9'},
{t:'Pinch-Pot Trinket Dishes',c:'Ceramics',l:'Beginner',m:60,d:'No wheel required. Shape, texture and glaze small dishes using air-dry or kiln-fired clay.',s:'t10'},
{t:'Kintsugi Repair for Broken Bowls',c:'Ceramics',l:'Advanced',m:300,d:'Mend broken pottery with food-safe urushi alternative and gold powder for beautiful, honest repairs.',s:'t11'},
{t:'Japanese Stab-Bound Notebook',c:'Paper & Print',l:'Beginner',m:60,d:'Fold, punch and stitch a handsome journal with decorative four-hole binding.',s:'t12'},
{t:'Linocut Greeting Cards',c:'Paper & Print',l:'Intermediate',m:180,d:'Carve, ink and print your own designs. Includes tips on registration and multi-colour layering.',s:'t13'},
{t:'Restoring a Cane-Seat Chair',c:'Restoration',l:'Intermediate',m:600,d:'Strip old finish, repair splits and weave a new cane seat in this weekend heirloom restoration.',s:'t14'},
{t:'Reviving a Vintage Tube Radio',c:'Restoration',l:'Advanced',m:600,d:'Safely service capacitors, clean contacts and revive a 1950s tube radio. Safety guide included.',s:'t15'},
{t:'Brass Hardware Polishing & Patina',c:'Restoration',l:'Beginner',m:60,d:'Choose between gleaming finish and aged patina, with gentle methods that protect antique hardware.',s:'t16'}
];
var grid = document.getElementById('tutGrid'), empty = document.getElementById('tutEmpty'),
countEl = document.getElementById('resultCount'), q = document.getElementById('q'),
craft = document.getElementById('craft'), time = document.getElementById('time'),
level = 'all';
function fmt(m){ return m<60? m+' min' : (m%60===0? (m/60)+' hr' : Math.floor(m/60)+' hr '+(m%60)+' min'); }
function esc(s){ return s.replace(/&/g,'&').replace(/</g,'<'); }
function renderTut(){
var term = q.value.trim().toLowerCase(), cv = craft.value, tv = time.value;
var list = tutorials.filter(function(x){
if(cv!=='all' && x.c!==cv) return false;
if(level!=='all' && x.l!==level) return false;
if(tv!=='all'){
var lim = parseInt(tv,10);
if(lim===999){ if(x.m<300) return false; }
else if(x.m>lim) return false;
}
if(term && (x.t+' '+x.d+' '+x.c).toLowerCase().indexOf(term)===-1) return false;
return true;
});
grid.innerHTML = list.map(function(x){
return '<article class="card"><div class="thumb"><img src="https://picsum.photos/seed/tinker-'+x.s+'/600/400" alt="'+esc(x.t)+'" width="600" height="400" loading="lazy"><span class="tag">'+esc(x.c)+'</span></div>'+
'<div class="body"><div class="meta"><span>⏱ '+fmt(x.m)+'</span><span>📶 '+x.l+'</span></div><h3>'+esc(x.t)+'</h3><p>'+esc(x.d)+'</p><a href="#" class="btn btn-ghost btn-sm">Start Tutorial</a></div></article>';
}).join('');
countEl.textContent = 'Showing '+list.length+' tutorial'+(list.length===1?'':'s');
empty.classList.toggle('show', list.length===0);
}
q.addEventListener('input', renderTut);
craft.addEventListener('change', renderTut);
time.addEventListener('change', renderTut);
document.getElementById('levelChips').addEventListener('click', function(e){
var b = e.target.closest('.chip'); if(!b) return;
level = b.dataset.level;
this.querySelectorAll('.chip').forEach(function(c){ c.classList.toggle('active', c===b); });
renderTut();
});
document.getElementById('resetBtn').addEventListener('click', function(){
q.value=''; craft.value='all'; time.value='all'; level='all';
document.querySelectorAll('#levelChips .chip').forEach(function(c){ c.classList.toggle('active', c.dataset.level==='all'); });
renderTut();
});
renderTut();
// Clubs
var clubs = [
{n:'Maplewood Knit & Natter',city:'Portland, OR',type:'Textiles',w:'Tuesdays · 6:30 pm',m:48,s:'c1',d:'Relaxed knitting and crochet circle for all abilities. Yarn swaps on the first Tuesday.'},
{n:'Southside Makers Guild',city:'Austin, TX',type:'Woodworking',w:'Saturdays · 9 am',m:92,s:'c2',d:'Shared workshop with jointers, lathes and a friendly mentor on every bench.'},
{n:'Lakeshore Vintage Collectors',city:'Chicago, IL',type:'Collecting',w:'1st Sunday · 1 pm',m:130,s:'c3',d:'Monthly swap meet for cameras, enamel signs, vinyl and pocket watches.'},
{n:'The Repair Café Collective',city:'Asheville, NC',type:'Repair',w:'Thursdays · 5 pm',m:61,s:'c4',d:'Bring broken lamps, chairs, radios and clothing. Volunteers help you fix them yourself.'},
{n:'Brickyard Stitch Society',city:'Leeds, UK',type:'Textiles',w:'Wednesdays · 7 pm',m:37,s:'c5',d:'Embroidery, sashiko and visible-mending sessions in a cosy converted warehouse.'},
{n:'Cedar Row Woodturners',city:'Minneapolis, MN',type:'Woodworking',w:'2nd & 4th Sat · 10 am',m:55,s:'c6',d:'Bowls, pens and spindles with experienced turners. Loaner lathes for new members.'},
{n:'Harbour Tube Radio Society',city:'Bristol, UK',type:'Repair',w:'Last Fri · 7 pm',m:29,s:'c7',d:'Restoration clinics and safe-service workshops for valve radios and amplifiers.'}
];
var clubList = document.getElementById('clubList'), clubQ = document.getElementById('clubQ'), ctype='all';
function renderClubs(){
var term = clubQ.value.trim().toLowerCase();
var res = clubs.filter(function(c){
return (ctype==='all'||c.type===ctype) && (!term || (c.n+' '+c.city).toLowerCase().indexOf(term)>-1);
});
clubList.innerHTML = res.length ? res.map(function(c){
return '<article class="club"><img src="https://picsum.photos/seed/tinker-'+c.s+'/200/200" alt="" width="96" height="96" loading="lazy"><div><h3>'+esc(c.n)+'</h3><p class="when">'+esc(c.city)+' · '+esc(c.w)+'</p><p>'+esc(c.d)+' <strong style="color:#fff">'+c.m+' members.</strong></p></div><a href="#" class="btn btn-primary btn-sm">Join</a></article>';
}).join('') : '<p style="padding:20px">No clubs found for that search yet — why not <a href="#" style="color:var(--mustard)">start a circle</a>?</p>';
}
clubQ.addEventListener('input', renderClubs);
document.getElementById('clubChips').addEventListener('click', function(e){
var b = e.target.closest('.chip'); if(!b) return;
ctype = b.dataset.type;
this.querySelectorAll('.chip').forEach(function(c){ c.classList.toggle('active', c===b); });
renderClubs();
});
renderClubs();
// Shop cart
var count = 0, cartEl = document.getElementById('cartCount');
document.getElementById('shopGrid').addEventListener('click', function(e){
var b = e.target.closest('.add'); if(!b) return;
var added = b.classList.toggle('added');
b.textContent = added ? '✓ In Kit' : 'Add to Kit';
count += added ? 1 : -1;
cartEl.textContent = count;
});
// Newsletter
document.getElementById('newsForm').addEventListener('submit', function(e){
e.preventDefault();
var em = document.getElementById('email'), msg = document.getElementById('formMsg');
if(/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(em.value)){
msg.textContent = 'Welcome to the bench! Check your inbox for your free pattern bundle.';
em.value = '';
} else {
msg.textContent = 'Please enter a valid email address.';
}
});
})();
</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:52:28.423Z",
"url": "https://benchmark.aimac.invalid/446d290243b742c956d712d3a8f9898640db5141be16d0f76cbf38a6ee1f918a.html",
"toolOptions": {
"runOnly": {
"type": "tag",
"values": [
"wcag2a",
"wcag2aa",
"wcag21a",
"wcag21aa",
"wcag22a",
"wcag22aa"
]
},
"resultTypes": [
"violations"
],
"reporter": "v1"
},
"inapplicable": [
{
"id": "area-alt",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag244",
"wcag412",
"section508",
"section508.22.a",
"TTv5",
"TT6.a",
"EN-301-549",
"EN-9.2.4.4",
"EN-9.4.1.2",
"ACT"
],
"description": "Ensure <area> elements of image maps have alternative text",
"help": "Active <area> elements must have alternative text",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/area-alt?application=axeAPI",
"nodes": []
},
{
"id": "aria-braille-equivalent",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure aria-braillelabel and aria-brailleroledescription have a non-braille equivalent",
"help": "aria-braille attributes must have a non-braille equivalent",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-braille-equivalent?application=axeAPI",
"nodes": []
},
{
"id": "aria-command-name",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"TTv5",
"TT6.a",
"EN-301-549",
"EN-9.4.1.2",
"ACT"
],
"description": "Ensure every ARIA button, link and menuitem has an accessible name",
"help": "ARIA commands must have an accessible name",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-command-name?application=axeAPI",
"nodes": []
},
{
"id": "aria-input-field-name",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"TTv5",
"TT5.c",
"EN-301-549",
"EN-9.4.1.2",
"ACT"
],
"description": "Ensure every ARIA input field has an accessible name",
"help": "ARIA input fields must have an accessible name",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-input-field-name?application=axeAPI",
"nodes": []
},
{
"id": "aria-meter-name",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag111",
"EN-301-549",
"EN-9.1.1.1"
],
"description": "Ensure every ARIA meter node has an accessible name",
"help": "ARIA meter nodes must have an accessible name",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-meter-name?application=axeAPI",
"nodes": []
},
{
"id": "aria-progressbar-name",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag111",
"EN-301-549",
"EN-9.1.1.1"
],
"description": "Ensure every ARIA progressbar node has an accessible name",
"help": "ARIA progressbar nodes must have an accessible name",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-progressbar-name?application=axeAPI",
"nodes": []
},
{
"id": "aria-required-children",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag131",
"EN-301-549",
"EN-9.1.3.1"
],
"description": "Ensure elements with an ARIA role that require child roles contain them",
"help": "Certain ARIA roles must contain particular children",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-required-children?application=axeAPI",
"nodes": []
},
{
"id": "aria-required-parent",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag131",
"EN-301-549",
"EN-9.1.3.1"
],
"description": "Ensure elements with an ARIA role that require parent roles are contained by them",
"help": "Certain ARIA roles must be contained by particular parents",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-required-parent?application=axeAPI",
"nodes": []
},
{
"id": "aria-toggle-field-name",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"TTv5",
"TT5.c",
"EN-301-549",
"EN-9.4.1.2",
"ACT"
],
"description": "Ensure every ARIA toggle field has an accessible name",
"help": "ARIA toggle fields must have an accessible name",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-toggle-field-name?application=axeAPI",
"nodes": []
},
{
"id": "aria-tooltip-name",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure every ARIA tooltip node has an accessible name",
"help": "ARIA tooltip nodes must have an accessible name",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-tooltip-name?application=axeAPI",
"nodes": []
},
{
"id": "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": "role-img-alt",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag111",
"section508",
"section508.22.a",
"TTv5",
"TT7.a",
"EN-301-549",
"EN-9.1.1.1",
"ACT"
],
"description": "Ensure [role=\"img\"] elements have alternative text",
"help": "[role=\"img\"] elements must have an alternative text",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/role-img-alt?application=axeAPI",
"nodes": []
},
{
"id": "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": "<a href=\"#top\" class=\"brand\" aria-label=\"Tinkerleaf home\">",
"target": [
"a[aria-label=\"Tinkerleaf home\"]"
]
}
]
},
{
"id": "aria-conditional-attr",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure ARIA attributes are used as described in the specification of the element's role",
"help": "ARIA attributes must be used as specified for the element's role",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-conditional-attr?application=axeAPI",
"nodes": [
{
"any": [],
"all": [
{
"id": "aria-conditional-attr",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "ARIA attribute is allowed"
}
],
"none": [],
"impact": null,
"html": "<a href=\"#top\" class=\"brand\" aria-label=\"Tinkerleaf home\">",
"target": [
"a[aria-label=\"Tinkerleaf home\"]"
]
}
]
},
{
"id": "aria-deprecated-role",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure elements do not use deprecated roles",
"help": "Deprecated ARIA roles must not be used",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-deprecated-role?application=axeAPI",
"nodes": [
{
"any": [],
"all": [],
"none": [
{
"id": "deprecatedrole",
"data": null,
"relatedNodes": [],
"impact": "minor",
"message": "ARIA role is not deprecated"
}
],
"impact": null,
"html": "<div class=\"finder\" role=\"search\" aria-label=\"Tutorial finder\">",
"target": [
".finder"
]
}
]
},
{
"id": "aria-hidden-body",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag131",
"wcag412",
"EN-301-549",
"EN-9.1.3.1",
"EN-9.4.1.2"
],
"description": "Ensure aria-hidden=\"true\" is not present on the document body.",
"help": "aria-hidden=\"true\" must not be present on the document body",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-hidden-body?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "aria-hidden-body",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "No aria-hidden attribute is present on document body"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<body>",
"target": [
"body"
]
}
]
},
{
"id": "aria-hidden-focus",
"impact": null,
"tags": [
"cat.name-role-value",
"wcag2a",
"wcag412",
"TTv5",
"TT6.a",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure aria-hidden elements are not focusable nor contain focusable elements",
"help": "ARIA hidden element must not be focusable or contain focusable elements",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-hidden-focus?application=axeAPI",
"nodes": [
{
"any": [],
"all": [
{
"id": "focusable-modal-open",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "No focusable elements while a modal is open"
},
{
"id": "focusable-disabled",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "No focusable elements contained within element"
},
{
"id": "focusable-not-tabbable",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "No focusable elements contained within element"
}
],
"none": [],
"impact": null,
"html": "<div class=\"collage\" aria-hidden=\"true\">",
"target": [
".collage"
]
}
]
},
{
"id": "aria-prohibited-attr",
"impact": "serious",
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure ARIA attributes are not prohibited for an element's role",
"help": "Elements must only use permitted ARIA attributes",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-prohibited-attr?application=axeAPI",
"nodes": [
{
"any": [],
"all": [],
"none": [
{
"id": "aria-prohibited-attr",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "ARIA attribute is allowed"
}
],
"impact": null,
"html": "<a href=\"#top\" class=\"brand\" aria-label=\"Tinkerleaf home\">",
"target": [
"a[aria-label=\"Tinkerleaf home\"]"
]
}
]
},
{
"id": "aria-required-attr",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure elements with ARIA roles have all required ARIA attributes",
"help": "Required ARIA attributes must be provided",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-required-attr?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "aria-required-attr",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "All required ARIA attributes are present"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<div class=\"finder\" role=\"search\" aria-label=\"Tutorial finder\">",
"target": [
".finder"
]
}
]
},
{
"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": "<div class=\"finder\" role=\"search\" aria-label=\"Tutorial finder\">",
"target": [
".finder"
]
}
]
},
{
"id": "aria-valid-attr-value",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure all ARIA attributes have valid values",
"help": "ARIA attributes must conform to valid values",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-valid-attr-value?application=axeAPI",
"nodes": [
{
"any": [],
"all": [
{
"id": "aria-valid-attr-value",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "ARIA attribute values are valid"
},
{
"id": "aria-errormessage",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "aria-errormessage exists and references elements visible to screen readers that use a supported aria-errormessage technique"
},
{
"id": "aria-level",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "aria-level values are valid"
}
],
"none": [],
"impact": null,
"html": "<a href=\"#top\" class=\"brand\" aria-label=\"Tinkerleaf home\">",
"target": [
"a[aria-label=\"Tinkerleaf home\"]"
]
}
]
},
{
"id": "aria-valid-attr",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure attributes that begin with aria- are valid ARIA attributes",
"help": "ARIA attributes must conform to valid names",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-valid-attr?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "aria-valid-attr",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "ARIA attribute name is valid"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<a href=\"#top\" class=\"brand\" aria-label=\"Tinkerleaf home\">",
"target": [
"a[aria-label=\"Tinkerleaf home\"]"
]
}
]
},
{
"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": "<section class=\"hero\" style=\"padding-bottom:90px\">",
"target": [
".hero"
]
}
]
},
{
"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 active\" data-level=\"all\">All levels</button>",
"target": [
"button[data-level=\"all\"]"
]
}
]
},
{
"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>Make slowly. Collect <em>joyfully.</em> Belong.</h1>",
"target": [
"h1"
]
},
{
"html": "<h2>A workshop, a library and a village square \u2014 all for hobbyists.</h2>",
"target": [
"div:nth-child(2) > h2"
]
},
{
"html": "<h3>Tested Tutorials</h3>",
"target": [
".feature:nth-child(1) > h3"
]
},
{
"html": "<h3>Sustainable by Default</h3>",
"target": [
".feature:nth-child(2) > h3"
]
},
{
"html": "<h3>Local Connections</h3>",
"target": [
".feature:nth-child(3) > h3"
]
},
{
"html": "<h3>Curated Supplies</h3>",
"target": [
".feature:nth-child(4) > h3"
]
},
{
"html": "<h2>Find your next weekend project in seconds.</h2>",
"target": [
"#tutorials > .container > .sec-head > h2"
]
},
{
"html": "<h3>Hand-Carved Spoon from Green Wood</h3>",
"target": [
".card:nth-child(1) > .body > h3"
]
},
{
"html": "<h3>Shaker-Style Wall Peg Rail</h3>",
"target": [
".card:nth-child(2) > .body > h3"
]
},
{
"html": "<h3>Dovetail Keepsake Box</h3>",
"target": [
".card:nth-child(3) > .body > h3"
]
},
{
"html": "<h3>Visible Mending with Sashiko</h3>",
"target": [
".card:nth-child(4) > .body > h3"
]
},
{
"html": "<h3>Chunky Crochet Market Tote</h3>",
"target": [
".card:nth-child(5) > .body > h3"
]
},
{
"html": "<h3>Botanical Dyeing with Kitchen Scraps</h3>",
"target": [
".card:nth-child(6) > .body > h3"
]
},
{
"html": "<h3>Thrifted Jar to Pendant Lamp</h3>",
"target": [
".card:nth-child(7) > .body > h3"
]
},
{
"html": "<h3>Pallet Wood Vertical Planter</h3>",
"target": [
".card:nth-child(8) > .body > h3"
]
},
{
"html": "<h3>Suitcase Pet Bed Makeover</h3>",
"target": [
".card:nth-child(9) > .body > h3"
]
},
{
"html": "<h3>Pinch-Pot Trinket Dishes</h3>",
"target": [
".card:nth-child(10) > .body > h3"
]
},
{
"html": "<h3>Kintsugi Repair for Broken Bowls</h3>",
"target": [
".card:nth-child(11) > .body > h3"
]
},
{
"html": "<h3>Japanese Stab-Bound Notebook</h3>",
"target": [
".card:nth-child(12) > .body > h3"
]
},
{
"html": "<h3>Linocut Greeting Cards</h3>",
"target": [
".card:nth-child(13) > .body > h3"
]
},
{
"html": "<h3>Restoring a Cane-Seat Chair</h3>",
"target": [
".card:nth-child(14) > .body > h3"
]
},
{
"html": "<h3>Reviving a Vintage Tube Radio</h3>",
"target": [
".card:nth-child(15) > .body > h3"
]
},
{
"html": "<h3>Brass Hardware Polishing & Patina</h3>",
"target": [
".card:nth-child(16) > .body > h3"
]
},
{
"html": "<h2>What's moving on makers' benches this season.</h2>",
"target": [
"#trends > .container > .sec-head > h2"
]
},
{
"html": "<h3>The Return of Slow Dyeing: Botanical Colour Goes Mainstream</h3>",
"target": [
".txt > h3"
]
},
{
"html": "<h3>Restoration Over Replacement</h3>",
"target": [
".trend-item:nth-child(1) > div > h3"
]
},
{
"html": "<h3>Chunky Crochet Meets Custom Design</h3>",
"target": [
".trend-item:nth-child(2) > div > h3"
]
},
{
"html": "<h3>Analogue Revival: Cameras, Radios & Typewriters</h3>",
"target": [
".trend-item:nth-child(3) > div > h3"
]
},
{
"html": "<h4>Trending Now</h4>",
"target": [
".widget:nth-child(1) > h4"
]
},
{
"html": "<h4>Free Pattern of the Month</h4>",
"target": [
".pattern-w > h4"
]
},
{
"html": "<h4>Featured Makers</h4>",
"target": [
".widget:nth-child(3) > h4"
]
},
{
"html": "<h4>Browse by Topic</h4>",
"target": [
".widget:nth-child(4) > h4"
]
},
{
"html": "<h2>Your people are closer than you think.</h2>",
"target": [
".club-top > div:nth-child(1) > h2"
]
},
{
"html": "<h3>Maplewood Knit & Natter</h3>",
"target": [
".club:nth-child(1) > div > h3"
]
},
{
"html": "<h3>Southside Makers Guild</h3>",
"target": [
".club:nth-child(2) > div > h3"
]
},
{
"html": "<h3>Lakeshore Vintage Collectors</h3>",
"target": [
".club:nth-child(3) > div > h3"
]
},
{
"html": "<h3>The Repair Caf\u00e9 Collective</h3>",
"target": [
".club:nth-child(4) > div > h3"
]
},
{
"html": "<h3>Brickyard Stitch Society</h3>",
"target": [
".club:nth-child(5) > div > h3"
]
},
{
"html": "<h3>Cedar Row Woodturners</h3>",
"target": [
".club:nth-child(6) > div > h3"
]
},
{
"html": "<h3>Harbour Tube Radio Society</h3>",
"target": [
".club:nth-child(7) > div > h3"
]
},
{
"html": "<h3>Start a Tinkerleaf Circle</h3>",
"target": [
".club-side > div > h3"
]
},
{
"html": "<h2>Supplies chosen by people who use them.</h2>",
"target": [
"#shop > .container > .center.sec-head > h2"
]
},
{
"html": "<h3>Beginner Whittling Kit</h3>",
"target": [
".product:nth-child(1) > .pb > h3"
]
},
{
"html": "<h3>Botanical Dye Starter Set</h3>",
"target": [
".product:nth-child(2) > .pb > h3"
]
},
{
"html": "<h3>Heirloom Restoration Set</h3>",
"target": [
".product:nth-child(3) > .pb > h3"
]
},
{
"html": "<h3>Hand-Bookbinding Bundle</h3>",
"target": [
".product:nth-child(4) > .pb > h3"
]
},
{
"html": "<h3>Not sure what you need? Get the matching kit.</h3>",
"target": [
".shop-banner > div > h3"
]
},
{
"html": "<h2>Hobbies change lives, quietly.</h2>",
"target": [
"#community > .container > .center.sec-head > h2"
]
},
{
"html": "<h2>Questions from new makers</h2>",
"target": [
".faq-wrap > div:nth-child(1) > h2"
]
},
{
"html": "<h2>The Weekend Bench Letter</h2>",
"target": [
".news-box > div:nth-child(1) > h2"
]
},
{
"html": "<h4>Explore</h4>",
"target": [
".foot-grid > div:nth-child(2) > h4"
]
},
{
"html": "<h4>Support</h4>",
"target": [
".foot-grid > div:nth-child(3) > h4"
]
},
{
"html": "<h4>Contact</h4>",
"target": [
".foot-grid > 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": "#f3e9d6",
"bgColor": "#143328",
"contrastRatio": 11.36,
"fontSize": "10.6pt (14.08px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [],
"impact": "serious",
"message": "Element has sufficient color contrast of 11.36"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<div class=\"topbar\">\ud83c\udf3f Spring Swap Season is here \u2014 free shipping on Maker Kits over $60. <a href=\"#shop\">Get Supplies \u2192</a></div>",
"target": [
".topbar"
]
}
]
},
{
"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": "mainNav",
"relatedNodes": [],
"impact": "critical",
"message": "Document has no elements referenced with ARIA or labels that share the same id attribute"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<nav id=\"mainNav\" aria-label=\"Primary\">",
"target": [
"#mainNav"
]
}
]
},
{
"id": "form-field-multiple-labels",
"impact": null,
"tags": [
"cat.forms",
"wcag2a",
"wcag332",
"TTv5",
"TT5.c",
"EN-301-549",
"EN-9.3.3.2"
],
"description": "Ensure form field does not have multiple label elements",
"help": "Form field must not have multiple label elements",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/form-field-multiple-labels?application=axeAPI",
"nodes": [
{
"any": [],
"all": [],
"none": [
{
"id": "multiple-label",
"data": null,
"relatedNodes": [
{
"html": "<label class=\"fl\" for=\"q\">Search</label>",
"target": [
"label[for=\"q\"]"
]
}
],
"impact": "moderate",
"message": "Form field does not have multiple label elements"
}
],
"impact": null,
"html": "<input type=\"search\" id=\"q\" placeholder=\"Try \u201cmacram\u00e9\u201d, \u201cchair\u201d, \u201cresin\u201d\u2026\">",
"target": [
"#q"
]
}
]
},
{
"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/104x104/1f4d3f/e9b44c?text=T&font=lora\" alt=\"Tinkerleaf logo\" width=\"52\" height=\"52\">",
"target": [
"a[aria-label=\"Tinkerleaf home\"] > img[alt=\"Tinkerleaf logo\"][width=\"52\"][height=\"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": {
"explicitLabel": "Search"
},
"relatedNodes": [
{
"html": "<label class=\"fl\" for=\"q\">Search</label>",
"target": [
"label[for=\"q\"]"
]
}
],
"impact": "critical",
"message": "Element has an explicit <label>"
},
{
"id": "non-empty-placeholder",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "Element has a placeholder attribute"
}
],
"all": [],
"none": [
{
"id": "hidden-explicit-label",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "Form element has a visible explicit <label>"
}
],
"impact": null,
"html": "<input type=\"search\" id=\"q\" placeholder=\"Try \u201cmacram\u00e9\u201d, \u201cchair\u201d, \u201cresin\u201d\u2026\">",
"target": [
"#q"
]
}
]
},
{
"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=\"topbar\">\ud83c\udf3f Spring Swap Season is here \u2014 free shipping on Maker Kits over $60. <a href=\"#shop\">Get Supplies \u2192</a></div>",
"target": [
".topbar"
]
}
],
"impact": "serious",
"message": "Links can be distinguished from surrounding text by visual styling"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<a href=\"#shop\">Get Supplies \u2192</a>",
"target": [
".topbar > a[href$=\"#shop\"]"
]
}
]
},
{
"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 href=\"#main\" class=\"skip\">Skip to content</a>",
"target": [
".skip"
]
}
]
},
{
"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": [
"#mainNav > 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=\"#about\">About</a></li>",
"target": [
"#mainNav > 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\">",
"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/104x104/1f4d3f/e9b44c?text=T&font=lora\" alt=\"Tinkerleaf logo\" width=\"52\" height=\"52\">",
"target": [
"a[aria-label=\"Tinkerleaf home\"] > img[alt=\"Tinkerleaf logo\"][width=\"52\"][height=\"52\"]"
]
}
]
},
{
"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": [
{
"any": [
{
"id": "focusable-content",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "Element contains focusable elements"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<div class=\"club-list\" id=\"clubList\" aria-live=\"polite\">",
"target": [
"#clubList"
]
}
]
},
{
"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": {
"explicitLabel": "Craft"
},
"relatedNodes": [
{
"html": "<label class=\"fl\" for=\"craft\">Craft</label>",
"target": [
"label[for=\"craft\"]"
]
}
],
"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=\"craft\">",
"target": [
"#craft"
]
}
]
},
{
"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>I've never made anything before. Where do I start?</summary>",
"target": [
"details[open=\"\"] > 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": 152.8,
"height": 48
},
"relatedNodes": [],
"impact": "serious",
"message": "Control has sufficient size (152.8px 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 href=\"#main\" class=\"skip\">Skip to content</a>",
"target": [
".skip"
]
}
]
}
],
"incomplete": [
{
"id": "aria-prohibited-attr",
"impact": "serious",
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure ARIA attributes are not prohibited for an element's role",
"help": "Elements must only use permitted ARIA attributes",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-prohibited-attr?application=axeAPI",
"nodes": [
{
"any": [],
"all": [],
"none": [
{
"id": "aria-prohibited-attr",
"data": {
"role": null,
"nodeName": "div",
"messageKey": "noRoleSingular",
"prohibited": [
"aria-label"
]
},
"relatedNodes": [],
"impact": "serious",
"message": "aria-label attribute is not well supported on a div with no valid role attribute."
}
],
"impact": "serious",
"html": "<div class=\"interests\" aria-label=\"Interests we cover\">\n <ul>\n <li>Upcycling</li><li>Woodworking</li><li>Knitting & Crochet</li><li>Restoration</li><li>Ceramics</li><li>Collecting</li><li>Paper Craft</li><li>Custom Design</li>\n </ul>\n</div>",
"target": [
".interests"
],
"failureSummary": "Fix all of the following:\n aria-label attribute is not well supported on a div with no valid role attribute."
}
]
},
{
"id": "color-contrast",
"impact": "serious",
"tags": [
"cat.color",
"wcag2aa",
"wcag143",
"TTv5",
"TT13.c",
"EN-301-549",
"EN-9.1.4.3",
"ACT"
],
"description": "Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds",
"help": "Elements must meet minimum color contrast ratio thresholds",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/color-contrast?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": null,
"bgColor": null,
"contrastRatio": 0,
"fontSize": "9.6pt (12.8px)",
"fontWeight": "bold",
"messageKey": "bgGradient",
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section class=\"hero\" style=\"padding-bottom:90px\">",
"target": [
".hero"
]
}
],
"impact": "serious",
"message": "Element's background color could not be determined due to a background gradient"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"eyebrow\">The home for hands-on hobbies</span>",
"target": [
".hero-grid > div:nth-child(1) > .eyebrow"
],
"failureSummary": "Fix any of the following:\n Element's background color could not be determined due to a background gradient"
}
]
}
],
"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": "#ffffff",
"bgColor": "#c9512b",
"contrastRatio": 4.47,
"fontSize": "11.6pt (15.52px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<a href=\"#tutorials\" class=\"btn btn-primary\">Find a Tutorial</a>",
"target": [
".btn-primary.btn[href$=\"#tutorials\"]"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.47 (foreground color: #ffffff, background color: #c9512b, font size: 11.6pt (15.52px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#tutorials\" class=\"btn btn-primary\">Find a Tutorial</a>",
"target": [
".btn-primary.btn[href$=\"#tutorials\"]"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.47 (foreground color: #ffffff, background color: #c9512b, font size: 11.6pt (15.52px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c9512b",
"bgColor": "#fbf6ee",
"contrastRatio": 4.15,
"fontSize": "9.6pt (12.8px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<body>",
"target": [
"body"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.15 (foreground color: #c9512b, background color: #fbf6ee, font size: 9.6pt (12.8px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"eyebrow\">About Tinkerleaf</span>",
"target": [
".about-grid > div:nth-child(2) > .eyebrow"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.15 (foreground color: #c9512b, background color: #fbf6ee, font size: 9.6pt (12.8px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c9512b",
"bgColor": "#f1e7d6",
"contrastRatio": 3.65,
"fontSize": "9.6pt (12.8px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section id=\"tutorials\">",
"target": [
"#tutorials"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.65 (foreground color: #c9512b, background color: #f1e7d6, font size: 9.6pt (12.8px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"eyebrow\">Craft Tutorials \u00b7 Interactive Finder</span>",
"target": [
"#tutorials > .container > .sec-head > .eyebrow"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.65 (foreground color: #c9512b, background color: #f1e7d6, font size: 9.6pt (12.8px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c9512b",
"bgColor": "#f1e7d6",
"contrastRatio": 3.65,
"fontSize": "12.8pt (17px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section id=\"tutorials\">",
"target": [
"#tutorials"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.65 (foreground color: #c9512b, background color: #f1e7d6, font size: 12.8pt (17px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<button id=\"resetBtn\" type=\"button\">Reset filters</button>",
"target": [
"#resetBtn"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.65 (foreground color: #c9512b, background color: #f1e7d6, font size: 12.8pt (17px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c9512b",
"bgColor": "#fbf6ee",
"contrastRatio": 4.15,
"fontSize": "9.6pt (12.8px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<body>",
"target": [
"body"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.15 (foreground color: #c9512b, background color: #fbf6ee, font size: 9.6pt (12.8px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"eyebrow\">Trend Reports</span>",
"target": [
"#trends > .container > .sec-head > .eyebrow"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.15 (foreground color: #c9512b, background color: #fbf6ee, font size: 9.6pt (12.8px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c9512b",
"bgColor": "#fffdf9",
"contrastRatio": 4.4,
"fontSize": "9.6pt (12.8px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<article class=\"trend-item\">",
"target": [
".trend-item:nth-child(1)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.4 (foreground color: #c9512b, background color: #fffdf9, font size: 9.6pt (12.8px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"eyebrow\" style=\"margin:0\">Upcycling</span>",
"target": [
".trend-item:nth-child(1) > div > .eyebrow"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.4 (foreground color: #c9512b, background color: #fffdf9, font size: 9.6pt (12.8px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c9512b",
"bgColor": "#fffdf9",
"contrastRatio": 4.4,
"fontSize": "11.0pt (14.72px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<article class=\"trend-item\">",
"target": [
".trend-item:nth-child(1)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.4 (foreground color: #c9512b, background color: #fffdf9, font size: 11.0pt (14.72px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#\" class=\"more\">Read more \u2192</a>",
"target": [
".trend-item:nth-child(1) > div > .more[href=\"#\"]"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.4 (foreground color: #c9512b, background color: #fffdf9, font size: 11.0pt (14.72px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c9512b",
"bgColor": "#fffdf9",
"contrastRatio": 4.4,
"fontSize": "9.6pt (12.8px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<article class=\"trend-item\">",
"target": [
".trend-item:nth-child(2)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.4 (foreground color: #c9512b, background color: #fffdf9, font size: 9.6pt (12.8px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"eyebrow\" style=\"margin:0\">Textiles</span>",
"target": [
".trend-item:nth-child(2) > div > .eyebrow"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.4 (foreground color: #c9512b, background color: #fffdf9, font size: 9.6pt (12.8px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c9512b",
"bgColor": "#fffdf9",
"contrastRatio": 4.4,
"fontSize": "11.0pt (14.72px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<article class=\"trend-item\">",
"target": [
".trend-item:nth-child(2)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.4 (foreground color: #c9512b, background color: #fffdf9, font size: 11.0pt (14.72px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#\" class=\"more\">Read more \u2192</a>",
"target": [
".trend-item:nth-child(2) > div > .more[href=\"#\"]"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.4 (foreground color: #c9512b, background color: #fffdf9, font size: 11.0pt (14.72px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c9512b",
"bgColor": "#fffdf9",
"contrastRatio": 4.4,
"fontSize": "9.6pt (12.8px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<article class=\"trend-item\">",
"target": [
".trend-item:nth-child(3)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.4 (foreground color: #c9512b, background color: #fffdf9, font size: 9.6pt (12.8px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"eyebrow\" style=\"margin:0\">Collecting</span>",
"target": [
".trend-item:nth-child(3) > div > .eyebrow"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.4 (foreground color: #c9512b, background color: #fffdf9, font size: 9.6pt (12.8px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c9512b",
"bgColor": "#fffdf9",
"contrastRatio": 4.4,
"fontSize": "11.0pt (14.72px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<article class=\"trend-item\">",
"target": [
".trend-item:nth-child(3)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.4 (foreground color: #c9512b, background color: #fffdf9, font size: 11.0pt (14.72px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#\" class=\"more\">Read more \u2192</a>",
"target": [
".trend-item:nth-child(3) > div > .more[href=\"#\"]"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.4 (foreground color: #c9512b, background color: #fffdf9, font size: 11.0pt (14.72px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#ffffff",
"bgColor": "#c9512b",
"contrastRatio": 4.47,
"fontSize": "10.6pt (14.08px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<a href=\"#\" class=\"btn btn-primary btn-sm\">Download Pattern</a>",
"target": [
".pattern-w > .btn-primary.btn-sm.btn"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.47 (foreground color: #ffffff, background color: #c9512b, font size: 10.6pt (14.08px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#\" class=\"btn btn-primary btn-sm\">Download Pattern</a>",
"target": [
".pattern-w > .btn-primary.btn-sm.btn"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.47 (foreground color: #ffffff, background color: #c9512b, font size: 10.6pt (14.08px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#ffffff",
"bgColor": "#c9512b",
"contrastRatio": 4.47,
"fontSize": "10.6pt (14.08px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<a href=\"#\" class=\"btn btn-primary btn-sm\">Join</a>",
"target": [
".club:nth-child(1) > .btn-primary.btn-sm.btn"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.47 (foreground color: #ffffff, background color: #c9512b, font size: 10.6pt (14.08px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#\" class=\"btn btn-primary btn-sm\">Join</a>",
"target": [
".club:nth-child(1) > .btn-primary.btn-sm.btn"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.47 (foreground color: #ffffff, background color: #c9512b, font size: 10.6pt (14.08px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#ffffff",
"bgColor": "#c9512b",
"contrastRatio": 4.47,
"fontSize": "10.6pt (14.08px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<a href=\"#\" class=\"btn btn-primary btn-sm\">Join</a>",
"target": [
".club:nth-child(2) > .btn-primary.btn-sm.btn"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.47 (foreground color: #ffffff, background color: #c9512b, font size: 10.6pt (14.08px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#\" class=\"btn btn-primary btn-sm\">Join</a>",
"target": [
".club:nth-child(2) > .btn-primary.btn-sm.btn"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.47 (foreground color: #ffffff, background color: #c9512b, font size: 10.6pt (14.08px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#ffffff",
"bgColor": "#c9512b",
"contrastRatio": 4.47,
"fontSize": "10.6pt (14.08px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<a href=\"#\" class=\"btn btn-primary btn-sm\">Join</a>",
"target": [
".club:nth-child(3) > .btn-primary.btn-sm.btn"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.47 (foreground color: #ffffff, background color: #c9512b, font size: 10.6pt (14.08px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#\" class=\"btn btn-primary btn-sm\">Join</a>",
"target": [
".club:nth-child(3) > .btn-primary.btn-sm.btn"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.47 (foreground color: #ffffff, background color: #c9512b, font size: 10.6pt (14.08px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#ffffff",
"bgColor": "#c9512b",
"contrastRatio": 4.47,
"fontSize": "10.6pt (14.08px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<a href=\"#\" class=\"btn btn-primary btn-sm\">Join</a>",
"target": [
".club:nth-child(4) > .btn-primary.btn-sm.btn"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.47 (foreground color: #ffffff, background color: #c9512b, font size: 10.6pt (14.08px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#\" class=\"btn btn-primary btn-sm\">Join</a>",
"target": [
".club:nth-child(4) > .btn-primary.btn-sm.btn"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.47 (foreground color: #ffffff, background color: #c9512b, font size: 10.6pt (14.08px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#ffffff",
"bgColor": "#c9512b",
"contrastRatio": 4.47,
"fontSize": "10.6pt (14.08px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<a href=\"#\" class=\"btn btn-primary btn-sm\">Join</a>",
"target": [
".club:nth-child(5) > .btn-primary.btn-sm.btn"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.47 (foreground color: #ffffff, background color: #c9512b, font size: 10.6pt (14.08px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#\" class=\"btn btn-primary btn-sm\">Join</a>",
"target": [
".club:nth-child(5) > .btn-primary.btn-sm.btn"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.47 (foreground color: #ffffff, background color: #c9512b, font size: 10.6pt (14.08px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#ffffff",
"bgColor": "#c9512b",
"contrastRatio": 4.47,
"fontSize": "10.6pt (14.08px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<a href=\"#\" class=\"btn btn-primary btn-sm\">Join</a>",
"target": [
".club:nth-child(6) > .btn-primary.btn-sm.btn"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.47 (foreground color: #ffffff, background color: #c9512b, font size: 10.6pt (14.08px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#\" class=\"btn btn-primary btn-sm\">Join</a>",
"target": [
".club:nth-child(6) > .btn-primary.btn-sm.btn"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.47 (foreground color: #ffffff, background color: #c9512b, font size: 10.6pt (14.08px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#ffffff",
"bgColor": "#c9512b",
"contrastRatio": 4.47,
"fontSize": "10.6pt (14.08px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<a href=\"#\" class=\"btn btn-primary btn-sm\">Join</a>",
"target": [
".club:nth-child(7) > .btn-primary.btn-sm.btn"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.47 (foreground color: #ffffff, background color: #c9512b, font size: 10.6pt (14.08px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#\" class=\"btn btn-primary btn-sm\">Join</a>",
"target": [
".club:nth-child(7) > .btn-primary.btn-sm.btn"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.47 (foreground color: #ffffff, background color: #c9512b, font size: 10.6pt (14.08px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#ffffff",
"bgColor": "#c9512b",
"contrastRatio": 4.47,
"fontSize": "11.6pt (15.52px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<a href=\"#\" class=\"btn btn-primary\">Start a Circle</a>",
"target": [
".club-side > div > .btn-primary.btn[href=\"#\"]"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.47 (foreground color: #ffffff, background color: #c9512b, font size: 11.6pt (15.52px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#\" class=\"btn btn-primary\">Start a Circle</a>",
"target": [
".club-side > div > .btn-primary.btn[href=\"#\"]"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.47 (foreground color: #ffffff, background color: #c9512b, font size: 11.6pt (15.52px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c9512b",
"bgColor": "#fbf6ee",
"contrastRatio": 4.15,
"fontSize": "9.6pt (12.8px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<body>",
"target": [
"body"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.15 (foreground color: #c9512b, background color: #fbf6ee, font size: 9.6pt (12.8px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"eyebrow\">Shop</span>",
"target": [
"#shop > .container > .center.sec-head > .eyebrow"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.15 (foreground color: #c9512b, background color: #fbf6ee, font size: 9.6pt (12.8px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c9512b",
"bgColor": "#fffdf9",
"contrastRatio": 4.4,
"fontSize": "8.9pt (11.84px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<article class=\"product\">",
"target": [
".product:nth-child(1)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.4 (foreground color: #c9512b, background color: #fffdf9, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"cat\">Woodworking</span>",
"target": [
".product:nth-child(1) > .pb > .cat"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.4 (foreground color: #c9512b, background color: #fffdf9, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c9512b",
"bgColor": "#fffdf9",
"contrastRatio": 4.4,
"fontSize": "8.9pt (11.84px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<article class=\"product\">",
"target": [
".product:nth-child(2)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.4 (foreground color: #c9512b, background color: #fffdf9, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"cat\">Textiles</span>",
"target": [
".product:nth-child(2) > .pb > .cat"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.4 (foreground color: #c9512b, background color: #fffdf9, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c9512b",
"bgColor": "#fffdf9",
"contrastRatio": 4.4,
"fontSize": "8.9pt (11.84px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<article class=\"product\">",
"target": [
".product:nth-child(3)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.4 (foreground color: #c9512b, background color: #fffdf9, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"cat\">Restoration</span>",
"target": [
".product:nth-child(3) > .pb > .cat"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.4 (foreground color: #c9512b, background color: #fffdf9, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c9512b",
"bgColor": "#fffdf9",
"contrastRatio": 4.4,
"fontSize": "8.9pt (11.84px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<article class=\"product\">",
"target": [
".product:nth-child(4)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.4 (foreground color: #c9512b, background color: #fffdf9, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"cat\">Paper & Print</span>",
"target": [
".product:nth-child(4) > .pb > .cat"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.4 (foreground color: #c9512b, background color: #fffdf9, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c9512b",
"bgColor": "#f1e7d6",
"contrastRatio": 3.65,
"fontSize": "9.6pt (12.8px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section id=\"community\">",
"target": [
"#community"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.65 (foreground color: #c9512b, background color: #f1e7d6, font size: 9.6pt (12.8px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"eyebrow\">Community Stories</span>",
"target": [
"#community > .container > .center.sec-head > .eyebrow"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.65 (foreground color: #c9512b, background color: #f1e7d6, font size: 9.6pt (12.8px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#ffffff",
"bgColor": "#c9512b",
"contrastRatio": 4.47,
"fontSize": "11.6pt (15.52px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<a href=\"#\" class=\"btn btn-primary\">Join Community</a>",
"target": [
"div:nth-child(4) > .btn-primary.btn[href=\"#\"]"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.47 (foreground color: #ffffff, background color: #c9512b, font size: 11.6pt (15.52px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#\" class=\"btn btn-primary\">Join Community</a>",
"target": [
"div:nth-child(4) > .btn-primary.btn[href=\"#\"]"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.47 (foreground color: #ffffff, background color: #c9512b, font size: 11.6pt (15.52px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c9512b",
"bgColor": "#fbf6ee",
"contrastRatio": 4.15,
"fontSize": "9.6pt (12.8px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<body>",
"target": [
"body"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.15 (foreground color: #c9512b, background color: #fbf6ee, font size: 9.6pt (12.8px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"eyebrow\">FAQ</span>",
"target": [
".faq-wrap > div:nth-child(1) > .eyebrow"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.15 (foreground color: #c9512b, background color: #fbf6ee, font size: 9.6pt (12.8px), font weight: bold). Expected contrast ratio of 4.5:1"
}
]
},
{
"id": "target-size",
"impact": "serious",
"tags": [
"cat.sensory-and-visual-cues",
"wcag22aa",
"wcag258"
],
"description": "Ensure touch targets have sufficient size and space",
"help": "All touch targets must be 24px large, or leave sufficient space",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/target-size?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "target-size",
"data": {
"messageKey": "partiallyObscured",
"minSize": 24,
"width": 68.8,
"height": 21
},
"relatedNodes": [
{
"html": "<a href=\"#clubs\">Local Clubs</a>",
"target": [
"#mainNav > ul > li:nth-child(4) > a[href$=\"#clubs\"]"
]
}
],
"impact": "serious",
"message": "Target has insufficient size because it is partially obscured (smallest space is 68.8px by 21px, should be at least 24px by 24px)"
},
{
"id": "target-offset",
"data": {
"closestOffset": 16.2,
"minOffset": 24
},
"relatedNodes": [
{
"html": "<a href=\"#tutorials\">#natural-dye</a>",
"target": [
"a[href$=\"#tutorials\"]:nth-child(3)"
]
}
],
"impact": "serious",
"message": "Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 16.2px instead of at least 24px."
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#tutorials\">#zines</a>",
"target": [
"a[href$=\"#tutorials\"]:nth-child(6)"
],
"failureSummary": "Fix any of the following:\n Target has insufficient size because it is partially obscured (smallest space is 68.8px by 21px, should be at least 24px by 24px)\n Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 16.2px instead of at least 24px."
},
{
"any": [
{
"id": "target-size",
"data": {
"messageKey": "partiallyObscured",
"minSize": 24,
"width": 133.5,
"height": 21
},
"relatedNodes": [
{
"html": "<a href=\"#clubs\">Local Clubs</a>",
"target": [
"#mainNav > ul > li:nth-child(4) > a[href$=\"#clubs\"]"
]
},
{
"html": "<a href=\"#community\">Community</a>",
"target": [
"li:nth-child(5) > a[href$=\"#community\"]"
]
},
{
"html": "<a href=\"#faq\">FAQ</a>",
"target": [
"li:nth-child(6) > a[href$=\"#faq\"]"
]
}
],
"impact": "serious",
"message": "Target has insufficient size because it is partially obscured (smallest space is 133.5px by 21px, should be at least 24px by 24px)"
},
{
"id": "target-offset",
"data": {
"closestOffset": 16.2,
"minOffset": 24
},
"relatedNodes": [
{
"html": "<a href=\"#tutorials\">#joinery</a>",
"target": [
"a[href$=\"#tutorials\"]:nth-child(4)"
]
}
],
"impact": "serious",
"message": "Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 16.2px instead of at least 24px."
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#tutorials\">#custom-design</a>",
"target": [
"a[href$=\"#tutorials\"]:nth-child(7)"
],
"failureSummary": "Fix any of the following:\n Target has insufficient size because it is partially obscured (smallest space is 133.5px by 21px, should be at least 24px by 24px)\n Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 16.2px instead of at least 24px."
},
{
"any": [
{
"id": "target-size",
"data": {
"messageKey": "partiallyObscured",
"minSize": 24,
"width": 103,
"height": 21
},
"relatedNodes": [
{
"html": "<a href=\"#faq\">FAQ</a>",
"target": [
"li:nth-child(6) > a[href$=\"#faq\"]"
]
},
{
"html": "<a href=\"#shop\" class=\"shop-link\">Shop <span class=\"cart-count\" id=\"cartCount\" aria-label=\"Items in kit\">0</span></a>",
"target": [
".shop-link"
]
}
],
"impact": "serious",
"message": "Target has insufficient size because it is partially obscured (smallest space is 103px by 21px, should be at least 24px by 24px)"
},
{
"id": "target-offset",
"data": {
"closestOffset": 16.2,
"minOffset": 24
},
"relatedNodes": [
{
"html": "<a href=\"#tutorials\">#kintsugi</a>",
"target": [
"a[href$=\"#tutorials\"]:nth-child(5)"
]
}
],
"impact": "serious",
"message": "Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 16.2px instead of at least 24px."
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#tutorials\">#miniatures</a>",
"target": [
"a[href$=\"#tutorials\"]:nth-child(8)"
],
"failureSummary": "Fix any of the following:\n Target has insufficient size because it is partially obscured (smallest space is 103px by 21px, should be at least 24px by 24px)\n Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 16.2px instead of at least 24px."
}
]
}
],
"coverage": {
"contract": "main-document-vertical-scroll",
"complete": true,
"positions": [
{
"y": 0,
"height": 13409
},
{
"y": 576,
"height": 13409
},
{
"y": 1152,
"height": 13409
},
{
"y": 1728,
"height": 13409
},
{
"y": 2304,
"height": 13409
},
{
"y": 2880,
"height": 13409
},
{
"y": 3456,
"height": 13409
},
{
"y": 4032,
"height": 13409
},
{
"y": 4608,
"height": 13409
},
{
"y": 5184,
"height": 13409
},
{
"y": 5760,
"height": 13409
},
{
"y": 6336,
"height": 13409
},
{
"y": 6912,
"height": 13409
},
{
"y": 7488,
"height": 13409
},
{
"y": 8064,
"height": 13409
},
{
"y": 8640,
"height": 13409
},
{
"y": 9216,
"height": 13409
},
{
"y": 9792,
"height": 13409
},
{
"y": 10368,
"height": 13409
},
{
"y": 10944,
"height": 13409
},
{
"y": 11520,
"height": 13409
},
{
"y": 12096,
"height": 13409
},
{
"y": 12672,
"height": 13409
},
{
"y": 12689,
"height": 13409
}
],
"scans": 25,
"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 "Hobbies and Interests" 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: "Hobbies and Interests"
- Description: Hobbies, crafts, DIY projects, collecting, and special interest communities.
**Your Creative Task:**
1. **Invent:** Create a unique, professional-sounding site name and a strong tagline fitting the "Hobbies and Interests" category.
2. **Define Page:** Determine the most effective primary page type (e.g., homepage, service landing page, category portal) to showcase this fictional entity.
3. **Design:** Develop an opinionated, modern, and professional layout. Make distinct choices about structure and flow.
**Content & Structure Requirements (Deliver a COMPLETE page):**
- **Overall:** The final page must feel substantial and complete, with realistic amounts of text (multiple paragraphs per section where appropriate, avoid single sentences), well-integrated placeholder images, and logical flow. It should look like a real website a business would proudly use.
- **HEADER:** Include the invented site name, tagline, a logo placeholder image, and a primary navigation bar. Ensure the navigation has **at least 5-7 clearly defined, relevant links** including: "About", "Craft Tutorials", "Shop".
- **MAIN CONTENT:** Structure this area with **at least 3-4 distinct, well-developed sections**.
- Address key topics relevant to the "Hobbies and Interests" category. Consider themes similar to: "Trend Reports", "Local Clubs", "DIY Tutorials".
- **Content Depth:** Populate each section with **substantial, realistic text** (multiple sentences/paragraphs). Use authentic industry language and terminology like: "upcycling", "custom design", "restoration".
- **Visuals:** Integrate relevant placeholder images logically within the content sections.
- **Calls to Action:** Include clear and contextually relevant CTAs. Use strong verbs similar to: "Download Pattern", "Join Community", "Get Supplies".
- **ENGAGEMENT (Recommended):** Strongly consider incorporating **one meaningful interactive element** that would genuinely benefit a user in the "Hobbies and Interests" sector. Ideas similar but not limited to: "tutorial finder".
- **SIDEBAR (Optional):** If your design includes a sidebar, populate it with **useful, relevant content**. Ideas: "craft trends", "new tutorials", "featured makers".
- **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.