Recursive Flint (free) – Food and Drink

via Recursive · Generated

  • AIMAC Debt 3.85
  • Cost $0.00
  • Total Violations 7
  • HTML Size 29 KB
  • Em Dashes 0

Screenshot

View Recursive Flint (free) Food and Drink page View Live Page

Accessibility Issues Found

7 Serious

  • color-contrast serious 7 instances

    Elements must meet minimum color contrast ratio thresholds

    Example HTML <span class="tag">Essential Guide</span>

Artifacts

View Generated HTML
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Savor &amp; Sage | Recipes, Restaurant Guides &amp; Meal Plans</title>
  <meta name="description" content="Savor & Sage is a food and drink publication offering tested recipes, restaurant guides, seasonal menus, cooking tips, and nutrition resources.">
  <link rel="preconnect" href="https://fonts.googleapis.com">
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
  <link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@500;600;700&family=Playfair+Display:ital,wght@0,500;0,700;1,500&family=Source+Sans+3:wght@300;400;600&display=swap" rel="stylesheet">
  <style>
    :root {
      --cream: #faf6ee;
      --paper: #fffdf8;
      --ink: #2b2118;
      --muted: #6e6154;
      --spice: #b4552d;
      --sage: #7a8450;
      --gold: #d9a441;
      --line: #e8dfd0;
      --shadow: 0 18px 40px -30px rgba(43, 33, 24, 0.35);
    }
    * { box-sizing: border-box; }
    html { scroll-behavior: smooth; }
    body {
      margin: 0;
      font-family: 'Source Sans 3', sans-serif;
      background: var(--cream);
      color: var(--ink);
      line-height: 1.6;
    }
    h1, h2, h3, h4 { font-family: 'Playfair Display', serif; line-height: 1.08; }
    a { color: var(--spice); }
    img { max-width: 100%; }
    .container { max-width: 1180px; margin: 0 auto; padding: 0 24px; }
    .eyebrow {
      font-family: 'Montserrat', sans-serif;
      text-transform: uppercase;
      letter-spacing: 0.18em;
      font-size: 12px;
      color: var(--spice);
      font-weight: 700;
      margin: 0;
    }
    .section { padding: 88px 0; }
    .section-alt { background: #f4eddd; }
    .section-head { max-width: 780px; margin-bottom: 48px; }
    .section-head h2 { font-size: clamp(34px, 4.5vw, 52px); margin: 12px 0; }
    .section-intro { font-size: 18px; color: var(--muted); }
    .grid { display: grid; gap: 28px; }
    .grid-2 { grid-template-columns: repeat(2, 1fr); }
    .grid-3 { grid-template-columns: repeat(3, 1fr); }
    .grid-4 { grid-template-columns: repeat(4, 1fr); }
    .two-col { display: grid; grid-template-columns: 1.2fr 0.8fr; gap: 40px; align-items: center; margin-top: 48px; }
    .prose { max-width: 760px; }
    .prose p { margin-bottom: 18px; color: var(--muted); font-size: 17px; }
    .btn {
      display: inline-block;
      background: var(--spice);
      color: #fff;
      padding: 14px 26px;
      border-radius: 999px;
      text-decoration: none;
      font-family: 'Montserrat', sans-serif;
      font-weight: 700;
      font-size: 13px;
      letter-spacing: 0.06em;
      text-transform: uppercase;
      border: 1px solid var(--spice);
      transition: 0.2s;
    }
    .btn:hover { background: #9c4526; }
    .btn-outline { background: transparent; color: var(--spice); border: 1px solid var(--spice); }
    .btn-small { padding: 10px 20px; font-size: 12px; }
    .cta-row { text-align: center; margin-top: 56px; }
    .cta-panel {
      background: linear-gradient(135deg, #7a8450, #5c663c);
      color: #fff;
      border-radius: 24px;
      padding: 56px;
    }
    .cta-panel h3 { color: #fff; font-size: 38px; margin: 0 0 16px; }
    .cta-panel p { max-width: 62ch; margin: 0 auto 28px; color: #f2f4e8; }
    .card {
      background: var(--paper);
      border: 1px solid var(--line);
      border-radius: 20px;
      overflow: hidden;
      box-shadow: var(--shadow);
      transition: 0.2s;
    }
    .card:hover { transform: translateY(-4px); box-shadow: 0 24px 50px -30px rgba(43, 33, 24, 0.45); }
    .card img { width: 100%; height: 220px; object-fit: cover; display: block; }
    .card-body { padding: 24px; }
    .card-body h3 { font-size: 24px; margin: 0 0 10px; }
    .card-body p { margin: 0; color: var(--muted); }
    .meta { font-family: 'Montserrat', sans-serif; font-size: 12px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--muted); }
    .tag {
      display: inline-block;
      background: #f4eddd;
      color: var(--spice);
      font-family: 'Montserrat', sans-serif;
      font-size: 11px;
      font-weight: 700;
      letter-spacing: 0.08em;
      text-transform: uppercase;
      padding: 6px 12px;
      border-radius: 999px;
      margin-right: 8px;
    }
    .time { font-family: 'Montserrat', sans-serif; font-size: 12px; color: var(--muted); }
    header {
      background: rgba(250, 246, 238, 0.94);
      backdrop-filter: blur(8px);
      border-bottom: 1px solid var(--line);
    }
    .header-inner { display: flex; align-items: center; gap: 24px; padding: 14px 24px; flex-wrap: wrap; }
    .brand { display: flex; align-items: center; gap: 12px; text-decoration: none; color: var(--ink); }
    .logo { width: 150px; height: auto; display: block; }
    .brand-text { font-family: 'Playfair Display', serif; font-size: 28px; }
    .amp { color: var(--spice); }
    .tagline { margin: 0; font-family: 'Montserrat', sans-serif; font-size: 11px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--spice); font-weight: 700; }
    .main-nav { display: flex; gap: 18px; flex-wrap: wrap; margin-left: auto; }
    .main-nav a {
      text-decoration: none;
      color: var(--ink);
      font-family: 'Montserrat', sans-serif;
      font-weight: 600;
      font-size: 12px;
      letter-spacing: 0.05em;
      text-transform: uppercase;
      padding: 8px 0;
      border-bottom: 2px solid transparent;
    }
    .main-nav a:hover, .main-nav a.active { color: var(--spice); border-bottom-color: var(--spice); }
    .hero { background: linear-gradient(135deg, #f7efe2, #f3ead8); border-bottom: 1px solid var(--line); }
    .hero-inner { display: grid; grid-template-columns: 1.1fr 0.9fr; gap: 48px; align-items: center; padding: 72px 24px; }
    .hero h1 { font-size: clamp(48px, 7vw, 84px); line-height: 0.95; margin: 12px 0; }
    .hero .tagline { font-family: 'Playfair Display', serif; font-style: italic; font-size: clamp(22px, 3vw, 30px); color: var(--sage); margin: 0 0 20px; }
    .hero-text { font-size: 18px; color: var(--muted); max-width: 54ch; }
    .hero-actions { display: flex; gap: 16px; margin-top: 32px; flex-wrap: wrap; }
    .hero-media img { width: 100%; border-radius: 24px; box-shadow: 0 30px 60px -30px rgba(43, 33, 24, 0.45); display: block; }
    .restaurant-layout { display: grid; grid-template-columns: 1.2fr 0.8fr; gap: 32px; align-items: start; }
    .restaurant-list { display: grid; gap: 20px; }
    .featured-restaurant { display: grid; grid-template-columns: 1fr; }
    .featured-restaurant img { height: 300px; }
    .featured-restaurant .card-body { padding: 28px; }
    blockquote { margin: 0; padding: 0; font-family: 'Playfair Display', serif; font-style: italic; font-size: 20px; line-height: 1.5; color: var(--ink); }
    .quote-author { margin-top: 16px; font-family: 'Montserrat', sans-serif; font-style: normal; font-size: 12px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--muted); }
    .plan-card { padding: 28px; display: flex; flex-direction: column; }
    .plan-card h3 { font-size: 28px; margin: 0 0 8px; }
    .price { font-family: 'Montserrat', sans-serif; font-size: 36px; font-weight: 700; color: var(--spice); margin: 16px 0; }
    .price span { font-size: 14px; font-weight: 500; color: var(--muted); }
    .faq details { background: var(--paper); border: 1px solid var(--line); border-radius: 14px; padding: 18px 20px; }
    .faq details + details { margin-top: 12px; }
    .faq summary { font-family: 'Montserrat', sans-serif; font-weight: 700; cursor: pointer; }
    .tool-card { background: var(--paper); border: 1px solid var(--line); border-radius: 20px; padding: 28px; }
    .tool-card label { display: block; font-family: 'Montserrat', sans-serif; font-weight: 700; font-size: 13px; text-transform: uppercase; margin: 16px 0 8px; }
    .tool-card select { width: 100%; padding: 12px; border-radius: 12px; border: 1px solid var(--line); background: #fffdf8; font: inherit; }
    #swap-result { margin-top: 20px; background: #f4eddd; padding: 16px; border-radius: 12px; border-left: 4px solid var(--sage); }
    .testimonial-grid { grid-template-columns: repeat(3, 1fr); }
    .testimonial-card { padding: 28px; }
    .testimonial-card p { font-family: 'Playfair Display', serif; font-style: italic; font-size: 20px; line-height: 1.5; margin-bottom: 20px; }
    .testimonial-author { display: flex; align-items: center; gap: 14px; }
    .testimonial-author img { width: 52px; height: 52px; border-radius: 50%; object-fit: cover; }
    .testimonial-author strong { display: block; font-family: 'Montserrat', sans-serif; font-size: 13px; text-transform: uppercase; letter-spacing: 0.06em; }
    .testimonial-author span { font-size: 13px; color: var(--muted); }
    footer { background: #2b2118; color: #efe6d8; }
    .footer-grid { display: grid; grid-template-columns: 1.4fr 1fr 1fr; gap: 40px; padding: 64px 0 40px; }
    .site-footer a { color: #efe6d8; text-decoration: none; }
    .site-footer h4 { color: #fff; font-family: 'Montserrat', sans-serif; text-transform: uppercase; letter-spacing: 0.14em; font-size: 13px; margin: 0 0 16px; }
    .footer-bottom { border-top: 1px solid rgba(239, 230, 216, 0.15); padding: 24px 0; display: flex; justify-content: space-between; gap: 16px; flex-wrap: wrap; font-size: 14px; }
    .social-links { display: flex; gap: 12px; flex-wrap: wrap; }
    .social-links a { display: inline-flex; align-items: center; justify-content: center; width: 40px; height: 40px; border: 1px solid rgba(239, 230, 216, 0.3); border-radius: 50%; font-family: 'Montserrat', sans-serif; font-size: 12px; text-decoration: none; }
    @media (max-width: 992px) {
      .grid-3, .grid-4, .testimonial-grid { grid-template-columns: repeat(2, 1fr); }
      .hero-inner, .two-col, .restaurant-layout { grid-template-columns: 1fr; }
      .footer-grid { grid-template-columns: 1fr; }
    }
    @media (max-width: 640px) {
      .grid-2, .grid-3, .grid-4, .testimonial-grid { grid-template-columns: 1fr; }
      .section { padding: 64px 0; }
      .cta-panel { padding: 36px; }
      .main-nav { margin-left: 0; }
    }
  </style>
</head>
<body>
  <header class="site-header">
    <div class="container header-inner">
      <a href="#" class="brand">
        <img class="logo" src="https://placehold.co/150x45?text=Savor%20%26%20Sage&font=montserrat&bg=F7F3EC&text=5C3A21" alt="Savor & Sage logo">
        <span class="brand-text">Savor <span class="amp">&amp;</span> Sage</span>
      </a>
      <p class="tagline">Cook deeper. Eat better.</p>
      <nav class="main-nav" aria-label="Primary navigation">
        <a href="#" class="active" aria-current="page">Home</a>
        <a href="#recipes">Recipes</a>
        <a href="#restaurants">Restaurant Reviews</a>
        <a href="#meal-plans">Meal Plans</a>
        <a href="#kitchen">Kitchen Essentials</a>
        <a href="#seasonal">Seasonal Menus</a>
        <a href="#about">About</a>
      </nav>
      <a href="#subscribe" class="btn btn-small">Get the Cookbook</a>
    </div>
  </header>

  <section class="hero" id="home">
    <div class="container hero-inner">
      <div class="hero-copy">
        <p class="eyebrow">Food &amp; Drink · Recipes · Guides · Nutrition</p>
        <h1>Savor <span class="amp">&amp;</span> Sage</h1>
        <p class="tagline">Cook deeper. Eat better.</p>
        <p class="hero-text">Welcome to Savor & Sage, where food is treated with reverence and joy. We publish tested recipes, deep-dive restaurant guides, seasonal menus, and practical meal plans for home cooks who want restaurant-caliber dining without the reservation.</p>
        <div class="hero-actions">
          <a href="#recipes" class="btn">Browse Recipes</a>
          <a href="#restaurants" class="btn btn-outline">Explore Restaurant Reviews</a>
        </div>
      </div>
      <div class="hero-media">
        <img src="https://picsum.photos/1000/750?grayscale&blur=0" alt="Fresh herbs, tomatoes, and a cast iron pan on a rustic kitchen counter">
      </div>
    </div>
  </section>

  <section class="section" id="kitchen">
    <div class="container">
      <div class="section-head">
        <p class="eyebrow">Technique</p>
        <h2>Master the Fundamentals, From Braising to Umami</h2>
        <p class="section-intro">Professional kitchens obsess over small details. Home cooks deserve the same rigor. Our technique guides translate restaurant methods into repeatable weekday cooking.</p>
      </div>
      <div class="grid grid-4">
        <article class="card">
          <img src="https://picsum.photos/600/450?grayscale&blur=1" alt="Slow-braised short ribs in a Dutch oven">
          <div class="card-body">
            <h3>Braising &amp; Low-Temperature Cooking</h3>
            <p>Short ribs, lamb shanks, and root vegetables become silky through gentle heat and time.</p>
          </div>
        </article>
        <article class="card">
          <img src="https://picsum.photos/600/450?grayscale&blur=1" alt="Red wine reduction in a saucepan">
          <div class="card-body">
            <h3>Reductions &amp; Pan Sauces</h3>
            <p>From demi-glace to herb oil, reductions concentrate flavor without adding salt alone.</p>
          </div>
        </article>
        <article class="card">
          <img src="https://picsum.photos/600/450?grayscale&blur=1" alt="Umami ingredients like mushrooms, miso, and soy">
          <div class="card-body">
            <h3>Umami Layering</h3>
            <p>Miso, fish sauce, tomatoes, mushrooms, aged cheese, and roasted bones deepen savory notes.</p>
          </div>
        </article>
        <article class="card">
          <img src="https://picsum.photos/600/450?grayscale&blur=1" alt="Knife skills and mise en place setup">
          <div class="card-body">
            <h3>Knife Skills &amp; Mise en Place</h3>
            <p>Confidence comes from preparation. Learn efficient cuts and clean workstations.</p>
          </div>
        </article>
      </div>
      <div class="two-col">
        <div class="prose">
          <p>Braising is not simply low heat; it is a conversation between collagen, liquid, aromatics, and time. A proper braise uses onions, carrots, celery, a splash of vinegar, and a tight-fitting lid. The process transforms tough cuts into spoon-tender meals, and the resulting jus is often thickened with a light roux or reduction.</p>
          <p>Reductions are another restaurant cornerstone. A wine reduction begins with aromatic vegetables and a roux, then adds wine and stock in stages. As water evaporates, sugars concentrate and flavors become layered. The goal is not a salty glaze but a balanced sauce that supports the dish.</p>
          <p>Umami is the savory fifth taste that makes food feel complete. We encourage cooks to build umami with roasted mushrooms, miso, fish sauce, aged Parmesan, tomato paste, and bone broth. Even a small amount can shift a dish from flat to deeply satisfying.</p>
        </div>
        <article class="card">
          <img src="https://picsum.photos/700/520?grayscale&blur=2" alt="Braising pot with vegetables and meat">
          <div class="card-body">
            <span class="tag">Essential Guide</span>
            <h3>Three-Step Braising Method</h3>
            <p>Season and sear. Add aromatics and liquid. Braise low, then reduce and finish.</p>
          </div>
        </article>
      </div>
      <div class="cta-row">
        <a href="#recipes" class="btn">Try Recipe</a>
      </div>
    </div>
  </section>

  <section class="section section-alt" id="recipes">
    <div class="container">
      <div class="section-head">
        <p class="eyebrow">Recipe Library</p>
        <h2>Recipes Worth Repetition</h2>
        <p class="section-intro">From weeknight pasta to celebratory roasts, our recipes are tested in real home kitchens. They favor braises, reductions, and umami-rich flavor systems.</p>
      </div>
      <div class="grid grid-3">
        <article class="card">
          <img src="https://picsum.photos/700/520?grayscale&blur=2" alt="Wild mushroom risotto">
          <div class="card-body">
            <span class="tag">Italian</span>
            <h3>Wild Mushroom Risotto</h3>
            <p class="time">45 minutes · Medium</p>
            <p>Arborio rice, mixed mushrooms, white wine reduction, thyme, and aged Parmesan.</p>
            <a href="#" class="btn btn-small" style="margin-top: 18px;">Try Recipe</a>
          </div>
        </article>
        <article class="card">
          <img src="https://picsum.photos/700/520?grayscale&blur=2" alt="Braised lamb shank">
          <div class="card-body">
            <span class="tag">French</span>
            <h3>Braised Lamb Shank</h3>
            <p class="time">3 hours · Advanced</p>
            <p>Dark beer, tomatoes, root vegetables, and a red wine reduction.</p>
            <a href="#" class="btn btn-small" style="margin-top: 18px;">Try Recipe</a>
          </div>
        </article>
        <article class="card">
          <img src="https://picsum.photos/700/520?grayscale&blur=2" alt="Brown butter chocolate cake">
          <div class="card-body">
            <span class="tag">Dessert</span>
            <h3>Brown Butter Chocolate Cake</h3>
            <p class="time">50 minutes · Medium</p>
            <p>Melted butter, dark chocolate, flaky salt, and espresso for depth.</p>
            <a href="#" class="btn btn-small" style="margin-top: 18px;">Try Recipe</a>
          </div>
        </article>
      </div>
      <div class="prose" style="margin-top: 48px;">
        <p>Our recipe development process begins with a single question: what would a busy home cook make on a Tuesday that still feels special? The answer often involves braised proteins, deeply caramelized vegetables, and sauces built through reduction. We test every recipe at least twice, then adjust for texture, seasoning, and timing.</p>
        <p>Many recipes also include substitution notes. If a home cook lacks fish sauce, we suggest soy and anchovy. If they have no white wine, we recommend verjus or lemon juice. These swaps preserve the intended flavor architecture rather than simply replacing one ingredient with another.</p>
      </div>
      <div class="cta-row">
        <a href="#subscribe" class="btn">Start Cooking Better</a>
      </div>
    </div>
  </section>

  <section class="section" id="restaurants">
    <div class="container">
      <div class="section-head">
        <p class="eyebrow">Restaurant Guide</p>
        <h2>Where the Critics Eat</h2>
        <p class="section-intro">Our dining team visits independent restaurants across the region, from wood-fired Italian kitchens to fermentation-focused tasting rooms.</p>
      </div>
      <div class="restaurant-layout">
        <article class="card featured-restaurant">
          <img src="https://picsum.photos/900/600?grayscale&blur=1" alt="Restaurant interior with open kitchen">
          <div class="card-body">
            <p class="eyebrow">Critics' Choice</p>
            <h3>The Fermented Fork</h3>
            <p class="meta">Oak-fired Italian · Portland, OR · 4.8 / 5</p>
            <blockquote>The pasta was rolled by hand and finished in a emulsion of pecorino, brown butter, and bottarga. The braised lamb had the depth of a two-day stew, but arrived at the table in under ninety minutes.</blockquote>
            <p class="quote-author">Elena Marsh, Senior Food Critic</p>
          </div>
        </article>
        <div class="restaurant-list">
          <article class="card">
            <img src="https://picsum.photos/600/400?grayscale&blur=1" alt="Seasonal vegetable plates at a farm-to-table restaurant">
            <div class="card-body">
              <h3>Ember &amp; Oak</h3>
              <p class="meta">Fire cooking · Austin, TX · 4.7 / 5</p>
              <p>Whole-animal fire cooking and charred seasonal vegetables.</p>
            </div>
          </article>
          <article class="card">
            <img src="https://picsum.photos/600/400?grayscale&blur=1" alt="Fermented marketplace plates">
            <div class="card-body">
              <h3>Green Table</h3>
              <p class="meta">Plant-forward · Minneapolis, MN · 4.6 / 5</p>
              <p>Fermented condiments and grain-forward small plates.</p>
            </div>
          </article>
        </div>
      </div>
      <div class="cta-row">
        <a href="#" class="btn btn-outline">View Menu</a>
      </div>
    </div>
  </section>

  <section class="section section-alt" id="meal-plans">
    <div class="container">
      <div class="section-head">
        <p class="eyebrow">Meal Plans</p>
        <h2>Seasonal Menus That Follow the Harvest</h2>
        <p class="section-intro">Our meal plans adapt to regional seasons and household goals, from low-carb resets to plant-forward eating.</p>
      </div>
      <div class="grid grid-3">
        <article class="card plan-card">
          <h3>The Weeknight Warrior</h3>
          <p class="meta">6 weeks · 12 meals</p>
          <div class="price">149 <span>/ person</span></div>
          <p>Braised proteins, quick pastas, and make-ahead sauces.</p>
          <a href="#" class="btn" style="margin-top: auto;">Start Meal Plan</a>
        </article>
        <article class="card plan-card">
          <h3>The Low-Carb Reset</h3>
          <p class="meta">4 weeks · 10 meals</p>
          <div class="price">199 <span>/ person</span></div>
          <p>Root vegetables, fermented vegetables, and low-carb braises.</p>
          <a href="#" class="btn" style="margin-top: auto;">Start Meal Plan</a>
        </article>
        <article class="card plan-card">
          <h3>The Plant-Forward Pantry</h3>
          <p class="meta">8 weeks · 14 meals</p>
          <div class="price">179 <span>/ person</span></div>
          <p>Miso, mushroom, lentil, and grain recipes for everyday plant-based cooking.</p>
          <a href="#" class="btn" style="margin-top: auto;">Start Meal Plan</a>
        </article>
      </div>
      <div class="grid grid-2" style="margin-top: 56px;">
        <div>
          <h3 style="font-size: 32px;">Seasonal Menu Spotlight</h3>
          <p style="color: var(--muted); font-size: 17px;">Summer menu at The Fermented Fork focuses on tomato water, basil emulsion, grilled stone fruit, and hand-cut pasta. Autumn introduces porcini, chestnut, and slow-cooked beef.</p>
        </div>
        <div>
          <h3 style="font-size: 32px;">Nutrition Notes</h3>
          <p style="color: var(--muted); font-size: 17px;">Our guides pair nutrition context with cooking technique, helping clients understand sodium, fiber, protein, and fat without sacrificing flavor.</p>
        </div>
      </div>
      <div class="faq" style="margin-top: 56px; max-width: 820px;">
        <h3 style="font-size: 32px; margin-bottom: 24px;">Frequently Asked Questions</h3>
        <details>
          <summary>How many servings do the meal plans include?</summary>
          <p style="margin: 12px 0 0; color: var(--muted);">Most plans include six to fourteen meals with grocery lists and prep notes.</p>
        </details>
        <details>
          <summary>Can I swap ingredients in the recipes?</summary>
          <p style="margin: 12px 0 0; color: var(--muted);">Yes. Every recipe includes substitution guidance that preserves braising liquid, reductions, and umami balance.</p>
        </details>
        <details>
          <summary>Do the meal plans work for dietary restrictions?</summary>
          <p style="margin: 12px 0 0; color: var(--muted);">We offer vegetarian, vegan, gluten-free, and dairy-light variations where appropriate.</p>
        </details>
      </div>
    </div>
  </section>

  <section class="section" id="substitute">
    <div class="container two-col" style="align-items: start;">
      <div class="prose">
        <p class="eyebrow">Engagement Tool</p>
        <h2 style="font-size: clamp(32px, 4vw, 46px); margin: 12px 0;">Ingredient Substitution Studio</h2>
        <p>Great cooking is adaptive. Use our substitution tool to replace key ingredients while preserving flavor. Whether you need to swap butter for oil, cream for coconut cream, or chicken for turkey, small changes can shift texture and taste.</p>
        <p>This tool is designed for home cooks who want to reduce waste, accommodate preferences, or cook from what they have. It pairs with our recipe language around braising, reductions, and umami.</p>
      </div>
      <div class="tool-card">
        <label for="original">Original ingredient</label>
        <select id="original">
          <option>Butter</option>
          <option>Heavy Cream</option>
          <option>Eggs</option>
          <option>Flour</option>
          <option>Chicken</option>
          <option>Salmon</option>
          <option>Rice</option>
          <option>Garlic</option>
          <option>Lemon</option>
        </select>
        <label for="substitute">Substitute</label>
        <select id="substitute">
          <option>Olive Oil</option>
          <option>Coconut Cream</option>
          <option>Flax Egg</option>
          <option>Almond Flour</option>
          <option>Turkey</option>
          <option>Tofu</option>
          <option>Quinoa</option>
          <option>Chives</option>
          <option>Lime</option>
        </select>
        <button id="swap-btn" class="btn" style="margin-top: 20px;">Swap Ingredient</button>
        <p id="swap-result">Choose an original ingredient and a substitute to see suggested technique notes.</p>
      </div>
    </div>
  </section>

  <section class="section section-alt" id="testimonials">
    <div class="container">
      <div class="section-head">
        <p class="eyebrow">Testimonials</p>
        <h2>Cooks Who Have Transformed Their Kitchens</h2>
      </div>
      <div class="grid grid-3">
        <article class="card testimonial-card">
          <p>"The braising guide changed how I cook beef. My Sunday roast became Tuesday dinner without tears."</p>
          <div class="testimonial-author">
            <img src="https://i.pravatar.cc/150?u=savor.sage" alt="Chef portrait">
            <div>
              <strong>Maya R.</strong>
              <span>Home cook, recipe reviewer</span>
            </div>
          </div>
        </article>
        <article class="card testimonial-card">
          <p>"Finally, a resource that explains reductions without drowning in culinary-school jargon."</p>
          <div class="testimonial-author">
            <img src="https://i.pravatar.cc/150?u=savor.sage" alt="Chef portrait">
            <div>
              <strong>Daniel K.</strong>
              <span>Family meal coordinator</span>
            </div>
          </div>
        </article>
        <article class="card testimonial-card">
          <p>"The meal plans helped us eat better with less waste. The grocery lists are ruthless in the best way.</p>
          <div class="testimonial-author">
            <img src="https://i.pravatar.cc/150?u=savor.sage" alt="Chef portrait">
            <div>
              <strong>Leila H.</strong>
              <span>Weekly meal planner</span>
            </div>
          </div>
        </article>
      </div>
    </div>
  </section>

  <footer class="site-footer" id="about">
    <div class="container">
      <div class="footer-grid">
        <div>
          <h3 style="font-size: 36px; color: #fff; margin-top: 0;">Savor &amp; Sage</h3>
          <p>Cook deeper. Eat better. Recipes, restaurant guides, seasonal menus, and practical food education.</p>
          <div class="social-links">
            <a href="#" aria-label="Instagram">IG</a>
            <a href="#" aria-label="Facebook">FB</a>
            <a href="#" aria-label="Pinterest">PIN</a>
            <a href="#" aria-label="YouTube">YT</a>
          </div>
        </div>
        <div>
          <h4>Explore</h4>
          <p><a href="#recipes">Recipes</a></p>
          <p><a href="#restaurants">Restaurant Reviews</a></p>
          <p><a href="#meal-plans">Meal Plans</a></p>
          <p><a href="#kitchen">Kitchen Essentials</a></p>
        </div>
        <div>
          <h4>Contact</h4>
          <p>123 Orchard Lane<br>Portland, OR 97205</p>
          <p>hello@savorsage.example</p>
          <p>+1 (503) 555-0184</p>
        </div>
      </div>
      <div class="footer-bottom">
        <p>© <span id="year">2026</span> Savor &amp; Sage. All rights reserved.</p>
        <div>
          <a href="#">Privacy Policy</a>
          <a href="#" style="margin-left: 18px;">Terms of Service</a>
        </div>
      </div>
    </div>
  </footer>

  <script>
    const swaps = {
      'Butter': 'Olive Oil',
      'Heavy Cream': 'Coconut Cream',
      'Eggs': 'Flax Egg',
      'Flour': 'Almond Flour',
      'Chicken': 'Turkey',
      'Salmon': 'Tofu',
      'Rice': 'Quinoa',
      'Garlic': 'Chives',
      'Lemon': 'Lime'
    };
    document.getElementById('year').textContent = new Date().getFullYear();
    document.getElementById('swap-btn').addEventListener('click', () => {
      const original = document.getElementById('original').value;
      const substitute = document.getElementById('substitute').value;
      const result = document.getElementById('swap-result');
      if (original === substitute) {
        result.textContent = 'Please choose a different ingredient.';
        return;
      }
      const match = Object.keys(swaps).find(key => swaps[key] === substitute);
      if (match) {
        result.textContent = `Great swap: ${original} can often be replaced with ${substitute}. For braises, adjust the fat source and simmer gently. For creams, blend until smooth and season carefully.`;
      } else {
        result.textContent = `You can use ${substitute} as a substitute for ${original}. Adjust seasoning, acid, and texture to suit the dish.`;
      }
    });
  </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:13:10.929Z",
  "url": "https://benchmark.aimac.invalid/3d86a9fc00b600d28ad7ac43d7ea14ae97db8a0c6b3b73019ae6e600c11e1121.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-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": []
    },
    {
      "id": "aria-hidden-focus",
      "impact": null,
      "tags": [
        "cat.name-role-value",
        "wcag2a",
        "wcag412",
        "TTv5",
        "TT6.a",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure aria-hidden elements are not focusable nor contain focusable elements",
      "help": "ARIA hidden element must not be focusable or contain focusable elements",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-hidden-focus?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-input-field-name",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "TTv5",
        "TT5.c",
        "EN-301-549",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure every ARIA input field has an accessible name",
      "help": "ARIA input fields must have an accessible name",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-input-field-name?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-meter-name",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag111",
        "EN-301-549",
        "EN-9.1.1.1"
      ],
      "description": "Ensure every ARIA meter node has an accessible name",
      "help": "ARIA meter nodes must have an accessible name",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-meter-name?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-progressbar-name",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag111",
        "EN-301-549",
        "EN-9.1.1.1"
      ],
      "description": "Ensure every ARIA progressbar node has an accessible name",
      "help": "ARIA progressbar nodes must have an accessible name",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-progressbar-name?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-required-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": []
    },
    {
      "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-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": []
    },
    {
      "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": "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": []
    },
    {
      "id": "link-in-text-block",
      "impact": null,
      "tags": [
        "cat.color",
        "wcag2a",
        "wcag141",
        "TTv5",
        "TT13.a",
        "EN-301-549",
        "EN-9.1.4.1"
      ],
      "description": "Ensure links are distinguished from surrounding text in a way that does not rely on color",
      "help": "Links must be distinguishable without relying on color",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/link-in-text-block?application=axeAPI",
      "nodes": []
    },
    {
      "id": "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": []
    },
    {
      "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": []
    },
    {
      "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\" aria-label=\"Primary navigation\">",
          "target": [
            "nav"
          ]
        }
      ]
    },
    {
      "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\" aria-label=\"Primary navigation\">",
          "target": [
            "nav"
          ]
        }
      ]
    },
    {
      "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-prohibited-attr",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure ARIA attributes are not prohibited for an element's role",
      "help": "Elements must only use permitted ARIA attributes",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-prohibited-attr?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [],
          "none": [
            {
              "id": "aria-prohibited-attr",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "ARIA attribute is allowed"
            }
          ],
          "impact": null,
          "html": "<nav class=\"main-nav\" aria-label=\"Primary navigation\">",
          "target": [
            "nav"
          ]
        }
      ]
    },
    {
      "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\" aria-label=\"Primary navigation\">",
          "target": [
            "nav"
          ]
        }
      ]
    },
    {
      "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\" aria-label=\"Primary navigation\">",
          "target": [
            "nav"
          ]
        }
      ]
    },
    {
      "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": "<a href=\"#\" class=\"btn btn-small\" style=\"margin-top: 18px;\">Try Recipe</a>",
          "target": [
            "article:nth-child(1) > .card-body > .btn-small.btn[href=\"#\"]"
          ]
        }
      ]
    },
    {
      "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 id=\"swap-btn\" class=\"btn\" style=\"margin-top: 20px;\">Swap Ingredient</button>",
          "target": [
            "#swap-btn"
          ]
        }
      ]
    },
    {
      "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>Savor <span class=\"amp\">&amp;</span> Sage</h1>",
                  "target": [
                    "h1"
                  ]
                },
                {
                  "html": "<h2>Master the Fundamentals, From Braising to Umami</h2>",
                  "target": [
                    "#kitchen > .container > .section-head > h2"
                  ]
                },
                {
                  "html": "<h3>Braising &amp; Low-Temperature Cooking</h3>",
                  "target": [
                    ".grid-4 > article:nth-child(1) > .card-body > h3"
                  ]
                },
                {
                  "html": "<h3>Reductions &amp; Pan Sauces</h3>",
                  "target": [
                    ".grid-4 > article:nth-child(2) > .card-body > h3"
                  ]
                },
                {
                  "html": "<h3>Umami Layering</h3>",
                  "target": [
                    ".grid-4 > article:nth-child(3) > .card-body > h3"
                  ]
                },
                {
                  "html": "<h3>Knife Skills &amp; Mise en Place</h3>",
                  "target": [
                    "article:nth-child(4) > .card-body > h3"
                  ]
                },
                {
                  "html": "<h3>Three-Step Braising Method</h3>",
                  "target": [
                    ".two-col > article > .card-body > h3"
                  ]
                },
                {
                  "html": "<h2>Recipes Worth Repetition</h2>",
                  "target": [
                    "#recipes > .container > .section-head > h2"
                  ]
                },
                {
                  "html": "<h3>Wild Mushroom Risotto</h3>",
                  "target": [
                    ".grid-3.grid > article:nth-child(1) > .card-body > h3"
                  ]
                },
                {
                  "html": "<h3>Braised Lamb Shank</h3>",
                  "target": [
                    ".grid-3.grid > article:nth-child(2) > .card-body > h3"
                  ]
                },
                {
                  "html": "<h3>Brown Butter Chocolate Cake</h3>",
                  "target": [
                    ".grid-3.grid > article:nth-child(3) > .card-body > h3"
                  ]
                },
                {
                  "html": "<h2>Where the Critics Eat</h2>",
                  "target": [
                    "#restaurants > .container > .section-head > h2"
                  ]
                },
                {
                  "html": "<h3>The Fermented Fork</h3>",
                  "target": [
                    ".featured-restaurant > .card-body > h3"
                  ]
                },
                {
                  "html": "<h3>Ember &amp; Oak</h3>",
                  "target": [
                    ".restaurant-list > article:nth-child(1) > .card-body > h3"
                  ]
                },
                {
                  "html": "<h3>Green Table</h3>",
                  "target": [
                    ".restaurant-list > article:nth-child(2) > .card-body > h3"
                  ]
                },
                {
                  "html": "<h2>Seasonal Menus That Follow the Harvest</h2>",
                  "target": [
                    "#meal-plans > .container > .section-head > h2"
                  ]
                },
                {
                  "html": "<h3>The Weeknight Warrior</h3>",
                  "target": [
                    ".plan-card:nth-child(1) > h3"
                  ]
                },
                {
                  "html": "<h3>The Low-Carb Reset</h3>",
                  "target": [
                    ".plan-card:nth-child(2) > h3"
                  ]
                },
                {
                  "html": "<h3>The Plant-Forward Pantry</h3>",
                  "target": [
                    ".plan-card:nth-child(3) > h3"
                  ]
                },
                {
                  "html": "<h3 style=\"font-size: 32px;\">Seasonal Menu Spotlight</h3>",
                  "target": [
                    ".grid-2 > div:nth-child(1) > h3"
                  ]
                },
                {
                  "html": "<h3 style=\"font-size: 32px;\">Nutrition Notes</h3>",
                  "target": [
                    ".grid-2 > div:nth-child(2) > h3"
                  ]
                },
                {
                  "html": "<h3 style=\"font-size: 32px; margin-bottom: 24px;\">Frequently Asked Questions</h3>",
                  "target": [
                    ".faq > h3"
                  ]
                },
                {
                  "html": "<h2 style=\"font-size: clamp(32px, 4vw, 46px); margin: 12px 0;\">Ingredient Substitution Studio</h2>",
                  "target": [
                    ".prose > h2"
                  ]
                },
                {
                  "html": "<h2>Cooks Who Have Transformed Their Kitchens</h2>",
                  "target": [
                    "#testimonials > .container > .section-head > h2"
                  ]
                },
                {
                  "html": "<h3 style=\"font-size: 36px; color: #fff; margin-top: 0;\">Savor &amp; Sage</h3>",
                  "target": [
                    ".footer-grid > div:nth-child(1) > h3"
                  ]
                },
                {
                  "html": "<h4>Explore</h4>",
                  "target": [
                    "div:nth-child(2) > h4"
                  ]
                },
                {
                  "html": "<h4>Contact</h4>",
                  "target": [
                    "div:nth-child(3) > h4"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Page has a heading"
            }
          ],
          "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": "#2b2118",
                "bgColor": "#faf6ee",
                "contrastRatio": 14.61,
                "fontSize": "21.0pt (28px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "3:1",
                "shadowColor": null
              },
              "relatedNodes": [],
              "impact": "serious",
              "message": "Element has sufficient color contrast of 14.61"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<span class=\"brand-text\">Savor <span class=\"amp\">&amp;</span> Sage</span>",
          "target": [
            ".brand-text"
          ]
        }
      ]
    },
    {
      "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": "critical",
      "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": "original",
              "relatedNodes": [],
              "impact": "critical",
              "message": "Document has no elements referenced with ARIA or labels that share the same id attribute"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<select id=\"original\">",
          "target": [
            "#original"
          ]
        }
      ]
    },
    {
      "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=\"original\">Original ingredient</label>",
                  "target": [
                    "label[for=\"original\"]"
                  ]
                }
              ],
              "impact": "moderate",
              "message": "Form field does not have multiple label elements"
            }
          ],
          "impact": null,
          "html": "<select id=\"original\">",
          "target": [
            "#original"
          ]
        }
      ]
    },
    {
      "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 class=\"logo\" src=\"https://placehold.co/150x45?text=Savor%20%26%20Sage&amp;font=montserrat&amp;bg=F7F3EC&amp;text=5C3A21\" alt=\"Savor &amp; Sage logo\">",
          "target": [
            ".logo"
          ]
        }
      ]
    },
    {
      "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=\"#\" class=\"brand\">\n        <img class=\"logo\" src=\"https://placehold.co/150x45?text=Savor%20%26%20Sage&amp;font=montserrat&amp;bg=F7F3EC&amp;text=5C3A21\" alt=\"Savor &amp; Sage logo\">\n        <span class=\"brand-text\">Savor <span class=\"amp\">&amp;</span> Sage</span>\n      </a>",
          "target": [
            ".brand"
          ]
        }
      ]
    },
    {
      "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 class=\"logo\" src=\"https://placehold.co/150x45?text=Savor%20%26%20Sage&amp;font=montserrat&amp;bg=F7F3EC&amp;text=5C3A21\" alt=\"Savor &amp; Sage logo\">",
          "target": [
            ".logo"
          ]
        }
      ]
    },
    {
      "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": "Original ingredient"
              },
              "relatedNodes": [
                {
                  "html": "<label for=\"original\">Original ingredient</label>",
                  "target": [
                    "label[for=\"original\"]"
                  ]
                }
              ],
              "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=\"original\">",
          "target": [
            "#original"
          ]
        }
      ]
    },
    {
      "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>How many servings do the meal plans include?</summary>",
          "target": [
            "details:nth-child(2) > 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": 328.8,
                "height": 44.8
              },
              "relatedNodes": [],
              "impact": "serious",
              "message": "Control has sufficient size (328.8px by 44.8px, should be at least 24px by 24px)"
            },
            {
              "id": "target-offset",
              "data": {
                "closestOffset": 24,
                "minOffset": 24
              },
              "relatedNodes": [],
              "impact": "serious",
              "message": "Target has sufficient space from its closest neighbors. Safe clickable space has a diameter of 24px which is at least 24px."
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<a href=\"#\" class=\"brand\">\n        <img class=\"logo\" src=\"https://placehold.co/150x45?text=Savor%20%26%20Sage&amp;font=montserrat&amp;bg=F7F3EC&amp;text=5C3A21\" alt=\"Savor &amp; Sage logo\">\n        <span class=\"brand-text\">Savor <span class=\"amp\">&amp;</span> Sage</span>\n      </a>",
          "target": [
            ".brand"
          ]
        }
      ]
    }
  ],
  "incomplete": [
    {
      "id": "color-contrast",
      "impact": "serious",
      "tags": [
        "cat.color",
        "wcag2aa",
        "wcag143",
        "TTv5",
        "TT13.c",
        "EN-301-549",
        "EN-9.1.4.3",
        "ACT"
      ],
      "description": "Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds",
      "help": "Elements must meet minimum color contrast ratio thresholds",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/color-contrast?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": null,
                "bgColor": null,
                "contrastRatio": 0,
                "fontSize": "9.0pt (12px)",
                "fontWeight": "bold",
                "messageKey": "bgGradient",
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<section class=\"hero\" id=\"home\">",
                  "target": [
                    "#home"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element's background color could not be determined due to a background gradient"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<p class=\"eyebrow\">Food &amp; Drink \u00b7 Recipes \u00b7 Guides \u00b7 Nutrition</p>",
          "target": [
            ".hero-copy > .eyebrow"
          ],
          "failureSummary": "Fix any of the following:\n  Element's background color could not be determined due to a background gradient"
        }
      ]
    },
    {
      "id": "duplicate-id-aria",
      "impact": "critical",
      "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": "substitute",
              "relatedNodes": [
                {
                  "html": "<select id=\"substitute\">",
                  "target": [
                    "select:nth-child(4)"
                  ]
                }
              ],
              "impact": "critical",
              "message": "Document has multiple elements referenced with ARIA with the same id attribute: substitute"
            }
          ],
          "all": [],
          "none": [],
          "impact": "critical",
          "html": "<section class=\"section\" id=\"substitute\">",
          "target": [
            ".section:nth-child(7)"
          ],
          "failureSummary": "Fix any of the following:\n  Document has multiple elements referenced with ARIA with the same id attribute: substitute"
        }
      ]
    }
  ],
  "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": "#b4552d",
                "bgColor": "#f4eddd",
                "contrastRatio": 4.2,
                "fontSize": "8.3pt (11px)",
                "fontWeight": "bold",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<span class=\"tag\">Essential Guide</span>",
                  "target": [
                    ".two-col > article > .card-body > .tag"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 4.2 (foreground color: #b4552d, background color: #f4eddd, font size: 8.3pt (11px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"tag\">Essential Guide</span>",
          "target": [
            ".two-col > article > .card-body > .tag"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 4.2 (foreground color: #b4552d, background color: #f4eddd, font size: 8.3pt (11px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b4552d",
                "bgColor": "#f4eddd",
                "contrastRatio": 4.2,
                "fontSize": "9.0pt (12px)",
                "fontWeight": "bold",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<section class=\"section section-alt\" id=\"recipes\">",
                  "target": [
                    "#recipes"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 4.2 (foreground color: #b4552d, background color: #f4eddd, font size: 9.0pt (12px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<p class=\"eyebrow\">Recipe Library</p>",
          "target": [
            "#recipes > .container > .section-head > .eyebrow"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 4.2 (foreground color: #b4552d, background color: #f4eddd, font size: 9.0pt (12px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b4552d",
                "bgColor": "#f4eddd",
                "contrastRatio": 4.2,
                "fontSize": "8.3pt (11px)",
                "fontWeight": "bold",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<span class=\"tag\">Italian</span>",
                  "target": [
                    "article:nth-child(1) > .card-body > .tag"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 4.2 (foreground color: #b4552d, background color: #f4eddd, font size: 8.3pt (11px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"tag\">Italian</span>",
          "target": [
            "article:nth-child(1) > .card-body > .tag"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 4.2 (foreground color: #b4552d, background color: #f4eddd, font size: 8.3pt (11px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b4552d",
                "bgColor": "#f4eddd",
                "contrastRatio": 4.2,
                "fontSize": "8.3pt (11px)",
                "fontWeight": "bold",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<span class=\"tag\">French</span>",
                  "target": [
                    ".grid-3.grid > article:nth-child(2) > .card-body > .tag"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 4.2 (foreground color: #b4552d, background color: #f4eddd, font size: 8.3pt (11px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"tag\">French</span>",
          "target": [
            ".grid-3.grid > article:nth-child(2) > .card-body > .tag"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 4.2 (foreground color: #b4552d, background color: #f4eddd, font size: 8.3pt (11px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b4552d",
                "bgColor": "#f4eddd",
                "contrastRatio": 4.2,
                "fontSize": "8.3pt (11px)",
                "fontWeight": "bold",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<span class=\"tag\">Dessert</span>",
                  "target": [
                    "article:nth-child(3) > .card-body > .tag"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 4.2 (foreground color: #b4552d, background color: #f4eddd, font size: 8.3pt (11px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"tag\">Dessert</span>",
          "target": [
            "article:nth-child(3) > .card-body > .tag"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 4.2 (foreground color: #b4552d, background color: #f4eddd, font size: 8.3pt (11px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b4552d",
                "bgColor": "#f4eddd",
                "contrastRatio": 4.2,
                "fontSize": "9.0pt (12px)",
                "fontWeight": "bold",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<section class=\"section section-alt\" id=\"meal-plans\">",
                  "target": [
                    "#meal-plans"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 4.2 (foreground color: #b4552d, background color: #f4eddd, font size: 9.0pt (12px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<p class=\"eyebrow\">Meal Plans</p>",
          "target": [
            "#meal-plans > .container > .section-head > .eyebrow"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 4.2 (foreground color: #b4552d, background color: #f4eddd, font size: 9.0pt (12px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b4552d",
                "bgColor": "#f4eddd",
                "contrastRatio": 4.2,
                "fontSize": "9.0pt (12px)",
                "fontWeight": "bold",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<section class=\"section section-alt\" id=\"testimonials\">",
                  "target": [
                    "#testimonials"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 4.2 (foreground color: #b4552d, background color: #f4eddd, font size: 9.0pt (12px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<p class=\"eyebrow\">Testimonials</p>",
          "target": [
            "#testimonials > .container > .section-head > .eyebrow"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 4.2 (foreground color: #b4552d, background color: #f4eddd, font size: 9.0pt (12px), font weight: bold). Expected contrast ratio of 4.5:1"
        }
      ]
    }
  ],
  "coverage": {
    "contract": "main-document-vertical-scroll",
    "complete": true,
    "positions": [
      {
        "y": 0,
        "height": 7687
      },
      {
        "y": 576,
        "height": 7687
      },
      {
        "y": 1152,
        "height": 7687
      },
      {
        "y": 1728,
        "height": 7687
      },
      {
        "y": 2304,
        "height": 7687
      },
      {
        "y": 2880,
        "height": 7687
      },
      {
        "y": 3456,
        "height": 7687
      },
      {
        "y": 4032,
        "height": 7687
      },
      {
        "y": 4608,
        "height": 7687
      },
      {
        "y": 5184,
        "height": 7687
      },
      {
        "y": 5760,
        "height": 7687
      },
      {
        "y": 6336,
        "height": 7687
      },
      {
        "y": 6912,
        "height": 7687
      },
      {
        "y": 6967,
        "height": 7687
      }
    ],
    "scans": 15,
    "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 "Food and Drink" 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: "Food and Drink"
- Description: Recipes, restaurant guides, cooking tips, and nutrition resources.

**Your Creative Task:**
1.  **Invent:** Create a unique, professional-sounding site name and a strong tagline fitting the "Food and Drink" 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: "Restaurant Reviews", "Meal Plans", "About".
-   **MAIN CONTENT:** Structure this area with **at least 3-4 distinct, well-developed sections**.
    -   Address key topics relevant to the "Food and Drink" category. Consider themes similar to: "Kitchen Essentials", "Seasonal Menus", "Restaurant Guide".
    -   **Content Depth:** Populate each section with **substantial, realistic text** (multiple sentences/paragraphs). Use authentic industry language and terminology like: "umami", "braising", "reduction".
    -   **Visuals:** Integrate relevant placeholder images logically within the content sections.
    -   **Calls to Action:** Include clear and contextually relevant CTAs. Use strong verbs similar to: "Try Recipe", "Order Now", "View Menu".
-   **ENGAGEMENT (Recommended):** Strongly consider incorporating **one meaningful interactive element** that would genuinely benefit a user in the "Food and Drink" sector. Ideas similar but not limited to: "ingredient substitution tool".
-   **SIDEBAR (Optional):** If your design includes a sidebar, populate it with **useful, relevant content**. Ideas: "restaurant picks", "featured chefs", "chef interviews".
-   **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.