Anthropic Claude Haiku 5.5 – Hobbies and Interests

via Anthropic · Generated

  • AIMAC Debt 4.90
  • Cost $0.012
  • Total Violations 21
  • HTML Size 54 KB
  • Em Dashes 0

Screenshot

View Anthropic Claude Haiku 5.5 Hobbies and Interests page View Live Page

Accessibility Issues Found

21 Serious

  • color-contrast serious 21 instances

    Elements must meet minimum color contrast ratio thresholds

    Example HTML <a href="#tutorials" class="btn btn-primary">Watch Video Tutorials</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.0">
  <title>Tinkerloom | Make, Mend, and Master the Things You Love</title>
  <meta name="description" content="Tinkerloom is a hobby community for DIY tutorials, honest tool reviews, beginner guides, and custom design projects. Get supplies, learn new crafting techniques, and join makers who share your passion.">
  <style>
    :root {
      --forest: #2F5D50;
      --forest-dark: #1F4037;
      --clay: #C8694A;
      --clay-light: #F6E3DA;
      --cream: #FBF7F1;
      --sand: #EFE6D8;
      --ink: #1E2A27;
      --muted: #5C6B67;
      --white: #FFFFFF;
      --radius: 14px;
      --shadow: 0 10px 30px rgba(31, 64, 55, 0.12);
      --container: 1200px;
    }

    * { box-sizing: border-box; margin: 0; padding: 0; }
    html { scroll-behavior: smooth; }
    body {
      font-family: "Source Sans 3", "Source Sans Pro", "Open Sans", system-ui, -apple-system, sans-serif;
      color: var(--ink);
      background: var(--cream);
      line-height: 1.65;
      font-size: 17px;
    }
    img { max-width: 100%; display: block; height: auto; }
    a { color: var(--forest); text-decoration: none; }
    a:hover { color: var(--clay); }
    h1, h2, h3, h4 {
      font-family: "Playfair Display", Georgia, serif;
      line-height: 1.2;
      color: var(--forest-dark);
    }
    h1 { font-size: clamp(2.2rem, 4.5vw, 3.6rem); }
    h2 { font-size: clamp(1.8rem, 3vw, 2.5rem); margin-bottom: 0.6rem; }
    h3 { font-size: 1.35rem; margin-bottom: 0.5rem; }
    p + p { margin-top: 1rem; }
    .container { max-width: var(--container); margin: 0 auto; padding: 0 24px; }
    section { padding: 88px 0; }
    .eyebrow {
      display: inline-block;
      font-size: 0.8rem;
      font-weight: 700;
      letter-spacing: 0.14em;
      text-transform: uppercase;
      color: var(--clay);
      margin-bottom: 0.75rem;
    }
    .section-intro { max-width: 720px; color: var(--muted); margin-bottom: 2.5rem; }

    /* Buttons */
    .btn {
      display: inline-flex;
      align-items: center;
      gap: 8px;
      padding: 13px 24px;
      border-radius: 999px;
      font-weight: 600;
      font-size: 1rem;
      border: 2px solid transparent;
      cursor: pointer;
      transition: all 0.2s ease;
      font-family: inherit;
    }
    .btn-primary { background: var(--clay); color: var(--white); }
    .btn-primary:hover { background: #B35636; color: var(--white); transform: translateY(-2px); }
    .btn-outline { border-color: var(--forest); color: var(--forest); background: transparent; }
    .btn-outline:hover { background: var(--forest); color: var(--white); }
    .btn-light { background: var(--white); color: var(--forest-dark); }
    .btn-light:hover { background: var(--clay-light); color: var(--forest-dark); }
    .btn-link { color: var(--forest); font-weight: 600; }
    .btn-link:hover { color: var(--clay); }

    /* Header */
    .site-header {
      position: sticky;
      top: 0;
      z-index: 100;
      background: rgba(251, 247, 241, 0.96);
      backdrop-filter: blur(8px);
      border-bottom: 1px solid var(--sand);
    }
    .topbar {
      background: var(--forest-dark);
      color: #E9F1EE;
      font-size: 0.9rem;
      padding: 8px 0;
    }
    .topbar .container { display: flex; justify-content: space-between; flex-wrap: wrap; gap: 8px; }
    .topbar a { color: #E9F1EE; }
    .topbar a:hover { color: #F3B9A3; }
    .header-main {
      display: flex;
      align-items: center;
      justify-content: space-between;
      padding: 16px 0;
      gap: 24px;
    }
    .brand { display: flex; align-items: center; gap: 14px; color: var(--ink); }
    .brand img { width: 56px; height: 56px; border-radius: 14px; }
    .brand-text strong {
      display: block;
      font-family: "Playfair Display", Georgia, serif;
      font-size: 1.6rem;
      color: var(--forest-dark);
      line-height: 1;
    }
    .brand-text span { font-size: 0.92rem; color: var(--muted); font-style: italic; }
    .main-nav ul { list-style: none; display: flex; gap: 6px; flex-wrap: wrap; }
    .main-nav a {
      display: block;
      padding: 10px 14px;
      border-radius: 8px;
      color: var(--ink);
      font-weight: 600;
    }
    .main-nav a:hover, .main-nav a.active { background: var(--sand); color: var(--forest); }
    .nav-toggle {
      display: none;
      background: none;
      border: 2px solid var(--forest);
      color: var(--forest);
      border-radius: 8px;
      padding: 8px 12px;
      font-weight: 700;
      cursor: pointer;
      font-family: inherit;
    }

    /* Hero */
    .hero {
      padding: 80px 0 96px;
      background:
        radial-gradient(circle at 10% 20%, var(--clay-light) 0, transparent 40%),
        radial-gradient(circle at 90% 80%, #DCE8E2 0, transparent 40%),
        var(--cream);
    }
    .hero-grid {
      display: grid;
      grid-template-columns: 1.05fr 1fr;
      gap: 56px;
      align-items: center;
    }
    .hero p.lead { font-size: 1.2rem; color: var(--muted); margin: 1.25rem 0 2rem; max-width: 560px; }
    .hero-actions { display: flex; flex-wrap: wrap; gap: 14px; align-items: center; }
    .hero-stats {
      display: flex;
      gap: 36px;
      margin-top: 44px;
      padding-top: 28px;
      border-top: 1px solid var(--sand);
      flex-wrap: wrap;
    }
    .hero-stats div strong {
      display: block;
      font-family: "Playfair Display", Georgia, serif;
      font-size: 2rem;
      color: var(--forest);
      line-height: 1;
    }
    .hero-stats div span { font-size: 0.92rem; color: var(--muted); }
    .hero-image { position: relative; }
    .hero-image img {
      border-radius: 24px;
      box-shadow: var(--shadow);
      width: 100%;
      height: 540px;
      object-fit: cover;
    }
    .hero-badge {
      position: absolute;
      left: -26px;
      bottom: 40px;
      background: var(--white);
      border-radius: var(--radius);
      box-shadow: var(--shadow);
      padding: 16px 20px;
      display: flex;
      gap: 14px;
      align-items: center;
      max-width: 280px;
    }
    .hero-badge img { width: 52px; height: 52px; border-radius: 50%; object-fit: cover; }
    .hero-badge strong { display: block; font-size: 0.98rem; color: var(--forest-dark); }
    .hero-badge span { font-size: 0.85rem; color: var(--muted); }

    /* Layout with sidebar */
    .content-layout {
      display: grid;
      grid-template-columns: minmax(0, 1fr) 340px;
      gap: 48px;
      align-items: start;
    }
    .main-column > section { padding: 72px 0; border-bottom: 1px solid var(--sand); }
    .main-column > section:first-child { padding-top: 0; }
    .main-column > section:last-child { border-bottom: none; }

    /* Feature grid */
    .feature-grid {
      display: grid;
      grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
      gap: 22px;
      margin-top: 8px;
    }
    .feature {
      background: var(--white);
      padding: 28px;
      border-radius: var(--radius);
      border: 1px solid var(--sand);
      transition: transform 0.2s ease, box-shadow 0.2s ease;
    }
    .feature:hover { transform: translateY(-4px); box-shadow: var(--shadow); }
    .feature-icon {
      width: 52px;
      height: 52px;
      border-radius: 14px;
      background: var(--clay-light);
      color: var(--clay);
      display: grid;
      place-items: center;
      font-size: 1.5rem;
      margin-bottom: 16px;
      font-weight: 700;
    }
    .feature p { color: var(--muted); font-size: 0.97rem; }

    /* Intro split */
    .split {
      display: grid;
      grid-template-columns: 1fr 1fr;
      gap: 56px;
      align-items: center;
    }
    .split img { border-radius: var(--radius); box-shadow: var(--shadow); width: 100%; height: 440px; object-fit: cover; }
    .split p { color: #3D4A47; }
    .checklist { list-style: none; margin: 20px 0 28px; }
    .checklist li {
      position: relative;
      padding-left: 30px;
      margin-bottom: 10px;
      color: #3D4A47;
    }
    .checklist li::before {
      content: "\2713";
      position: absolute;
      left: 0;
      top: 0;
      width: 20px;
      height: 20px;
      background: var(--forest);
      color: var(--white);
      border-radius: 50%;
      font-size: 0.75rem;
      display: grid;
      place-items: center;
      font-weight: 700;
    }

    /* Tutorial cards */
    .card-grid {
      display: grid;
      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
      gap: 26px;
    }
    .card {
      background: var(--white);
      border-radius: var(--radius);
      overflow: hidden;
      box-shadow: 0 4px 16px rgba(31, 64, 55, 0.07);
      display: flex;
      flex-direction: column;
      transition: transform 0.2s ease, box-shadow 0.2s ease;
    }
    .card:hover { transform: translateY(-5px); box-shadow: var(--shadow); }
    .card-media { position: relative; }
    .card-media img { width: 100%; height: 200px; object-fit: cover; }
    .tag {
      position: absolute;
      top: 14px;
      left: 14px;
      background: var(--white);
      color: var(--forest-dark);
      font-size: 0.78rem;
      font-weight: 700;
      padding: 5px 12px;
      border-radius: 999px;
    }
    .play {
      position: absolute;
      right: 14px;
      bottom: 14px;
      width: 48px;
      height: 48px;
      border-radius: 50%;
      background: rgba(31, 64, 55, 0.9);
      color: var(--white);
      display: grid;
      place-items: center;
      font-size: 1rem;
    }
    .card-body { padding: 22px; display: flex; flex-direction: column; flex: 1; }
    .card-body p { color: var(--muted); font-size: 0.96rem; margin-bottom: 16px; }
    .meta { display: flex; gap: 14px; font-size: 0.85rem; color: var(--muted); margin-bottom: 12px; flex-wrap: wrap; }
    .card-body .btn-link { margin-top: auto; }
    .difficulty { color: var(--clay); font-weight: 700; }

    /* Review */
    .review-grid {
      display: grid;
      grid-template-columns: repeat(3, 1fr);
      gap: 22px;
    }
    .review-card {
      background: var(--white);
      border-radius: var(--radius);
      border: 1px solid var(--sand);
      padding: 26px;
      display: flex;
      flex-direction: column;
    }
    .review-card img.product { width: 100%; height: 170px; object-fit: cover; border-radius: 10px; margin-bottom: 18px; }
    .stars { color: #E0A526; letter-spacing: 2px; font-size: 1rem; margin-bottom: 6px; }
    .score {
      display: inline-block;
      background: var(--forest);
      color: var(--white);
      font-weight: 700;
      border-radius: 8px;
      padding: 3px 10px;
      font-size: 0.9rem;
      margin-bottom: 10px;
    }
    .review-card p { color: var(--muted); font-size: 0.96rem; }
    .pros-cons { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin: 14px 0; font-size: 0.88rem; }
    .pros-cons strong { display: block; margin-bottom: 2px; color: var(--forest-dark); }
    .pros-cons ul { padding-left: 16px; color: var(--muted); }
    .review-card .btn-link { margin-top: auto; padding-top: 10px; }

    /* Calculator */
    .calculator-wrap {
      background: var(--forest-dark);
      color: #E9F1EE;
      border-radius: 24px;
      padding: 48px;
      display: grid;
      grid-template-columns: 1fr 1fr;
      gap: 48px;
      box-shadow: var(--shadow);
    }
    .calculator-wrap h2, .calculator-wrap h3 { color: var(--white); }
    .calculator-wrap .eyebrow { color: #F3B9A3; }
    .calculator-wrap p { color: #CFE0D9; }
    .calc-form { display: grid; gap: 16px; }
    .calc-form label { display: block; font-weight: 600; font-size: 0.92rem; margin-bottom: 6px; color: #E9F1EE; }
    .calc-form input, .calc-form select {
      width: 100%;
      padding: 12px 14px;
      border-radius: 10px;
      border: 1px solid rgba(255,255,255,0.2);
      background: rgba(255,255,255,0.08);
      color: var(--white);
      font-size: 1rem;
      font-family: inherit;
    }
    .calc-form select option { color: var(--ink); }
    .calc-form input:focus, .calc-form select:focus { outline: 3px solid #F3B9A3; outline-offset: 1px; }
    .calc-row { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
    .calc-form .btn { justify-content: center; margin-top: 6px; }
    .calc-results {
      background: var(--white);
      color: var(--ink);
      border-radius: 18px;
      padding: 28px;
    }
    .calc-results h3 { color: var(--forest-dark); }
    .calc-results ul { list-style: none; margin-top: 14px; }
    .calc-results li {
      display: flex;
      justify-content: space-between;
      padding: 12px 0;
      border-bottom: 1px dashed var(--sand);
      font-size: 0.98rem;
    }
    .calc-results li strong { color: var(--clay); }
    .calc-note { font-size: 0.85rem; color: var(--muted); margin-top: 14px; }
    .calc-error { color: #B3261E; font-weight: 600; min-height: 1.4em; font-size: 0.9rem; color: #FFB4A8; }

    /* Guides with steps */
    .guide-layout { display: grid; grid-template-columns: 1fr 1fr; gap: 48px; align-items: start; }
    .steps { list-style: none; counter-reset: step; display: grid; gap: 18px; }
    .steps li {
      counter-increment: step;
      position: relative;
      padding: 20px 20px 20px 78px;
      background: var(--white);
      border-radius: var(--radius);
      border: 1px solid var(--sand);
    }
    .steps li::before {
      content: counter(step);
      position: absolute;
      left: 20px;
      top: 20px;
      width: 42px;
      height: 42px;
      border-radius: 50%;
      background: var(--clay);
      color: var(--white);
      font-family: "Playfair Display", Georgia, serif;
      font-size: 1.2rem;
      display: grid;
      place-items: center;
      font-weight: 700;
    }
    .steps h3 { font-size: 1.1rem; margin-bottom: 4px; }
    .steps p { color: var(--muted); font-size: 0.96rem; }
    .guide-image img { width: 100%; height: 320px; object-fit: cover; border-radius: var(--radius); box-shadow: var(--shadow); margin-bottom: 26px; }
    .guide-image .btn { margin-top: 4px; }

    /* Accordion (FAQ) */
    .faq-list { display: grid; gap: 14px; max-width: 860px; }
    details {
      background: var(--white);
      border: 1px solid var(--sand);
      border-radius: 12px;
      padding: 0;
      overflow: hidden;
    }
    details[open] { border-color: var(--forest); box-shadow: 0 6px 18px rgba(31,64,55,0.08); }
    summary {
      cursor: pointer;
      list-style: none;
      padding: 20px 24px;
      font-weight: 700;
      color: var(--forest-dark);
      display: flex;
      justify-content: space-between;
      align-items: center;
      gap: 16px;
    }
    summary::-webkit-details-marker { display: none; }
    summary::after {
      content: "+";
      font-size: 1.6rem;
      color: var(--clay);
      line-height: 1;
      transition: transform 0.2s ease;
    }
    details[open] summary::after { content: "\2212"; }
    details p { padding: 0 24px 22px; color: var(--muted); }

    /* Testimonials */
    .testimonial-grid {
      display: grid;
      grid-template-columns: repeat(3, 1fr);
      gap: 22px;
    }
    .testimonial {
      background: var(--white);
      border-radius: var(--radius);
      padding: 28px;
      border-left: 5px solid var(--clay);
      box-shadow: 0 4px 16px rgba(31,64,55,0.06);
    }
    .testimonial blockquote { font-style: italic; color: #3D4A47; margin-bottom: 20px; font-size: 1.02rem; }
    .author { display: flex; align-items: center; gap: 12px; }
    .author img { width: 48px; height: 48px; border-radius: 50%; }
    .author strong { display: block; color: var(--forest-dark); font-size: 0.98rem; }
    .author span { font-size: 0.85rem; color: var(--muted); }

    /* Newsletter / CTA banner */
    .cta-banner {
      background: linear-gradient(120deg, var(--clay) 0%, #B35636 100%);
      color: var(--white);
      border-radius: 24px;
      padding: 56px;
      display: flex;
      align-items: center;
      justify-content: space-between;
      gap: 40px;
      flex-wrap: wrap;
    }
    .cta-banner h2 { color: var(--white); margin-bottom: 8px; }
    .cta-banner p { color: #FCEBE3; max-width: 560px; }
    .cta-banner form { display: flex; gap: 10px; flex-wrap: wrap; }
    .cta-banner input {
      padding: 14px 18px;
      border-radius: 999px;
      border: none;
      min-width: 260px;
      font-size: 1rem;
      font-family: inherit;
    }

    /* Sidebar */
    .sidebar { position: sticky; top: 110px; display: grid; gap: 26px; }
    .widget {
      background: var(--white);
      border-radius: var(--radius);
      padding: 26px;
      box-shadow: 0 4px 16px rgba(31,64,55,0.06);
      border: 1px solid var(--sand);
    }
    .widget h3 {
      font-size: 1.2rem;
      padding-bottom: 12px;
      margin-bottom: 16px;
      border-bottom: 2px solid var(--clay-light);
    }
    .workshop { display: flex; gap: 14px; padding: 12px 0; border-bottom: 1px dashed var(--sand); }
    .workshop:last-child { border-bottom: none; padding-bottom: 0; }
    .date-badge {
      flex-shrink: 0;
      width: 60px;
      text-align: center;
      background: var(--forest);
      color: var(--white);
      border-radius: 10px;
      padding: 8px 4px;
      line-height: 1.1;
    }
    .date-badge strong { display: block; font-size: 1.4rem; font-family: "Playfair Display", Georgia, serif; }
    .date-badge span { font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.08em; }
    .workshop h4 { font-family: inherit; font-size: 0.98rem; color: var(--ink); margin-bottom: 2px; }
    .workshop p { font-size: 0.85rem; color: var(--muted); }
    .maker { display: flex; align-items: center; gap: 12px; padding: 10px 0; }
    .maker img { width: 52px; height: 52px; border-radius: 50%; object-fit: cover; }
    .maker strong { display: block; font-size: 0.98rem; color: var(--forest-dark); }
    .maker span { font-size: 0.84rem; color: var(--muted); }
    .picks img { width: 100%; height: 140px; object-fit: cover; border-radius: 10px; margin-bottom: 12px; }
    .picks li { list-style: none; margin-bottom: 12px; font-size: 0.95rem; }
    .picks ul { padding: 0; }
    .picks a { font-weight: 600; }
    .widget-cta { background: var(--forest-dark); border: none; color: var(--white); }
    .widget-cta h3 { color: var(--white); border-bottom-color: rgba(255,255,255,0.15); }
    .widget-cta p { color: #CFE0D9; margin-bottom: 18px; font-size: 0.95rem; }

    /* Contact section */
    .contact-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 48px; align-items: start; }
    .contact-form { background: var(--white); padding: 36px; border-radius: 20px; border: 1px solid var(--sand); box-shadow: var(--shadow); display: grid; gap: 16px; }
    .contact-form .calc-row { gap: 14px; }
    .contact-form label { display: block; font-weight: 600; font-size: 0.92rem; margin-bottom: 6px; color: var(--forest-dark); }
    .contact-form input, .contact-form select, .contact-form textarea {
      width: 100%;
      padding: 12px 14px;
      border-radius: 10px;
      border: 1px solid #D9D2C5;
      background: var(--cream);
      font-size: 1rem;
      font-family: inherit;
      color: var(--ink);
    }
    .contact-form textarea { min-height: 130px; resize: vertical; }
    .contact-form input:focus, .contact-form select:focus, .contact-form textarea:focus { outline: 3px solid var(--clay-light); border-color: var(--clay); }
    .info-list { list-style: none; display: grid; gap: 20px; margin-top: 26px; }
    .info-list li { display: flex; gap: 16px; }
    .info-list .feature-icon { margin-bottom: 0; flex-shrink: 0; }
    .info-list strong { display: block; color: var(--forest-dark); }
    .info-list span { color: var(--muted); font-size: 0.96rem; }
    .form-note { font-size: 0.85rem; color: var(--muted); }

    /* Footer */
    .site-footer {
      background: var(--forest-dark);
      color: #CFE0D9;
      padding: 72px 0 0;
      font-size: 0.96rem;
    }
    .footer-grid {
      display: grid;
      grid-template-columns: 1.4fr 1fr 1fr 1.2fr;
      gap: 40px;
      padding-bottom: 48px;
    }
    .site-footer h4 { color: var(--white); font-family: inherit; font-size: 1.05rem; margin-bottom: 16px; letter-spacing: 0.02em; }
    .site-footer p { color: #CFE0D9; }
    .site-footer ul { list-style: none; display: grid; gap: 10px; }
    .site-footer a { color: #CFE0D9; }
    .site-footer a:hover { color: #F3B9A3; }
    .footer-brand strong { font-family: "Playfair Display", Georgia, serif; font-size: 1.7rem; color: var(--white); display: block; margin-bottom: 8px; }
    .social { display: flex; gap: 10px; margin-top: 18px; }
    .social a {
      width: 40px;
      height: 40px;
      border-radius: 50%;
      background: rgba(255,255,255,0.1);
      display: grid;
      place-items: center;
      color: var(--white);
      font-weight: 700;
      font-size: 0.85rem;
    }
    .social a:hover { background: var(--clay); color: var(--white); }
    .newsletter-small { display: flex; gap: 8px; margin-top: 10px; }
    .newsletter-small input {
      flex: 1;
      padding: 10px 12px;
      border-radius: 8px;
      border: 1px solid rgba(255,255,255,0.2);
      background: rgba(255,255,255,0.08);
      color: var(--white);
      font-family: inherit;
      min-width: 0;
    }
    .newsletter-small button {
      padding: 10px 14px;
      border-radius: 8px;
      border: none;
      background: var(--clay);
      color: var(--white);
      font-weight: 700;
      cursor: pointer;
      font-family: inherit;
    }
    .footer-bottom {
      border-top: 1px solid rgba(255,255,255,0.12);
      padding: 22px 0;
      display: flex;
      justify-content: space-between;
      flex-wrap: wrap;
      gap: 14px;
      font-size: 0.88rem;
    }
    .footer-bottom nav { display: flex; gap: 20px; flex-wrap: wrap; }

    /* Responsive */
    @media (max-width: 1080px) {
      .content-layout { grid-template-columns: 1fr; }
      .sidebar { position: static; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); }
      .review-grid, .testimonial-grid { grid-template-columns: repeat(2, 1fr); }
    }
    @media (max-width: 900px) {
      .hero-grid, .split, .guide-layout, .contact-grid, .calculator-wrap { grid-template-columns: 1fr; }
      .hero-image img { height: 420px; }
      .hero-badge { left: 16px; bottom: 16px; }
      .footer-grid { grid-template-columns: 1fr 1fr; }
      .calculator-wrap { padding: 32px; }
      .nav-toggle { display: inline-block; }
      .main-nav { display: none; width: 100%; }
      .main-nav.open { display: block; }
      .main-nav ul { flex-direction: column; gap: 2px; padding-bottom: 12px; }
      .header-main { flex-wrap: wrap; }
    }
    @media (max-width: 680px) {
      section { padding: 64px 0; }
      .review-grid, .testimonial-grid { grid-template-columns: 1fr; }
      .footer-grid { grid-template-columns: 1fr; }
      .cta-banner { padding: 36px 26px; }
      .cta-banner input { min-width: 0; width: 100%; }
      .cta-banner form { width: 100%; }
      .calc-row { grid-template-columns: 1fr; }
      .brand-text strong { font-size: 1.3rem; }
      .topbar { display: none; }
      .pros-cons { grid-template-columns: 1fr; }
    }
  </style>
</head>
<body>

  <!-- HEADER -->
  <header class="site-header">
    <div class="topbar">
      <div class="container">
        <span>Free shipping on supply kits over $60 &middot; New Sunday workshops every month</span>
        <span><a href="#contact">Help Center</a> &nbsp;|&nbsp; <a href="#faq">FAQs</a> &nbsp;|&nbsp; <a href="#contact">Sign In</a></span>
      </div>
    </div>
    <div class="container header-main">
      <a href="#top" class="brand" id="top">
        <img src="https://placehold.co/112x112/2F5D50/FBF7F1?text=TL&font=montserrat" alt="Tinkerloom logo placeholder">
        <div class="brand-text">
          <strong>Tinkerloom</strong>
          <span>Make, mend, and master the things you love.</span>
        </div>
      </a>
      <button class="nav-toggle" id="navToggle" aria-expanded="false" aria-controls="mainNav">Menu</button>
      <nav class="main-nav" id="mainNav" aria-label="Primary navigation">
        <ul>
          <li><a href="#tutorials" class="active">DIY Tutorials</a></li>
          <li><a href="#reviews">Tool Reviews</a></li>
          <li><a href="#calculator">Supply Calculator</a></li>
          <li><a href="#guides">Beginner Guides</a></li>
          <li><a href="#about">About</a></li>
          <li><a href="#shop">Shop</a></li>
          <li><a href="#contact">Contact</a></li>
        </ul>
      </nav>
    </div>
  </header>

  <main>

    <!-- HERO -->
    <section class="hero">
      <div class="container hero-grid">
        <div>
          <span class="eyebrow">Hobby Community &amp; Makers' Workshop</span>
          <h1>Turn Weekend Ideas Into Pieces You're Proud Of</h1>
          <p class="lead">
            Tinkerloom brings together DIY tutorials, honest tool reviews, and practical beginner guides for hobbyists who love working with their hands. Whether you are upcycling a secondhand dresser, learning your first dovetail joint, or building a collection of vintage fountain pens, you will find step-by-step support here.
          </p>
          <div class="hero-actions">
            <a href="#tutorials" class="btn btn-primary">Watch Video Tutorials</a>
            <a href="#shop" class="btn btn-outline">Get Supplies</a>
          </div>
          <div class="hero-stats">
            <div><strong>1,200+</strong><span>Tested DIY projects</span></div>
            <div><strong>48K</strong><span>Active community makers</span></div>
            <div><strong>350</strong><span>Hands-on tool reviews</span></div>
          </div>
        </div>
        <div class="hero-image">
          <img src="https://picsum.photos/900/1000" alt="Maker sanding a handmade wooden shelf in a bright home workshop">
          <div class="hero-badge">
            <img src="https://i.pravatar.cc/120?u=tinkerloom-founder" alt="Founder portrait">
            <div>
              <strong>Featured this month</strong>
              <span>"Our most-saved project: the modular planter wall."</span>
            </div>
          </div>
        </div>
      </div>
    </section>

    <div class="container content-layout">

      <!-- MAIN COLUMN -->
      <div class="main-column">

        <!-- Why Tinkerloom -->
        <section id="about">
          <span class="eyebrow">Why Tinkerloom</span>
          <h2>Built by Hobbyists, for Hobbyists</h2>
          <p class="section-intro">
            Tinkerloom started in a cramped garage in 2016, when a group of weekend woodworkers, potters, and fabric artists got tired of instructions that skipped the hard parts. We wanted guides that admitted when a glue-up goes wrong, reviews that tell you how a tool feels after three hours of use, and a community that shares both successes and failures.
          </p>
          <div class="feature-grid">
            <article class="feature">
              <div class="feature-icon">1</div>
              <h3>Every Project Is Tested</h3>
              <p>Our editors build each tutorial from start to finish before publishing. Material quantities, drying times, and common mistakes are recorded so you can plan with confidence.</p>
            </article>
            <article class="feature">
              <div class="feature-icon">2</div>
              <h3>Honest Gear Reviews</h3>
              <p>We buy every tool we review with our own budget. No sponsored rankings, no hidden affiliate pressure, and clear notes on what each product does well and where it falls short.</p>
            </article>
            <article class="feature">
              <div class="feature-icon">3</div>
              <h3>Skill-Based Learning Paths</h3>
              <p>Projects are sorted by difficulty and by technique, so you can move from basic sanding and finishing to advanced joinery, resin casting, or custom design at your own pace.</p>
            </article>
          </div>
        </section>

        <!-- DIY Tutorials -->
        <section id="tutorials">
          <span class="eyebrow">DIY Tutorials</span>
          <h2>Featured Projects This Season</h2>
          <p class="section-intro">
            Each tutorial includes a materials list, a time estimate, and a short video walkthrough. Start with a project that fits your skill level, then build toward more ambitious custom design work as your confidence grows.
          </p>
          <div class="card-grid">
            <article class="card">
              <div class="card-media">
                <img src="https://picsum.photos/600/400" alt="Finished reclaimed wood wall shelf with brass brackets">
                <span class="tag">Upcycling</span>
                <span class="play" aria-hidden="true">&#9654;</span>
              </div>
              <div class="card-body">
                <h3>Reclaimed Pallet Wall Shelf</h3>
                <div class="meta"><span class="difficulty">Beginner</span><span>&#9201; 3 hours</span><span>&#128179; About $25</span></div>
                <p>Transform a discarded shipping pallet into a sturdy floating shelf. You will learn safe disassembly, planing rough boards, and applying a durable oil finish.</p>
                <a href="#calculator" class="btn-link">Watch Video &rarr;</a>
              </div>
            </article>
            <article class="card">
              <div class="card-media">
                <img src="https://picsum.photos/601/401" alt="Hand-painted ceramic planter with geometric glaze pattern">
                <span class="tag">Craft Technique</span>
                <span class="play" aria-hidden="true">&#9654;</span>
              </div>
              <div class="card-body">
                <h3>Hand-Built Clay Planter</h3>
                <div class="meta"><span class="difficulty">Intermediate</span><span>&#9201; 5 hours</span><span>&#128179; About $40</span></div>
                <p>Learn the pinch and coil method for building a planter with drainage, then apply underglaze in a custom geometric pattern. Includes firing schedule notes for home kilns.</p>
                <a href="#calculator" class="btn-link">Watch Video &rarr;</a>
              </div>
            </article>
            <article class="card">
              <div class="card-media">
                <img src="https://picsum.photos/602/402" alt="Stack of folded cotton fabric beside a sewing machine">
                <span class="tag">Sewing</span>
                <span class="play" aria-hidden="true">&#9654;</span>
              </div>
              <div class="card-body">
                <h3>Custom Tote with Lined Pockets</h3>
                <div class="meta"><span class="difficulty">Intermediate</span><span>&#9201; 4 hours</span><span>&#128179; About $18</span></div>
                <p>A practical sewing project covering pattern cutting, interfacing, and clean French seams. Customize the strap length and pocket layout to suit your everyday carry.</p>
                <a href="#calculator" class="btn-link">Watch Video &rarr;</a>
              </div>
            </article>
          </div>
          <p style="margin-top: 32px;"><a href="#tutorials" class="btn btn-outline">Browse Gallery of 1,200+ Projects</a></p>
        </section>

        <!-- Tool Reviews -->
        <section id="reviews">
          <span class="eyebrow">Tool Reviews</span>
          <h2>Honest Reviews From Real Workbenches</h2>
          <p class="section-intro">
            Our reviewers test tools over a minimum of 30 hours of real use before scoring them. We look at ergonomics, accuracy, durability, and value, and we publish the results whether or not a product impressed us.
          </p>
          <div class="review-grid">
            <article class="review-card">
              <img class="product" src="https://picsum.photos/500/340" alt="Compact cordless drill driver on a wooden workbench">
              <span class="score">4.6 / 5</span>
              <h3>Cordless Drill Driver 18V</h3>
              <div class="stars" aria-label="4.5 out of 5 stars">&#9733;&#9733;&#9733;&#9733;&#9733;</div>
              <p>Excellent torque control for furniture assembly and pilot holes. The battery holds a charge through a full weekend of projects, though the chuck can loosen under heavy use.</p>
              <div class="pros-cons">
                <div><strong>Pros</strong><ul><li>Balanced grip</li><li>Quick charger</li></ul></div>
                <div><strong>Cons</strong><ul><li>Loose chuck</li><li>Heavy battery</li></ul></div>
              </div>
              <a href="#shop" class="btn-link">Get Supplies &rarr;</a>
            </article>
            <article class="review-card">
              <img class="product" src="https://picsum.photos/501/341" alt="Japanese pull saw resting on a cutting board">
              <span class="score">4.8 / 5</span>
              <h3>Japanese Dozuki Pull Saw</h3>
              <div class="stars" aria-label="5 out of 5 stars">&#9733;&#9733;&#9733;&#9733;&#9733;</div>
              <p>The thin kerf makes precise joinery remarkably clean. Beginners may need a few sessions to adjust to the pull stroke, but the control and finish quality are outstanding for the price.</p>
              <div class="pros-cons">
                <div><strong>Pros</strong><ul><li>Thin kerf</li><li>Razor-sharp teeth</li></ul></div>
                <div><strong>Cons</strong><ul><li>Learning curve</li><li>Replacement blades</li></ul></div>
              </div>
              <a href="#shop" class="btn-link">Get Supplies &rarr;</a>
            </article>
            <article class="review-card">
              <img class="product" src="https://picsum.photos/502/342" alt="Rotary cutter and cutting mat on a quilting table">
              <span class="score">4.3 / 5</span>
              <h3>Rotary Cutter Set, 45mm</h3>
              <div class="stars" aria-label="4 out of 5 stars">&#9733;&#9733;&#9733;&#9733;&#9734;</div>
              <p>A reliable everyday cutter for quilting and fabric projects. The blade guard clicks shut firmly, and the ergonomic handle reduces wrist fatigue during long cutting sessions.</p>
              <div class="pros-cons">
                <div><strong>Pros</strong><ul><li>Smooth rolling</li><li>Safe guard</li></ul></div>
                <div><strong>Cons</strong><ul><li>Blades dull fast</li><li>Mat sold separately</li></ul></div>
              </div>
              <a href="#shop" class="btn-link">Get Supplies &rarr;</a>
            </article>
          </div>
        </section>

        <!-- Interactive: Supply Calculator -->
        <section id="calculator">
          <div class="calculator-wrap">
            <div>
              <span class="eyebrow">Interactive Tool</span>
              <h2>Project Supply Calculator</h2>
              <p>
                Guessing how much stain, finish, or sandpaper to buy is the fastest way to waste money or stall a project halfway through. Enter your piece dimensions and the number of coats you plan to apply, and the calculator estimates what you need.
              </p>
              <p>
                Estimates include a waste allowance you can adjust. Coverage figures are based on typical water-based and oil-based finishes on softwood and hardwood, so always check the label on your specific product and test on scrap first.
              </p>
            </div>
            <div>
              <form class="calc-form" id="supplyCalc" novalidate>
                <div>
                  <label for="projectType">Project type</label>
                  <select id="projectType">
                    <option value="1">Wall shelf (both faces)</option>
                    <option value="1.5">Planter box (inside and outside)</option>
                    <option value="1.2">Picture frame or panel</option>
                    <option value="1.1">Tabletop or workbench</option>
                  </select>
                </div>
                <div class="calc-row">
                  <div>
                    <label for="lengthCm">Length (cm)</label>
                    <input type="number" id="lengthCm" min="1" value="120" inputmode="decimal">
                  </div>
                  <div>
                    <label for="widthCm">Width (cm)</label>
                    <input type="number" id="widthCm" min="1" value="30" inputmode="decimal">
                  </div>
                </div>
                <div class="calc-row">
                  <div>
                    <label for="coats">Finish coats</label>
                    <input type="number" id="coats" min="1" max="6" value="2" inputmode="numeric">
                  </div>
                  <div>
                    <label for="waste">Waste allowance (%)</label>
                    <input type="number" id="waste" min="0" max="50" value="10" inputmode="numeric">
                  </div>
                </div>
                <button type="submit" class="btn btn-primary">Calculate Supplies</button>
                <p class="calc-error" id="calcError" role="alert"></p>
              </form>
              <div class="calc-results" id="calcResults" aria-live="polite" style="margin-top: 18px;">
                <h3>Your Materials Estimate</h3>
                <ul>
                  <li><span>Surface area</span><strong id="outArea">0.72 m&sup2;</strong></li>
                  <li><span>Finish required</span><strong id="outFinish">0.19 L</strong></li>
                  <li><span>Sandpaper sheets (120 grit)</span><strong id="outSand">4</strong></li>
                  <li><span>Board stock (240 cm lengths)</span><strong id="outBoards">1</strong></li>
                </ul>
                <p class="calc-note">Estimates only. Add extra stock for mistakes and grain matching on visible faces.</p>
              </div>
            </div>
          </div>
        </section>

        <!-- Beginner Guides -->
        <section id="guides">
          <span class="eyebrow">Beginner Guides</span>
          <h2>Your First Project, Step by Step</h2>
          <p class="section-intro">
            New to making things? Our beginner path walks you through the fundamentals of measuring, marking, cutting, and finishing. Each step includes the reason behind it, because understanding the why makes the next project easier.
          </p>
          <div class="guide-layout">
            <div class="guide-image">
              <img src="https://picsum.photos/700/500" alt="Beginner measuring and marking a board with a steel square and pencil">
              <p>The skills in this guide apply to nearly every hobby we cover, from woodworking and metalwork to sewing and resin art. Take your time with the early steps. Accurate measuring and clean surfaces prevent most of the frustration beginners face.</p>
              <p><a href="#shop" class="btn btn-primary">Get Starter Kit</a></p>
            </div>
            <ol class="steps">
              <li>
                <h3>Set Up a Safe Workspace</h3>
                <p>Choose a stable table with good lighting and ventilation. Keep a fire extinguisher nearby, and store finishes away from heat sources.</p>
              </li>
              <li>
                <h3>Measure Twice and Mark Clearly</h3>
                <p>Use a sharp pencil and a reliable steel rule. Mark reference edges with a consistent symbol so you always know which face is which.</p>
              </li>
              <li>
                <h3>Cut With Controlled Strokes</h3>
                <p>Let the saw do the work. Support the offcut, keep your guiding hand clear of the blade path, and cut slightly outside the line for later refinement.</p>
              </li>
              <li>
                <h3>Sand Progressively</h3>
                <p>Work from 120 grit to 180 grit and finish with 220. Skipping grits leaves scratches that show through stain and clear coats.</p>
              </li>
              <li>
                <h3>Apply a Thin, Even Finish</h3>
                <p>Wipe on thin coats, allow full drying time between layers, and lightly sand with fine paper between coats for a smooth, professional result.</p>
              </li>
            </ol>
          </div>
        </section>

        <!-- Testimonials -->
        <section id="community">
          <span class="eyebrow">Community Stories</span>
          <h2>What Our Makers Say</h2>
          <p class="section-intro">
            From first-time crafters to lifelong collectors, members use Tinkerloom to learn, share, and celebrate their work.
          </p>
          <div class="testimonial-grid">
            <article class="testimonial">
              <blockquote>"I had never held a chisel before my first Tinkerloom workshop. Six months later I have built a bedside table for my daughter, and the step-by-step photos made every stage feel manageable."</blockquote>
              <div class="author">
                <img src="https://i.pravatar.cc/96?u=maya-ruiz" alt="Portrait of Maya Ruiz">
                <div><strong>Maya Ruiz</strong><span>Woodworking beginner, Denver</span></div>
              </div>
            </article>
            <article class="testimonial">
              <blockquote>"The drill review saved me from buying a tool that would have frustrated me for years. The reviewers are straightforward about flaws, which is exactly what I need as a budget-conscious hobbyist."</blockquote>
              <div class="author">
                <img src="https://i.pravatar.cc/96?u=daniel-okafor" alt="Portrait of Daniel Okafor">
                <div><strong>Daniel Okafor</strong><span>Home renovation enthusiast, Lagos</span></div>
              </div>
            </article>
            <article class="testimonial">
              <blockquote>"Our quilting circle moved our monthly meetup to Tinkerloom's online sewing library. The custom design section gave us so many ideas, and the community critiques are kind and genuinely useful."</blockquote>
              <div class="author">
                <img src="https://i.pravatar.cc/96?u=priya-lindqvist" alt="Portrait of Priya Lindqvist">
                <div><strong>Priya Lindqvist</strong><span>Quilter and sewing teacher, Stockholm</span></div>
              </div>
            </article>
          </div>
        </section>

        <!-- FAQ -->
        <section id="faq">
          <span class="eyebrow">Frequently Asked Questions</span>
          <h2>Good Questions, Clear Answers</h2>
          <p class="section-intro">Can't find what you need? Reach out through our contact form and a member of our editorial team will reply within two business days.</p>
          <div class="faq-list">
            <details open>
              <summary>Do I need expensive tools to start a DIY project?</summary>
              <p>No. Most of our beginner projects can be completed with a handful of basics: a measuring tape, a quality utility knife, sandpaper, and a small set of clamps. Our tool reviews indicate which items are worth upgrading and which are fine as budget purchases.</p>
            </details>
            <details>
              <summary>How accurate are the supply calculator estimates?</summary>
              <p>The calculator uses typical coverage rates for common finishes and standard board lengths. Results are a starting point. Adjust the waste allowance upward for complex shapes, grain matching, or if you are a first-time finisher.</p>
            </details>
            <details>
              <summary>Can I sell items I make from Tinkerloom tutorials?</summary>
              <p>Yes, you may sell finished pieces made from our tutorials for personal or commercial purposes. Please credit Tinkerloom in your listing, and do not republish our written instructions, photographs, or videos without written permission.</p>
            </details>
            <details>
              <summary>Do you offer workshops outside the United States?</summary>
              <p>Our live workshops are currently held in five cities, and we stream selected sessions online. Recorded workshops are available to all members with a Maker Plus subscription, including downloadable material lists and printable plans.</p>
            </details>
          </div>
        </section>

        <!-- Shop / CTA banner -->
        <section id="shop">
          <div class="cta-banner">
            <div>
              <h2>Start Your Next Project This Weekend</h2>
              <p>Join 48,000 makers who receive our monthly project roundup, new tutorial alerts, and exclusive discounts on curated supply kits.</p>
            </div>
            <form action="#" onsubmit="event.preventDefault(); this.querySelector('button').textContent='Subscribed!';">
              <input type="email" placeholder="Enter your email address" aria-label="Email address" required>
              <button type="submit" class="btn btn-light">Join the Community</button>
            </form>
          </div>
        </section>

        <!-- Contact -->
        <section id="contact">
          <div class="contact-grid">
            <div>
              <span class="eyebrow">Contact</span>
              <h2>Questions, Collaborations, or Workshop Bookings</h2>
              <p>Whether you want to host a group session, propose a tutorial, or ask about a tool you are considering, our team is happy to help. We read every message and respond personally.</p>
              <ul class="info-list">
                <li>
                  <div class="feature-icon">@</div>
                  <div><strong>Email</strong><span>hello@tinkerloom.com</span></div>
                </li>
                <li>
                  <div class="feature-icon">&#9742;</div>
                  <div><strong>Phone</strong><span>+1 (303) 555-0142, Mon to Fri, 9am to 5pm MT</span></div>
                </li>
                <li>
                  <div class="feature-icon">&#9873;</div>
                  <div><strong>Studio</strong><span>2214 Foundry Lane, Unit B, Denver, CO 80205</span></div>
                </li>
              </ul>
            </div>
            <form class="contact-form" action="#" onsubmit="event.preventDefault(); this.querySelector('button').textContent='Message sent. Thank you!';">
              <div class="calc-row">
                <div>
                  <label for="cName">Full name</label>
                  <input type="text" id="cName" name="name" required>
                </div>
                <div>
                  <label for="cEmail">Email</label>
                  <input type="email" id="cEmail" name="email" required>
                </div>
              </div>
              <div>
                <label for="cTopic">Topic</label>
                <select id="cTopic" name="topic">
                  <option>General question</option>
                  <option>Workshop booking</option>
                  <option>Tutorial submission</option>
                  <option>Product review request</option>
                  <option>Partnership</option>
                </select>
              </div>
              <div>
                <label for="cMessage">Message</label>
                <textarea id="cMessage" name="message" placeholder="Tell us about your project or question..."></textarea>
              </div>
              <button type="submit" class="btn btn-primary">Send Message</button>
              <p class="form-note">We never share your details. See our Privacy Policy for how we handle your data.</p>
            </form>
          </div>
        </section>

      </div>

      <!-- SIDEBAR -->
      <aside class="sidebar" aria-label="Community sidebar">
        <div class="widget">
          <h3>Upcoming Workshops</h3>
          <div class="workshop">
            <div class="date-badge"><strong>14</strong><span>Mar</span></div>
            <div>
              <h4>Dovetail Basics: Hand Tools Only</h4>
              <p>Saturday, 10am &middot; Denver Studio &middot; $65</p>
            </div>
          </div>
          <div class="workshop">
            <div class="date-badge"><strong>22</strong><span>Mar</span></div>
            <div>
              <h4>Intro to Wheel Throwing</h4>
              <p>Saturday, 1pm &middot; Online + Studio &middot; $80</p>
            </div>
          </div>
          <div class="workshop">
            <div class="date-badge"><strong>05</strong><span>Apr</span></div>
            <div>
              <h4>Custom Quilt Design Circle</h4>
              <p>Saturday, 2pm &middot; Online &middot; Free for members</p>
            </div>
          </div>
        </div>

        <div class="widget">
          <h3>Featured Makers</h3>
          <div class="maker">
            <img src="https://i.pravatar.cc/104?u=ellen-park" alt="Portrait of Ellen Park">
            <div><strong>Ellen Park</strong><span>Ceramicist &middot; Glaze chemistry</span></div>
          </div>
          <div class="maker">
            <img src="https://i.pravatar.cc/104?u=jonah-blake" alt="Portrait of Jonah Blake">
            <div><strong>Jonah Blake</strong><span>Furniture restorer &middot; Hand tools</span></div>
          </div>
          <div class="maker">
            <img src="https://i.pravatar.cc/104?u=amara-osei" alt="Portrait of Amara Osei">
            <div><strong>Amara Osei</strong><span>Textile artist &middot; Natural dyes</span></div>
          </div>
        </div>

        <div class="widget picks">
          <h3>Community Picks</h3>
          <img src="https://picsum.photos/600/300" alt="Member project: hand-dyed indigo linen throw">
          <ul>
            <li><a href="#tutorials">Indigo Linen Throw</a><br><span style="color: var(--muted); font-size: 0.88rem;">Picked by 312 members this week</span></li>
            <li><a href="#tutorials">Brass Inlay Coaster Set</a><br><span style="color: var(--muted); font-size: 0.88rem;">Top-rated metalwork project</span></li>
          </ul>
        </div>

        <div class="widget widget-cta">
          <h3>Maker Plus Membership</h3>
          <p>Unlock downloadable plans, recorded workshops, and member-only supply discounts. Cancel anytime.</p>
          <a href="#shop" class="btn btn-primary" style="width: 100%; justify-content: center;">Join Maker Plus</a>
        </div>
      </aside>

    </div>

  </main>

  <!-- FOOTER -->
  <footer class="site-footer">
    <div class="container">
      <div class="footer-grid">
        <div>
          <div class="footer-brand">
            <strong>Tinkerloom</strong>
          </div>
          <p>A hobby community for DIY tutorials, honest tool reviews, and beginner-friendly craft guides. Made in Denver, shared worldwide.</p>
          <div class="social" aria-label="Social media">
            <a href="#" aria-label="Instagram">IG</a>
            <a href="#" aria-label="YouTube">YT</a>
            <a href="#" aria-label="Pinterest">PN</a>
            <a href="#" aria-label="Facebook">FB</a>
          </div>
        </div>
        <div>
          <h4>Explore</h4>
          <ul>
            <li><a href="#tutorials">DIY Tutorials</a></li>
            <li><a href="#reviews">Tool Reviews</a></li>
            <li><a href="#guides">Beginner Guides</a></li>
            <li><a href="#calculator">Supply Calculator</a></li>
            <li><a href="#community">Community Stories</a></li>
          </ul>
        </div>
        <div>
          <h4>Company</h4>
          <ul>
            <li><a href="#about">About Tinkerloom</a></li>
            <li><a href="#shop">Shop Supply Kits</a></li>
            <li><a href="#faq">FAQs</a></li>
            <li><a href="#contact">Contact</a></li>
            <li><a href="#contact">Careers</a></li>
          </ul>
        </div>
        <div>
          <h4>Stay in the Loop</h4>
          <p>Monthly project roundups and workshop alerts, straight to your inbox.</p>
          <form class="newsletter-small" onsubmit="event.preventDefault(); this.querySelector('button').textContent='Done';">
            <input type="email" placeholder="Your email" aria-label="Footer email address" required>
            <button type="submit">Join</button>
          </form>
          <p style="margin-top: 16px; font-size: 0.92rem;">2214 Foundry Lane, Unit B<br>Denver, CO 80205<br>hello@tinkerloom.com<br>+1 (303) 555-0142</p>
        </div>
      </div>
    </div>
    <div class="container">
      <div class="footer-bottom">
        <span>&copy; <span id="year">2025</span> Tinkerloom Hobby Co. All rights reserved.</span>
        <nav aria-label="Legal">
          <a href="#">Privacy Policy</a>
          <a href="#">Terms of Use</a>
          <a href="#">Cookie Settings</a>
          <a href="#">Accessibility</a>
        </nav>
      </div>
    </div>
  </footer>

  <script>
    // Current year in footer
    document.getElementById('year').textContent = new Date().getFullYear();

    // Mobile navigation toggle
    const navToggle = document.getElementById('navToggle');
    const mainNav = document.getElementById('mainNav');
    navToggle.addEventListener('click', () => {
      const open = mainNav.classList.toggle('open');
      navToggle.setAttribute('aria-expanded', open ? 'true' : 'false');
    });

    // Supply calculator
    const form = document.getElementById('supplyCalc');
    const errorEl = document.getElementById('calcError');
    const fields = {
      type: document.getElementById('projectType'),
      length: document.getElementById('lengthCm'),
      width: document.getElementById('widthCm'),
      coats: document.getElementById('coats'),
      waste: document.getElementById('waste')
    };

    function runCalculation(e) {
      if (e) e.preventDefault();
      errorEl.textContent = '';

      const factor = parseFloat(fields.type.value);
      const length = parseFloat(fields.length.value);
      const width = parseFloat(fields.width.value);
      const coats = parseInt(fields.coats.value, 10);
      const waste = parseFloat(fields.waste.value);

      if (!length || length <= 0 || !width || width <= 0) {
        errorEl.textContent = 'Please enter a length and width greater than zero.';
        return;
      }
      if (!coats || coats < 1 || coats > 6) {
        errorEl.textContent = 'Finish coats should be between 1 and 6.';
        return;
      }
      if (isNaN(waste) || waste < 0 || waste > 50) {
        errorEl.textContent = 'Waste allowance should be between 0% and 50%.';
        return;
      }

      const wasteMultiplier = 1 + waste / 100;

      // Surface area in square metres (converted from cm²)
      const areaM2 = (2 * length * width / 10000) * factor;

      // Finish: approx. 12 m² per litre per coat
      const finishLitres = (areaM2 * coats / 12) * wasteMultiplier;

      // Sandpaper: approx. one 230 x 280 mm sheet per 0.25 m² (sanding passes included)
      const sandSheets = Math.ceil((areaM2 / 0.25) * wasteMultiplier);

      // Board stock: standard 240 cm lengths, with 10% allowance for cut-off losses
      const boards = Math.max(1, Math.ceil((length * 1.1) / 240));

      document.getElementById('outArea').textContent = areaM2.toFixed(2) + ' m\u00B2';
      document.getElementById('outFinish').textContent = finishLitres.toFixed(2) + ' L';
      document.getElementById('outSand').textContent = sandSheets + (sandSheets === 1 ? ' sheet' : ' sheets');
      document.getElementById('outBoards').textContent = boards + (boards === 1 ? ' board' : ' boards');
    }

    form.addEventListener('submit', runCalculation);
    runCalculation();
  </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-12T10:08:10.496Z",
  "url": "https://benchmark.aimac.invalid/edf79f28617a394594cbe60417dc34b1085293ad57be6e6f57e0fc3b7ebf88c9.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": "scrollable-region-focusable",
      "impact": null,
      "tags": [
        "cat.keyboard",
        "wcag2a",
        "wcag211",
        "wcag213",
        "TTv5",
        "TT4.a",
        "EN-301-549",
        "EN-9.2.1.1",
        "EN-9.2.1.3"
      ],
      "description": "Ensure elements that have scrollable content are accessible by keyboard",
      "help": "Scrollable region must have keyboard access",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/scrollable-region-focusable?application=axeAPI",
      "nodes": []
    },
    {
      "id": "server-side-image-map",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag211",
        "section508",
        "section508.22.f",
        "TTv5",
        "TT4.a",
        "EN-301-549",
        "EN-9.2.1.1"
      ],
      "description": "Ensure that server-side image maps are not used",
      "help": "Server-side image maps must not be used",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/server-side-image-map?application=axeAPI",
      "nodes": []
    },
    {
      "id": "svg-img-alt",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag111",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT7.a",
        "EN-301-549",
        "EN-9.1.1.1",
        "ACT"
      ],
      "description": "Ensure <svg> elements with an img, graphics-document or graphics-symbol role have an accessible text",
      "help": "<svg> elements with an img role must have an alternative text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/svg-img-alt?application=axeAPI",
      "nodes": []
    },
    {
      "id": "td-headers-attr",
      "impact": null,
      "tags": [
        "cat.tables",
        "wcag2a",
        "wcag131",
        "section508",
        "section508.22.g",
        "TTv5",
        "TT14.b",
        "EN-301-549",
        "EN-9.1.3.1"
      ],
      "description": "Ensure that each cell in a table that uses the headers attribute refers only to other cells in that table",
      "help": "Table cells that use the headers attribute must only refer to cells in the same table",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/td-headers-attr?application=axeAPI",
      "nodes": []
    },
    {
      "id": "th-has-data-cells",
      "impact": null,
      "tags": [
        "cat.tables",
        "wcag2a",
        "wcag131",
        "section508",
        "section508.22.g",
        "TTv5",
        "TT14.b",
        "EN-301-549",
        "EN-9.1.3.1"
      ],
      "description": "Ensure that <th> elements and elements with role=columnheader/rowheader have data cells they describe",
      "help": "Table headers in a data table must refer to data cells",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/th-has-data-cells?application=axeAPI",
      "nodes": []
    },
    {
      "id": "valid-lang",
      "impact": null,
      "tags": [
        "cat.language",
        "wcag2aa",
        "wcag312",
        "TTv5",
        "TT11.b",
        "EN-301-549",
        "EN-9.3.1.2",
        "ACT"
      ],
      "description": "Ensure lang attributes have valid values",
      "help": "lang attribute must have a valid value",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/valid-lang?application=axeAPI",
      "nodes": []
    },
    {
      "id": "video-caption",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag122",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT17.a",
        "EN-301-549",
        "EN-9.1.2.2"
      ],
      "description": "Ensure <video> elements have captions",
      "help": "<video> elements must have captions",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/video-caption?application=axeAPI",
      "nodes": []
    },
    {
      "id": "no-autoplay-audio",
      "impact": null,
      "tags": [
        "cat.time-and-media",
        "wcag2a",
        "wcag142",
        "TTv5",
        "TT2.a",
        "EN-301-549",
        "EN-9.1.4.2",
        "ACT"
      ],
      "description": "Ensure <video> or <audio> elements do not autoplay audio for more than 3 seconds without a control mechanism to stop or mute the audio",
      "help": "<video> or <audio> elements must not play automatically",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/no-autoplay-audio?application=axeAPI",
      "nodes": []
    }
  ],
  "passes": [
    {
      "id": "aria-allowed-attr",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure an element's role supports its ARIA attributes",
      "help": "Elements must only use supported ARIA attributes",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-allowed-attr?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [
            {
              "id": "aria-allowed-attr",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "ARIA attributes are used correctly for the defined role"
            }
          ],
          "none": [
            {
              "id": "aria-unsupported-attr",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "ARIA attribute is supported"
            }
          ],
          "impact": null,
          "html": "<nav class=\"main-nav\" id=\"mainNav\" aria-label=\"Primary navigation\">",
          "target": [
            "#mainNav"
          ]
        }
      ]
    },
    {
      "id": "aria-conditional-attr",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure ARIA attributes are used as described in the specification of the element's role",
      "help": "ARIA attributes must be used as specified for the element's role",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-conditional-attr?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [
            {
              "id": "aria-conditional-attr",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "ARIA attribute is allowed"
            }
          ],
          "none": [],
          "impact": null,
          "html": "<nav class=\"main-nav\" id=\"mainNav\" aria-label=\"Primary navigation\">",
          "target": [
            "#mainNav"
          ]
        }
      ]
    },
    {
      "id": "aria-deprecated-role",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure elements do not use deprecated roles",
      "help": "Deprecated ARIA roles must not be used",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-deprecated-role?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [],
          "none": [
            {
              "id": "deprecatedrole",
              "data": null,
              "relatedNodes": [],
              "impact": "minor",
              "message": "ARIA role is not deprecated"
            }
          ],
          "impact": null,
          "html": "<p class=\"calc-error\" id=\"calcError\" role=\"alert\"></p>",
          "target": [
            "#calcError"
          ]
        }
      ]
    },
    {
      "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": "<span class=\"play\" aria-hidden=\"true\">\u25b6</span>",
          "target": [
            ".card:nth-child(1) > .card-media > .play[aria-hidden=\"true\"]"
          ]
        }
      ]
    },
    {
      "id": "aria-prohibited-attr",
      "impact": "serious",
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure ARIA attributes are not prohibited for an element's role",
      "help": "Elements must only use permitted ARIA attributes",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-prohibited-attr?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [],
          "none": [
            {
              "id": "aria-prohibited-attr",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "ARIA attribute is allowed"
            }
          ],
          "impact": null,
          "html": "<nav class=\"main-nav\" id=\"mainNav\" aria-label=\"Primary navigation\">",
          "target": [
            "#mainNav"
          ]
        }
      ]
    },
    {
      "id": "aria-required-attr",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure elements with ARIA roles have all required ARIA attributes",
      "help": "Required ARIA attributes must be provided",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-required-attr?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "aria-required-attr",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "All required ARIA attributes are present"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<p class=\"calc-error\" id=\"calcError\" role=\"alert\"></p>",
          "target": [
            "#calcError"
          ]
        }
      ]
    },
    {
      "id": "aria-roles",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure all elements with a role attribute use a valid value",
      "help": "ARIA roles used must conform to valid values",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-roles?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [],
          "none": [
            {
              "id": "invalidrole",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "ARIA role is valid"
            },
            {
              "id": "abstractrole",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "Abstract roles are not used"
            },
            {
              "id": "unsupportedrole",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "ARIA role is supported"
            }
          ],
          "impact": null,
          "html": "<p class=\"calc-error\" id=\"calcError\" role=\"alert\"></p>",
          "target": [
            "#calcError"
          ]
        }
      ]
    },
    {
      "id": "aria-valid-attr-value",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure all ARIA attributes have valid values",
      "help": "ARIA attributes must conform to valid values",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-valid-attr-value?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [
            {
              "id": "aria-valid-attr-value",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "ARIA attribute values are valid"
            },
            {
              "id": "aria-errormessage",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "aria-errormessage exists and references elements visible to screen readers that use a supported aria-errormessage technique"
            },
            {
              "id": "aria-level",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "aria-level values are valid"
            }
          ],
          "none": [],
          "impact": null,
          "html": "<nav class=\"main-nav\" id=\"mainNav\" aria-label=\"Primary navigation\">",
          "target": [
            "#mainNav"
          ]
        }
      ]
    },
    {
      "id": "aria-valid-attr",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure attributes that begin with aria- are valid ARIA attributes",
      "help": "ARIA attributes must conform to valid names",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-valid-attr?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "aria-valid-attr",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "ARIA attribute name is valid"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<nav class=\"main-nav\" id=\"mainNav\" aria-label=\"Primary navigation\">",
          "target": [
            "#mainNav"
          ]
        }
      ]
    },
    {
      "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": "<p style=\"margin-top: 32px;\"><a href=\"#tutorials\" class=\"btn btn-outline\">Browse Gallery of 1,200+ Projects</a></p>",
          "target": [
            "#tutorials > p:nth-child(5)"
          ]
        }
      ]
    },
    {
      "id": "button-name",
      "impact": null,
      "tags": [
        "cat.name-role-value",
        "wcag2a",
        "wcag412",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT6.a",
        "EN-301-549",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure buttons have discernible text",
      "help": "Buttons must have discernible text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/button-name?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "button-has-visible-text",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "Element has inner text that is visible to screen readers"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<button type=\"submit\" class=\"btn btn-primary\">Calculate Supplies</button>",
          "target": [
            "#supplyCalc > button[type=\"submit\"]"
          ]
        }
      ]
    },
    {
      "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>Turn Weekend Ideas Into Pieces You're Proud Of</h1>",
                  "target": [
                    "h1"
                  ]
                },
                {
                  "html": "<h2>Built by Hobbyists, for Hobbyists</h2>",
                  "target": [
                    "#about > h2"
                  ]
                },
                {
                  "html": "<h3>Every Project Is Tested</h3>",
                  "target": [
                    ".feature:nth-child(1) > h3"
                  ]
                },
                {
                  "html": "<h3>Honest Gear Reviews</h3>",
                  "target": [
                    ".feature:nth-child(2) > h3"
                  ]
                },
                {
                  "html": "<h3>Skill-Based Learning Paths</h3>",
                  "target": [
                    ".feature:nth-child(3) > h3"
                  ]
                },
                {
                  "html": "<h2>Featured Projects This Season</h2>",
                  "target": [
                    "#tutorials > h2"
                  ]
                },
                {
                  "html": "<h3>Reclaimed Pallet Wall Shelf</h3>",
                  "target": [
                    ".card:nth-child(1) > .card-body > h3"
                  ]
                },
                {
                  "html": "<h3>Hand-Built Clay Planter</h3>",
                  "target": [
                    ".card:nth-child(2) > .card-body > h3"
                  ]
                },
                {
                  "html": "<h3>Custom Tote with Lined Pockets</h3>",
                  "target": [
                    ".card:nth-child(3) > .card-body > h3"
                  ]
                },
                {
                  "html": "<h2>Honest Reviews From Real Workbenches</h2>",
                  "target": [
                    "#reviews > h2"
                  ]
                },
                {
                  "html": "<h3>Cordless Drill Driver 18V</h3>",
                  "target": [
                    ".review-card:nth-child(1) > h3"
                  ]
                },
                {
                  "html": "<h3>Japanese Dozuki Pull Saw</h3>",
                  "target": [
                    ".review-card:nth-child(2) > h3"
                  ]
                },
                {
                  "html": "<h3>Rotary Cutter Set, 45mm</h3>",
                  "target": [
                    ".review-card:nth-child(3) > h3"
                  ]
                },
                {
                  "html": "<h2>Project Supply Calculator</h2>",
                  "target": [
                    ".calculator-wrap > div:nth-child(1) > h2"
                  ]
                },
                {
                  "html": "<h3>Your Materials Estimate</h3>",
                  "target": [
                    "#calcResults > h3"
                  ]
                },
                {
                  "html": "<h2>Your First Project, Step by Step</h2>",
                  "target": [
                    "#guides > h2"
                  ]
                },
                {
                  "html": "<h3>Set Up a Safe Workspace</h3>",
                  "target": [
                    "li:nth-child(1) > h3"
                  ]
                },
                {
                  "html": "<h3>Measure Twice and Mark Clearly</h3>",
                  "target": [
                    "li:nth-child(2) > h3"
                  ]
                },
                {
                  "html": "<h3>Cut With Controlled Strokes</h3>",
                  "target": [
                    "li:nth-child(3) > h3"
                  ]
                },
                {
                  "html": "<h3>Sand Progressively</h3>",
                  "target": [
                    "li:nth-child(4) > h3"
                  ]
                },
                {
                  "html": "<h3>Apply a Thin, Even Finish</h3>",
                  "target": [
                    "li:nth-child(5) > h3"
                  ]
                },
                {
                  "html": "<h2>What Our Makers Say</h2>",
                  "target": [
                    "#community > h2"
                  ]
                },
                {
                  "html": "<h2>Good Questions, Clear Answers</h2>",
                  "target": [
                    "#faq > h2"
                  ]
                },
                {
                  "html": "<h2>Start Your Next Project This Weekend</h2>",
                  "target": [
                    ".cta-banner > div > h2"
                  ]
                },
                {
                  "html": "<h2>Questions, Collaborations, or Workshop Bookings</h2>",
                  "target": [
                    ".contact-grid > div > h2"
                  ]
                },
                {
                  "html": "<h3>Upcoming Workshops</h3>",
                  "target": [
                    ".widget:nth-child(1) > h3"
                  ]
                },
                {
                  "html": "<h4>Dovetail Basics: Hand Tools Only</h4>",
                  "target": [
                    ".workshop:nth-child(2) > div:nth-child(2) > h4"
                  ]
                },
                {
                  "html": "<h4>Intro to Wheel Throwing</h4>",
                  "target": [
                    ".workshop:nth-child(3) > div:nth-child(2) > h4"
                  ]
                },
                {
                  "html": "<h4>Custom Quilt Design Circle</h4>",
                  "target": [
                    ".workshop:nth-child(4) > div:nth-child(2) > h4"
                  ]
                },
                {
                  "html": "<h3>Featured Makers</h3>",
                  "target": [
                    ".widget:nth-child(2) > h3"
                  ]
                },
                {
                  "html": "<h3>Community Picks</h3>",
                  "target": [
                    ".picks > h3"
                  ]
                },
                {
                  "html": "<h3>Maker Plus Membership</h3>",
                  "target": [
                    ".widget-cta > h3"
                  ]
                },
                {
                  "html": "<h4>Explore</h4>",
                  "target": [
                    ".footer-grid > div:nth-child(2) > h4"
                  ]
                },
                {
                  "html": "<h4>Company</h4>",
                  "target": [
                    "div:nth-child(3) > h4"
                  ]
                },
                {
                  "html": "<h4>Stay in the Loop</h4>",
                  "target": [
                    "div:nth-child(4) > h4"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Page has a heading"
            },
            {
              "id": "landmark",
              "data": null,
              "relatedNodes": [
                {
                  "html": "<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": "#e9f1ee",
                "bgColor": "#1f4037",
                "contrastRatio": 9.89,
                "fontSize": "10.8pt (14.4px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [],
              "impact": "serious",
              "message": "Element has sufficient color contrast of 9.89"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<span>Free shipping on supply kits over $60 \u00b7 New Sunday workshops every month</span>",
          "target": [
            ".container > span:nth-child(1)"
          ]
        }
      ]
    },
    {
      "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 class=\"main-nav\" id=\"mainNav\" aria-label=\"Primary navigation\">",
          "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 for=\"projectType\">Project type</label>",
                  "target": [
                    "label[for=\"projectType\"]"
                  ]
                }
              ],
              "impact": "moderate",
              "message": "Form field does not have multiple label elements"
            }
          ],
          "impact": null,
          "html": "<select id=\"projectType\">",
          "target": [
            "#projectType"
          ]
        }
      ]
    },
    {
      "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/112x112/2F5D50/FBF7F1?text=TL&amp;font=montserrat\" alt=\"Tinkerloom logo placeholder\">",
          "target": [
            "img[alt=\"Tinkerloom logo placeholder\"]"
          ]
        }
      ]
    },
    {
      "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": "Length (cm)"
              },
              "relatedNodes": [
                {
                  "html": "<label for=\"lengthCm\">Length (cm)</label>",
                  "target": [
                    "label[for=\"lengthCm\"]"
                  ]
                }
              ],
              "impact": "critical",
              "message": "Element has an explicit <label>"
            }
          ],
          "all": [],
          "none": [
            {
              "id": "hidden-explicit-label",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "Form element has a visible explicit <label>"
            }
          ],
          "impact": null,
          "html": "<input type=\"number\" id=\"lengthCm\" min=\"1\" value=\"120\" inputmode=\"decimal\">",
          "target": [
            "#lengthCm"
          ]
        }
      ]
    },
    {
      "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=\"widget widget-cta\">",
                  "target": [
                    ".widget-cta"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Links can be distinguished from surrounding text by visual styling"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<a href=\"#shop\" class=\"btn btn-primary\" style=\"width: 100%; justify-content: center;\">Join Maker Plus</a>",
          "target": [
            ".widget-cta > .btn-primary.btn[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=\"#contact\">Help Center</a>",
          "target": [
            "span:nth-child(2) > a[href$=\"#contact\"]:nth-child(1)"
          ]
        }
      ]
    },
    {
      "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=\"#tutorials\" class=\"active\">DIY Tutorials</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.0\">",
          "target": [
            "meta[name=\"viewport\"]"
          ]
        }
      ]
    },
    {
      "id": "nested-interactive",
      "impact": null,
      "tags": [
        "cat.keyboard",
        "wcag2a",
        "wcag412",
        "TTv5",
        "TT6.a",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure interactive controls are not nested as they are not always announced by screen readers or can cause focus problems for assistive technologies",
      "help": "Interactive controls must not be nested",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/nested-interactive?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "no-focusable-content",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "Element does not have focusable descendants"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<img src=\"https://placehold.co/112x112/2F5D50/FBF7F1?text=TL&amp;font=montserrat\" alt=\"Tinkerloom logo placeholder\">",
          "target": [
            "img[alt=\"Tinkerloom logo placeholder\"]"
          ]
        }
      ]
    },
    {
      "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": "Project type"
              },
              "relatedNodes": [
                {
                  "html": "<label for=\"projectType\">Project type</label>",
                  "target": [
                    "label[for=\"projectType\"]"
                  ]
                }
              ],
              "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=\"projectType\">",
          "target": [
            "#projectType"
          ]
        }
      ]
    },
    {
      "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>Do I need expensive tools to start a DIY project?</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": 354,
                "height": 81.7
              },
              "relatedNodes": [],
              "impact": "serious",
              "message": "Control has sufficient size (354px by 81.7px, 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=\"#top\" class=\"brand\" id=\"top\">",
          "target": [
            "#top"
          ]
        }
      ]
    }
  ],
  "incomplete": [
    {
      "id": "aria-prohibited-attr",
      "impact": "serious",
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure ARIA attributes are not prohibited for an element's role",
      "help": "Elements must only use permitted ARIA attributes",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-prohibited-attr?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [],
          "none": [
            {
              "id": "aria-prohibited-attr",
              "data": {
                "role": null,
                "nodeName": "div",
                "messageKey": "noRoleSingular",
                "prohibited": [
                  "aria-label"
                ]
              },
              "relatedNodes": [],
              "impact": "serious",
              "message": "aria-label attribute is not well supported on a div with no valid role attribute."
            }
          ],
          "impact": "serious",
          "html": "<div class=\"stars\" aria-label=\"4.5 out of 5 stars\">\u2605\u2605\u2605\u2605\u2605</div>",
          "target": [
            "div[aria-label=\"4.5 out of 5 stars\"]"
          ],
          "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\">",
                  "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\">Hobby Community &amp; Makers' Workshop</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": "#c8694a",
                "contrastRatio": 3.76,
                "fontSize": "12.0pt (16px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<a href=\"#tutorials\" class=\"btn btn-primary\">Watch Video Tutorials</a>",
                  "target": [
                    ".btn-primary.btn[href$=\"#tutorials\"]"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.76 (foreground color: #ffffff, background color: #c8694a, font size: 12.0pt (16px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<a href=\"#tutorials\" class=\"btn btn-primary\">Watch Video Tutorials</a>",
          "target": [
            ".btn-primary.btn[href$=\"#tutorials\"]"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.76 (foreground color: #ffffff, background color: #c8694a, font size: 12.0pt (16px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#c8694a",
                "bgColor": "#fbf7f1",
                "contrastRatio": 3.52,
                "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 3.52 (foreground color: #c8694a, background color: #fbf7f1, font size: 9.6pt (12.8px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"eyebrow\">Why Tinkerloom</span>",
          "target": [
            "#about > .eyebrow"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.52 (foreground color: #c8694a, background color: #fbf7f1, font size: 9.6pt (12.8px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#c8694a",
                "bgColor": "#fbf7f1",
                "contrastRatio": 3.52,
                "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 3.52 (foreground color: #c8694a, background color: #fbf7f1, font size: 9.6pt (12.8px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"eyebrow\">DIY Tutorials</span>",
          "target": [
            "#tutorials > .eyebrow"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.52 (foreground color: #c8694a, background color: #fbf7f1, font size: 9.6pt (12.8px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#c8694a",
                "bgColor": "#ffffff",
                "contrastRatio": 3.76,
                "fontSize": "10.2pt (13.6px)",
                "fontWeight": "bold",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<article class=\"card\">",
                  "target": [
                    ".card:nth-child(1)"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.76 (foreground color: #c8694a, background color: #ffffff, font size: 10.2pt (13.6px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"difficulty\">Beginner</span>",
          "target": [
            ".card:nth-child(1) > .card-body > .meta > .difficulty"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.76 (foreground color: #c8694a, background color: #ffffff, font size: 10.2pt (13.6px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#c8694a",
                "bgColor": "#ffffff",
                "contrastRatio": 3.76,
                "fontSize": "10.2pt (13.6px)",
                "fontWeight": "bold",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<article class=\"card\">",
                  "target": [
                    ".card:nth-child(2)"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.76 (foreground color: #c8694a, background color: #ffffff, font size: 10.2pt (13.6px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"difficulty\">Intermediate</span>",
          "target": [
            ".card:nth-child(2) > .card-body > .meta > .difficulty"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.76 (foreground color: #c8694a, background color: #ffffff, font size: 10.2pt (13.6px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#c8694a",
                "bgColor": "#ffffff",
                "contrastRatio": 3.76,
                "fontSize": "10.2pt (13.6px)",
                "fontWeight": "bold",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<article class=\"card\">",
                  "target": [
                    ".card:nth-child(3)"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.76 (foreground color: #c8694a, background color: #ffffff, font size: 10.2pt (13.6px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"difficulty\">Intermediate</span>",
          "target": [
            ".card:nth-child(3) > .card-body > .meta > .difficulty"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.76 (foreground color: #c8694a, background color: #ffffff, font size: 10.2pt (13.6px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#c8694a",
                "bgColor": "#fbf7f1",
                "contrastRatio": 3.52,
                "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 3.52 (foreground color: #c8694a, background color: #fbf7f1, font size: 9.6pt (12.8px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"eyebrow\">Tool Reviews</span>",
          "target": [
            "#reviews > .eyebrow"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.52 (foreground color: #c8694a, background color: #fbf7f1, font size: 9.6pt (12.8px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#ffffff",
                "bgColor": "#c8694a",
                "contrastRatio": 3.76,
                "fontSize": "12.0pt (16px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<button type=\"submit\" class=\"btn btn-primary\">Calculate Supplies</button>",
                  "target": [
                    "#supplyCalc > button[type=\"submit\"]"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.76 (foreground color: #ffffff, background color: #c8694a, font size: 12.0pt (16px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<button type=\"submit\" class=\"btn btn-primary\">Calculate Supplies</button>",
          "target": [
            "#supplyCalc > button[type=\"submit\"]"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.76 (foreground color: #ffffff, background color: #c8694a, font size: 12.0pt (16px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#c8694a",
                "bgColor": "#ffffff",
                "contrastRatio": 3.76,
                "fontSize": "11.8pt (15.68px)",
                "fontWeight": "bold",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<div class=\"calc-results\" id=\"calcResults\" aria-live=\"polite\" style=\"margin-top: 18px;\">",
                  "target": [
                    "#calcResults"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.76 (foreground color: #c8694a, background color: #ffffff, font size: 11.8pt (15.68px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<strong id=\"outArea\">0.72 m\u00b2</strong>",
          "target": [
            "#outArea"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.76 (foreground color: #c8694a, background color: #ffffff, font size: 11.8pt (15.68px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#c8694a",
                "bgColor": "#ffffff",
                "contrastRatio": 3.76,
                "fontSize": "11.8pt (15.68px)",
                "fontWeight": "bold",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<div class=\"calc-results\" id=\"calcResults\" aria-live=\"polite\" style=\"margin-top: 18px;\">",
                  "target": [
                    "#calcResults"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.76 (foreground color: #c8694a, background color: #ffffff, font size: 11.8pt (15.68px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<strong id=\"outFinish\">0.13 L</strong>",
          "target": [
            "#outFinish"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.76 (foreground color: #c8694a, background color: #ffffff, font size: 11.8pt (15.68px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#c8694a",
                "bgColor": "#ffffff",
                "contrastRatio": 3.76,
                "fontSize": "11.8pt (15.68px)",
                "fontWeight": "bold",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<div class=\"calc-results\" id=\"calcResults\" aria-live=\"polite\" style=\"margin-top: 18px;\">",
                  "target": [
                    "#calcResults"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.76 (foreground color: #c8694a, background color: #ffffff, font size: 11.8pt (15.68px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<strong id=\"outSand\">4 sheets</strong>",
          "target": [
            "#outSand"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.76 (foreground color: #c8694a, background color: #ffffff, font size: 11.8pt (15.68px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#c8694a",
                "bgColor": "#ffffff",
                "contrastRatio": 3.76,
                "fontSize": "11.8pt (15.68px)",
                "fontWeight": "bold",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<div class=\"calc-results\" id=\"calcResults\" aria-live=\"polite\" style=\"margin-top: 18px;\">",
                  "target": [
                    "#calcResults"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.76 (foreground color: #c8694a, background color: #ffffff, font size: 11.8pt (15.68px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<strong id=\"outBoards\">1 board</strong>",
          "target": [
            "#outBoards"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.76 (foreground color: #c8694a, background color: #ffffff, font size: 11.8pt (15.68px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#cfe0d9",
                "bgColor": "#ffffff",
                "contrastRatio": 1.37,
                "fontSize": "10.2pt (13.6px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<div class=\"calc-results\" id=\"calcResults\" aria-live=\"polite\" style=\"margin-top: 18px;\">",
                  "target": [
                    "#calcResults"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 1.37 (foreground color: #cfe0d9, background color: #ffffff, font size: 10.2pt (13.6px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<p class=\"calc-note\">Estimates only. Add extra stock for mistakes and grain matching on visible faces.</p>",
          "target": [
            ".calc-note"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 1.37 (foreground color: #cfe0d9, background color: #ffffff, font size: 10.2pt (13.6px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#c8694a",
                "bgColor": "#fbf7f1",
                "contrastRatio": 3.52,
                "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 3.52 (foreground color: #c8694a, background color: #fbf7f1, font size: 9.6pt (12.8px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"eyebrow\">Beginner Guides</span>",
          "target": [
            "#guides > .eyebrow"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.52 (foreground color: #c8694a, background color: #fbf7f1, font size: 9.6pt (12.8px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#ffffff",
                "bgColor": "#c8694a",
                "contrastRatio": 3.76,
                "fontSize": "12.0pt (16px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<a href=\"#shop\" class=\"btn btn-primary\">Get Starter Kit</a>",
                  "target": [
                    "p:nth-child(3) > .btn-primary.btn[href$=\"#shop\"]"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.76 (foreground color: #ffffff, background color: #c8694a, font size: 12.0pt (16px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<a href=\"#shop\" class=\"btn btn-primary\">Get Starter Kit</a>",
          "target": [
            "p:nth-child(3) > .btn-primary.btn[href$=\"#shop\"]"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.76 (foreground color: #ffffff, background color: #c8694a, font size: 12.0pt (16px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#c8694a",
                "bgColor": "#fbf7f1",
                "contrastRatio": 3.52,
                "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 3.52 (foreground color: #c8694a, background color: #fbf7f1, 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 > .eyebrow"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.52 (foreground color: #c8694a, background color: #fbf7f1, font size: 9.6pt (12.8px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#c8694a",
                "bgColor": "#fbf7f1",
                "contrastRatio": 3.52,
                "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 3.52 (foreground color: #c8694a, background color: #fbf7f1, font size: 9.6pt (12.8px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"eyebrow\">Frequently Asked Questions</span>",
          "target": [
            "#faq > .eyebrow"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.52 (foreground color: #c8694a, background color: #fbf7f1, font size: 9.6pt (12.8px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#c8694a",
                "bgColor": "#fbf7f1",
                "contrastRatio": 3.52,
                "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 3.52 (foreground color: #c8694a, background color: #fbf7f1, font size: 9.6pt (12.8px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"eyebrow\">Contact</span>",
          "target": [
            ".contact-grid > div > .eyebrow"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.52 (foreground color: #c8694a, background color: #fbf7f1, font size: 9.6pt (12.8px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#ffffff",
                "bgColor": "#c8694a",
                "contrastRatio": 3.76,
                "fontSize": "12.0pt (16px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<button type=\"submit\" class=\"btn btn-primary\">Send Message</button>",
                  "target": [
                    ".contact-form > button[type=\"submit\"]"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.76 (foreground color: #ffffff, background color: #c8694a, font size: 12.0pt (16px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<button type=\"submit\" class=\"btn btn-primary\">Send Message</button>",
          "target": [
            ".contact-form > button[type=\"submit\"]"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.76 (foreground color: #ffffff, background color: #c8694a, font size: 12.0pt (16px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#ffffff",
                "bgColor": "#c8694a",
                "contrastRatio": 3.76,
                "fontSize": "12.0pt (16px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<a href=\"#shop\" class=\"btn btn-primary\" style=\"width: 100%; justify-content: center;\">Join Maker Plus</a>",
                  "target": [
                    ".widget-cta > .btn-primary.btn[href$=\"#shop\"]"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.76 (foreground color: #ffffff, background color: #c8694a, font size: 12.0pt (16px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<a href=\"#shop\" class=\"btn btn-primary\" style=\"width: 100%; justify-content: center;\">Join Maker Plus</a>",
          "target": [
            ".widget-cta > .btn-primary.btn[href$=\"#shop\"]"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.76 (foreground color: #ffffff, background color: #c8694a, font size: 12.0pt (16px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#ffffff",
                "bgColor": "#c8694a",
                "contrastRatio": 3.76,
                "fontSize": "10.0pt (13.3333px)",
                "fontWeight": "bold",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<button type=\"submit\">Join</button>",
                  "target": [
                    ".newsletter-small > button[type=\"submit\"]"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.76 (foreground color: #ffffff, background color: #c8694a, font size: 10.0pt (13.3333px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<button type=\"submit\">Join</button>",
          "target": [
            ".newsletter-small > button[type=\"submit\"]"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.76 (foreground color: #ffffff, background color: #c8694a, font size: 10.0pt (13.3333px), font weight: bold). Expected contrast ratio of 4.5:1"
        }
      ]
    }
  ],
  "coverage": {
    "contract": "main-document-vertical-scroll",
    "complete": true,
    "positions": [
      {
        "y": 0,
        "height": 9990
      },
      {
        "y": 576,
        "height": 9990
      },
      {
        "y": 1152,
        "height": 9990
      },
      {
        "y": 1728,
        "height": 9990
      },
      {
        "y": 2304,
        "height": 9990
      },
      {
        "y": 2880,
        "height": 9990
      },
      {
        "y": 3456,
        "height": 9990
      },
      {
        "y": 4032,
        "height": 9990
      },
      {
        "y": 4608,
        "height": 9990
      },
      {
        "y": 5184,
        "height": 9990
      },
      {
        "y": 5760,
        "height": 9990
      },
      {
        "y": 6336,
        "height": 9990
      },
      {
        "y": 6912,
        "height": 9990
      },
      {
        "y": 7488,
        "height": 9990
      },
      {
        "y": 8064,
        "height": 9990
      },
      {
        "y": 8640,
        "height": 9990
      },
      {
        "y": 9216,
        "height": 9990
      },
      {
        "y": 9270,
        "height": 9990
      }
    ],
    "scans": 19,
    "max_states": 512,
    "settle_ms": 5000,
    "page_timeout_seconds": 150,
    "layout_stability": "consecutive 100ms size samples within one CSS pixel",
    "animation_settling": "finite animations present when scroll resources are ready finish or are cancelled",
    "interactive_states": "not exercised",
    "horizontal_scroll": "not exercised"
  }
}
System Prompt
You are a lead web developer at a top digital agency, tasked with creating a one-page website for a new client based on the given specifications, delivered as an HTML file. First non-whitespace char '<', last non-whitespace char '>'. Use the following services to generate placeholder images where needed:
- placehold.co (text): https://placehold.co/[{w}x{h}|{size}][/{bg-color}/{text-color}]?text={text}&font=[lato|lora|montserrat|noto sans|open sans|oswald|playfair display|poppins|pt sans|raleway|roboto|source sans|source sans pro]
- picsum.photos (photos): https://picsum.photos/[{w}/{h}|{size}]?[grayscale][&blur={1-10}]
- pravatar.cc (avatars): https://i.pravatar.cc/{size}?u={identifier}
Choose sizes appropriate to layout.
User Prompt
Create a **complete, polished, production-quality** primary web page for a new client in the "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", "Shop", "Contact".
-   **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: "DIY Tutorials", "Tool Reviews", "Beginner Guides".
    -   **Content Depth:** Populate each section with **substantial, realistic text** (multiple sentences/paragraphs). Use authentic industry language and terminology like: "upcycling", "crafting technique", "custom design".
    -   **Visuals:** Integrate relevant placeholder images logically within the content sections.
    -   **Calls to Action:** Include clear and contextually relevant CTAs. Use strong verbs similar to: "Watch Video", "Browse Gallery", "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: "supply calculator".
-   **SIDEBAR (Optional):** If your design includes a sidebar, populate it with **useful, relevant content**. Ideas: "featured makers", "upcoming workshops", "community picks".
-   **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.