Qwen Qwen3.7 Plus – Food and Drink
via Alibaba · Generated
- AIMAC Debt 21.78
- Cost $0.02
- Total Violations 15
- HTML Size 56 KB
- Em Dashes 10
Screenshot
View Live Page
Accessibility Issues Found
4 Critical 11 Serious
-
color-contrast serious 11 instances
Elements must meet minimum color contrast ratio thresholds
Example HTML
<span class="section-label">Featured Recipes</span> -
label critical 2 instances
Form elements must have labels
Example HTML
<input type="number" id="originalServings" value="4" min="1" max="20"> -
select-name critical 2 instances
Select element must have an accessible name
Example HTML
<select id="recipeType">
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 & Stem — Where Every Flavor Tells a Story</title>
<link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,700;1,400&family=Source+Sans+Pro:wght@300;400;600;700&display=swap" rel="stylesheet">
<style>
:root {
--primary: #2D5016;
--primary-light: #3D6B1F;
--accent: #C8A951;
--accent-dark: #A8893A;
--cream: #FDF8F0;
--cream-dark: #F5EDE0;
--charcoal: #2C2C2C;
--gray: #6B6B6B;
--light-gray: #E8E2D8;
--white: #FFFFFF;
--shadow: 0 4px 20px rgba(0,0,0,0.08);
--shadow-lg: 0 8px 40px rgba(0,0,0,0.12);
--radius: 12px;
--transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html {
scroll-behavior: smooth;
}
body {
font-family: 'Source Sans Pro', sans-serif;
color: var(--charcoal);
background: var(--cream);
line-height: 1.7;
overflow-x: hidden;
}
h1, h2, h3, h4, h5 {
font-family: 'Playfair Display', serif;
line-height: 1.3;
}
a {
text-decoration: none;
color: inherit;
transition: var(--transition);
}
img {
max-width: 100%;
height: auto;
display: block;
}
.container {
max-width: 1280px;
margin: 0 auto;
padding: 0 24px;
}
/* HEADER */
.header {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 1000;
background: rgba(253, 248, 240, 0.95);
backdrop-filter: blur(12px);
border-bottom: 1px solid var(--light-gray);
transition: var(--transition);
}
.header-inner {
display: flex;
align-items: center;
justify-content: space-between;
padding: 16px 24px;
max-width: 1400px;
margin: 0 auto;
}
.logo-group {
display: flex;
align-items: center;
gap: 14px;
}
.logo-img {
width: 52px;
height: 52px;
border-radius: 50%;
object-fit: cover;
}
.logo-text h1 {
font-size: 1.5rem;
color: var(--primary);
letter-spacing: -0.5px;
}
.logo-text span {
font-family: 'Source Sans Pro', sans-serif;
font-size: 0.72rem;
color: var(--gray);
text-transform: uppercase;
letter-spacing: 2px;
font-weight: 600;
}
.nav {
display: flex;
align-items: center;
gap: 32px;
}
.nav a {
font-size: 0.92rem;
font-weight: 600;
color: var(--charcoal);
position: relative;
padding: 4px 0;
}
.nav a::after {
content: '';
position: absolute;
bottom: -2px;
left: 0;
width: 0;
height: 2px;
background: var(--accent);
transition: var(--transition);
}
.nav a:hover::after {
width: 100%;
}
.nav a:hover {
color: var(--primary);
}
.nav-cta {
background: var(--primary);
color: var(--white) !important;
padding: 10px 24px;
border-radius: 50px;
font-weight: 600;
}
.nav-cta:hover {
background: var(--primary-light);
transform: translateY(-1px);
}
.nav-cta::after {
display: none !important;
}
.mobile-toggle {
display: none;
flex-direction: column;
gap: 5px;
cursor: pointer;
padding: 8px;
}
.mobile-toggle span {
width: 24px;
height: 2px;
background: var(--charcoal);
transition: var(--transition);
}
/* HERO */
.hero {
margin-top: 84px;
position: relative;
min-height: 85vh;
display: flex;
align-items: center;
overflow: hidden;
}
.hero-bg {
position: absolute;
inset: 0;
z-index: 0;
}
.hero-bg img {
width: 100%;
height: 100%;
object-fit: cover;
}
.hero-overlay {
position: absolute;
inset: 0;
background: linear-gradient(135deg, rgba(45,80,22,0.88) 0%, rgba(45,80,22,0.6) 50%, rgba(0,0,0,0.3) 100%);
z-index: 1;
}
.hero-content {
position: relative;
z-index: 2;
max-width: 700px;
padding: 80px 0;
}
.hero-badge {
display: inline-block;
background: rgba(200, 169, 81, 0.2);
border: 1px solid var(--accent);
color: var(--accent);
padding: 6px 18px;
border-radius: 50px;
font-size: 0.8rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 1.5px;
margin-bottom: 24px;
}
.hero h2 {
font-size: clamp(2.5rem, 5vw, 4rem);
color: var(--white);
margin-bottom: 20px;
font-weight: 700;
}
.hero h2 em {
color: var(--accent);
font-style: italic;
}
.hero p {
font-size: 1.15rem;
color: rgba(255,255,255,0.85);
margin-bottom: 36px;
line-height: 1.8;
max-width: 560px;
}
.hero-buttons {
display: flex;
gap: 16px;
flex-wrap: wrap;
}
.btn {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 14px 32px;
border-radius: 50px;
font-weight: 600;
font-size: 0.95rem;
cursor: pointer;
border: none;
transition: var(--transition);
font-family: 'Source Sans Pro', sans-serif;
}
.btn-primary {
background: var(--accent);
color: var(--charcoal);
}
.btn-primary:hover {
background: var(--accent-dark);
transform: translateY(-2px);
box-shadow: 0 8px 24px rgba(200,169,81,0.3);
}
.btn-outline {
background: transparent;
color: var(--white);
border: 2px solid rgba(255,255,255,0.4);
}
.btn-outline:hover {
border-color: var(--white);
background: rgba(255,255,255,0.1);
transform: translateY(-2px);
}
.btn-green {
background: var(--primary);
color: var(--white);
}
.btn-green:hover {
background: var(--primary-light);
transform: translateY(-2px);
box-shadow: 0 8px 24px rgba(45,80,22,0.3);
}
/* STATS BAR */
.stats-bar {
background: var(--white);
border-bottom: 1px solid var(--light-gray);
padding: 40px 0;
}
.stats-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 32px;
text-align: center;
}
.stat-item h3 {
font-size: 2.2rem;
color: var(--primary);
margin-bottom: 4px;
}
.stat-item p {
font-size: 0.85rem;
color: var(--gray);
text-transform: uppercase;
letter-spacing: 1px;
font-weight: 600;
}
/* SECTION STYLES */
.section {
padding: 100px 0;
}
.section-header {
text-align: center;
max-width: 680px;
margin: 0 auto 60px;
}
.section-label {
display: inline-block;
font-size: 0.78rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 2.5px;
color: var(--accent-dark);
margin-bottom: 12px;
}
.section-header h2 {
font-size: clamp(2rem, 3.5vw, 2.8rem);
color: var(--charcoal);
margin-bottom: 16px;
}
.section-header p {
font-size: 1.05rem;
color: var(--gray);
line-height: 1.8;
}
/* FEATURED RECIPES */
.recipes-section {
background: var(--white);
}
.recipes-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 32px;
}
.recipe-card {
background: var(--cream);
border-radius: var(--radius);
overflow: hidden;
transition: var(--transition);
border: 1px solid var(--light-gray);
}
.recipe-card:hover {
transform: translateY(-6px);
box-shadow: var(--shadow-lg);
}
.recipe-card-img {
position: relative;
height: 240px;
overflow: hidden;
}
.recipe-card-img img {
width: 100%;
height: 100%;
object-fit: cover;
transition: var(--transition);
}
.recipe-card:hover .recipe-card-img img {
transform: scale(1.05);
}
.recipe-tag {
position: absolute;
top: 16px;
left: 16px;
background: var(--primary);
color: var(--white);
padding: 4px 14px;
border-radius: 50px;
font-size: 0.75rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.recipe-time {
position: absolute;
bottom: 16px;
right: 16px;
background: rgba(0,0,0,0.7);
color: var(--white);
padding: 4px 12px;
border-radius: 50px;
font-size: 0.78rem;
font-weight: 600;
}
.recipe-card-body {
padding: 28px;
}
.recipe-card-body h3 {
font-size: 1.3rem;
margin-bottom: 10px;
color: var(--charcoal);
}
.recipe-card-body p {
font-size: 0.92rem;
color: var(--gray);
margin-bottom: 18px;
line-height: 1.7;
}
.recipe-meta {
display: flex;
align-items: center;
gap: 16px;
font-size: 0.82rem;
color: var(--gray);
}
.recipe-meta span {
display: flex;
align-items: center;
gap: 4px;
}
.recipe-link {
display: inline-flex;
align-items: center;
gap: 6px;
color: var(--primary);
font-weight: 600;
font-size: 0.9rem;
margin-top: 14px;
}
.recipe-link:hover {
gap: 10px;
color: var(--accent-dark);
}
/* WINE PAIRING SECTION */
.wine-section {
background: var(--primary);
color: var(--white);
position: relative;
overflow: hidden;
}
.wine-section::before {
content: '';
position: absolute;
top: -50%;
right: -20%;
width: 600px;
height: 600px;
border-radius: 50%;
background: rgba(200,169,81,0.05);
}
.wine-section .section-label {
color: var(--accent);
}
.wine-section .section-header h2 {
color: var(--white);
}
.wine-section .section-header p {
color: rgba(255,255,255,0.7);
}
.wine-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 60px;
align-items: center;
}
.wine-image {
border-radius: var(--radius);
overflow: hidden;
box-shadow: var(--shadow-lg);
}
.wine-image img {
width: 100%;
height: 450px;
object-fit: cover;
}
.wine-content h3 {
font-size: 1.8rem;
margin-bottom: 20px;
color: var(--white);
}
.wine-content p {
color: rgba(255,255,255,0.8);
margin-bottom: 16px;
line-height: 1.8;
}
.wine-pairs {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 16px;
margin-top: 30px;
}
.wine-pair-item {
background: rgba(255,255,255,0.08);
border: 1px solid rgba(255,255,255,0.12);
border-radius: 10px;
padding: 20px;
transition: var(--transition);
}
.wine-pair-item:hover {
background: rgba(255,255,255,0.12);
transform: translateY(-2px);
}
.wine-pair-item h4 {
font-size: 1rem;
color: var(--accent);
margin-bottom: 6px;
font-family: 'Source Sans Pro', sans-serif;
font-weight: 700;
}
.wine-pair-item p {
font-size: 0.85rem;
color: rgba(255,255,255,0.6);
margin-bottom: 0;
line-height: 1.5;
}
/* KITCHEN ESSENTIALS */
.essentials-section {
background: var(--cream);
}
.essentials-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 24px;
}
.essential-card {
background: var(--white);
border-radius: var(--radius);
padding: 36px 28px;
text-align: center;
border: 1px solid var(--light-gray);
transition: var(--transition);
}
.essential-card:hover {
transform: translateY(-4px);
box-shadow: var(--shadow);
border-color: var(--accent);
}
.essential-icon {
width: 72px;
height: 72px;
margin: 0 auto 20px;
background: var(--cream);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 1.8rem;
}
.essential-card h3 {
font-size: 1.15rem;
margin-bottom: 10px;
color: var(--charcoal);
}
.essential-card p {
font-size: 0.88rem;
color: var(--gray);
line-height: 1.7;
}
/* INTERACTIVE CALCULATOR */
.calculator-section {
background: var(--white);
border-top: 1px solid var(--light-gray);
border-bottom: 1px solid var(--light-gray);
}
.calculator-wrapper {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 60px;
align-items: center;
}
.calculator-info h3 {
font-size: 2rem;
margin-bottom: 16px;
}
.calculator-info p {
color: var(--gray);
margin-bottom: 16px;
line-height: 1.8;
}
.calculator-box {
background: var(--cream);
border-radius: var(--radius);
padding: 40px;
border: 1px solid var(--light-gray);
}
.calculator-box h4 {
font-size: 1.3rem;
margin-bottom: 24px;
text-align: center;
color: var(--primary);
}
.calc-field {
margin-bottom: 20px;
}
.calc-field label {
display: block;
font-size: 0.85rem;
font-weight: 600;
color: var(--charcoal);
margin-bottom: 8px;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.calc-field select,
.calc-field input {
width: 100%;
padding: 12px 16px;
border: 1px solid var(--light-gray);
border-radius: 8px;
font-size: 0.95rem;
font-family: 'Source Sans Pro', sans-serif;
background: var(--white);
color: var(--charcoal);
transition: var(--transition);
}
.calc-field select:focus,
.calc-field input:focus {
outline: none;
border-color: var(--primary);
box-shadow: 0 0 0 3px rgba(45,80,22,0.1);
}
.calc-result {
background: var(--primary);
color: var(--white);
border-radius: 8px;
padding: 20px;
text-align: center;
margin-top: 24px;
}
.calc-result h5 {
font-family: 'Source Sans Pro', sans-serif;
font-size: 0.8rem;
text-transform: uppercase;
letter-spacing: 1px;
color: var(--accent);
margin-bottom: 6px;
}
.calc-result p {
font-size: 1.1rem;
font-weight: 600;
color: var(--white);
}
/* TESTIMONIALS */
.testimonials-section {
background: var(--cream-dark);
}
.testimonials-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 32px;
}
.testimonial-card {
background: var(--white);
border-radius: var(--radius);
padding: 36px;
border: 1px solid var(--light-gray);
transition: var(--transition);
}
.testimonial-card:hover {
box-shadow: var(--shadow);
}
.testimonial-stars {
color: var(--accent);
font-size: 1.1rem;
margin-bottom: 16px;
}
.testimonial-card blockquote {
font-size: 0.95rem;
color: var(--gray);
line-height: 1.8;
margin-bottom: 24px;
font-style: italic;
}
.testimonial-author {
display: flex;
align-items: center;
gap: 12px;
}
.testimonial-author img {
width: 48px;
height: 48px;
border-radius: 50%;
object-fit: cover;
}
.testimonial-author-info h4 {
font-family: 'Source Sans Pro', sans-serif;
font-size: 0.95rem;
font-weight: 700;
color: var(--charcoal);
}
.testimonial-author-info p {
font-size: 0.8rem;
color: var(--gray);
}
/* FAQ */
.faq-section {
background: var(--white);
}
.faq-grid {
max-width: 800px;
margin: 0 auto;
}
.faq-item {
border-bottom: 1px solid var(--light-gray);
padding: 0;
}
.faq-question {
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
padding: 24px 0;
background: none;
border: none;
cursor: pointer;
font-family: 'Playfair Display', serif;
font-size: 1.1rem;
color: var(--charcoal);
text-align: left;
transition: var(--transition);
}
.faq-question:hover {
color: var(--primary);
}
.faq-icon {
width: 28px;
height: 28px;
border-radius: 50%;
background: var(--cream);
display: flex;
align-items: center;
justify-content: center;
font-size: 1.2rem;
color: var(--primary);
transition: var(--transition);
flex-shrink: 0;
}
.faq-item.active .faq-icon {
background: var(--primary);
color: var(--white);
transform: rotate(45deg);
}
.faq-answer {
max-height: 0;
overflow: hidden;
transition: max-height 0.4s ease, padding 0.4s ease;
}
.faq-item.active .faq-answer {
max-height: 300px;
padding-bottom: 24px;
}
.faq-answer p {
font-size: 0.95rem;
color: var(--gray);
line-height: 1.8;
}
/* CTA SECTION */
.cta-section {
background: linear-gradient(135deg, var(--primary) 0%, #1a3a0d 100%);
padding: 80px 0;
text-align: center;
position: relative;
overflow: hidden;
}
.cta-section::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: url("data:image/svg+xml,%3Csvg width='60' height='60' viewBox='0 0 60 60' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cg fill='%23ffffff' fill-opacity='0.03'%3E%3Cpath d='M36 34v-4h-2v4h-4v2h4v4h2v-4h4v-2h-4zm0-30V0h-2v4h-4v2h4v4h2V6h4V4h-4zM6 34v-4H4v4H0v2h4v4h2v-4h4v-2H6zM6 4V0H4v4H0v2h4v4h2V6h4V4H6z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E");
}
.cta-content {
position: relative;
z-index: 1;
}
.cta-section h2 {
font-size: clamp(2rem, 3.5vw, 2.8rem);
color: var(--white);
margin-bottom: 16px;
}
.cta-section p {
font-size: 1.1rem;
color: rgba(255,255,255,0.75);
max-width: 560px;
margin: 0 auto 32px;
line-height: 1.8;
}
/* FOOTER */
.footer {
background: #1a1a1a;
color: rgba(255,255,255,0.7);
padding: 80px 0 0;
}
.footer-grid {
display: grid;
grid-template-columns: 2fr 1fr 1fr 1fr;
gap: 48px;
padding-bottom: 60px;
border-bottom: 1px solid rgba(255,255,255,0.1);
}
.footer-brand h3 {
font-size: 1.5rem;
color: var(--white);
margin-bottom: 12px;
}
.footer-brand p {
font-size: 0.9rem;
line-height: 1.8;
margin-bottom: 20px;
}
.footer-social {
display: flex;
gap: 12px;
}
.footer-social a {
width: 40px;
height: 40px;
border-radius: 50%;
background: rgba(255,255,255,0.08);
display: flex;
align-items: center;
justify-content: center;
color: rgba(255,255,255,0.7);
font-size: 0.85rem;
font-weight: 700;
transition: var(--transition);
}
.footer-social a:hover {
background: var(--accent);
color: var(--charcoal);
}
.footer-col h4 {
font-family: 'Source Sans Pro', sans-serif;
font-size: 0.85rem;
text-transform: uppercase;
letter-spacing: 1.5px;
color: var(--white);
margin-bottom: 20px;
font-weight: 700;
}
.footer-col ul {
list-style: none;
}
.footer-col ul li {
margin-bottom: 10px;
}
.footer-col ul li a {
font-size: 0.9rem;
color: rgba(255,255,255,0.6);
}
.footer-col ul li a:hover {
color: var(--accent);
}
.footer-bottom {
display: flex;
align-items: center;
justify-content: space-between;
padding: 24px 0;
font-size: 0.82rem;
color: rgba(255,255,255,0.4);
}
.footer-bottom-links {
display: flex;
gap: 24px;
}
.footer-bottom-links a {
color: rgba(255,255,255,0.4);
}
.footer-bottom-links a:hover {
color: var(--accent);
}
/* RESPONSIVE */
@media (max-width: 1024px) {
.recipes-grid {
grid-template-columns: repeat(2, 1fr);
}
.essentials-grid {
grid-template-columns: repeat(2, 1fr);
}
.wine-grid {
grid-template-columns: 1fr;
gap: 40px;
}
.calculator-wrapper {
grid-template-columns: 1fr;
gap: 40px;
}
.footer-grid {
grid-template-columns: 1fr 1fr;
}
}
@media (max-width: 768px) {
.nav {
display: none;
}
.mobile-toggle {
display: flex;
}
.hero {
min-height: 70vh;
}
.stats-grid {
grid-template-columns: repeat(2, 1fr);
gap: 24px;
}
.recipes-grid {
grid-template-columns: 1fr;
}
.testimonials-grid {
grid-template-columns: 1fr;
}
.essentials-grid {
grid-template-columns: 1fr;
}
.wine-pairs {
grid-template-columns: 1fr;
}
.footer-grid {
grid-template-columns: 1fr;
gap: 32px;
}
.footer-bottom {
flex-direction: column;
gap: 12px;
text-align: center;
}
.hero-buttons {
flex-direction: column;
}
}
</style>
</head>
<body>
<!-- HEADER -->
<header class="header">
<div class="header-inner">
<div class="logo-group">
<img src="https://placehold.co/52x52/2D5016/C8A951?text=S%26S&font=playfair+display" alt="Savor & Stem Logo" class="logo-img">
<div class="logo-text">
<h1>Savor & Stem</h1>
<span>Where Every Flavor Tells a Story</span>
</div>
</div>
<nav class="nav">
<a href="#recipes">Recipes</a>
<a href="#wine">Wine Pairings</a>
<a href="#classes">Cooking Classes</a>
<a href="#essentials">Kitchen Essentials</a>
<a href="#shop">Shop</a>
<a href="#catering">Catering</a>
<a href="#reserve" class="nav-cta">Reserve Table</a>
</nav>
<div class="mobile-toggle">
<span></span>
<span></span>
<span></span>
</div>
</div>
</header>
<!-- HERO -->
<section class="hero">
<div class="hero-bg">
<img src="https://picsum.photos/1920/1080?blur=1" alt="Beautifully plated dish">
</div>
<div class="hero-overlay"></div>
<div class="container">
<div class="hero-content">
<div class="hero-badge">★ Award-Winning Culinary Platform</div>
<h2>Master the Art of <em>Modern Cuisine</em></h2>
<p>From farm-fresh recipes and expert wine pairings to hands-on cooking classes and bespoke catering — Savor & Stem is your complete destination for elevating every meal into an unforgettable experience.</p>
<div class="hero-buttons">
<a href="#classes" class="btn btn-primary">Join Cooking Class →</a>
<a href="#recipes" class="btn btn-outline">Explore Recipes</a>
</div>
</div>
</div>
</section>
<!-- STATS BAR -->
<div class="stats-bar">
<div class="container">
<div class="stats-grid">
<div class="stat-item">
<h3>2,400+</h3>
<p>Tested Recipes</p>
</div>
<div class="stat-item">
<h3>180+</h3>
<p>Restaurant Guides</p>
</div>
<div class="stat-item">
<h3>45K</h3>
<p>Community Members</p>
</div>
<div class="stat-item">
<h3>98%</h3>
<p>Satisfaction Rate</p>
</div>
</div>
</div>
</div>
<!-- FEATURED RECIPES -->
<section class="section recipes-section" id="recipes">
<div class="container">
<div class="section-header">
<span class="section-label">Featured Recipes</span>
<h2>Curated Collections for Every Palate</h2>
<p>Our test kitchen develops and perfects each recipe through rigorous iteration. From rustic comfort foods to refined plating techniques, discover dishes that balance flavor, texture, and visual appeal.</p>
</div>
<div class="recipes-grid">
<div class="recipe-card">
<div class="recipe-card-img">
<img src="https://picsum.photos/600/400?random=10" alt="Seared Duck Breast">
<span class="recipe-tag">Chef's Pick</span>
<span class="recipe-time">45 min</span>
</div>
<div class="recipe-card-body">
<h3>Pan-Seared Duck with Cherry Gastrique</h3>
<p>Crispy-skinned duck breast served over a bed of whipped parsnip purée, finished with a tart cherry gastrique that achieves the perfect balance between sweetness and acidity through careful reduction and emulsification of the pan drippings.</p>
<div class="recipe-meta">
<span>⏱ 45 min</span>
<span>👥 4 servings</span>
<span>📊 Intermediate</span>
</div>
<a href="#" class="recipe-link">View Full Recipe →</a>
</div>
</div>
<div class="recipe-card">
<div class="recipe-card-img">
<img src="https://picsum.photos/600/400?random=20" alt="Handmade Pasta">
<span class="recipe-tag">Trending</span>
<span class="recipe-time">60 min</span>
</div>
<div class="recipe-card-body">
<h3>Saffron Pappardelle with Wild Mushroom Ragù</h3>
<p>Hand-rolled pappardelle infused with bloomed saffron threads, tossed in a deeply savory ragù of foraged chanterelles, porcini, and maitake mushrooms. The key lies in building layers of umami through proper mise en place and patient caramelization.</p>
<div class="recipe-meta">
<span>⏱ 60 min</span>
<span>👥 6 servings</span>
<span>📊 Advanced</span>
</div>
<a href="#" class="recipe-link">View Full Recipe →</a>
</div>
</div>
<div class="recipe-card">
<div class="recipe-card-img">
<img src="https://picsum.photos/600/400?random=30" alt="Citrus Dessert">
<span class="recipe-tag">Seasonal</span>
<span class="recipe-time">30 min</span>
</div>
<div class="recipe-card-body">
<h3>Blood Orange Tart with Pistachio Frangipane</h3>
<p>A buttery shortcrust shell filled with aromatic pistachio frangipane, crowned with jewel-toned blood orange segments and a delicate rosemary-infused honey glaze. The contrast of nutty richness against bright citrus creates an elegant finish to any meal.</p>
<div class="recipe-meta">
<span>⏱ 30 min + chill</span>
<span>👥 8 servings</span>
<span>📊 Intermediate</span>
</div>
<a href="#" class="recipe-link">View Full Recipe →</a>
</div>
</div>
</div>
</div>
</section>
<!-- WINE PAIRING SECTION -->
<section class="section wine-section" id="wine">
<div class="container">
<div class="section-header">
<span class="section-label">Wine & Spirits</span>
<h2>The Art of Perfect Pairing</h2>
<p>Our sommeliers curate pairing recommendations that elevate both the wine and the dish, creating harmonious combinations that reveal new dimensions of flavor.</p>
</div>
<div class="wine-grid">
<div class="wine-image">
<img src="https://picsum.photos/700/450?random=40" alt="Wine and food pairing">
</div>
<div class="wine-content">
<h3>Understanding Flavor Bridges</h3>
<p>Great wine pairing isn't about rigid rules — it's about understanding the molecular flavor compounds that create natural affinities between food and wine. When we talk about "bridges," we refer to shared aromatic compounds that create a seamless transition from palate to finish.</p>
<p>Consider how the malolactic fermentation in an oaked Chardonnay mirrors the buttery notes in a béchamel sauce, or how the pyrazines in a Sauvignon Blanc echo the herbaceous qualities of a fresh pesto. These connections transform a good meal into a transcendent dining experience.</p>
<div class="wine-pairs">
<div class="wine-pair-item">
<h4>🍷 Barolo & Braised Short Rib</h4>
<p>Nebbiolo's tannic structure cuts through rich collagen beautifully</p>
</div>
<div class="wine-pair-item">
<h4>🥂 Champagne & Oysters</h4>
<p>Effervescence cleanses the palate between briny bites</p>
</div>
<div class="wine-pair-item">
<h4>🍾 Riesling & Spiced Duck</h4>
<p>Off-dry sweetness balances warm five-spice complexity</p>
</div>
<div class="wine-pair-item">
<h4>🍸 Gin & Cucumber Salad</h4>
<p>Botanical juniper notes mirror fresh garden herbs</p>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- KITCHEN ESSENTIALS -->
<section class="section essentials-section" id="essentials">
<div class="container">
<div class="section-header">
<span class="section-label">Kitchen Essentials</span>
<h2>Tools That Transform Your Cooking</h2>
<p>Professional-grade equipment doesn't just make cooking easier — it fundamentally changes what's possible in your kitchen. These are the tools our chefs rely on daily.</p>
</div>
<div class="essentials-grid">
<div class="essential-card">
<div class="essential-icon">🔪</div>
<h3>Japanese Chef's Knife</h3>
<p>A 210mm gyuto with VG-10 steel core delivers the precision needed for everything from delicate herb chiffonade to breaking down whole fish. The rockwell hardness of 60-61 maintains an edge through hundreds of cuts.</p>
</div>
<div class="essential-card">
<div class="essential-icon">🌡️</div>
<h3>Instant-Read Thermometer</h3>
<p>Eliminate guesswork with a thermocouple probe that reads temperature in under 2 seconds. Essential for achieving perfect doneness on proteins and ensuring food safety standards are consistently met.</p>
</div>
<div class="essential-card">
<div class="essential-icon">⚖️</div>
<h3>Precision Digital Scale</h3>
<p>Baking is chemistry, and chemistry demands accuracy. A scale with 0.1g resolution ensures consistent results in everything from bread hydration ratios to delicate macaron batter proportions.</p>
</div>
<div class="essential-card">
<div class="essential-icon">🍳</div>
<h3>Carbon Steel Pan</h3>
<p>The professional's secret weapon. Lighter than cast iron with superior heat response, a well-seasoned carbon steel pan develops a natural non-stick patina that improves with every use, delivering restaurant-quality sear and sauté.</p>
</div>
</div>
</div>
</section>
<!-- INTERACTIVE CALCULATOR -->
<section class="section calculator-section" id="calculator">
<div class="container">
<div class="calculator-wrapper">
<div class="calculator-info">
<span class="section-label">Interactive Tool</span>
<h3>Recipe Serving Calculator</h3>
<p>Planning a dinner party or meal prep session? Our intelligent calculator adjusts ingredient quantities, cooking times, and even suggests appropriate cookware sizes based on your guest count. No more guessing or wasted ingredients.</p>
<p>Whether you're scaling up a family favorite for a holiday gathering or scaling down a banquet recipe for two, this tool ensures your proportions remain perfectly balanced. We account for the non-linear nature of cooking — reducing a recipe by half doesn't always mean halving the cooking time or spice levels.</p>
<p>The calculator also factors in altitude adjustments for baking, carryover cooking temperatures for proteins, and provides wine quantity recommendations based on your menu selections.</p>
</div>
<div class="calculator-box">
<h4>🧮 Adjust Your Recipe</h4>
<div class="calc-field">
<label>Select Recipe Type</label>
<select id="recipeType">
<option value="main">Main Course</option>
<option value="appetizer">Appetizer / Starter</option>
<option value="dessert">Dessert</option>
<option value="soup">Soup / Stew</option>
<option value="baking">Baking / Bread</option>
</select>
</div>
<div class="calc-field">
<label>Original Servings</label>
<input type="number" id="originalServings" value="4" min="1" max="20">
</div>
<div class="calc-field">
<label>Desired Servings</label>
<input type="number" id="desiredServings" value="8" min="1" max="50">
</div>
<div class="calc-field">
<label>Cooking Method</label>
<select id="cookingMethod">
<option value="stovetop">Stovetop</option>
<option value="oven">Oven Roasting</option>
<option value="grill">Grilling</option>
<option value="braise">Braising</option>
<option value="steam">Steaming</option>
</select>
</div>
<button class="btn btn-green" onclick="calculateRecipe()" style="width:100%; justify-content:center;">Calculate Portions</button>
<div class="calc-result" id="calcResult">
<h5>Recommended Adjustments</h5>
<p id="resultText">Scale ingredients by 2.0x • Use a 5qt vessel • Add 8 min to cook time</p>
</div>
</div>
</div>
</div>
</section>
<!-- TESTIMONIALS -->
<section class="section testimonials-section">
<div class="container">
<div class="section-header">
<span class="section-label">What Our Community Says</span>
<h2>Trusted by Home Cooks & Professionals</h2>
<p>From weekend enthusiasts to Michelin-starred chefs, our community spans the full spectrum of culinary passion.</p>
</div>
<div class="testimonials-grid">
<div class="testimonial-card">
<div class="testimonial-stars">★★★★★</div>
<blockquote>"The wine pairing guide completely transformed how I approach dinner parties. My guests constantly ask about the thoughtful combinations, and I've learned so much about flavor bridges I never considered before. The sommelier notes are incredibly detailed yet accessible."</blockquote>
<div class="testimonial-author">
<img src="https://i.pravatar.cc/48?u=marcus" alt="Marcus Chen">
<div class="testimonial-author-info">
<h4>Marcus Chen</h4>
<p>Home Enthusiast, Portland</p>
</div>
</div>
</div>
<div class="testimonial-card">
<div class="testimonial-stars">★★★★★</div>
<blockquote>"As a culinary school graduate, I was skeptical about what an online platform could teach me. But the technique breakdowns — especially the modules on emulsification and sauce mother sauces — revealed nuances I'd missed in formal training. The mise en place system they teach is now foundational to how I run my kitchen."</blockquote>
<div class="testimonial-author">
<img src="https://i.pravatar.cc/48?u=sarah" alt="Sarah Blackwell">
<div class="testimonial-author-info">
<h4>Sarah Blackwell</h4>
<p>Sous Chef, Brooklyn</p>
</div>
</div>
</div>
<div class="testimonial-card">
<div class="testimonial-stars">★★★★★</div>
<blockquote>"We used Savor & Stem's catering service for our wedding rehearsal dinner and it was absolutely flawless. The team handled everything from menu design to plating with the precision of a fine dining establishment. Every guest commented on the presentation and flavor complexity."</blockquote>
<div class="testimonial-author">
<img src="https://i.pravatar.cc/48?u=james" alt="James & Diana Okafor">
<div class="testimonial-author-info">
<h4>James & Diana Okafor</h4>
<p>Catering Clients, Austin</p>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- FAQ -->
<section class="section faq-section" id="faq">
<div class="container">
<div class="section-header">
<span class="section-label">Common Questions</span>
<h2>Everything You Need to Know</h2>
<p>Find answers to the most frequently asked questions about our services, classes, and culinary resources.</p>
</div>
<div class="faq-grid">
<div class="faq-item">
<button class="faq-question">
What skill levels are your cooking classes designed for?
<span class="faq-icon">+</span>
</button>
<div class="faq-answer">
<p>Our classes span the full spectrum from absolute beginner to advanced professional techniques. Each class listing clearly indicates the prerequisite skill level. Beginner classes focus on fundamental knife skills, basic cooking methods, and building confidence with mise en place organization. Advanced classes tackle complex techniques like sous vide precision cooking, sugar work, and multi-component plating. We also offer "bridge" classes designed to help intermediate cooks level up.</p>
</div>
</div>
<div class="faq-item">
<button class="faq-question">
How does the catering service work for private events?
<span class="faq-icon">+</span>
</button>
<div class="faq-answer">
<p>Our catering begins with a complimentary consultation where we discuss your vision, dietary requirements, guest count, and budget. From there, our executive chef designs a custom menu that reflects your preferences and the occasion's tone. We handle everything — from sourcing seasonal ingredients to full-service setup, professional plating, and cleanup. We accommodate events from intimate 10-person dinners to 200-guest celebrations, and can coordinate with your venue's team seamlessly.</p>
</div>
</div>
<div class="faq-item">
<button class="faq-question">
Are your recipes tested for home kitchen equipment?
<span class="faq-icon">+</span>
</button>
<div class="faq-answer">
<p>Absolutely. Every recipe in our collection is tested a minimum of three times in a standard home kitchen environment — not a professional test kitchen. We use conventional residential ovens, standard stovetop burners, and commonly available cookware. Each recipe includes notes on equipment substitutions, altitude adjustments for baking, and troubleshooting tips for common issues. We believe great cooking should be accessible regardless of your kitchen setup.</p>
</div>
</div>
<div class="faq-item">
<button class="faq-question">
What's included in the wine pairing subscription?
<span class="faq-icon">+</span>
</button>
<div class="faq-answer">
<p>Our wine pairing subscription delivers curated pairing guides monthly, matched to seasonal menus and current culinary trends. Each guide includes detailed tasting notes, specific bottle recommendations at multiple price points, regional alternatives, and the science behind why each pairing works. Subscribers also get access to virtual tasting events with our sommelier team, early access to limited-release recommendations, and a 10% discount on wines purchased through our partner merchants.</p>
</div>
</div>
<div class="faq-item">
<button class="faq-question">
Can I gift a cooking class or catering experience?
<span class="faq-icon">+</span>
</button>
<div class="faq-answer">
<p>Yes! We offer beautifully designed digital and physical gift cards for any of our services. Cooking class gift cards can be applied to any scheduled session, and catering gift cards work as credits toward any event. Gift recipients can choose their preferred date, class level, or menu style. All gift cards are valid for 12 months from purchase and can be combined with other offers. It's the perfect gift for the food lover who seems to have everything.</p>
</div>
</div>
</div>
</div>
</section>
<!-- CTA SECTION -->
<section class="cta-section" id="reserve">
<div class="container">
<div class="cta-content">
<h2>Ready to Elevate Your Culinary Journey?</h2>
<p>Whether you're booking a table at our partner restaurants, joining a hands-on cooking class, or planning a catered event — we're here to make every flavor count.</p>
<div style="display:flex; gap:16px; justify-content:center; flex-wrap:wrap;">
<a href="#" class="btn btn-primary">Make Reservation</a>
<a href="#" class="btn btn-outline">Browse Cooking Classes</a>
</div>
</div>
</div>
</section>
<!-- FOOTER -->
<footer class="footer">
<div class="container">
<div class="footer-grid">
<div class="footer-brand">
<h3>Savor & Stem</h3>
<p>Your complete culinary destination for recipes, restaurant guides, cooking education, wine expertise, and bespoke catering. We believe that great food brings people together and transforms ordinary moments into extraordinary memories.</p>
<div class="footer-social">
<a href="#" title="Instagram">IG</a>
<a href="#" title="Facebook">FB</a>
<a href="#" title="Pinterest">PI</a>
<a href="#" title="YouTube">YT</a>
<a href="#" title="TikTok">TK</a>
</div>
</div>
<div class="footer-col">
<h4>Explore</h4>
<ul>
<li><a href="#">Recipe Archive</a></li>
<li><a href="#">Restaurant Guides</a></li>
<li><a href="#">Wine Pairings</a></li>
<li><a href="#">Nutrition Resources</a></li>
<li><a href="#">Culinary Trends</a></li>
<li><a href="#">Seasonal Menus</a></li>
</ul>
</div>
<div class="footer-col">
<h4>Services</h4>
<ul>
<li><a href="#">Cooking Classes</a></li>
<li><a href="#">Private Catering</a></li>
<li><a href="#">Corporate Events</a></li>
<li><a href="#">Shop Equipment</a></li>
<li><a href="#">Gift Cards</a></li>
<li><a href="#">Wine Subscription</a></li>
</ul>
</div>
<div class="footer-col">
<h4>Contact</h4>
<ul>
<li><a href="#">hello@savorandstem.com</a></li>
<li><a href="#">+1 (503) 555-0147</a></li>
<li><a href="#">247 Hawthorne Blvd</a></li>
<li><a href="#">Portland, OR 97214</a></li>
<li><a href="#">Mon–Sat: 9am – 9pm</a></li>
<li><a href="#">Sun: 10am – 6pm</a></li>
</ul>
</div>
</div>
<div class="footer-bottom">
<p>© 2025 Savor & Stem. All rights reserved.</p>
<div class="footer-bottom-links">
<a href="#">Privacy Policy</a>
<a href="#">Terms of Service</a>
<a href="#">Cookie Settings</a>
<a href="#">Accessibility</a>
</div>
</div>
</div>
</footer>
<script>
// FAQ Accordion
document.querySelectorAll('.faq-question').forEach(button => {
button.addEventListener('click', () => {
const item = button.parentElement;
const isActive = item.classList.contains('active');
// Close all
document.querySelectorAll('.faq-item').forEach(i => i.classList.remove('active'));
// Open clicked if it wasn't already open
if (!isActive) {
item.classList.add('active');
}
});
});
// Recipe Calculator
function calculateRecipe() {
const type = document.getElementById('recipeType').value;
const original = parseInt(document.getElementById('originalServings').value);
const desired = parseInt(document.getElementById('desiredServings').value);
const method = document.getElementById('cookingMethod').value;
if (original <= 0 || desired <= 0) {
document.getElementById('resultText').textContent = 'Please enter valid serving numbers.';
return;
}
const scale = (desired / original).toFixed(1);
// Vessel recommendations
const vessels = {
main: { small: '3qt saucepan', med: '5qt Dutch oven', large: '8qt stockpot' },
appetizer: { small: '2qt sauté pan', med: '4qt sauté pan', large: '6qt braiser' },
dessert: { small: '8" round pan', med: '9x13 baking dish', large: 'half sheet pan' },
soup: { small: '3qt pot', med: '6qt Dutch oven', large: '10qt stockpot' },
baking: { small: 'standard loaf pan', med: '9" round + half sheet', large: '2 half sheets + stand mixer' }
};
// Time adjustments
const timeMultipliers = {
stovetop: { up: '+5-8 min', down: '-3-5 min' },
oven: { up: '+10-15 min', down: '-5-8 min' },
grill: { up: '+8-12 min (indirect heat)', down: '-3-5 min (higher heat)' },
braise: { up: '+20-30 min', down: '-10-15 min' },
steam: { up: '+5-10 min', down: '-2-4 min' }
};
let vesselSize = desired <= 4 ? vessels[type].small : desired <= 8 ? vessels[type].med : vessels[type].large;
let timeAdj = desired > original ? timeMultipliers[method].up : desired < original ? timeMultipliers[method].down : 'no change';
let spiceNote = desired > original * 1.5 ? ' • Increase spices by 1.75x (not linear)' : desired < original * 0.5 ? ' • Reduce salt by 10% (concentration effect)' : '';
document.getElementById('resultText').textContent = `Scale ingredients by ${scale}x • Use ${vesselSize} • Adjust cook time: ${timeAdj}${spiceNote}`;
}
// Smooth scroll for nav links
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function(e) {
const target = document.querySelector(this.getAttribute('href'));
if (target) {
e.preventDefault();
target.scrollIntoView({ behavior: 'smooth', block: 'start' });
}
});
});
// Header scroll effect
window.addEventListener('scroll', () => {
const header = document.querySelector('.header');
if (window.scrollY > 50) {
header.style.boxShadow = '0 2px 20px rgba(0,0,0,0.08)';
} else {
header.style.boxShadow = 'none';
}
});
</script>
</body>
</html>
View Axe Report (JSON)
{
"testEngine": {
"name": "axe-core",
"version": "4.10.2"
},
"testRunner": {
"name": "axe"
},
"testEnvironment": {
"userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36",
"windowWidth": 1280,
"windowHeight": 720,
"orientationAngle": 0,
"orientationType": "landscape-primary"
},
"timestamp": "2026-11-12T09:43:00.924Z",
"url": "https://benchmark.aimac.invalid/0e039812749df7a22e99d11858b4068a05590fdb242f9c91b0fa874122485633.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-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": []
},
{
"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-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": []
},
{
"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-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": []
},
{
"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": "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": []
},
{
"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": []
},
{
"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": "duplicate-id-aria",
"impact": null,
"tags": [
"cat.parsing",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure every id attribute value used in ARIA and in labels is unique",
"help": "IDs used in ARIA and labels must be unique",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/duplicate-id-aria?application=axeAPI",
"nodes": []
},
{
"id": "frame-focusable-content",
"impact": null,
"tags": [
"cat.keyboard",
"wcag2a",
"wcag211",
"TTv5",
"TT4.a",
"EN-301-549",
"EN-9.2.1.1"
],
"description": "Ensure <frame> and <iframe> elements with focusable content do not have tabindex=-1",
"help": "Frames with focusable content must not have tabindex=-1",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/frame-focusable-content?application=axeAPI",
"nodes": []
},
{
"id": "frame-title-unique",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag412",
"TTv5",
"TT12.d",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure <iframe> and <frame> elements contain a unique title attribute",
"help": "Frames must have a unique title attribute",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/frame-title-unique?application=axeAPI",
"nodes": []
},
{
"id": "frame-title",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag412",
"section508",
"section508.22.i",
"TTv5",
"TT12.d",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure <iframe> and <frame> elements have an accessible name",
"help": "Frames must have an accessible name",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/frame-title?application=axeAPI",
"nodes": []
},
{
"id": "html-xml-lang-mismatch",
"impact": null,
"tags": [
"cat.language",
"wcag2a",
"wcag311",
"EN-301-549",
"EN-9.3.1.1",
"ACT"
],
"description": "Ensure that HTML elements with both valid lang and xml:lang attributes agree on the base language of the page",
"help": "HTML elements with lang and xml:lang must have the same base language",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/html-xml-lang-mismatch?application=axeAPI",
"nodes": []
},
{
"id": "input-button-name",
"impact": null,
"tags": [
"cat.name-role-value",
"wcag2a",
"wcag412",
"section508",
"section508.22.a",
"TTv5",
"TT5.c",
"EN-301-549",
"EN-9.4.1.2",
"ACT"
],
"description": "Ensure input buttons have discernible text",
"help": "Input buttons must have discernible text",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/input-button-name?application=axeAPI",
"nodes": []
},
{
"id": "input-image-alt",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag111",
"wcag412",
"section508",
"section508.22.a",
"TTv5",
"TT7.a",
"EN-301-549",
"EN-9.1.1.1",
"EN-9.4.1.2",
"ACT"
],
"description": "Ensure <input type=\"image\"> elements have alternative text",
"help": "Image buttons must have alternative text",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/input-image-alt?application=axeAPI",
"nodes": []
},
{
"id": "marquee",
"impact": null,
"tags": [
"cat.parsing",
"wcag2a",
"wcag222",
"TTv5",
"TT2.b",
"EN-301-549",
"EN-9.2.2.2"
],
"description": "Ensure <marquee> elements are not used",
"help": "<marquee> elements are deprecated and must not be used",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/marquee?application=axeAPI",
"nodes": []
},
{
"id": "meta-refresh",
"impact": null,
"tags": [
"cat.time-and-media",
"wcag2a",
"wcag221",
"TTv5",
"TT8.a",
"EN-301-549",
"EN-9.2.2.1"
],
"description": "Ensure <meta http-equiv=\"refresh\"> is not used for delayed refresh",
"help": "Delayed refresh under 20 hours must not be used",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/meta-refresh?application=axeAPI",
"nodes": []
},
{
"id": "object-alt",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag111",
"section508",
"section508.22.a",
"EN-301-549",
"EN-9.1.1.1"
],
"description": "Ensure <object> elements have alternative text",
"help": "<object> elements must have alternative text",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/object-alt?application=axeAPI",
"nodes": []
},
{
"id": "role-img-alt",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag111",
"section508",
"section508.22.a",
"TTv5",
"TT7.a",
"EN-301-549",
"EN-9.1.1.1",
"ACT"
],
"description": "Ensure [role=\"img\"] elements have alternative text",
"help": "[role=\"img\"] elements must have an alternative text",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/role-img-alt?application=axeAPI",
"nodes": []
},
{
"id": "scrollable-region-focusable",
"impact": null,
"tags": [
"cat.keyboard",
"wcag2a",
"wcag211",
"wcag213",
"TTv5",
"TT4.a",
"EN-301-549",
"EN-9.2.1.1",
"EN-9.2.1.3"
],
"description": "Ensure elements that have scrollable content are accessible by keyboard",
"help": "Scrollable region must have keyboard access",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/scrollable-region-focusable?application=axeAPI",
"nodes": []
},
{
"id": "server-side-image-map",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag211",
"section508",
"section508.22.f",
"TTv5",
"TT4.a",
"EN-301-549",
"EN-9.2.1.1"
],
"description": "Ensure that server-side image maps are not used",
"help": "Server-side image maps must not be used",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/server-side-image-map?application=axeAPI",
"nodes": []
},
{
"id": "summary-name",
"impact": null,
"tags": [
"cat.name-role-value",
"wcag2a",
"wcag412",
"section508",
"section508.22.a",
"TTv5",
"TT6.a",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure summary elements have discernible text",
"help": "Summary elements must have discernible text",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/summary-name?application=axeAPI",
"nodes": []
},
{
"id": "svg-img-alt",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag111",
"section508",
"section508.22.a",
"TTv5",
"TT7.a",
"EN-301-549",
"EN-9.1.1.1",
"ACT"
],
"description": "Ensure <svg> elements with an img, graphics-document or graphics-symbol role have an accessible text",
"help": "<svg> elements with an img role must have an alternative text",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/svg-img-alt?application=axeAPI",
"nodes": []
},
{
"id": "td-headers-attr",
"impact": null,
"tags": [
"cat.tables",
"wcag2a",
"wcag131",
"section508",
"section508.22.g",
"TTv5",
"TT14.b",
"EN-301-549",
"EN-9.1.3.1"
],
"description": "Ensure that each cell in a table that uses the headers attribute refers only to other cells in that table",
"help": "Table cells that use the headers attribute must only refer to cells in the same table",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/td-headers-attr?application=axeAPI",
"nodes": []
},
{
"id": "th-has-data-cells",
"impact": null,
"tags": [
"cat.tables",
"wcag2a",
"wcag131",
"section508",
"section508.22.g",
"TTv5",
"TT14.b",
"EN-301-549",
"EN-9.1.3.1"
],
"description": "Ensure that <th> elements and elements with role=columnheader/rowheader have data cells they describe",
"help": "Table headers in a data table must refer to data cells",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/th-has-data-cells?application=axeAPI",
"nodes": []
},
{
"id": "valid-lang",
"impact": null,
"tags": [
"cat.language",
"wcag2aa",
"wcag312",
"TTv5",
"TT11.b",
"EN-301-549",
"EN-9.3.1.2",
"ACT"
],
"description": "Ensure lang attributes have valid values",
"help": "lang attribute must have a valid value",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/valid-lang?application=axeAPI",
"nodes": []
},
{
"id": "video-caption",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag122",
"section508",
"section508.22.a",
"TTv5",
"TT17.a",
"EN-301-549",
"EN-9.1.2.2"
],
"description": "Ensure <video> elements have captions",
"help": "<video> elements must have captions",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/video-caption?application=axeAPI",
"nodes": []
},
{
"id": "no-autoplay-audio",
"impact": null,
"tags": [
"cat.time-and-media",
"wcag2a",
"wcag142",
"TTv5",
"TT2.a",
"EN-301-549",
"EN-9.1.4.2",
"ACT"
],
"description": "Ensure <video> or <audio> elements do not autoplay audio for more than 3 seconds without a control mechanism to stop or mute the audio",
"help": "<video> or <audio> elements must not play automatically",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/no-autoplay-audio?application=axeAPI",
"nodes": []
}
],
"passes": [
{
"id": "aria-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": "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": "<button class=\"btn btn-green\" onclick=\"calculateRecipe()\" style=\"width:100%; justify-content:center;\">Calculate Portions</button>",
"target": [
".btn-green"
]
}
]
},
{
"id": "button-name",
"impact": null,
"tags": [
"cat.name-role-value",
"wcag2a",
"wcag412",
"section508",
"section508.22.a",
"TTv5",
"TT6.a",
"EN-301-549",
"EN-9.4.1.2",
"ACT"
],
"description": "Ensure buttons have discernible text",
"help": "Buttons must have discernible text",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/button-name?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "button-has-visible-text",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "Element has inner text that is visible to screen readers"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<button class=\"btn btn-green\" onclick=\"calculateRecipe()\" style=\"width:100%; justify-content:center;\">Calculate Portions</button>",
"target": [
".btn-green"
]
}
]
},
{
"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 & Stem</h1>",
"target": [
"h1"
]
},
{
"html": "<h2>Master the Art of <em>Modern Cuisine</em></h2>",
"target": [
".hero-content > h2"
]
},
{
"html": "<h3>2,400+</h3>",
"target": [
".stat-item:nth-child(1) > h3"
]
},
{
"html": "<h3>180+</h3>",
"target": [
".stat-item:nth-child(2) > h3"
]
},
{
"html": "<h3>45K</h3>",
"target": [
".stat-item:nth-child(3) > h3"
]
},
{
"html": "<h3>98%</h3>",
"target": [
".stat-item:nth-child(4) > h3"
]
},
{
"html": "<h2>Curated Collections for Every Palate</h2>",
"target": [
"#recipes > .container > .section-header > h2"
]
},
{
"html": "<h3>Pan-Seared Duck with Cherry Gastrique</h3>",
"target": [
".recipe-card:nth-child(1) > .recipe-card-body > h3"
]
},
{
"html": "<h3>Saffron Pappardelle with Wild Mushroom Rag\u00f9</h3>",
"target": [
".recipe-card:nth-child(2) > .recipe-card-body > h3"
]
},
{
"html": "<h3>Blood Orange Tart with Pistachio Frangipane</h3>",
"target": [
".recipe-card:nth-child(3) > .recipe-card-body > h3"
]
},
{
"html": "<h2>The Art of Perfect Pairing</h2>",
"target": [
"#wine > .container > .section-header > h2"
]
},
{
"html": "<h3>Understanding Flavor Bridges</h3>",
"target": [
".wine-content > h3"
]
},
{
"html": "<h4>\ud83c\udf77 Barolo & Braised Short Rib</h4>",
"target": [
".wine-pair-item:nth-child(1) > h4"
]
},
{
"html": "<h4>\ud83e\udd42 Champagne & Oysters</h4>",
"target": [
".wine-pair-item:nth-child(2) > h4"
]
},
{
"html": "<h4>\ud83c\udf7e Riesling & Spiced Duck</h4>",
"target": [
".wine-pair-item:nth-child(3) > h4"
]
},
{
"html": "<h4>\ud83c\udf78 Gin & Cucumber Salad</h4>",
"target": [
".wine-pair-item:nth-child(4) > h4"
]
},
{
"html": "<h2>Tools That Transform Your Cooking</h2>",
"target": [
"#essentials > .container > .section-header > h2"
]
},
{
"html": "<h3>Japanese Chef's Knife</h3>",
"target": [
".essential-card:nth-child(1) > h3"
]
},
{
"html": "<h3>Instant-Read Thermometer</h3>",
"target": [
".essential-card:nth-child(2) > h3"
]
},
{
"html": "<h3>Precision Digital Scale</h3>",
"target": [
".essential-card:nth-child(3) > h3"
]
},
{
"html": "<h3>Carbon Steel Pan</h3>",
"target": [
".essential-card:nth-child(4) > h3"
]
},
{
"html": "<h3>Recipe Serving Calculator</h3>",
"target": [
".calculator-info > h3"
]
},
{
"html": "<h4>\ud83e\uddee Adjust Your Recipe</h4>",
"target": [
".calculator-box > h4"
]
},
{
"html": "<h5>Recommended Adjustments</h5>",
"target": [
"h5"
]
},
{
"html": "<h2>Trusted by Home Cooks & Professionals</h2>",
"target": [
".testimonials-section > .container > .section-header > h2"
]
},
{
"html": "<h4>Marcus Chen</h4>",
"target": [
".testimonial-card:nth-child(1) > .testimonial-author > .testimonial-author-info > h4"
]
},
{
"html": "<h4>Sarah Blackwell</h4>",
"target": [
".testimonial-card:nth-child(2) > .testimonial-author > .testimonial-author-info > h4"
]
},
{
"html": "<h4>James & Diana Okafor</h4>",
"target": [
".testimonial-card:nth-child(3) > .testimonial-author > .testimonial-author-info > h4"
]
},
{
"html": "<h2>Everything You Need to Know</h2>",
"target": [
"#faq > .container > .section-header > h2"
]
},
{
"html": "<h2>Ready to Elevate Your Culinary Journey?</h2>",
"target": [
".cta-content > h2"
]
},
{
"html": "<h3>Savor & Stem</h3>",
"target": [
".footer-brand > h3"
]
},
{
"html": "<h4>Explore</h4>",
"target": [
".footer-col:nth-child(2) > h4"
]
},
{
"html": "<h4>Services</h4>",
"target": [
".footer-col:nth-child(3) > h4"
]
},
{
"html": "<h4>Contact</h4>",
"target": [
".footer-col:nth-child(4) > h4"
]
}
],
"impact": "serious",
"message": "Page has a heading"
}
],
"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": "#2d5016",
"bgColor": "#fdf8f0",
"contrastRatio": 8.74,
"fontSize": "18.0pt (24px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "3:1",
"shadowColor": null
},
"relatedNodes": [],
"impact": "serious",
"message": "Element has sufficient color contrast of 8.74"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<h1>Savor & Stem</h1>",
"target": [
"h1"
]
}
]
},
{
"id": "document-title",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag242",
"TTv5",
"TT12.a",
"EN-301-549",
"EN-9.2.4.2",
"ACT"
],
"description": "Ensure each HTML document contains a non-empty <title> element",
"help": "Documents must have <title> element to aid in navigation",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/document-title?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "doc-has-title",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "Document has a non-empty <title> element"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<html lang=\"en\">",
"target": [
"html"
]
}
]
},
{
"id": "form-field-multiple-labels",
"impact": null,
"tags": [
"cat.forms",
"wcag2a",
"wcag332",
"TTv5",
"TT5.c",
"EN-301-549",
"EN-9.3.3.2"
],
"description": "Ensure form field does not have multiple label elements",
"help": "Form field must not have multiple label elements",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/form-field-multiple-labels?application=axeAPI",
"nodes": [
{
"any": [],
"all": [],
"none": [
{
"id": "multiple-label",
"data": null,
"relatedNodes": [],
"impact": "moderate",
"message": "Form field does not have multiple label elements"
}
],
"impact": null,
"html": "<select id=\"recipeType\">",
"target": [
"#recipeType"
]
}
]
},
{
"id": "html-has-lang",
"impact": null,
"tags": [
"cat.language",
"wcag2a",
"wcag311",
"TTv5",
"TT11.a",
"EN-301-549",
"EN-9.3.1.1",
"ACT"
],
"description": "Ensure every HTML document has a lang attribute",
"help": "<html> element must have a lang attribute",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/html-has-lang?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "has-lang",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "The <html> element has a lang attribute"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<html lang=\"en\">",
"target": [
"html"
]
}
]
},
{
"id": "html-lang-valid",
"impact": null,
"tags": [
"cat.language",
"wcag2a",
"wcag311",
"TTv5",
"TT11.a",
"EN-301-549",
"EN-9.3.1.1",
"ACT"
],
"description": "Ensure the lang attribute of the <html> element has a valid value",
"help": "<html> element must have a valid value for the lang attribute",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/html-lang-valid?application=axeAPI",
"nodes": [
{
"any": [],
"all": [],
"none": [
{
"id": "valid-lang",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "Value of lang attribute is included in the list of valid languages"
}
],
"impact": null,
"html": "<html lang=\"en\">",
"target": [
"html"
]
}
]
},
{
"id": "image-alt",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag111",
"section508",
"section508.22.a",
"TTv5",
"TT7.a",
"TT7.b",
"EN-301-549",
"EN-9.1.1.1",
"ACT"
],
"description": "Ensure <img> elements have alternative text or a role of none or presentation",
"help": "Images must have alternative text",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/image-alt?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "has-alt",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "Element has an alt attribute"
}
],
"all": [],
"none": [
{
"id": "alt-space-value",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "Element has a valid alt attribute value"
}
],
"impact": null,
"html": "<img src=\"https://placehold.co/52x52/2D5016/C8A951?text=S%26S&font=playfair+display\" alt=\"Savor & Stem Logo\" class=\"logo-img\">",
"target": [
".logo-img"
]
}
]
},
{
"id": "link-in-text-block",
"impact": null,
"tags": [
"cat.color",
"wcag2a",
"wcag141",
"TTv5",
"TT13.a",
"EN-301-549",
"EN-9.1.4.1"
],
"description": "Ensure links are distinguished from surrounding text in a way that does not rely on color",
"help": "Links must be distinguishable without relying on color",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/link-in-text-block?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "link-in-text-block-style",
"data": null,
"relatedNodes": [
{
"html": "<div class=\"recipe-card-body\">",
"target": [
".recipe-card:nth-child(1) > .recipe-card-body"
]
}
],
"impact": "serious",
"message": "Links can be distinguished from surrounding text by visual styling"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<a href=\"#\" class=\"recipe-link\">View Full Recipe \u2192</a>",
"target": [
".recipe-card:nth-child(1) > .recipe-card-body > .recipe-link[href=\"#\"]"
]
}
]
},
{
"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=\"#recipes\">Recipes</a>",
"target": [
"nav > a[href$=\"#recipes\"]"
]
}
]
},
{
"id": "list",
"impact": null,
"tags": [
"cat.structure",
"wcag2a",
"wcag131",
"EN-301-549",
"EN-9.1.3.1"
],
"description": "Ensure that lists are structured correctly",
"help": "<ul> and <ol> must only directly contain <li>, <script> or <template> elements",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/list?application=axeAPI",
"nodes": [
{
"any": [],
"all": [],
"none": [
{
"id": "only-listitems",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "List element only has direct children that are allowed inside <li> elements"
}
],
"impact": null,
"html": "<ul>",
"target": [
".footer-col:nth-child(2) > ul"
]
}
]
},
{
"id": "listitem",
"impact": null,
"tags": [
"cat.structure",
"wcag2a",
"wcag131",
"EN-301-549",
"EN-9.1.3.1"
],
"description": "Ensure <li> elements are used semantically",
"help": "<li> elements must be contained in a <ul> or <ol>",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/listitem?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "listitem",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "List item has a <ul>, <ol> or role=\"list\" parent element"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<li><a href=\"#\">Recipe Archive</a></li>",
"target": [
".footer-col:nth-child(2) > ul > li:nth-child(1)"
]
}
]
},
{
"id": "meta-viewport",
"impact": null,
"tags": [
"cat.sensory-and-visual-cues",
"wcag2aa",
"wcag144",
"EN-301-549",
"EN-9.1.4.4",
"ACT"
],
"description": "Ensure <meta name=\"viewport\"> does not disable text scaling and zooming",
"help": "Zooming and scaling must not be disabled",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/meta-viewport?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "meta-viewport",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "<meta> tag does not disable zooming on mobile devices"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">",
"target": [
"meta[name=\"viewport\"]"
]
}
]
},
{
"id": "nested-interactive",
"impact": null,
"tags": [
"cat.keyboard",
"wcag2a",
"wcag412",
"TTv5",
"TT6.a",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure interactive controls are not nested as they are not always announced by screen readers or can cause focus problems for assistive technologies",
"help": "Interactive controls must not be nested",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/nested-interactive?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "no-focusable-content",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "Element does not have focusable descendants"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<img src=\"https://placehold.co/52x52/2D5016/C8A951?text=S%26S&font=playfair+display\" alt=\"Savor & Stem Logo\" class=\"logo-img\">",
"target": [
".logo-img"
]
}
]
},
{
"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": 48.8,
"height": 33
},
"relatedNodes": [],
"impact": "serious",
"message": "Control has sufficient size (48.8px by 33px, 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=\"#recipes\">Recipes</a>",
"target": [
"nav > a[href$=\"#recipes\"]"
]
}
]
}
],
"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.6pt (12.8px)",
"fontWeight": "normal",
"messageKey": "bgGradient",
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"hero-badge\">\u2605 Award-Winning Culinary Platform</div>",
"target": [
".hero-badge"
]
},
{
"html": "<div class=\"hero-overlay\"></div>",
"target": [
".hero-overlay"
]
}
],
"impact": "serious",
"message": "Element's background color could not be determined due to a background gradient"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<div class=\"hero-badge\">\u2605 Award-Winning Culinary Platform</div>",
"target": [
".hero-badge"
],
"failureSummary": "Fix any of the following:\n Element's background color could not be determined due to a background gradient"
}
]
}
],
"violations": [
{
"id": "color-contrast",
"impact": "serious",
"tags": [
"cat.color",
"wcag2aa",
"wcag143",
"TTv5",
"TT13.c",
"EN-301-549",
"EN-9.1.4.3",
"ACT"
],
"description": "Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds",
"help": "Elements must meet minimum color contrast ratio thresholds",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/color-contrast?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#a8893a",
"bgColor": "#ffffff",
"contrastRatio": 3.33,
"fontSize": "9.4pt (12.48px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section class=\"section recipes-section\" id=\"recipes\">",
"target": [
"#recipes"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.33 (foreground color: #a8893a, background color: #ffffff, font size: 9.4pt (12.48px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"section-label\">Featured Recipes</span>",
"target": [
"#recipes > .container > .section-header > .section-label"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.33 (foreground color: #a8893a, background color: #ffffff, font size: 9.4pt (12.48px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#a8893a",
"bgColor": "#fdf8f0",
"contrastRatio": 3.15,
"fontSize": "9.4pt (12.48px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section class=\"section essentials-section\" id=\"essentials\">",
"target": [
"#essentials"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.15 (foreground color: #a8893a, background color: #fdf8f0, font size: 9.4pt (12.48px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"section-label\">Kitchen Essentials</span>",
"target": [
"#essentials > .container > .section-header > .section-label"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.15 (foreground color: #a8893a, background color: #fdf8f0, font size: 9.4pt (12.48px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#a8893a",
"bgColor": "#ffffff",
"contrastRatio": 3.33,
"fontSize": "9.4pt (12.48px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section class=\"section calculator-section\" id=\"calculator\">",
"target": [
"#calculator"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.33 (foreground color: #a8893a, background color: #ffffff, font size: 9.4pt (12.48px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"section-label\">Interactive Tool</span>",
"target": [
".calculator-info > .section-label"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.33 (foreground color: #a8893a, background color: #ffffff, font size: 9.4pt (12.48px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c8a951",
"bgColor": "#2d5016",
"contrastRatio": 4.07,
"fontSize": "9.6pt (12.8px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"calc-result\" id=\"calcResult\">\n <h5>Recommended Adjustments</h5>\n <p id=\"resultText\">Scale ingredients by 2.0x \u2022 Use a 5qt vessel \u2022 Add 8 min to cook time</p>\n </div>",
"target": [
"#calcResult"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.07 (foreground color: #c8a951, background color: #2d5016, font size: 9.6pt (12.8px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<h5>Recommended Adjustments</h5>",
"target": [
"h5"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.07 (foreground color: #c8a951, background color: #2d5016, font size: 9.6pt (12.8px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#a8893a",
"bgColor": "#f5ede0",
"contrastRatio": 2.86,
"fontSize": "9.4pt (12.48px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section class=\"section testimonials-section\">",
"target": [
".testimonials-section"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 2.86 (foreground color: #a8893a, background color: #f5ede0, font size: 9.4pt (12.48px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"section-label\">What Our Community Says</span>",
"target": [
".testimonials-section > .container > .section-header > .section-label"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 2.86 (foreground color: #a8893a, background color: #f5ede0, font size: 9.4pt (12.48px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#a8893a",
"bgColor": "#ffffff",
"contrastRatio": 3.33,
"fontSize": "9.4pt (12.48px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section class=\"section faq-section\" id=\"faq\">",
"target": [
"#faq"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.33 (foreground color: #a8893a, background color: #ffffff, font size: 9.4pt (12.48px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"section-label\">Common Questions</span>",
"target": [
"#faq > .container > .section-header > .section-label"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.33 (foreground color: #a8893a, background color: #ffffff, font size: 9.4pt (12.48px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#767676",
"bgColor": "#1a1a1a",
"contrastRatio": 3.83,
"fontSize": "9.8pt (13.12px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<footer class=\"footer\">",
"target": [
"footer"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.83 (foreground color: #767676, background color: #1a1a1a, font size: 9.8pt (13.12px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<p>\u00a9 2025 Savor & Stem. All rights reserved.</p>",
"target": [
".footer-bottom > p"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.83 (foreground color: #767676, background color: #1a1a1a, font size: 9.8pt (13.12px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#767676",
"bgColor": "#1a1a1a",
"contrastRatio": 3.83,
"fontSize": "9.8pt (13.12px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<footer class=\"footer\">",
"target": [
"footer"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.83 (foreground color: #767676, background color: #1a1a1a, font size: 9.8pt (13.12px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#\">Privacy Policy</a>",
"target": [
".footer-bottom-links > a[href=\"#\"]:nth-child(1)"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.83 (foreground color: #767676, background color: #1a1a1a, font size: 9.8pt (13.12px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#767676",
"bgColor": "#1a1a1a",
"contrastRatio": 3.83,
"fontSize": "9.8pt (13.12px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<footer class=\"footer\">",
"target": [
"footer"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.83 (foreground color: #767676, background color: #1a1a1a, font size: 9.8pt (13.12px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#\">Terms of Service</a>",
"target": [
".footer-bottom-links > a[href=\"#\"]:nth-child(2)"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.83 (foreground color: #767676, background color: #1a1a1a, font size: 9.8pt (13.12px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#767676",
"bgColor": "#1a1a1a",
"contrastRatio": 3.83,
"fontSize": "9.8pt (13.12px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<footer class=\"footer\">",
"target": [
"footer"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.83 (foreground color: #767676, background color: #1a1a1a, font size: 9.8pt (13.12px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#\">Cookie Settings</a>",
"target": [
".footer-bottom-links > a[href=\"#\"]:nth-child(3)"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.83 (foreground color: #767676, background color: #1a1a1a, font size: 9.8pt (13.12px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#767676",
"bgColor": "#1a1a1a",
"contrastRatio": 3.83,
"fontSize": "9.8pt (13.12px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<footer class=\"footer\">",
"target": [
"footer"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.83 (foreground color: #767676, background color: #1a1a1a, font size: 9.8pt (13.12px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#\">Accessibility</a>",
"target": [
".footer-bottom-links > a[href=\"#\"]:nth-child(4)"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.83 (foreground color: #767676, background color: #1a1a1a, font size: 9.8pt (13.12px), font weight: normal). Expected contrast ratio of 4.5:1"
}
]
},
{
"id": "label",
"impact": "critical",
"tags": [
"cat.forms",
"wcag2a",
"wcag412",
"section508",
"section508.22.n",
"TTv5",
"TT5.c",
"EN-301-549",
"EN-9.4.1.2",
"ACT"
],
"description": "Ensure every form element has a label",
"help": "Form elements must have labels",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/label?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "implicit-label",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "Element does not have an implicit (wrapped) <label>"
},
{
"id": "explicit-label",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "Element does not have an explicit <label>"
},
{
"id": "aria-label",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "aria-label attribute does not exist or is empty"
},
{
"id": "aria-labelledby",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty"
},
{
"id": "non-empty-title",
"data": {
"messageKey": "noAttr"
},
"relatedNodes": [],
"impact": "critical",
"message": "Element has no title attribute"
},
{
"id": "non-empty-placeholder",
"data": {
"messageKey": "noAttr"
},
"relatedNodes": [],
"impact": "critical",
"message": "Element has no placeholder attribute"
},
{
"id": "presentational-role",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "Element's default semantics were not overridden with role=\"none\" or role=\"presentation\""
}
],
"all": [],
"none": [],
"impact": "critical",
"html": "<input type=\"number\" id=\"originalServings\" value=\"4\" min=\"1\" max=\"20\">",
"target": [
"#originalServings"
],
"failureSummary": "Fix any of the following:\n Element does not have an implicit (wrapped) <label>\n Element does not have an explicit <label>\n aria-label attribute does not exist or is empty\n aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty\n Element has no title attribute\n Element has no placeholder attribute\n Element's default semantics were not overridden with role=\"none\" or role=\"presentation\""
},
{
"any": [
{
"id": "implicit-label",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "Element does not have an implicit (wrapped) <label>"
},
{
"id": "explicit-label",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "Element does not have an explicit <label>"
},
{
"id": "aria-label",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "aria-label attribute does not exist or is empty"
},
{
"id": "aria-labelledby",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty"
},
{
"id": "non-empty-title",
"data": {
"messageKey": "noAttr"
},
"relatedNodes": [],
"impact": "critical",
"message": "Element has no title attribute"
},
{
"id": "non-empty-placeholder",
"data": {
"messageKey": "noAttr"
},
"relatedNodes": [],
"impact": "critical",
"message": "Element has no placeholder attribute"
},
{
"id": "presentational-role",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "Element's default semantics were not overridden with role=\"none\" or role=\"presentation\""
}
],
"all": [],
"none": [],
"impact": "critical",
"html": "<input type=\"number\" id=\"desiredServings\" value=\"8\" min=\"1\" max=\"50\">",
"target": [
"#desiredServings"
],
"failureSummary": "Fix any of the following:\n Element does not have an implicit (wrapped) <label>\n Element does not have an explicit <label>\n aria-label attribute does not exist or is empty\n aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty\n Element has no title attribute\n Element has no placeholder attribute\n Element's default semantics were not overridden with role=\"none\" or role=\"presentation\""
}
]
},
{
"id": "select-name",
"impact": "critical",
"tags": [
"cat.forms",
"wcag2a",
"wcag412",
"section508",
"section508.22.n",
"TTv5",
"TT5.c",
"EN-301-549",
"EN-9.4.1.2",
"ACT"
],
"description": "Ensure select element has an accessible name",
"help": "Select element must have an accessible name",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/select-name?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "implicit-label",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "Element does not have an implicit (wrapped) <label>"
},
{
"id": "explicit-label",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "Element does not have an explicit <label>"
},
{
"id": "aria-label",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "aria-label attribute does not exist or is empty"
},
{
"id": "aria-labelledby",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty"
},
{
"id": "non-empty-title",
"data": {
"messageKey": "noAttr"
},
"relatedNodes": [],
"impact": "critical",
"message": "Element has no title attribute"
},
{
"id": "presentational-role",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "Element's default semantics were not overridden with role=\"none\" or role=\"presentation\""
}
],
"all": [],
"none": [],
"impact": "critical",
"html": "<select id=\"recipeType\">",
"target": [
"#recipeType"
],
"failureSummary": "Fix any of the following:\n Element does not have an implicit (wrapped) <label>\n Element does not have an explicit <label>\n aria-label attribute does not exist or is empty\n aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty\n Element has no title attribute\n Element's default semantics were not overridden with role=\"none\" or role=\"presentation\""
},
{
"any": [
{
"id": "implicit-label",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "Element does not have an implicit (wrapped) <label>"
},
{
"id": "explicit-label",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "Element does not have an explicit <label>"
},
{
"id": "aria-label",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "aria-label attribute does not exist or is empty"
},
{
"id": "aria-labelledby",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty"
},
{
"id": "non-empty-title",
"data": {
"messageKey": "noAttr"
},
"relatedNodes": [],
"impact": "critical",
"message": "Element has no title attribute"
},
{
"id": "presentational-role",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "Element's default semantics were not overridden with role=\"none\" or role=\"presentation\""
}
],
"all": [],
"none": [],
"impact": "critical",
"html": "<select id=\"cookingMethod\">",
"target": [
"#cookingMethod"
],
"failureSummary": "Fix any of the following:\n Element does not have an implicit (wrapped) <label>\n Element does not have an explicit <label>\n aria-label attribute does not exist or is empty\n aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty\n Element has no title attribute\n Element's default semantics were not overridden with role=\"none\" or role=\"presentation\""
}
]
}
],
"coverage": {
"contract": "main-document-vertical-scroll",
"complete": true,
"positions": [
{
"y": 0,
"height": 7343
},
{
"y": 576,
"height": 7343
},
{
"y": 1152,
"height": 7343
},
{
"y": 1728,
"height": 7343
},
{
"y": 2304,
"height": 7343
},
{
"y": 2880,
"height": 7343
},
{
"y": 3456,
"height": 7343
},
{
"y": 4032,
"height": 7343
},
{
"y": 4608,
"height": 7343
},
{
"y": 5184,
"height": 7343
},
{
"y": 5760,
"height": 7343
},
{
"y": 6336,
"height": 7343
},
{
"y": 6623,
"height": 7343
}
],
"scans": 14,
"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: "Shop", "Cooking Classes", "Catering".
- **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: "Wine Pairings", "Culinary Trends", "Kitchen Essentials".
- **Content Depth:** Populate each section with **substantial, realistic text** (multiple sentences/paragraphs). Use authentic industry language and terminology like: "emulsification", "mise en place", "plating".
- **Visuals:** Integrate relevant placeholder images logically within the content sections.
- **Calls to Action:** Include clear and contextually relevant CTAs. Use strong verbs similar to: "Join Cooking Class", "Make Reservation", "Reserve Table".
- **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: "recipe calculator".
- **SIDEBAR (Optional):** If your design includes a sidebar, populate it with **useful, relevant content**. Ideas: "food news", "restaurant picks", "daily specials".
- **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.