MiniMax MiniMax M3.1 Flash – Food and Drink
via Minimax · Generated
- AIMAC Debt 7.51
- Cost $0.03
- Total Violations 41
- HTML Size 121 KB
- Em Dashes 3
Screenshot
View Live Page
Accessibility Issues Found
41 Serious
-
color-contrast serious 40 instances
Elements must meet minimum color contrast ratio thresholds
Example HTML
<span class="subscribe-label">Subscribe</span> -
target-size serious 1 instance
All touch targets must be 24px large, or leave sufficient space
Example HTML
<input id="newsletterEmail" name="email" type="email" autocomplete="email" placeholder="Your email address" required="">
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">
<meta name="description" content="Field & Flame is an independent guide to seasonal recipes, thoughtful restaurant finds, practical cooking techniques, and everyday nutrition.">
<meta name="theme-color" content="#173f35">
<meta property="og:title" content="Field & Flame — Seasonal recipes for generous tables">
<meta property="og:description" content="Kitchen-tested recipes, neighborhood restaurant guides, and smarter ways to cook with the season.">
<meta property="og:type" content="website">
<meta property="og:image" content="https://picsum.photos/1200/630">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700&family=Playfair+Display:ital,wght@0,600;0,700;1,600&display=swap" rel="stylesheet">
<title>Field & Flame | Seasonal recipes for generous tables</title>
<script>document.documentElement.classList.add('js');</script>
<style>
:root {
--forest: #173f35;
--forest-deep: #0e2d26;
--forest-soft: #2e5a4e;
--cream: #f7f2e8;
--paper: #fffdf8;
--sand: #e9dfcf;
--oat: #d9cbb8;
--tomato: #d65b38;
--tomato-dark: #ae3f24;
--gold: #d9a94f;
--sage: #9eaf98;
--ink: #202922;
--muted: #667068;
--white: #ffffff;
--line: rgba(32, 41, 34, 0.13);
--shadow-sm: 0 8px 26px rgba(29, 48, 39, 0.08);
--shadow-lg: 0 26px 70px rgba(18, 41, 32, 0.16);
--serif: "Playfair Display", Georgia, serif;
--sans: "DM Sans", Arial, sans-serif;
--radius-sm: 12px;
--radius: 20px;
--radius-lg: 30px;
--container: 1240px;
}
*,
*::before,
*::after {
box-sizing: border-box;
}
html {
scroll-behavior: smooth;
scroll-padding-top: 108px;
}
body {
margin: 0;
color: var(--ink);
background: var(--cream);
font-family: var(--sans);
line-height: 1.65;
overflow-x: hidden;
-webkit-font-smoothing: antialiased;
}
body::selection {
color: var(--paper);
background: var(--tomato);
}
img {
display: block;
width: 100%;
max-width: 100%;
}
a {
color: inherit;
text-decoration: none;
}
button,
input,
select {
color: inherit;
font: inherit;
}
button,
select {
cursor: pointer;
}
button {
border: 0;
}
h1,
h2,
h3,
h4,
p {
margin-top: 0;
}
h1,
h2,
h3 {
line-height: 1.1;
}
h1,
h2 {
font-family: var(--serif);
font-weight: 600;
letter-spacing: -0.035em;
}
h3,
h4 {
font-weight: 700;
letter-spacing: -0.02em;
}
p:last-child {
margin-bottom: 0;
}
:focus-visible {
outline: 3px solid var(--gold);
outline-offset: 3px;
}
[hidden] {
display: none !important;
}
.container {
width: min(calc(100% - 40px), var(--container));
margin-inline: auto;
}
.section {
padding: 112px 0;
}
.section--tight {
padding: 82px 0;
}
.section--white {
background: var(--paper);
}
.section--sand {
background: var(--sand);
}
.skip-link {
position: fixed;
top: 12px;
left: 12px;
z-index: 1000;
padding: 10px 16px;
border-radius: 8px;
color: var(--white);
background: var(--forest);
transform: translateY(-150%);
transition: transform 0.2s ease;
}
.skip-link:focus {
transform: translateY(0);
}
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
.eyebrow {
display: inline-flex;
align-items: center;
gap: 9px;
margin-bottom: 18px;
color: var(--tomato);
font-size: 0.76rem;
font-weight: 700;
letter-spacing: 0.16em;
line-height: 1.3;
text-transform: uppercase;
}
.eyebrow::before {
width: 28px;
height: 1px;
content: "";
background: currentColor;
}
.section-heading {
display: grid;
grid-template-columns: minmax(0, 1.05fr) minmax(280px, 0.75fr);
align-items: end;
gap: 64px;
margin-bottom: 48px;
}
.section-heading h2 {
max-width: 760px;
margin-bottom: 0;
font-size: clamp(2.35rem, 5vw, 4.35rem);
}
.section-heading > div:last-child p {
margin-bottom: 0;
color: var(--muted);
font-size: 1.03rem;
}
.section-heading--light > div:last-child p {
color: rgba(255, 255, 255, 0.72);
}
.section-heading--light .eyebrow {
color: var(--gold);
}
.button {
display: inline-flex;
min-height: 50px;
align-items: center;
justify-content: center;
gap: 10px;
padding: 12px 22px;
border: 1px solid transparent;
border-radius: 999px;
font-size: 0.92rem;
font-weight: 700;
line-height: 1;
transition: transform 0.2s ease, background 0.2s ease, color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease;
}
.button:hover {
transform: translateY(-2px);
}
.button--primary {
color: var(--white);
background: var(--tomato);
box-shadow: 0 10px 24px rgba(214, 91, 56, 0.22);
}
.button--primary:hover {
background: var(--tomato-dark);
}
.button--dark {
color: var(--white);
background: var(--forest);
}
.button--dark:hover {
background: var(--forest-deep);
}
.button--outline {
border-color: var(--line);
background: transparent;
}
.button--outline:hover {
border-color: var(--forest);
background: var(--paper);
}
.button--light {
color: var(--forest);
background: var(--white);
}
.button--light:hover {
color: var(--white);
background: var(--tomato);
}
.text-link {
display: inline-flex;
align-items: center;
gap: 8px;
color: var(--forest);
font-size: 0.92rem;
font-weight: 700;
}
.text-link svg,
.button svg {
width: 17px;
height: 17px;
flex: 0 0 auto;
transition: transform 0.2s ease;
}
.text-link:hover svg,
.button:hover svg {
transform: translateX(3px);
}
.announcement {
position: relative;
z-index: 101;
color: var(--white);
background: var(--forest);
font-size: 0.8rem;
}
.announcement .container {
display: flex;
min-height: 38px;
align-items: center;
justify-content: center;
gap: 18px;
}
.announcement span {
color: rgba(255, 255, 255, 0.66);
}
.announcement a {
font-weight: 700;
}
.announcement a:hover {
color: var(--gold);
}
.site-header {
position: sticky;
top: 0;
z-index: 100;
border-bottom: 1px solid rgba(32, 41, 34, 0.08);
background: rgba(247, 242, 232, 0.93);
backdrop-filter: blur(18px);
transition: box-shadow 0.2s ease;
}
.site-header.is-scrolled {
box-shadow: 0 10px 30px rgba(24, 46, 36, 0.08);
}
.nav-wrap {
display: flex;
min-height: 82px;
align-items: center;
gap: 28px;
}
.brand {
display: inline-flex;
flex: 0 0 auto;
align-items: center;
gap: 12px;
}
.brand-logo {
width: 52px;
height: 52px;
flex: 0 0 auto;
border-radius: 14px 14px 14px 4px;
box-shadow: 0 6px 18px rgba(23, 63, 53, 0.18);
}
.brand-copy {
display: grid;
line-height: 1.05;
}
.brand-name {
font-family: var(--serif);
font-size: 1.42rem;
font-weight: 700;
letter-spacing: -0.03em;
}
.brand-tagline {
margin-top: 5px;
color: var(--muted);
font-size: 0.67rem;
font-weight: 600;
letter-spacing: 0.07em;
text-transform: uppercase;
}
.primary-nav {
display: flex;
flex: 1;
align-items: center;
justify-content: center;
gap: clamp(15px, 1.8vw, 27px);
}
.primary-nav a {
position: relative;
padding: 28px 0;
color: #465149;
font-size: 0.84rem;
font-weight: 600;
white-space: nowrap;
}
.primary-nav a::after {
position: absolute;
right: 0;
bottom: 20px;
left: 0;
height: 2px;
border-radius: 2px;
content: "";
background: var(--tomato);
transform: scaleX(0);
transform-origin: right;
transition: transform 0.2s ease;
}
.primary-nav a:hover,
.primary-nav a.is-active {
color: var(--forest);
}
.primary-nav a:hover::after,
.primary-nav a.is-active::after {
transform: scaleX(1);
transform-origin: left;
}
.nav-actions {
display: flex;
flex: 0 0 auto;
align-items: center;
gap: 10px;
}
.icon-button {
display: inline-grid;
width: 43px;
height: 43px;
place-items: center;
border: 1px solid var(--line);
border-radius: 50%;
background: transparent;
transition: background 0.2s ease, color 0.2s ease;
}
.icon-button:hover {
color: var(--white);
background: var(--forest);
}
.icon-button svg {
width: 18px;
height: 18px;
}
.nav-actions .button {
min-height: 43px;
padding: 11px 18px;
font-size: 0.82rem;
}
.menu-toggle {
display: none;
width: 44px;
height: 44px;
padding: 0;
border-radius: 50%;
background: var(--forest);
}
.menu-toggle span {
display: block;
width: 18px;
height: 2px;
margin: 4px auto;
border-radius: 2px;
background: var(--white);
transition: transform 0.2s ease, opacity 0.2s ease;
}
.menu-toggle[aria-expanded="true"] span:nth-child(1) {
transform: translateY(6px) rotate(45deg);
}
.menu-toggle[aria-expanded="true"] span:nth-child(2) {
opacity: 0;
}
.menu-toggle[aria-expanded="true"] span:nth-child(3) {
transform: translateY(-6px) rotate(-45deg);
}
.mobile-nav {
display: none;
padding: 8px 20px 22px;
border-top: 1px solid var(--line);
background: var(--cream);
}
.mobile-nav.open {
display: grid;
}
.mobile-nav a {
padding: 11px 4px;
border-bottom: 1px solid var(--line);
font-size: 0.95rem;
font-weight: 600;
}
.mobile-nav .button {
width: 100%;
margin-top: 16px;
}
.hero {
position: relative;
overflow: hidden;
padding: 76px 0 88px;
background:
radial-gradient(circle at 5% 18%, rgba(217, 169, 79, 0.16), transparent 22%),
linear-gradient(180deg, #fbf8f1 0%, var(--cream) 100%);
}
.hero::after {
position: absolute;
top: 80px;
right: -120px;
width: 360px;
height: 360px;
border: 1px solid rgba(23, 63, 53, 0.12);
border-radius: 50%;
content: "";
pointer-events: none;
}
.hero-grid {
display: grid;
grid-template-columns: minmax(0, 1.03fr) minmax(420px, 0.87fr);
align-items: center;
gap: clamp(54px, 7vw, 96px);
}
.hero-copy {
position: relative;
z-index: 2;
}
.hero h1 {
max-width: 720px;
margin-bottom: 26px;
font-size: clamp(3.5rem, 7vw, 6.35rem);
}
.hero h1 em {
color: var(--tomato);
font-weight: 600;
}
.hero-copy > p {
max-width: 650px;
margin-bottom: 18px;
color: #556159;
font-size: clamp(1.02rem, 1.6vw, 1.16rem);
}
.hero-copy > p + p {
font-size: 0.98rem;
}
.hero-actions {
display: flex;
flex-wrap: wrap;
gap: 12px;
margin: 31px 0 34px;
}
.reader-trust {
display: flex;
align-items: center;
gap: 14px;
}
.reader-avatars {
display: flex;
padding-left: 7px;
}
.reader-avatars img {
width: 38px;
height: 38px;
margin-left: -7px;
border: 3px solid var(--cream);
border-radius: 50%;
object-fit: cover;
}
.reader-trust p {
margin: 0;
color: var(--muted);
font-size: 0.82rem;
line-height: 1.45;
}
.reader-trust strong {
color: var(--ink);
}
.stars {
color: var(--gold);
letter-spacing: 0.08em;
}
.hero-visual {
position: relative;
min-height: 620px;
padding: 0 0 54px 50px;
}
.hero-visual::before {
position: absolute;
bottom: 22px;
left: 0;
width: 70%;
height: 58%;
border-radius: 45% 0 0 0;
content: "";
background: var(--sage);
opacity: 0.35;
}
.hero-image-frame {
position: relative;
z-index: 1;
height: 590px;
overflow: hidden;
border: 9px solid var(--paper);
border-radius: 48% 48% 24px 24px;
box-shadow: var(--shadow-lg);
}
.hero-image-frame > img {
width: 100%;
height: 100%;
object-fit: cover;
object-position: center;
}
.hero-image-frame::after {
position: absolute;
inset: 0;
content: "";
background: linear-gradient(180deg, transparent 48%, rgba(10, 31, 25, 0.6) 100%);
pointer-events: none;
}
.hero-image-caption {
position: absolute;
z-index: 2;
right: 28px;
bottom: 25px;
left: 28px;
display: flex;
align-items: end;
justify-content: space-between;
gap: 20px;
color: var(--white);
}
.hero-image-caption span {
display: block;
margin-bottom: 4px;
color: rgba(255, 255, 255, 0.72);
font-size: 0.68rem;
font-weight: 700;
letter-spacing: 0.14em;
text-transform: uppercase;
}
.hero-image-caption strong {
font-family: var(--serif);
font-size: 1.48rem;
font-weight: 600;
}
.round-arrow {
display: inline-grid;
width: 44px;
height: 44px;
flex: 0 0 auto;
place-items: center;
border-radius: 50%;
color: var(--forest);
background: var(--white);
}
.round-arrow svg {
width: 18px;
height: 18px;
}
.season-sticker {
position: absolute;
z-index: 3;
top: 54px;
left: 0;
display: grid;
width: 118px;
height: 118px;
place-items: center;
border: 5px solid var(--paper);
border-radius: 50%;
color: var(--white);
background: var(--tomato);
box-shadow: var(--shadow-sm);
text-align: center;
transform: rotate(-8deg);
}
.season-sticker strong,
.season-sticker span {
display: block;
line-height: 1.05;
}
.season-sticker strong {
font-family: var(--serif);
font-size: 1.6rem;
}
.season-sticker span {
margin-top: 4px;
font-size: 0.62rem;
font-weight: 700;
letter-spacing: 0.12em;
text-transform: uppercase;
}
.hero-recipe-card {
position: absolute;
z-index: 3;
right: -25px;
bottom: 0;
display: grid;
grid-template-columns: 72px 1fr;
width: 270px;
padding: 12px;
border: 1px solid var(--line);
border-radius: 16px;
background: var(--paper);
box-shadow: var(--shadow-sm);
}
.hero-recipe-card img {
width: 72px;
height: 72px;
border-radius: 10px;
object-fit: cover;
}
.hero-recipe-card div {
align-self: center;
padding-left: 12px;
}
.hero-recipe-card span {
display: block;
margin-bottom: 2px;
color: var(--tomato);
font-size: 0.61rem;
font-weight: 700;
letter-spacing: 0.11em;
text-transform: uppercase;
}
.hero-recipe-card strong {
display: block;
font-family: var(--serif);
font-size: 0.93rem;
line-height: 1.2;
}
.stats-band {
color: var(--white);
background: var(--forest);
}
.stats-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
}
.stat-item {
padding: 27px 24px;
text-align: center;
}
.stat-item + .stat-item {
border-left: 1px solid rgba(255, 255, 255, 0.14);
}
.stat-item strong {
display: block;
margin-bottom: 2px;
color: var(--gold);
font-family: var(--serif);
font-size: 1.85rem;
font-weight: 600;
}
.stat-item span {
color: rgba(255, 255, 255, 0.72);
font-size: 0.78rem;
font-weight: 600;
letter-spacing: 0.06em;
text-transform: uppercase;
}
.recipe-filters {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 9px;
margin-bottom: 30px;
}
.filter-button {
min-height: 40px;
padding: 9px 16px;
border: 1px solid var(--line);
border-radius: 999px;
color: #536057;
background: var(--paper);
font-size: 0.8rem;
font-weight: 700;
transition: color 0.2s ease, background 0.2s ease, border-color 0.2s ease;
}
.filter-button:hover,
.filter-button.active {
border-color: var(--forest);
color: var(--white);
background: var(--forest);
}
.filter-count {
margin-left: auto;
color: var(--muted);
font-size: 0.8rem;
}
.recipe-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 22px;
}
.recipe-card {
position: relative;
overflow: hidden;
border: 1px solid var(--line);
border-radius: var(--radius);
background: var(--paper);
box-shadow: 0 5px 18px rgba(30, 50, 40, 0.035);
transition: transform 0.25s ease, box-shadow 0.25s ease;
}
.recipe-card:hover {
transform: translateY(-6px);
box-shadow: var(--shadow-sm);
}
.recipe-card.featured {
display: grid;
grid-column: span 2;
grid-template-columns: 1.08fr 0.92fr;
}
.recipe-image {
position: relative;
min-height: 230px;
overflow: hidden;
background: var(--sand);
}
.recipe-card.featured .recipe-image {
min-height: 100%;
}
.recipe-image img {
width: 100%;
height: 100%;
min-height: 230px;
object-fit: cover;
transition: transform 0.5s ease;
}
.recipe-card:hover .recipe-image img {
transform: scale(1.035);
}
.recipe-image::after {
position: absolute;
inset: 0;
content: "";
background: linear-gradient(180deg, transparent 60%, rgba(12, 34, 27, 0.2));
pointer-events: none;
}
.recipe-badge {
position: absolute;
z-index: 2;
top: 16px;
left: 16px;
padding: 7px 11px;
border-radius: 999px;
color: var(--forest);
background: rgba(255, 253, 248, 0.93);
font-size: 0.68rem;
font-weight: 700;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.save-button {
position: absolute;
z-index: 3;
top: 14px;
right: 14px;
display: grid;
width: 40px;
height: 40px;
place-items: center;
border-radius: 50%;
color: var(--forest);
background: rgba(255, 253, 248, 0.94);
box-shadow: 0 4px 16px rgba(19, 40, 32, 0.13);
transition: transform 0.2s ease, color 0.2s ease, background 0.2s ease;
}
.save-button:hover {
transform: scale(1.08);
}
.save-button svg {
width: 18px;
height: 18px;
fill: none;
stroke: currentColor;
stroke-width: 1.8;
}
.save-button.saved {
color: var(--white);
background: var(--tomato);
}
.save-button.saved svg {
fill: currentColor;
}
.recipe-body {
display: flex;
flex-direction: column;
padding: 25px;
}
.recipe-card.featured .recipe-body {
justify-content: center;
padding: 42px;
}
.recipe-meta {
display: flex;
flex-wrap: wrap;
gap: 7px 15px;
margin-bottom: 12px;
color: var(--muted);
font-size: 0.75rem;
font-weight: 600;
}
.recipe-meta span {
display: inline-flex;
align-items: center;
gap: 5px;
}
.recipe-meta span + span::before {
width: 3px;
height: 3px;
margin-right: 2px;
border-radius: 50%;
content: "";
background: var(--tomato);
}
.recipe-body h3 {
margin-bottom: 11px;
font-family: var(--serif);
font-size: 1.55rem;
font-weight: 600;
letter-spacing: -0.025em;
}
.recipe-card.featured .recipe-body h3 {
font-size: clamp(2rem, 3.2vw, 2.75rem);
}
.recipe-body p {
margin-bottom: 19px;
color: var(--muted);
font-size: 0.92rem;
}
.recipe-footer {
display: flex;
align-items: center;
justify-content: space-between;
gap: 14px;
margin-top: auto;
}
.recipe-time {
color: var(--forest);
font-size: 0.78rem;
font-weight: 700;
}
.guide-section {
position: relative;
overflow: hidden;
color: var(--white);
background: var(--forest);
}
.guide-section::before {
position: absolute;
top: -160px;
left: -120px;
width: 460px;
height: 460px;
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 50%;
content: "";
}
.guide-main {
display: grid;
grid-template-columns: minmax(0, 0.9fr) minmax(420px, 1.1fr);
align-items: center;
gap: clamp(52px, 8vw, 110px);
}
.guide-copy h2 {
max-width: 650px;
margin-bottom: 24px;
font-size: clamp(2.5rem, 5vw, 4.6rem);
}
.guide-copy > p {
color: rgba(255, 255, 255, 0.72);
font-size: 1.02rem;
}
.guide-copy > p + p {
font-size: 0.94rem;
}
.guide-actions {
display: flex;
flex-wrap: wrap;
gap: 12px;
margin-top: 30px;
}
.guide-feature {
position: relative;
padding: 12px;
border: 1px solid rgba(255, 255, 255, 0.13);
border-radius: var(--radius-lg);
background: rgba(255, 255, 255, 0.06);
}
.guide-feature img {
width: 100%;
height: 510px;
border-radius: 22px;
object-fit: cover;
}
.featured-restaurant-card {
position: absolute;
right: 28px;
bottom: 28px;
left: 28px;
padding: 20px 22px;
border: 1px solid rgba(255, 255, 255, 0.18);
border-radius: 16px;
background: rgba(13, 38, 31, 0.86);
backdrop-filter: blur(12px);
}
.featured-restaurant-card .restaurant-type {
color: var(--gold);
font-size: 0.68rem;
font-weight: 700;
letter-spacing: 0.12em;
text-transform: uppercase;
}
.featured-restaurant-card h3 {
margin: 5px 0 5px;
font-family: var(--serif);
font-size: 1.7rem;
font-weight: 600;
}
.featured-restaurant-card p {
margin: 0;
color: rgba(255, 255, 255, 0.69);
font-size: 0.83rem;
}
.guide-subheading {
display: flex;
align-items: end;
justify-content: space-between;
gap: 30px;
margin: 78px 0 28px;
}
.guide-subheading h3 {
margin: 0;
font-family: var(--serif);
font-size: 2rem;
font-weight: 600;
}
.guide-subheading a {
color: var(--gold);
font-size: 0.85rem;
font-weight: 700;
}
.restaurant-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 20px;
}
.restaurant-card {
overflow: hidden;
border: 1px solid rgba(255, 255, 255, 0.12);
border-radius: 18px;
background: rgba(255, 255, 255, 0.055);
transition: transform 0.25s ease, background 0.25s ease;
}
.restaurant-card:hover {
transform: translateY(-5px);
background: rgba(255, 255, 255, 0.085);
}
.restaurant-card img {
width: 100%;
height: 215px;
object-fit: cover;
}
.restaurant-card-body {
padding: 21px;
}
.restaurant-card h4 {
margin-bottom: 7px;
font-family: var(--serif);
font-size: 1.35rem;
font-weight: 600;
}
.restaurant-card p {
margin-bottom: 14px;
color: rgba(255, 255, 255, 0.66);
font-size: 0.85rem;
}
.restaurant-card-meta {
display: flex;
justify-content: space-between;
gap: 12px;
color: var(--gold);
font-size: 0.72rem;
font-weight: 700;
}
.technique-grid {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 20px;
}
.technique-card {
position: relative;
min-height: 295px;
padding: 28px;
overflow: hidden;
border: 1px solid var(--line);
border-radius: var(--radius);
background: var(--paper);
}
.technique-card::after {
position: absolute;
right: -24px;
bottom: -38px;
color: rgba(23, 63, 53, 0.055);
content: attr(data-number);
font-family: var(--serif);
font-size: 9rem;
font-weight: 700;
line-height: 1;
}
.technique-card > * {
position: relative;
z-index: 1;
}
.technique-number {
display: inline-grid;
width: 38px;
height: 38px;
margin-bottom: 26px;
place-items: center;
border-radius: 50%;
color: var(--white);
background: var(--tomato);
font-family: var(--serif);
font-size: 0.95rem;
}
.technique-card h3 {
margin-bottom: 12px;
font-family: var(--serif);
font-size: 1.45rem;
font-weight: 600;
}
.technique-card p {
margin: 0;
color: var(--muted);
font-size: 0.9rem;
}
.technique-notes {
margin-top: 42px;
padding: 32px 36px;
border-radius: var(--radius);
background: var(--sand);
}
.technique-notes h3 {
margin-bottom: 18px;
font-family: var(--serif);
font-size: 1.65rem;
font-weight: 600;
}
.technique-notes details {
border-top: 1px solid rgba(32, 41, 34, 0.14);
}
.technique-notes details:last-child {
border-bottom: 1px solid rgba(32, 41, 34, 0.14);
}
.technique-notes summary {
position: relative;
padding: 18px 34px 18px 0;
font-weight: 700;
list-style: none;
cursor: pointer;
}
.technique-notes summary::-webkit-details-marker {
display: none;
}
.technique-notes summary::after {
position: absolute;
top: 15px;
right: 0;
width: 24px;
height: 24px;
border-radius: 50%;
content: "+";
color: var(--forest);
background: rgba(255, 255, 255, 0.55);
line-height: 24px;
text-align: center;
transition: transform 0.2s ease;
}
.technique-notes details[open] summary::after {
transform: rotate(45deg);
}
.technique-notes details p {
max-width: 850px;
margin: -5px 0 20px;
color: var(--muted);
font-size: 0.91rem;
}
.season-panel {
display: grid;
grid-template-columns: minmax(0, 1.25fr) minmax(330px, 0.75fr);
min-height: 530px;
overflow: hidden;
border-radius: var(--radius-lg);
color: var(--white);
background: var(--forest);
box-shadow: var(--shadow-lg);
}
.season-panel-media {
position: relative;
min-height: 480px;
}
.season-panel-media img {
width: 100%;
height: 100%;
object-fit: cover;
}
.season-panel-media::after {
position: absolute;
inset: 0;
content: "";
background: linear-gradient(90deg, transparent 55%, rgba(23, 63, 53, 0.42));
}
.season-date {
position: absolute;
z-index: 2;
top: 24px;
left: 24px;
padding: 8px 13px;
border: 1px solid rgba(255, 255, 255, 0.3);
border-radius: 999px;
background: rgba(17, 45, 37, 0.55);
backdrop-filter: blur(10px);
font-size: 0.72rem;
font-weight: 700;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.season-panel-copy {
display: flex;
flex-direction: column;
justify-content: center;
padding: 54px;
}
.season-panel-copy h2 {
margin-bottom: 20px;
font-size: clamp(2.5rem, 4.5vw, 4rem);
}
.season-panel-copy > p {
color: rgba(255, 255, 255, 0.72);
}
.produce-list {
display: flex;
flex-wrap: wrap;
gap: 9px;
margin: 21px 0 27px;
}
.produce-list span {
padding: 8px 12px;
border: 1px solid rgba(255, 255, 255, 0.16);
border-radius: 999px;
color: rgba(255, 255, 255, 0.87);
background: rgba(255, 255, 255, 0.06);
font-size: 0.75rem;
font-weight: 600;
}
.season-strip {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 16px;
margin-top: 22px;
}
.season-card {
padding: 24px;
border: 1px solid var(--line);
border-radius: 16px;
background: var(--paper);
transition: transform 0.2s ease, border-color 0.2s ease;
}
.season-card:hover {
transform: translateY(-4px);
border-color: rgba(23, 63, 53, 0.34);
}
.season-card.is-current {
border-color: var(--tomato);
box-shadow: inset 0 3px 0 var(--tomato);
}
.season-card span {
color: var(--tomato);
font-size: 0.69rem;
font-weight: 700;
letter-spacing: 0.12em;
text-transform: uppercase;
}
.season-card h3 {
margin: 8px 0;
font-family: var(--serif);
font-size: 1.45rem;
font-weight: 600;
}
.season-card p {
margin: 0;
color: var(--muted);
font-size: 0.84rem;
}
.planner-section {
background:
linear-gradient(rgba(232, 222, 206, 0.96), rgba(232, 222, 206, 0.96)),
url("https://picsum.photos/1600/1000") center / cover;
}
.planner-layout {
display: grid;
grid-template-columns: minmax(0, 1.25fr) minmax(340px, 0.75fr);
align-items: start;
gap: 28px;
}
.planner-board,
.shopping-panel {
border: 1px solid rgba(32, 41, 34, 0.12);
border-radius: var(--radius);
background: var(--paper);
box-shadow: var(--shadow-sm);
}
.planner-board {
padding: 28px;
}
.planner-board h3,
.shopping-panel h3 {
margin-bottom: 5px;
font-family: var(--serif);
font-size: 1.55rem;
font-weight: 600;
}
.planner-board > p,
.shopping-panel > p {
color: var(--muted);
font-size: 0.86rem;
}
.meal-days {
margin-top: 22px;
border-top: 1px solid var(--line);
}
.meal-day {
display: grid;
grid-template-columns: 96px minmax(0, 1fr);
align-items: center;
gap: 20px;
padding: 15px 0;
border-bottom: 1px solid var(--line);
}
.day-label {
display: flex;
align-items: center;
gap: 10px;
font-weight: 700;
}
.day-label span {
display: grid;
width: 36px;
height: 36px;
place-items: center;
border-radius: 50%;
color: var(--forest);
background: var(--sand);
font-family: var(--serif);
font-size: 0.84rem;
}
.meal-select {
width: 100%;
min-height: 46px;
padding: 10px 40px 10px 14px;
border: 1px solid var(--line);
border-radius: 10px;
color: #39463e;
background-color: var(--paper);
background-image: linear-gradient(45deg, transparent 50%, var(--forest) 50%), linear-gradient(135deg, var(--forest) 50%, transparent 50%);
background-position: calc(100% - 18px) 20px, calc(100% - 13px) 20px;
background-repeat: no-repeat;
background-size: 5px 5px, 5px 5px;
appearance: none;
}
.staples {
margin-top: 24px;
}
.staples > strong {
display: block;
margin-bottom: 10px;
font-size: 0.8rem;
letter-spacing: 0.05em;
text-transform: uppercase;
}
.staple-options {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.staple-chip {
position: relative;
cursor: pointer;
}
.staple-chip input {
position: absolute;
opacity: 0;
pointer-events: none;
}
.staple-chip span {
display: inline-flex;
min-height: 36px;
align-items: center;
padding: 7px 13px;
border: 1px solid var(--line);
border-radius: 999px;
color: var(--muted);
background: var(--cream);
font-size: 0.76rem;
font-weight: 600;
transition: color 0.2s ease, background 0.2s ease, border-color 0.2s ease;
}
.staple-chip input:checked + span {
border-color: var(--forest);
color: var(--white);
background: var(--forest);
}
.staple-chip input:focus-visible + span {
outline: 3px solid var(--gold);
outline-offset: 3px;
}
.planner-actions {
display: flex;
flex-wrap: wrap;
gap: 9px;
margin-top: 25px;
padding-top: 22px;
border-top: 1px solid var(--line);
}
.planner-actions .button {
min-height: 42px;
padding: 10px 16px;
font-size: 0.78rem;
}
.shopping-panel {
position: sticky;
top: 108px;
padding: 28px;
}
.shopping-header {
display: flex;
align-items: start;
justify-content: space-between;
gap: 15px;
}
.shopping-count {
display: grid;
min-width: 38px;
height: 38px;
place-items: center;
border-radius: 50%;
color: var(--white);
background: var(--tomato);
font-size: 0.78rem;
font-weight: 700;
}
.shopping-list {
max-height: 490px;
margin-top: 18px;
overflow-y: auto;
}
.shopping-group + .shopping-group {
margin-top: 22px;
}
.shopping-group h4 {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 9px;
color: var(--forest);
font-size: 0.73rem;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.shopping-group h4 span {
color: var(--muted);
font-size: 0.68rem;
}
.shopping-group ul {
margin: 0;
padding: 0;
list-style: none;
}
.shopping-group label {
display: flex;
align-items: center;
gap: 9px;
padding: 5px 0;
color: #4d5851;
font-size: 0.83rem;
cursor: pointer;
}
.shopping-group input {
width: 16px;
height: 16px;
accent-color: var(--tomato);
}
.shopping-group label.is-bought {
color: #8c948e;
text-decoration: line-through;
}
.shopping-empty {
padding: 28px 12px;
color: var(--muted);
font-size: 0.88rem;
text-align: center;
}
.planner-status {
min-height: 20px;
margin-top: 12px;
color: var(--forest);
font-size: 0.77rem;
font-weight: 600;
}
.nutrition-layout {
display: grid;
grid-template-columns: minmax(360px, 0.82fr) minmax(0, 1.18fr);
align-items: center;
gap: clamp(52px, 8vw, 105px);
}
.nutrition-photo {
position: relative;
padding: 12px;
border-radius: 220px 220px 24px 24px;
background: var(--sand);
}
.nutrition-photo img {
width: 100%;
height: 570px;
border-radius: 210px 210px 17px 17px;
object-fit: cover;
}
.nutrition-note {
position: absolute;
right: -25px;
bottom: 35px;
width: 220px;
padding: 20px;
border-radius: 16px;
color: var(--white);
background: var(--forest);
box-shadow: var(--shadow-lg);
}
.nutrition-note strong {
display: block;
margin-bottom: 5px;
color: var(--gold);
font-family: var(--serif);
font-size: 1.5rem;
font-weight: 600;
}
.nutrition-note span {
color: rgba(255, 255, 255, 0.72);
font-size: 0.78rem;
}
.nutrition-copy h2 {
max-width: 720px;
margin-bottom: 23px;
font-size: clamp(2.5rem, 5vw, 4.5rem);
}
.nutrition-copy > p {
color: var(--muted);
font-size: 1rem;
}
.nutrition-principles {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 12px;
margin: 30px 0;
}
.nutrition-principle {
padding: 20px;
border: 1px solid var(--line);
border-radius: 14px;
background: var(--paper);
}
.nutrition-principle strong {
display: block;
margin-bottom: 7px;
color: var(--forest);
font-family: var(--serif);
font-size: 1.12rem;
}
.nutrition-principle p {
margin: 0;
color: var(--muted);
font-size: 0.79rem;
}
.nutrition-disclaimer {
margin-top: 18px;
color: #7b837d;
font-size: 0.74rem;
}
.journal-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 22px;
}
.article-card {
overflow: hidden;
border: 1px solid var(--line);
border-radius: var(--radius);
background: var(--paper);
transition: transform 0.25s ease, box-shadow 0.25s ease;
}
.article-card:hover {
transform: translateY(-5px);
box-shadow: var(--shadow-sm);
}
.article-image {
overflow: hidden;
aspect-ratio: 16 / 10;
background: var(--sand);
}
.article-image img {
width: 100%;
height: 100%;
object-fit: cover;
transition: transform 0.5s ease;
}
.article-card:hover img {
transform: scale(1.035);
}
.article-body {
padding: 25px;
}
.article-kicker {
display: flex;
align-items: center;
justify-content: space-between;
gap: 15px;
margin-bottom: 13px;
color: var(--tomato);
font-size: 0.69rem;
font-weight: 700;
letter-spacing: 0.09em;
text-transform: uppercase;
}
.article-kicker span:last-child {
color: var(--muted);
letter-spacing: 0;
text-transform: none;
}
.article-body h3 {
margin-bottom: 11px;
font-family: var(--serif);
font-size: 1.55rem;
font-weight: 600;
}
.article-body p {
margin-bottom: 19px;
color: var(--muted);
font-size: 0.88rem;
}
.about-section {
position: relative;
overflow: hidden;
background: var(--sand);
}
.about-layout {
display: grid;
grid-template-columns: minmax(340px, 0.8fr) minmax(0, 1.2fr);
align-items: center;
gap: clamp(52px, 9vw, 115px);
}
.about-photo-wrap {
position: relative;
}
.about-photo {
width: 100%;
height: 580px;
border-radius: 22px 150px 22px 22px;
object-fit: cover;
filter: saturate(0.88);
}
.about-badge {
position: absolute;
right: -28px;
bottom: 28px;
max-width: 220px;
padding: 20px;
border-radius: 16px;
color: var(--white);
background: var(--tomato);
box-shadow: var(--shadow-lg);
}
.about-badge span {
display: block;
margin-bottom: 5px;
color: rgba(255, 255, 255, 0.73);
font-size: 0.65rem;
font-weight: 700;
letter-spacing: 0.1em;
text-transform: uppercase;
}
.about-badge strong {
font-family: var(--serif);
font-size: 1.25rem;
line-height: 1.2;
}
.about-copy h2 {
max-width: 720px;
margin-bottom: 24px;
font-size: clamp(2.5rem, 5vw, 4.5rem);
}
.about-copy > p {
color: var(--muted);
font-size: 1rem;
}
.about-stats {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 18px;
margin: 30px 0;
padding: 24px 0;
border-top: 1px solid rgba(32, 41, 34, 0.14);
border-bottom: 1px solid rgba(32, 41, 34, 0.14);
}
.about-stats strong {
display: block;
color: var(--forest);
font-family: var(--serif);
font-size: 1.8rem;
font-weight: 600;
}
.about-stats span {
color: var(--muted);
font-size: 0.73rem;
font-weight: 600;
letter-spacing: 0.04em;
text-transform: uppercase;
}
.voices-section {
background: var(--paper);
}
.voices-layout {
display: grid;
grid-template-columns: minmax(0, 0.9fr) minmax(0, 1.1fr);
gap: clamp(52px, 8vw, 100px);
align-items: start;
}
.voices-intro h2 {
margin-bottom: 22px;
font-size: clamp(2.4rem, 4.7vw, 4rem);
}
.voices-intro > p {
color: var(--muted);
}
.testimonials {
display: grid;
gap: 14px;
margin-top: 28px;
}
.testimonial {
padding: 22px;
border: 1px solid var(--line);
border-radius: 16px;
background: var(--cream);
}
.testimonial blockquote {
margin: 11px 0 17px;
font-family: var(--serif);
font-size: 1.13rem;
font-style: italic;
line-height: 1.55;
}
.testimonial-author {
display: flex;
align-items: center;
gap: 10px;
}
.testimonial-author img {
width: 38px;
height: 38px;
border-radius: 50%;
object-fit: cover;
}
.testimonial-author strong,
.testimonial-author span {
display: block;
line-height: 1.35;
}
.testimonial-author strong {
font-size: 0.78rem;
}
.testimonial-author span {
color: var(--muted);
font-size: 0.69rem;
}
.faq-wrap {
padding: 34px;
border-radius: var(--radius);
background: var(--sand);
}
.faq-wrap > h3 {
margin-bottom: 8px;
font-family: var(--serif);
font-size: 1.9rem;
font-weight: 600;
}
.faq-wrap > p {
margin-bottom: 19px;
color: var(--muted);
font-size: 0.89rem;
}
.faq-wrap details {
border-top: 1px solid rgba(32, 41, 34, 0.14);
}
.faq-wrap details:last-child {
border-bottom: 1px solid rgba(32, 41, 34, 0.14);
}
.faq-wrap summary {
position: relative;
padding: 18px 34px 18px 0;
font-weight: 700;
list-style: none;
cursor: pointer;
}
.faq-wrap summary::-webkit-details-marker {
display: none;
}
.faq-wrap summary::after {
position: absolute;
top: 16px;
right: 0;
content: "+";
color: var(--tomato);
font-size: 1.35rem;
font-weight: 400;
line-height: 1;
}
.faq-wrap details[open] summary::after {
transform: rotate(45deg);
}
.faq-wrap details p {
margin: -3px 0 18px;
color: var(--muted);
font-size: 0.88rem;
}
.newsletter-section {
position: relative;
overflow: hidden;
padding: 88px 0;
color: var(--white);
background: var(--tomato);
}
.newsletter-section::before,
.newsletter-section::after {
position: absolute;
border: 1px solid rgba(255, 255, 255, 0.17);
border-radius: 50%;
content: "";
pointer-events: none;
}
.newsletter-section::before {
top: -190px;
right: -70px;
width: 430px;
height: 430px;
}
.newsletter-section::after {
bottom: -220px;
left: 30%;
width: 390px;
height: 390px;
}
.newsletter-grid {
position: relative;
z-index: 1;
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(400px, 0.85fr);
align-items: center;
gap: 70px;
}
.newsletter-grid h2 {
margin-bottom: 17px;
font-size: clamp(2.5rem, 5vw, 4.4rem);
}
.newsletter-grid p {
max-width: 650px;
margin: 0;
color: rgba(255, 255, 255, 0.79);
}
.newsletter-form {
display: flex;
gap: 10px;
padding: 10px;
border-radius: 999px;
background: var(--paper);
box-shadow: 0 18px 40px rgba(87, 30, 16, 0.2);
}
.newsletter-form input {
width: 100%;
min-width: 0;
padding: 11px 15px;
border: 0;
outline: 0;
background: transparent;
}
.newsletter-form .button {
flex: 0 0 auto;
color: var(--white);
background: var(--forest);
}
.newsletter-form .button:hover {
background: var(--forest-deep);
}
.form-status {
min-height: 22px;
margin: 10px 4px 0;
color: var(--white);
font-size: 0.82rem;
font-weight: 600;
}
.site-footer {
padding: 76px 0 24px;
color: rgba(255, 255, 255, 0.74);
background: var(--forest-deep);
}
.footer-grid {
display: grid;
grid-template-columns: 1.4fr 0.7fr 0.7fr 1fr;
gap: 50px;
}
.footer-brand .brand-name {
color: var(--white);
font-size: 1.8rem;
}
.footer-brand .brand-tagline {
color: rgba(255, 255, 255, 0.52);
}
.footer-brand > p {
max-width: 350px;
margin: 20px 0;
font-size: 0.87rem;
}
.footer-title {
margin-bottom: 18px;
color: var(--white);
font-size: 0.76rem;
font-weight: 700;
letter-spacing: 0.13em;
text-transform: uppercase;
}
.footer-links {
display: grid;
gap: 9px;
}
.footer-links a {
width: fit-content;
color: rgba(255, 255, 255, 0.67);
font-size: 0.85rem;
transition: color 0.2s ease;
}
.footer-links a:hover {
color: var(--gold);
}
.footer-contact {
display: grid;
gap: 13px;
font-size: 0.84rem;
line-height: 1.5;
}
.footer-contact a:hover {
color: var(--gold);
}
.social-links {
display: flex;
gap: 9px;
margin-top: 20px;
}
.social-links a {
display: grid;
width: 38px;
height: 38px;
place-items: center;
border: 1px solid rgba(255, 255, 255, 0.16);
border-radius: 50%;
color: var(--white);
transition: color 0.2s ease, background 0.2s ease, transform 0.2s ease;
}
.social-links a:hover {
color: var(--forest-deep);
background: var(--gold);
transform: translateY(-2px);
}
.social-links svg {
width: 16px;
height: 16px;
}
.footer-bottom {
display: flex;
align-items: center;
justify-content: space-between;
gap: 30px;
margin-top: 56px;
padding-top: 22px;
border-top: 1px solid rgba(255, 255, 255, 0.12);
font-size: 0.74rem;
}
.footer-legal {
display: flex;
gap: 22px;
}
.footer-legal a:hover {
color: var(--gold);
}
.search-dialog {
width: min(calc(100% - 30px), 650px);
max-height: min(720px, calc(100vh - 30px));
padding: 0;
overflow: hidden;
border: 0;
border-radius: 20px;
color: var(--ink);
background: var(--paper);
box-shadow: 0 35px 100px rgba(8, 28, 22, 0.3);
}
.search-dialog::backdrop {
background: rgba(11, 31, 25, 0.68);
backdrop-filter: blur(5px);
}
.search-form {
padding: 26px;
}
.search-header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 20px;
margin-bottom: 18px;
}
.search-header h2 {
margin: 0;
font-size: 1.8rem;
}
.dialog-close {
display: grid;
width: 38px;
height: 38px;
place-items: center;
border-radius: 50%;
color: var(--white);
background: var(--forest);
font-size: 1.2rem;
}
.search-input-wrap {
display: flex;
align-items: center;
gap: 10px;
padding: 4px 14px;
border: 1px solid var(--line);
border-radius: 12px;
}
.search-input-wrap svg {
width: 18px;
height: 18px;
color: var(--muted);
}
.search-input-wrap input {
width: 100%;
min-height: 46px;
border: 0;
outline: 0;
background: transparent;
}
.search-results {
max-height: 390px;
margin-top: 14px;
overflow-y: auto;
}
.search-result {
display: block;
padding: 14px;
border-bottom: 1px solid var(--line);
}
.search-result:hover {
border-radius: 10px;
background: var(--cream);
}
.search-result span {
display: block;
color: var(--tomato);
font-size: 0.66rem;
font-weight: 700;
letter-spacing: 0.09em;
text-transform: uppercase;
}
.search-result strong {
display: block;
margin-top: 3px;
font-family: var(--serif);
font-size: 1.08rem;
font-weight: 600;
}
.search-empty {
padding: 24px 10px;
color: var(--muted);
font-size: 0.86rem;
text-align: center;
}
.toast {
position: fixed;
z-index: 300;
right: 24px;
bottom: 24px;
max-width: min(360px, calc(100% - 48px));
padding: 13px 18px;
border-radius: 10px;
color: var(--white);
background: var(--forest-deep);
box-shadow: var(--shadow-lg);
font-size: 0.83rem;
font-weight: 600;
opacity: 0;
pointer-events: none;
transform: translateY(15px);
transition: opacity 0.2s ease, transform 0.2s ease;
}
.toast.show {
opacity: 1;
transform: translateY(0);
}
.js .reveal {
opacity: 0;
transform: translateY(18px);
transition: opacity 0.65s ease, transform 0.65s ease;
}
.js .reveal.visible {
opacity: 1;
transform: translateY(0);
}
@media (max-width: 1120px) {
.primary-nav {
gap: 16px;
}
.primary-nav a {
font-size: 0.78rem;
}
.nav-actions .subscribe-label {
display: none;
}
.hero-grid {
grid-template-columns: minmax(0, 1fr) minmax(380px, 0.85fr);
gap: 48px;
}
.hero-recipe-card {
right: -10px;
}
.guide-main {
grid-template-columns: minmax(0, 0.92fr) minmax(380px, 1.08fr);
gap: 54px;
}
.footer-grid {
grid-template-columns: 1.25fr 0.75fr 0.75fr;
}
.footer-contact-column {
grid-column: 1 / -1;
}
}
@media (max-width: 980px) {
.section {
padding: 88px 0;
}
.primary-nav {
display: none;
}
.menu-toggle {
display: block;
}
.nav-wrap {
justify-content: space-between;
}
.nav-actions {
margin-left: auto;
}
.hero {
padding-top: 64px;
}
.hero-grid {
grid-template-columns: 1fr;
}
.hero-copy {
max-width: 760px;
}
.hero-visual {
width: min(100%, 680px);
min-height: 610px;
margin: 10px auto 0;
}
.hero-image-frame {
height: 590px;
}
.section-heading {
grid-template-columns: 1fr;
gap: 22px;
}
.section-heading > div:last-child {
max-width: 680px;
}
.recipe-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.recipe-card.featured {
grid-column: span 2;
}
.guide-main {
grid-template-columns: 1fr;
}
.guide-copy {
max-width: 760px;
}
.guide-feature img {
height: 570px;
}
.restaurant-grid,
.journal-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.restaurant-grid .restaurant-card:last-child,
.journal-grid .article-card:last-child {
grid-column: span 2;
}
.technique-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.season-panel {
grid-template-columns: 1fr;
}
.season-panel-media {
min-height: 430px;
}
.season-panel-copy {
padding: 45px;
}
.season-strip {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.planner-layout {
grid-template-columns: 1fr;
}
.shopping-panel {
position: static;
}
.shopping-list {
max-height: none;
}
.nutrition-layout,
.about-layout {
grid-template-columns: 1fr;
}
.nutrition-photo,
.about-photo-wrap {
width: min(100%, 590px);
margin-inline: auto;
}
.nutrition-copy,
.about-copy {
max-width: 760px;
}
.about-badge {
right: 12px;
}
.voices-layout {
grid-template-columns: 1fr;
}
.newsletter-grid {
grid-template-columns: 1fr;
gap: 35px;
}
}
@media (max-width: 700px) {
.container {
width: min(calc(100% - 28px), var(--container));
}
.section {
padding: 72px 0;
}
.section--tight {
padding: 60px 0;
}
.announcement .container {
justify-content: flex-start;
overflow: hidden;
white-space: nowrap;
}
.announcement span {
display: none;
}
.nav-wrap {
min-height: 72px;
gap: 10px;
}
.brand-logo {
width: 44px;
height: 44px;
}
.brand-name {
font-size: 1.18rem;
}
.brand-tagline {
font-size: 0.56rem;
}
.nav-actions .button {
display: none;
}
.hero {
padding: 52px 0 62px;
}
.hero h1 {
font-size: clamp(3rem, 14vw, 4.6rem);
}
.hero-visual {
min-height: 500px;
padding: 0 0 52px;
}
.hero-image-frame {
height: 470px;
border-width: 6px;
border-radius: 45% 45% 20px 20px;
}
.season-sticker {
top: 22px;
left: -5px;
width: 94px;
height: 94px;
}
.season-sticker strong {
font-size: 1.25rem;
}
.hero-recipe-card {
right: 4px;
width: 250px;
}
.stats-grid {
grid-template-columns: repeat(2, 1fr);
}
.stat-item {
padding: 22px 12px;
}
.stat-item + .stat-item {
border-left: 0;
}
.stat-item:nth-child(even) {
border-left: 1px solid rgba(255, 255, 255, 0.14);
}
.stat-item:nth-child(n + 3) {
border-top: 1px solid rgba(255, 255, 255, 0.14);
}
.recipe-grid,
.restaurant-grid,
.journal-grid,
.technique-grid {
grid-template-columns: 1fr;
}
.recipe-card.featured,
.restaurant-grid .restaurant-card:last-child,
.journal-grid .article-card:last-child {
display: block;
grid-column: auto;
}
.recipe-card.featured .recipe-image {
min-height: 260px;
}
.recipe-card.featured .recipe-body {
padding: 25px;
}
.recipe-card.featured .recipe-body h3 {
font-size: 1.55rem;
}
.filter-count {
width: 100%;
margin: 6px 0 0;
}
.guide-feature img {
height: 440px;
}
.featured-restaurant-card {
right: 18px;
bottom: 18px;
left: 18px;
}
.guide-subheading {
align-items: start;
flex-direction: column;
}
.season-panel-media {
min-height: 340px;
}
.season-panel-copy {
padding: 34px 25px;
}
.season-strip {
grid-template-columns: 1fr;
}
.planner-board,
.shopping-panel {
padding: 21px;
}
.meal-day {
grid-template-columns: 74px minmax(0, 1fr);
gap: 10px;
}
.day-label {
gap: 6px;
}
.day-label span {
width: 30px;
height: 30px;
}
.nutrition-photo img {
height: 470px;
}
.nutrition-note {
right: 8px;
bottom: 18px;
width: 190px;
}
.nutrition-principles {
grid-template-columns: 1fr;
}
.about-photo {
height: 470px;
}
.about-stats {
grid-template-columns: 1fr;
gap: 18px;
}
.faq-wrap {
padding: 25px 20px;
}
.newsletter-section {
padding: 68px 0;
}
.newsletter-form {
display: grid;
padding: 9px;
border-radius: 16px;
}
.newsletter-form .button {
width: 100%;
}
.footer-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 38px 24px;
}
.footer-brand,
.footer-contact-column {
grid-column: 1 / -1;
}
.footer-bottom {
align-items: flex-start;
flex-direction: column;
gap: 14px;
}
}
@media (max-width: 420px) {
.hero-actions .button {
width: 100%;
}
.hero-recipe-card {
grid-template-columns: 58px 1fr;
width: 225px;
}
.hero-recipe-card img {
width: 58px;
height: 58px;
}
.reader-trust {
align-items: flex-start;
flex-direction: column;
}
.guide-feature img {
height: 390px;
}
.featured-restaurant-card {
padding: 16px;
}
.featured-restaurant-card h3 {
font-size: 1.4rem;
}
.meal-day {
grid-template-columns: 1fr;
}
.day-label {
margin-bottom: -3px;
}
.footer-grid {
grid-template-columns: 1fr;
}
.footer-brand,
.footer-contact-column {
grid-column: auto;
}
}
@media (prefers-reduced-motion: reduce) {
html {
scroll-behavior: auto;
}
*,
*::before,
*::after {
scroll-behavior: auto !important;
transition-duration: 0.01ms !important;
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
}
.js .reveal {
opacity: 1;
transform: none;
}
}
@media print {
body {
background: var(--white);
}
body > * {
visibility: hidden;
}
#planner,
#planner * {
visibility: visible;
}
#planner {
position: absolute;
top: 0;
left: 0;
width: 100%;
padding: 30px;
background: var(--white);
}
#planner .planner-controls,
#planner .planner-actions,
#planner .planner-status,
#planner .section-heading {
display: none;
}
#planner .planner-layout {
grid-template-columns: 1fr 1fr;
}
#planner .shopping-panel {
position: static;
box-shadow: none;
}
}
</style>
</head>
<body>
<a class="skip-link" href="#main-content">Skip to main content</a>
<div class="announcement">
<div class="container">
<span>Field Notes · September issue</span>
<a href="#seasonal">The late-summer produce guide is here →</a>
</div>
</div>
<header class="site-header" id="siteHeader">
<div class="container nav-wrap">
<a class="brand" href="#home" aria-label="Field and Flame home">
<img class="brand-logo" src="https://placehold.co/72x72/173f35/fffaf0?text=F%26F&font=playfair+display" alt="Field and Flame logo" width="72" height="72">
<span class="brand-copy">
<span class="brand-name">Field & Flame</span>
<span class="brand-tagline">Seasonal recipes for generous tables</span>
</span>
</a>
<nav class="primary-nav" aria-label="Primary navigation">
<a href="#recipes">Recipes</a>
<a href="#restaurant-guide">Restaurant Guide</a>
<a href="#seasonal">Seasonal Menus</a>
<a href="#cooking-tips">Cooking Tips</a>
<a href="#nutrition">Nutrition</a>
<a href="#blog">Blog</a>
<a href="#about">About</a>
</nav>
<div class="nav-actions">
<button class="icon-button" id="searchTrigger" type="button" aria-label="Search Field and Flame">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" aria-hidden="true">
<circle cx="11" cy="11" r="7"></circle>
<path d="m20 20-4-4"></path>
</svg>
</button>
<a class="button button--primary" href="#subscribe"><span class="subscribe-label">Subscribe</span><span aria-hidden="true">→</span></a>
<button class="menu-toggle" id="menuToggle" type="button" aria-label="Open navigation" aria-controls="mobileNav" aria-expanded="false">
<span></span><span></span><span></span>
</button>
</div>
</div>
<nav class="mobile-nav" id="mobileNav" aria-label="Mobile navigation">
<a href="#recipes">Recipes</a>
<a href="#restaurant-guide">Restaurant Guide</a>
<a href="#seasonal">Seasonal Menus</a>
<a href="#cooking-tips">Cooking Tips</a>
<a href="#nutrition">Nutrition</a>
<a href="#blog">Blog</a>
<a href="#about">About</a>
<a class="button button--primary" href="#subscribe">Subscribe to Field Notes</a>
</nav>
</header>
<main id="main-content">
<section class="hero" id="home">
<div class="container hero-grid">
<div class="hero-copy reveal">
<span class="eyebrow">An independent guide to cooking and eating</span>
<h1>Good food starts with <em>what’s in season.</em></h1>
<p>Kitchen-tested recipes, neighborhood tables worth knowing, and the small cooking decisions that make everyday food feel exceptional.</p>
<p>Field & Flame follows ingredients from market to menu, sharing practical technique without sacrificing curiosity, flavor, or a life well eaten.</p>
<div class="hero-actions">
<a class="button button--primary" href="#recipes">
Explore new recipes
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"></path></svg>
</a>
<a class="button button--outline" href="#restaurant-guide">Find a restaurant</a>
</div>
<div class="reader-trust">
<div class="reader-avatars" aria-hidden="true">
<img src="https://i.pravatar.cc/80?u=home-cook-anna" alt="" width="80" height="80">
<img src="https://i.pravatar.cc/80?u=home-cook-luis" alt="" width="80" height="80">
<img src="https://i.pravatar.cc/80?u=home-cook-june" alt="" width="80" height="80">
</div>
<p><strong><span class="stars" aria-label="5 out of 5 stars">★★★★★</span> 4.9</strong> from 2,800+ curious home cooks</p>
</div>
</div>
<div class="hero-visual reveal">
<div class="hero-image-frame">
<img src="https://picsum.photos/1100/1300" alt="A colorful seasonal meal arranged on a dining table" width="1100" height="1300">
<div class="hero-image-caption">
<div>
<span>Summer table · Issue 08</span>
<strong>Tomatoes, peaches & the long table</strong>
</div>
<a class="round-arrow" href="#seasonal" aria-label="Explore the summer table">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"></path></svg>
</a>
</div>
</div>
<div class="season-sticker" aria-hidden="true">
<div>
<strong>Peak</strong>
<span>Season now</span>
</div>
</div>
<a class="hero-recipe-card" href="#recipes">
<img src="https://picsum.photos/id/1080/160/160" alt="" width="160" height="160" loading="lazy">
<div>
<span>This week’s pick</span>
<strong>Charred tomato & whipped feta toasts</strong>
</div>
</a>
</div>
</div>
</section>
<section class="stats-band" aria-label="Field and Flame by the numbers">
<div class="container stats-grid">
<div class="stat-item"><strong>240+</strong><span>Kitchen-tested recipes</span></div>
<div class="stat-item"><strong>74</strong><span>Neighborhood tables</span></div>
<div class="stat-item"><strong>18K</strong><span>Curious subscribers</span></div>
<div class="stat-item"><strong>32</strong><span>Seasonal produce notes</span></div>
</div>
</section>
<section class="section section--white" id="recipes">
<div class="container">
<div class="section-heading reveal">
<div>
<span class="eyebrow">From the test kitchen</span>
<h2>Recipes for right now.</h2>
</div>
<div>
<p>Our recipes are cooked, adjusted, and cooked again until the instructions are clear and the results are genuinely worth sharing. Each one begins with a season, a technique, or a well-loved pantry staple.</p>
<p style="margin-top: 12px;">Choose a filter, save a favorite, or use the weekly planner to turn the list into a week of meals.</p>
</div>
</div>
<div class="recipe-filters reveal" aria-label="Filter recipes">
<button class="filter-button active" type="button" data-filter="all" aria-pressed="true">All recipes</button>
<button class="filter-button" type="button" data-filter="weeknight" aria-pressed="false">Weeknight</button>
<button class="filter-button" type="button" data-filter="plant-forward" aria-pressed="false">Plant-forward</button>
<button class="filter-button" type="button" data-filter="baking" aria-pressed="false">Baking</button>
<span class="filter-count" id="filterCount" aria-live="polite">6 recipes to explore</span>
</div>
<div class="recipe-grid" id="recipeGrid">
<article class="recipe-card featured reveal" data-categories="weeknight vegetarian summer" data-index="0">
<div class="recipe-image">
<img src="https://picsum.photos/id/1080/1000/720" alt="Tomatoes and herbs prepared for a seasonal toast" width="1000" height="720" loading="lazy">
<span class="recipe-badge">Editor’s pick</span>
<button class="save-button" type="button" aria-label="Save Charred Tomato and Whipped Feta Toasts" aria-pressed="false">
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M20.8 4.6a5.5 5.5 0 0 0-7.8 0L12 5.7l-1.1-1.1a5.5 5.5 0 0 0-7.8 7.8l1.1 1.1L12 21l7.8-7.5 1.1-1.1a5.5 5.5 0 0 0-.1-7.8Z"></path></svg>
</button>
</div>
<div class="recipe-body">
<div class="recipe-meta"><span>Summer</span><span>Vegetarian</span></div>
<h3>Charred Tomato & Whipped Feta Toasts</h3>
<p>Ripe tomatoes meet a hot pan for smoky edges, then land on lemony whipped feta and deeply toasted sourdough. A spoonful of basil oil turns the plate into a complete late-summer lunch.</p>
<div class="recipe-footer">
<span class="recipe-time">25 minutes · Easy</span>
<a class="text-link" href="#planner">Add to plan <span aria-hidden="true">→</span></a>
</div>
</div>
</article>
<article class="recipe-card reveal" data-categories="weeknight vegetarian quick" data-index="1">
<div class="recipe-image">
<img src="https://picsum.photos/id/106/1000/720" alt="A bright plate of pasta with green vegetables" width="1000" height="720" loading="lazy">
<span class="recipe-badge">Weeknight</span>
<button class="save-button" type="button" aria-label="Save Lemony Orzo with Asparagus and Dill" aria-pressed="false">
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M20.8 4.6a5.5 5.5 0 0 0-7.8 0L12 5.7l-1.1-1.1a5.5 5.5 0 0 0-7.8 7.8l1.1 1.1L12 21l7.8-7.5 1.1-1.1a5.5 5.5 0 0 0-.1-7.8Z"></path></svg>
</button>
</div>
<div class="recipe-body">
<div class="recipe-meta"><span>30 minutes</span><span>Vegetarian</span></div>
<h3>Lemony Orzo, Asparagus & Dill</h3>
<p>Silky orzo, tender asparagus, and a bright lemon-dill dressing make this an effortless dinner for the nights when everything needs to happen at once.</p>
<div class="recipe-footer">
<span class="recipe-time">Beginner-friendly</span>
<a class="text-link" href="#planner">Add to plan <span aria-hidden="true">→</span></a>
</div>
</div>
</article>
<article class="recipe-card reveal" data-categories="weeknight plant-forward vegetarian" data-index="2">
<div class="recipe-image">
<img src="https://picsum.photos/id/1073/1000/720" alt="Roasted carrots with sesame and herbs" width="1000" height="720" loading="lazy">
<span class="recipe-badge">One pan</span>
<button class="save-button" type="button" aria-label="Save Miso Butter Roasted Carrots" aria-pressed="false">
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M20.8 4.6a5.5 5.5 0 0 0-7.8 0L12 5.7l-1.1-1.1a5.5 5.5 0 0 0-7.8 7.8l1.1 1.1L12 21l7.8-7.5 1.1-1.1a5.5 5.5 0 0 0-.1-7.8Z"></path></svg>
</button>
</div>
<div class="recipe-body">
<div class="recipe-meta"><span>Plant-forward</span><span>Gluten-free</span></div>
<h3>Miso-Butter Roasted Carrots</h3>
<p>Roasting brings out the carrots’ sweetness, while miso and browned butter add a savory edge. Sesame, scallions, and rice vinegar keep every bite lively.</p>
<div class="recipe-footer">
<span class="recipe-time">45 minutes</span>
<a class="text-link" href="#planner">Add to plan <span aria-hidden="true">→</span></a>
</div>
</div>
</article>
<article class="recipe-card reveal" data-categories="baking summer vegetarian" data-index="3">
<div class="recipe-image">
<img src="https://picsum.photos/id/1050/1000/720" alt="A rustic fruit tart with stone fruit" width="1000" height="720" loading="lazy">
<span class="recipe-badge">Bake</span>
<button class="save-button" type="button" aria-label="Save Rustic Peach and Almond Galette" aria-pressed="false">
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M20.8 4.6a5.5 5.5 0 0 0-7.8 0L12 5.7l-1.1-1.1a5.5 5.5 0 0 0-7.8 7.8l1.1 1.1L12 21l7.8-7.5 1.1-1.1a5.5 5.5 0 0 0-.1-7.8Z"></path></svg>
</button>
</div>
<div class="recipe-body">
<div class="recipe-meta"><span>Seasonal</span><span>Baking</span></div>
<h3>Rustic Peach & Almond Galette</h3>
<p>A free-form almond crust keeps this tart relaxed and deeply fragrant. Ripe peaches caramelize at the edges without hiding the fruit’s floral sweetness.</p>
<div class="recipe-footer">
<span class="recipe-time">1 hour · Weekend</span>
<a class="text-link" href="#planner">Add to plan <span aria-hidden="true">→</span></a>
</div>
</div>
</article>
<article class="recipe-card reveal" data-categories="weeknight plant-forward vegetarian one-pot" data-index="4">
<div class="recipe-image">
<img src="https://picsum.photos/id/1062/1000/720" alt="A hearty bowl of white bean stew" width="1000" height="720" loading="lazy">
<span class="recipe-badge">Meal prep</span>
<button class="save-button" type="button" aria-label="Save Smoky White Bean Stew" aria-pressed="false">
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M20.8 4.6a5.5 5.5 0 0 0-7.8 0L12 5.7l-1.1-1.1a5.5 5.5 0 0 0-7.8 7.8l1.1 1.1L12 21l7.8-7.5 1.1-1.1a5.5 5.5 0 0 0-.1-7.8Z"></path></svg>
</button>
</div>
<div class="recipe-body">
<div class="recipe-meta"><span>One-pot</span><span>High protein</span></div>
<h3>Smoky White Bean Stew</h3>
<p>Creamy beans, tomato, and kale turn a short list of pantry staples into a deeply savory supper. Smoked paprika builds warmth without overwhelming the greens.</p>
<div class="recipe-footer">
<span class="recipe-time">40 minutes</span>
<a class="text-link" href="#planner">Add to plan <span aria-hidden="true">→</span></a>
</div>
</div>
</article>
<article class="recipe-card reveal" data-categories="plant-forward vegetarian meal-prep" data-index="5">
<div class="recipe-image">
<img src="https://picsum.photos/id/1060/1000/720" alt="A green herb soup served in a bowl" width="1000" height="720" loading="lazy">
<span class="recipe-badge">Freezer-friendly</span>
<button class="save-button" type="button" aria-label="Save Green Herb Soup with Lemon" aria-pressed="false">
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M20.8 4.6a5.5 5.5 0 0 0-7.8 0L12 5.7l-1.1-1.1a5.5 5.5 0 0 0-7.8 7.8l1.1 1.1L12 21l7.8-7.5 1.1-1.1a5.5 5.5 0 0 0-.1-7.8Z"></path></svg>
</button>
</div>
<div class="recipe-body">
<div class="recipe-meta"><span>Meal prep</span><span>Vegetarian</span></div>
<h3>Green Herb Soup with Lemon</h3>
<p>Leek, potato, and celery create a soft base for parsley and chives. Finish with lemon and cream for a soup that tastes even brighter the next day.</p>
<div class="recipe-footer">
<span class="recipe-time">35 minutes</span>
<a class="text-link" href="#planner">Add to plan <span aria-hidden="true">→</span></a>
</div>
</div>
</article>
</div>
</div>
</section>
<section class="section guide-section" id="restaurant-guide">
<div class="container">
<div class="guide-main">
<div class="guide-copy reveal">
<span class="eyebrow">The restaurant guide</span>
<h2>The neighborhood table, carefully chosen.</h2>
<p>We visit regularly, not once. Our editors look for a point of view, a welcome room, and food that shows respect for its ingredients, producers, and place. Great technique matters, but generosity matters more.</p>
<p>From a six-seat taco counter to a meticulous neighborhood dining room, these are the tables we are excited to return to—and the reason each one earned its place.</p>
<div class="guide-actions">
<a class="button button--light" href="#restaurant-picks">Explore all restaurant picks</a>
<a class="button" style="color:#fff;border-color:rgba(255,255,255,.25)" href="#subscribe">Get the monthly guide</a>
</div>
</div>
<div class="guide-feature reveal">
<img src="https://picsum.photos/id/292/900/1100" alt="An intimate seasonal restaurant dining room" width="900" height="1100" loading="lazy">
<div class="featured-restaurant-card">
<span class="restaurant-type">New American · $$</span>
<h3>Alder & Ash</h3>
<p>Chef Lena Ortiz’s ten-seat counter serves produce-forward plates, warm bread, and excellent natural wine in a quietly electric room.</p>
</div>
</div>
</div>
<div class="guide-subheading reveal" id="restaurant-picks">
<div>
<span class="eyebrow">Recently visited</span>
<h3>Three tables on our list</h3>
</div>
<a href="#restaurant-guide">See the complete guide →</a>
</div>
<div class="restaurant-grid">
<article class="restaurant-card reveal">
<img src="https://picsum.photos/id/1076/800/600" alt="A wood-fired dish at a modern restaurant" width="800" height="600" loading="lazy">
<div class="restaurant-card-body">
<h4>Juniper Room</h4>
<p>Live-fire cooking, handmade pasta, and a concise list of natural wines in a warmly lit room built around an open hearth.</p>
<div class="restaurant-card-meta"><span>Hawthorne District</span><span>$$$</span></div>
</div>
</article>
<article class="restaurant-card reveal">
<img src="https://picsum.photos/id/1060/800/600" alt="A composed seafood course at a coastal restaurant" width="800" height="600" loading="lazy">
<div class="restaurant-card-body">
<h4>Marea</h4>
<p>Coastal ingredients meet a restrained Italian sensibility. The daily crudo and brown-butter agnolotti are reasons to arrive early.</p>
<div class="restaurant-card-meta"><span>Eastbank</span><span>$$$</span></div>
</div>
</article>
<article class="restaurant-card reveal">
<img src="https://picsum.photos/id/1073/800/600" alt="A bright all-day restaurant interior and plated food" width="800" height="600" loading="lazy">
<div class="restaurant-card-body">
<h4>The Greenhouse</h4>
<p>An all-day café, produce counter, and bakery in one sunny space. Excellent grain bowls, very good coffee, and a patio made for lingering.</p>
<div class="restaurant-card-meta"><span>North Loop</span><span>$$</span></div>
</div>
</article>
</div>
</div>
</section>
<section class="section" id="cooking-tips">
<div class="container">
<div class="section-heading reveal">
<div>
<span class="eyebrow">The technique notebook</span>
<h2>Better cooking, one idea at a time.</h2>
</div>
<div>
<p>Good cooking is less about memorizing recipes and more about understanding what the food needs. These are the repeatable principles we return to in our test kitchen and at the stove at home.</p>
<p style="margin-top:12px;">Choose one, cook with it for a week, and notice how much more confidently your meals come together.</p>
</div>
</div>
<div class="technique-grid">
<article class="technique-card reveal" data-number="1">
<span class="technique-number">01</span>
<h3>Season in layers</h3>
<p>Seasoning only at the end is a common habit, but flavor builds throughout cooking. Salt early to season the food, then adjust with acid and finishing salt once the dish is nearly ready.</p>
</article>
<article class="technique-card reveal" data-number="2">
<h3>Think acid + fat</h3>
<p>A squeeze of lemon, a splash of vinegar, or a spoon of pickle brine can correct a dish that feels heavy. Acid sharpens flavor, while fat carries aroma; use both before reaching for more salt.</p>
</article>
<article class="technique-card reveal" data-number="3">
<h3>Brown, then braise</h3>
<p>The Maillard reaction creates the savory depth we call “browning.” Give ingredients enough space, use enough heat, and resist moving them too soon before adding liquid for a tender braise.</p>
</article>
<article class="technique-card reveal" data-number="4">
<h3>Ferment with intent</h3>
<p>Fermentation is less about following a rigid formula and more about managing salt, temperature, and time. Start with a trusted recipe, keep equipment clean, and always taste along the way.</p>
</article>
</div>
<div class="technique-notes reveal">
<h3>Five useful answers</h3>
<details>
<summary>How do I know my oil is hot enough for searing?</summary>
<p>Place a small piece of food in the oil; it should sizzle immediately without darkening in a second. If the oil is quiet, wait. If it smokes, pull it from the heat and let it cool before adjusting.</p>
</details>
<details>
<summary>Why does my vinaigrette taste flat?</summary>
<p>Most vinaigrettes need both acid and salt, and they need time to emulsify. Whisk the acid first, then slowly incorporate the oil. If it still tastes dull, add a spoonful of warm water or a pinch of sugar.</p>
</details>
<details>
<summary>Can I make a sauce without a recipe?</summary>
<p>Yes. Start with fat, aromatics, and acid, then adjust with salt and heat. A useful sequence is sauté aromatics, deglaze with wine or stock, reduce, and finish with butter or vinegar off the heat.</p>
</details>
<details>
<summary>When should I add fresh herbs?</summary>
<p>Tender herbs such as basil, mint, and cilantro usually benefit from being added late so their flavor stays vivid. Hardy herbs like rosemary, thyme, and sage can cook longer, helping build a deeper aromatic base.</p>
</details>
<details>
<summary>How can I tell when meat needs resting?</summary>
<p>Resting allows muscle fibers to relax and retain more juice, but timing depends on the cut. For most medium-sized roasted cuts, a short rest is enough; very small portions do not need the same treatment.</p>
</details>
</div>
</div>
</section>
<section class="section section--white" id="seasonal">
<div class="container">
<div class="section-heading reveal">
<div>
<span class="eyebrow">Eat with the calendar</span>
<h2>Seasonal menus, built around what is here.</h2>
</div>
<div>
<p>Seasonal cooking is not a rulebook; it is a way to notice. Our monthly menus follow the markets, balancing peak produce with ingredients that make a complete meal all year long.</p>
<p style="margin-top:12px;">Each edition includes a market list, a four-course menu, substitutions, and a short note on where the season’s best ingredients are coming from.</p>
</div>
</div>
<div class="season-panel reveal">
<div class="season-panel-media">
<img src="https://picsum.photos/id/1084/1200/900" alt="A market table filled with late-summer produce" width="1200" height="900" loading="lazy">
<span class="season-date">September · Late summer</span>
</div>
<div class="season-panel-copy">
<span class="eyebrow">Current menu</span>
<h2>The last tomatoes before autumn.</h2>
<p>There is a brief, delicious window when heirloom tomatoes and early apples overlap. This menu moves from a green tomato salad to grilled fish with peppercorn salsa, then finishes with a warm peach galette.</p>
<div class="produce-list" aria-label="September produce">
<span>Heirloom tomatoes</span><span>Sweet corn</span><span>Early apples</span><span>Peaches</span><span>Basil</span><span>Sweet peppers</span>
</div>
<a class="button button--light" href="#planner">Browse the September menu</a>
</div>
</div>
<div class="season-strip">
<article class="season-card reveal">
<span>March – May</span>
<h3>Spring</h3>
<p>Asparagus, peas, radishes, and tender herbs. These are the ingredients that taste most alive when barely cooked.</p>
</article>
<article class="season-card is-current reveal">
<span>June – August</span>
<h3>Summer</h3>
<p>Tomatoes, stone fruit, zucchini, and corn. The best summer cooking happens quickly, with fire, oil, and very little fuss.</p>
</article>
<article class="season-card reveal">
<span>September – November</span>
<h3>Autumn</h3>
<p>Apples, squash, mushrooms, and roots bring richer flavors. Slow roasting and long braises suit the cooling weather.</p>
</article>
<article class="season-card reveal">
<span>December – February</span>
<h3>Winter</h3>
<p>Cabbage, citrus, onions, and legumes become the focus. Bright acid and careful seasoning keep cold-weather cooking alive.</p>
</article>
</div>
</div>
</section>
<section class="section planner-section" id="planner">
<div class="container">
<div class="section-heading reveal">
<div>
<span class="eyebrow">Interactive kitchen planner</span>
<h2>Build a week you’ll actually cook.</h2>
</div>
<div>
<p>Choose a dinner for each day and we’ll organize the ingredients into a practical shopping list. Tell us what is already in your pantry, then print the list or take it to the market.</p>
<p style="margin-top:12px;">The planner is designed for flexibility: swap any meal, leave a night open for leftovers, or let the surprise button make the decision for you.</p>
</div>
</div>
<div class="planner-layout">
<div class="planner-board reveal">
<div class="planner-controls">
<h3>Your week of dinners</h3>
<p>Select a recipe for each evening. Your list updates automatically.</p>
</div>
<div class="meal-days" id="mealDays">
<div class="meal-day">
<label class="day-label" for="monday"><span>Mon</span> Monday</label>
<select class="meal-select" id="monday" data-day="Monday"></select>
</div>
<div class="meal-day">
<label class="day-label" for="tuesday"><span>Tue</span> Tuesday</label>
<select class="meal-select" id="tuesday" data-day="Tuesday"></select>
</div>
<div class="meal-day">
<label class="day-label" for="wednesday"><span>Wed</span> Wednesday</label>
<select class="meal-select" id="wednesday" data-day="Wednesday"></select>
</div>
<div class="meal-day">
<label class="day-label" for="thursday"><span>Thu</span> Thursday</label>
<select class="meal-select" id="thursday" data-day="Thursday"></select>
</div>
<div class="meal-day">
<label class="day-label" for="friday"><span>Fri</span> Friday</label>
<select class="meal-select" id="friday" data-day="Friday"></select>
</div>
<div class="meal-day">
<label class="day-label" for="saturday"><span>Sat</span> Saturday</label>
<select class="meal-select" id="saturday" data-day="Saturday"></select>
</div>
<div class="meal-day">
<label class="day-label" for="sunday"><span>Sun</span> Sunday</label>
<select class="meal-select" id="sunday" data-day="Sunday"></select>
</div>
</div>
<div class="staples">
<strong>I already have these pantry staples</strong>
<div class="staple-options">
<label class="staple-chip"><input type="checkbox" data-staple="Olive oil"><span>Olive oil</span></label>
<label class="staple-chip"><input type="checkbox" data-staple="Flaky salt"><span>Flaky salt</span></label>
<label class="staple-chip"><input type="checkbox" data-staple="Black pepper"><span>Black pepper</span></label>
</div>
</div>
<div class="planner-actions">
<button class="button button--dark" id="surpriseMe" type="button">Surprise me</button>
<button class="button button--outline" id="clearPlan" type="button">Clear plan</button>
<button class="button button--primary" id="printList" type="button">Print shopping list</button>
</div>
<p class="planner-status" id="plannerStatus" aria-live="polite">Your weekly shopping list is ready.</p>
</div>
<aside class="shopping-panel reveal" aria-labelledby="shoppingTitle">
<div class="shopping-header">
<div>
<h3 id="shoppingTitle">Shopping list</h3>
<p>Grouped for a quicker market trip.</p>
</div>
<span class="shopping-count" id="shoppingCount" aria-label="Number of shopping items">0</span>
</div>
<div class="shopping-list" id="shoppingList" aria-live="polite"></div>
</aside>
</div>
</div>
</section>
<section class="section" id="nutrition">
<div class="container nutrition-layout">
<div class="nutrition-photo reveal">
<img src="https://picsum.photos/id/1080/900/1100" alt="A balanced plate of vegetables, grains, and greens" width="900" height="1100" loading="lazy">
<div class="nutrition-note">
<strong>Less noise. More context.</strong>
<span>Useful guidance for real kitchens and real schedules.</span>
</div>
</div>
<div class="nutrition-copy reveal">
<span class="eyebrow">Everyday nutrition</span>
<h2>Nutrition that respects real life.</h2>
<p>Food does not need to be perfect to be nourishing. Our approach focuses on useful patterns: enough variety, satisfying portions, and techniques that help you build a better plate without turning dinner into a project.</p>
<p>We translate broad nutrition principles into approachable choices, explain the reasoning plainly, and leave room for preferences, culture, budget, and the realities of a Tuesday evening.</p>
<div class="nutrition-principles">
<article class="nutrition-principle">
<strong>Build the plate</strong>
<p>Use produce, a satisfying protein, and a fiber-rich carbohydrate as a flexible starting point—not a rigid formula.</p>
</article>
<article class="nutrition-principle">
<strong>Read with context</strong>
<p>Labels can guide choices, but serving size, ingredients, and your overall pattern matter more than a single number.</p>
</article>
<article class="nutrition-principle">
<strong>Make it satisfying</strong>
<p>Include enough fat, fiber, protein, and acid to stay full and make simple food taste worth coming back to.</p>
</article>
</div>
<a class="button button--dark" href="#blog">Read our nutrition notes</a>
<p class="nutrition-disclaimer">Field & Flame provides general educational information, not personalized medical advice. For individual nutrition needs, consult a qualified healthcare professional.</p>
</div>
</div>
</section>
<section class="section section--white" id="blog">
<div class="container">
<div class="section-heading reveal">
<div>
<span class="eyebrow">The journal</span>
<h2>Stories from the field.</h2>
</div>
<div>
<p>Dispatches from market stalls, home kitchens, restaurant pass windows, and the scientists who help us understand where flavor comes from. We write for curious cooks who value substance over spectacle.</p>
<p style="margin-top:12px;">Every story is edited to offer something useful: a principle, a technique, a place, or a new way to see an ingredient.</p>
</div>
</div>
<div class="journal-grid">
<article class="article-card reveal">
<div class="article-image"><img src="https://picsum.photos/id/292/900/560" alt="A bowl of greens and a carefully dressed salad" width="900" height="560" loading="lazy"></div>
<div class="article-body">
<div class="article-kicker"><span>Technique</span><span>6 min read</span></div>
<h3>The quiet science of a better vinaigrette</h3>
<p>Why ratio matters less than order, emulsification, and the balance between acid, fat, salt, and sweetness.</p>
<a class="text-link" href="#blog">Read the story <span aria-hidden="true">→</span></a>
</div>
</article>
<article class="article-card reveal">
<div class="article-image"><img src="https://picsum.photos/id/1084/900/560" alt="A farmers market display of ripe peaches" width="900" height="560" loading="lazy"></div>
<div class="article-body">
<div class="article-kicker"><span>Produce guide</span><span>8 min read</span></div>
<h3>A field guide to peak-season stone fruit</h3>
<p>Learn how to choose ripe peaches, tell when an apricot is ready, and make apricots ripen without losing their character.</p>
<a class="text-link" href="#blog">Read the story <span aria-hidden="true">→</span></a>
</div>
</article>
<article class="article-card reveal">
<div class="article-image"><img src="https://picsum.photos/id/1062/900/560" alt="Fermented vegetables in glass jars" width="900" height="560" loading="lazy"></div>
<div class="article-body">
<div class="article-kicker"><span>Food science</span><span>10 min read</span></div>
<h3>What fermentation can teach a weeknight kitchen</h3>
<p>Salt, time, and microbial flavor are powerful tools. Here is what a cautious first ferment can teach us about seasoning.</p>
<a class="text-link" href="#blog">Read the story <span aria-hidden="true">→</span></a>
</div>
</article>
</div>
</div>
</section>
<section class="section about-section" id="about">
<div class="container about-layout">
<div class="about-photo-wrap reveal">
<img class="about-photo" src="https://i.pravatar.cc/700?u=mara-ellis-founder" alt="Mara Ellis, founder and recipe director of Field and Flame" width="700" height="700" loading="lazy">
<div class="about-badge">
<span>Founded in 2018</span>
<strong>By Mara Ellis, recipe director & founder</strong>
</div>
</div>
<div class="about-copy reveal">
<span class="eyebrow">About Field & Flame</span>
<h2>Built around the belief that food should bring us closer.</h2>
<p>Field & Flame began with a weekly notebook of market observations, restaurant notes, and recipes scribbled after long dinners. Its founder, Mara Ellis, wanted to create a food publication that valued curiosity over certainty and expertise without intimidation.</p>
<p>Today, our small editorial team works with recipe developers, growers, chefs, nutritionists, and food scientists to make useful, beautiful, deeply researched cooking guides. Every seasonal ingredient is treated as a point of view: where it comes from, how it behaves, and how to make the most of it.</p>
<p>We are independent, reader-supported, and committed to keeping our recommendations clear, practical, and rooted in a genuine love of the table.</p>
<div class="about-stats">
<div><strong>6</strong><span>Core editorial team</span></div>
<div><strong>120+</strong><span>Local food makers</span></div>
<div><strong>42</strong><span>Test-kitchen recipes monthly</span></div>
</div>
<a class="button button--dark" href="#subscribe">Read Field Notes</a>
</div>
</div>
</section>
<section class="section voices-section">
<div class="container voices-layout">
<div class="voices-intro reveal">
<span class="eyebrow">Around the table</span>
<h2>Cooked, shared, and loved.</h2>
<p>Our readers are generous with their feedback, and their notes are one of the best parts of making this publication. Here is a few from our community.</p>
<div class="testimonials">
<article class="testimonial reveal">
<div class="stars" aria-label="5 out of 5 stars">★★★★★</div>
<blockquote>“The planner changed my Sunday reset. I bought only what the recipes needed and stopped the old habit of making one enormous, unbalanced market trip.”</blockquote>
<div class="testimonial-author">
<img src="https://i.pravatar.cc/80?u=reader-nadia" alt="" width="80" height="80" loading="lazy">
<div><strong>Nadia R.</strong><span>Portland, OR</span></div>
</div>
</article>
<article class="testimonial reveal">
<div class="stars" aria-label="5 out of 5 stars">★★★★★</div>
<blockquote>“I have wanted to understand fermentation without being told to buy eleven special jars. These explanations are clear, calm, and genuinely practical.”</blockquote>
<div class="testimonial-author">
<img src="https://i.pravatar.cc/80?u=reader-elliot" alt="" width="80" height="80" loading="lazy">
<div><strong>Elliot M.</strong><span>Austin, TX</span></div>
</div>
</article>
<article class="testimonial reveal">
<div class="stars" aria-label="5 out of 5 stars">★★★★★</div>
<blockquote>“The restaurant guide feels like advice from a friend with excellent taste. We have discovered three neighborhood rooms we would never have found otherwise.”</blockquote>
<div class="testimonial-author">
<img src="https://i.pravatar.cc/80?u=reader-camille" alt="" width="80" height="80" loading="lazy">
<div><strong>Camille T.</strong><span>Brooklyn, NY</span></div>
</div>
</article>
</div>
</div>
<div class="faq-wrap reveal">
<h3>Frequently asked</h3>
<p>A few details about our recipes, guides, and editorial approach.</p>
<details>
<summary>How do you test recipes?</summary>
<p>Every published recipe is cooked at least twice in a home-style test kitchen, with one cook following the written instructions without improvisation. We then adjust ratios, temperatures, and timings for clarity and repeatability.</p>
</details>
<details>
<summary>How are restaurants selected?</summary>
<p>Editors make multiple anonymous and known visits, review the menu and service, and consider value, consistency, sourcing, and neighborhood fit. We do not accept payment for inclusion, and restaurant relationships do not determine scores.</p>
</details>
<details>
<summary>Can the meal planner accommodate my preferences?</summary>
<p>Yes. Use it as a starting point, swap meals freely, and remove ingredients you do not eat from your shopping list before printing. The current planner is designed to make weekly organization easier without locking you into a rigid diet.</p>
</details>
<details>
<summary>How often are seasonal menus updated?</summary>
<p>Menus are refreshed monthly and whenever a major ingredient shift occurs. Members are notified when a new menu is published, and past editions remain available for reference.</p>
</details>
<details>
<summary>Can I contribute a recipe or restaurant tip?</summary>
<p>Absolutely. We welcome recipes with a clear point of view and restaurant observations from readers. Editorial staff review every submission, but we cannot guarantee that every idea will be published.</p>
</details>
</div>
</div>
</section>
<section class="newsletter-section" id="subscribe">
<div class="container newsletter-grid">
<div class="reveal">
<span class="eyebrow" style="color:#fff">Field Notes, every Sunday</span>
<h2>A slower Sunday starts here.</h2>
<p>One seasonal recipe, one market note, one technique worth keeping, and a thoughtful restaurant pick. Join 18,000 readers who want to cook with more curiosity.</p>
</div>
<div class="reveal">
<form class="newsletter-form" id="newsletterForm">
<label class="sr-only" for="newsletterEmail">Email address</label>
<input id="newsletterEmail" name="email" type="email" autocomplete="email" placeholder="Your email address" required>
<button class="button" type="submit">Join Field Notes</button>
</form>
<p class="form-status" id="formStatus" aria-live="polite"></p>
</div>
</div>
</section>
</main>
<footer class="site-footer">
<div class="container">
<div class="footer-grid">
<div class="footer-brand">
<a class="brand" href="#home" aria-label="Field and Flame home">
<span class="brand-copy">
<span class="brand-name">Field & Flame</span>
<span class="brand-tagline">Seasonal recipes for generous tables</span>
</span>
</a>
<p>An independent guide to seasonal cooking, neighborhood restaurants, and the everyday pleasure of eating well.</p>
<div class="social-links" aria-label="Social media links">
<a href="https://www.instagram.com/" target="_blank" rel="noopener noreferrer" aria-label="Follow Field and Flame on Instagram">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" aria-hidden="true"><rect x="3" y="3" width="18" height="18" rx="5"></rect><circle cx="12" cy="12" r="4"></circle><circle cx="17.5" cy="6.5" r="1" fill="currentColor" stroke="none"></circle></svg>
</a>
<a href="https://www.pinterest.com/" target="_blank" rel="noopener noreferrer" aria-label="Follow Field and Flame on Pinterest">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" aria-hidden="true"><circle cx="12" cy="12" r="9"></circle><path d="M9.5 20c1-3 1.5-5.5 2-7.5M12 7.5c2.8 0 4.5 1.6 4.5 4.2 0 3-1.8 5.2-4.4 5.2-1.2 0-2.3-.6-2.7-1.6"></path></svg>
</a>
<a href="https://www.youtube.com/" target="_blank" rel="noopener noreferrer" aria-label="Watch Field and Flame on YouTube">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" aria-hidden="true"><path d="M21 12s0-3.5-.5-5.2a2.7 2.7 0 0 0-1.9-1.9C16.9 4.4 12 4.4 12 4.4s-4.9 0-6.6.5a2.7 2.7 0 0 0-1.9 1.9C3 8.5 3 12 3 12s0 3.5.5 5.2a2.7 2.7 0 0 0 1.9 1.9c1.7.5 6.6.5 6.6.5s4.9 0 6.6-.5a2.7 2.7 0 0 0 1.9-1.9c.5-1.7.5-5.2.5-5.2Z"></path><path d="m10 9 5 3-5 3Z"></path></svg>
</a>
<a href="https://www.facebook.com/" target="_blank" rel="noopener noreferrer" aria-label="Follow Field and Flame on Facebook">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" aria-hidden="true"><path d="M14 21v-8h3l.5-3H14V8.5c0-1 .3-1.7 1.8-1.7H18V4.1c-.8-.1-1.6-.2-2.4-.2-2.4 0-4 1.5-4 4.2V10H9v3h2.6v8"></path></svg>
</a>
</div>
</div>
<div>
<h3 class="footer-title">Explore</h3>
<nav class="footer-links" aria-label="Footer exploration links">
<a href="#recipes">Recipes</a>
<a href="#restaurant-guide">Restaurant guide</a>
<a href="#seasonal">Seasonal menus</a>
<a href="#cooking-tips">Cooking tips</a>
<a href="#nutrition">Nutrition</a>
<a href="#blog">Journal</a>
</nav>
</div>
<div>
<h3 class="footer-title">Company</h3>
<nav class="footer-links" aria-label="Company links">
<a href="#about">About us</a>
<a href="#about">Meet the team</a>
<a href="mailto:hello@fieldandflame.co">Contact</a>
<a href="mailto:editorial@fieldandflame.co">Submissions</a>
<a href="mailto:partners@fieldandflame.co">Partnerships</a>
<a href="#subscribe">Newsletter</a>
</nav>
</div>
<div class="footer-contact-column">
<h3 class="footer-title">Visit the editorial table</h3>
<div class="footer-contact">
<address>418 NW 12th Avenue<br>Portland, OR 97209</address>
<a href="mailto:hello@fieldandflame.co">hello@fieldandflame.co</a>
<a href="tel:+15035550148">+1 (503) 555-0148</a>
<span>Monday–Friday · 9:00–5:00 Pacific</span>
</div>
</div>
</div>
<div class="footer-bottom">
<p>© <span id="current-year">2025</span> Field & Flame Journal. All rights reserved.</p>
<nav class="footer-legal" aria-label="Legal links">
<a href="privacy.html">Privacy</a>
<a href="terms.html">Terms</a>
<a href="#subscribe">Accessibility</a>
<a href="#subscribe">Contact</a>
</nav>
</div>
</div>
</footer>
<dialog class="search-dialog" id="searchDialog" aria-labelledby="searchTitle">
<form class="search-form" method="dialog">
<div class="search-header">
<h2 id="searchTitle">Search Field & Flame</h2>
<button class="dialog-close" type="submit" value="close" aria-label="Close search">×</button>
</div>
<div class="search-input-wrap">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" aria-hidden="true"><circle cx="11" cy="11" r="7"></circle><path d="m20 20-4-4"></path></svg>
<label class="sr-only" for="siteSearch">Search recipes, guides, and articles</label>
<input id="siteSearch" type="search" placeholder="Search recipes, guides, and articles" autocomplete="off">
</div>
<div class="search-results" id="searchResults"></div>
</form>
</dialog>
<div class="toast" id="toast" role="status" aria-live="polite"></div>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "Field & Flame",
"description": "Seasonal recipes, restaurant guides, cooking techniques, and practical nutrition resources.",
"email": "hello@fieldandflame.co",
"url": "https://fieldandflame.co",
"address": {
"@type": "PostalAddress",
"streetAddress": "418 NW 12th Avenue",
"addressLocality": "Portland",
"addressRegion": "OR",
"postalCode": "97209",
"addressCountry": "US"
}
}
</script>
<script>
(() => {
const header = document.getElementById("siteHeader");
const menuToggle = document.getElementById("menuToggle");
const mobileNav = document.getElementById("mobileNav");
const searchDialog = document.getElementById("searchDialog");
const searchTrigger = document.getElementById("searchTrigger");
const siteSearch = document.getElementById("siteSearch");
const searchResults = document.getElementById("searchResults");
const toast = document.getElementById("toast");
let toastTimer;
const showToast = (message) => {
toast.textContent = message;
toast.classList.add("show");
clearTimeout(toastTimer);
toastTimer = setTimeout(() => toast.classList.remove("show"), 2600);
};
window.addEventListener("scroll", () => {
header.classList.toggle("is-scrolled", window.scrollY > 20);
}, { passive: true });
menuToggle.addEventListener("click", () => {
const isOpen = menuToggle.getAttribute("aria-expanded") === "true";
menuToggle.setAttribute("aria-expanded", String(!isOpen));
menuToggle.setAttribute("aria-label", isOpen ? "Open navigation" : "Close navigation");
mobileNav.classList.toggle("open", !isOpen);
});
mobileNav.querySelectorAll("a").forEach((link) => {
link.addEventListener("click", () => {
menuToggle.setAttribute("aria-expanded", "false");
menuToggle.setAttribute("aria-label", "Open navigation");
mobileNav.classList.remove("open");
});
});
const searchableItems = [
{ title: "Charred Tomato & Whipped Feta Toasts", type: "Recipe", href: "#recipes" },
{ title: "Lemony Orzo, Asparagus & Dill", type: "Recipe", href: "#recipes" },
{ title: "Miso-Butter Roasted Carrots", type: "Recipe", href: "#recipes" },
{ title: "Rustic Peach & Almond Galette", type: "Recipe", href: "#recipes" },
{ title: "The neighborhood table, carefully chosen", type: "Restaurant guide", href: "#restaurant-guide" },
{ title: "September seasonal menu", type: "Seasonal menu", href: "#seasonal" },
{ title: "Build a week you’ll actually cook", type: "Meal planner", href: "#planner" },
{ title: "Nutrition that respects real life", type: "Nutrition", href: "#nutrition" },
{ title: "The quiet science of a better vinaigrette", type: "Journal", href: "#blog" },
{ title: "What fermentation can teach a weeknight kitchen", type: "Journal", href: "#blog" },
{ title: "About Field & Flame", type: "About", href: "#about" }
];
const renderSearchResults = (query = "") => {
const normalized = query.trim().toLowerCase();
const matches = searchableItems.filter((item) =>
item.title.toLowerCase().includes(normalized) ||
item.type.toLowerCase().includes(normalized)
);
if (!matches.length) {
searchResults.innerHTML = '<p class="search-empty">No matches yet. Try “recipe,” “seasonal,” or “restaurant.”</p>';
return;
}
searchResults.innerHTML = matches.map((item) =>
`<a class="search-result" href="${item.href}"><span>${item.type}</span><strong>${item.title}</strong></a>`
).join("");
};
renderSearchResults();
searchTrigger.addEventListener("click", () => {
if (typeof searchDialog.showModal === "function") {
searchDialog.showModal();
setTimeout(() => siteSearch.focus(), 50);
} else {
searchDialog.setAttribute("open", "");
}
});
siteSearch.addEventListener("input", () => renderSearchResults(siteSearch.value));
searchResults.addEventListener("click", (event) => {
if (event.target.closest("a") && typeof searchDialog.close === "function") {
searchDialog.close();
}
});
searchDialog.addEventListener("click", (event) => {
const bounds = searchDialog.getBoundingClientRect();
const outside = event.clientX < bounds.left || event.clientX > bounds.right ||
event.clientY < bounds.top || event.clientY > bounds.bottom;
if (outside && typeof searchDialog.close === "function") {
searchDialog.close();
}
});
const filterButtons = document.querySelectorAll(".filter-button");
const recipeCards = Array.from(document.querySelectorAll(".recipe-card"));
const filterCount = document.getElementById("filterCount");
filterButtons.forEach((button) => {
button.addEventListener("click", () => {
const filter = button.dataset.filter;
let visibleCount = 0;
filterButtons.forEach((item) => {
const active = item === button;
item.classList.toggle("active", active);
item.setAttribute("aria-pressed", String(active));
});
recipeCards.forEach((card) => {
const categories = card.dataset.categories.split(" ");
const isVisible = filter === "all" || categories.includes(filter);
card.hidden = !isVisible;
card.classList.toggle("featured", filter === "all" && card.dataset.index === "0");
if (isVisible) visibleCount += 1;
});
const label = filter === "all" ? "recipes" : "matching recipes";
filterCount.textContent = `${visibleCount} ${label} to explore`;
});
});
const savedRecipes = (() => {
try {
return new Set(JSON.parse(localStorage.getItem("field-flame-saved")) || []);
} catch (error) {
return new Set();
}
})();
document.querySelectorAll(".save-button").forEach((button) => {
const card = button.closest(".recipe-card");
const title = card.querySelector("h3").textContent.trim();
if (savedRecipes.has(title)) {
button.classList.add("saved");
button.setAttribute("aria-pressed", "true");
}
button.addEventListener("click", () => {
const isSaved = button.classList.toggle("saved");
button.setAttribute("aria-pressed", String(isSaved));
if (isSaved) {
savedRecipes.add(title);
showToast(`Saved “${title}” to your recipe box.`);
} else {
savedRecipes.delete(title);
showToast("Recipe removed from your saved list.");
}
try {
localStorage.setItem("field-flame-saved", JSON.stringify(Array.from(savedRecipes)));
} catch (error) {
// Saving still works for the current visit when storage is unavailable.
}
});
});
const recipeCatalog = {
toast: {
title: "Charred tomato & whipped feta toasts",
ingredients: [
{ item: "4 ripe tomatoes", group: "Produce" },
{ item: "Fresh basil", group: "Produce" },
{ item: "2 garlic cloves", group: "Produce" },
{ item: "Sourdough", group: "Bakery" },
{ item: "150 g whipped feta", group: "Dairy & eggs" },
{ item: "Olive oil", group: "Pantry" },
{ item: "Flaky salt", group: "Pantry" },
{ item: "Black pepper", group: "Pantry" }
]
},
orzo: {
title: "Lemony orzo, asparagus & dill",
ingredients: [
{ item: "Asparagus", group: "Produce" },
{ item: "1 lemon", group: "Produce" },
{ item: "Fresh dill", group: "Produce" },
{ item: "1 shallot", group: "Produce" },
{ item: "Orzo", group: "Pantry" },
{ item: "Vegetable stock", group: "Pantry" },
{ item: "Olive oil", group: "Pantry" },
{ item: "Crème fraîche", group: "Dairy & eggs" }
]
},
carrots: {
title: "Miso-butter roasted carrots",
ingredients: [
{ item: "Carrots", group: "Produce" },
{ item: "Scallions", group: "Produce" },
{ item: "White miso", group: "Pantry" },
{ item: "Unsalted butter", group: "Dairy & eggs" },
{ item: "Toasted sesame seeds", group: "Pantry" },
{ item: "Rice vinegar", group: "Pantry" }
]
},
galette: {
title: "Rustic peach & almond galette",
ingredients: [
{ item: "Ripe peaches", group: "Produce" },
{ item: "1 lemon", group: "Produce" },
{ item: "All-purpose flour", group: "Pantry" },
{ item: "Almond flour", group: "Pantry" },
{ item: "Cane sugar", group: "Pantry" },
{ item: "Sliced almonds", group: "Pantry" },
{ item: "Unsalted butter", group: "Dairy & eggs" },
{ item: "1 egg", group: "Dairy & eggs" },
{ item: "Heavy cream", group: "Dairy & eggs" }
]
},
stew: {
title: "Smoky white bean stew",
ingredients: [
{ item: "Cannellini beans", group: "Produce" },
{ item: "Crushed tomatoes", group: "Pantry" },
{ item: "Yellow onion", group: "Produce" },
{ item: "Tuscan kale", group: "Produce" },
{ item: "Garlic", group: "Produce" },
{ item: "Smoked paprika", group: "Pantry" },
{ item: "Vegetable stock", group: "Pantry" },
{ item: "Olive oil", group: "Pantry" }
]
},
soup: {
title: "Green herb soup with lemon",
ingredients: [
{ item: "Potatoes", group: "Produce" },
{ item: "Leeks", group: "Produce" },
{ item: "Celery", group: "Produce" },
{ item: "Flat-leaf parsley", group: "Produce" },
{ item: "1 lemon", group: "Produce" },
{ item: "Vegetable stock", group: "Pantry" },
{ item: "Olive oil", group: "Pantry" },
{ item: "Heavy cream", group: "Dairy & eggs" }
]
}
};
const mealSelects = Array.from(document.querySelectorAll(".meal-select"));
const shoppingList = document.getElementById("shoppingList");
const shoppingCount = document.getElementById("shoppingCount");
const plannerStatus = document.getElementById("plannerStatus");
mealSelects.forEach((select) => {
const emptyOption = document.createElement("option");
emptyOption.value = "";
emptyOption.textContent = "No meal planned";
select.appendChild(emptyOption);
Object.entries(recipeCatalog).forEach(([value, recipe]) => {
const option = document.createElement("option");
option.value = value;
option.textContent = recipe.title;
select.appendChild(option);
});
});
const initialPlan = {
monday: "toast",
tuesday: "orzo",
wednesday: "carrots",
thursday: "",
friday: "stew",
saturday: "soup",
sunday: "galette"
};
Object.entries(initialPlan).forEach(([id, value]) => {
document.getElementById(id).value = value;
});
const updateShoppingList = (announce = true) => {
const selectedRecipes = mealSelects
.map((select) => select.value)
.filter(Boolean);
const staplesToRemove = new Set(
Array.from(document.querySelectorAll("[data-staple]:checked")).map((input) => input.dataset.staple)
);
const groups = {};
const uniqueItems = new Set();
selectedRecipes.forEach((recipeKey) => {
recipeCatalog[recipeKey].ingredients.forEach((ingredient) => {
if (staplesToRemove.has(ingredient.item)) return;
const key = `${ingredient.group}::${ingredient.item}`;
if (uniqueItems.has(key)) return;
uniqueItems.add(key);
if (!groups[ingredient.group]) groups[ingredient.group] = [];
groups[ingredient.group].push(ingredient.item);
});
});
const groupOrder = ["Produce", "Pantry", "Bakery", "Dairy & eggs"];
const activeGroups = groupOrder.filter((group) => groups[group] && groups[group].length);
const totalItems = activeGroups.reduce((total, group) => total + groups[group].length, 0);
shoppingCount.textContent = totalItems;
if (!totalItems) {
shoppingList.innerHTML = '<p class="shopping-empty">Choose a meal for any day to start your shopping list.</p>';
if (announce) plannerStatus.textContent = "Your plan is empty. Choose a meal to begin.";
return;
}
shoppingList.innerHTML = activeGroups.map((group) => `
<div class="shopping-group">
<h4>${group}<span>${groups[group].length} item${groups[group].length === 1 ? "" : "s"}</span></h4>
<ul>
${groups[group].map((item) => `
<li>
<label>
<input type="checkbox" data-shopping-item>
<span>${item}</span>
</label>
</li>
`).join("")}
</ul>
</div>
`).join("");
if (announce) {
plannerStatus.textContent = `${totalItems} ingredients across ${selectedRecipes.length} planned ${selectedRecipes.length === 1 ? "meal" : "meals"}.`;
}
};
mealSelects.forEach((select) => select.addEventListener("change", () => updateShoppingList()));
document.querySelectorAll("[data-staple]").forEach((input) => input.addEventListener("change", () => updateShoppingList()));
shoppingList.addEventListener("change", (event) => {
if (event.target.matches("[data-shopping-item]")) {
event.target.closest("label").classList.toggle("is-bought", event.target.checked);
}
});
document.getElementById("surpriseMe").addEventListener("click", () => {
const recipes = Object.keys(recipeCatalog);
mealSelects.forEach((select) => {
select.value = recipes[Math.floor(Math.random() * recipes.length)];
});
updateShoppingList();
});
document.getElementById("clearPlan").addEventListener("click", () => {
mealSelects.forEach((select) => { select.value = ""; });
document.querySelectorAll("[data-staple]").forEach((input) => { input.checked = false; });
updateShoppingList();
});
document.getElementById("printList").addEventListener("click", () => window.print());
updateShoppingList(false);
const newsletterForm = document.getElementById("newsletterForm");
const formStatus = document.getElementById("formStatus");
newsletterForm.addEventListener("submit", (event) => {
event.preventDefault();
const email = document.getElementById("newsletterEmail");
if (!email.checkValidity()) {
email.reportValidity();
return;
}
formStatus.textContent = "Welcome to Field Notes. Your first Sunday edition is on its way.";
newsletterForm.reset();
});
document.getElementById("current-year").textContent = new Date().getFullYear();
const revealElements = document.querySelectorAll(".reveal");
if ("IntersectionObserver" in window) {
const revealObserver = new IntersectionObserver((entries, observer) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
entry.target.classList.add("visible");
observer.unobserve(entry.target);
}
});
}, { threshold: 0.12, rootMargin: "0px 0px -35px" });
revealElements.forEach((element) => revealObserver.observe(element));
} else {
revealElements.forEach((element) => element.classList.add("visible"));
}
})();
</script>
</body>
</html>
View Axe Report (JSON)
{
"testEngine": {
"name": "axe-core",
"version": "4.10.2"
},
"testRunner": {
"name": "axe"
},
"testEnvironment": {
"userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36",
"windowWidth": 1280,
"windowHeight": 720,
"orientationAngle": 0,
"orientationType": "landscape-primary"
},
"timestamp": "2026-11-12T10:10:32.132Z",
"url": "https://benchmark.aimac.invalid/a2b04caf80d8b01df096fb23a9ac64416e4850c81a8093c95925b661e3f801a1.html",
"toolOptions": {
"runOnly": {
"type": "tag",
"values": [
"wcag2a",
"wcag2aa",
"wcag21a",
"wcag21aa",
"wcag22a",
"wcag22aa"
]
},
"resultTypes": [
"violations"
],
"reporter": "v1"
},
"inapplicable": [
{
"id": "area-alt",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag244",
"wcag412",
"section508",
"section508.22.a",
"TTv5",
"TT6.a",
"EN-301-549",
"EN-9.2.4.4",
"EN-9.4.1.2",
"ACT"
],
"description": "Ensure <area> elements of image maps have alternative text",
"help": "Active <area> elements must have alternative text",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/area-alt?application=axeAPI",
"nodes": []
},
{
"id": "aria-braille-equivalent",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure aria-braillelabel and aria-brailleroledescription have a non-braille equivalent",
"help": "aria-braille attributes must have a non-braille equivalent",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-braille-equivalent?application=axeAPI",
"nodes": []
},
{
"id": "aria-command-name",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"TTv5",
"TT6.a",
"EN-301-549",
"EN-9.4.1.2",
"ACT"
],
"description": "Ensure every ARIA button, link and menuitem has an accessible name",
"help": "ARIA commands must have an accessible name",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-command-name?application=axeAPI",
"nodes": []
},
{
"id": "aria-input-field-name",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"TTv5",
"TT5.c",
"EN-301-549",
"EN-9.4.1.2",
"ACT"
],
"description": "Ensure every ARIA input field has an accessible name",
"help": "ARIA input fields must have an accessible name",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-input-field-name?application=axeAPI",
"nodes": []
},
{
"id": "aria-meter-name",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag111",
"EN-301-549",
"EN-9.1.1.1"
],
"description": "Ensure every ARIA meter node has an accessible name",
"help": "ARIA meter nodes must have an accessible name",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-meter-name?application=axeAPI",
"nodes": []
},
{
"id": "aria-progressbar-name",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag111",
"EN-301-549",
"EN-9.1.1.1"
],
"description": "Ensure every ARIA progressbar node has an accessible name",
"help": "ARIA progressbar nodes must have an accessible name",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-progressbar-name?application=axeAPI",
"nodes": []
},
{
"id": "aria-required-children",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag131",
"EN-301-549",
"EN-9.1.3.1"
],
"description": "Ensure elements with an ARIA role that require child roles contain them",
"help": "Certain ARIA roles must contain particular children",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-required-children?application=axeAPI",
"nodes": []
},
{
"id": "aria-required-parent",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag131",
"EN-301-549",
"EN-9.1.3.1"
],
"description": "Ensure elements with an ARIA role that require parent roles are contained by them",
"help": "Certain ARIA roles must be contained by particular parents",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-required-parent?application=axeAPI",
"nodes": []
},
{
"id": "aria-toggle-field-name",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"TTv5",
"TT5.c",
"EN-301-549",
"EN-9.4.1.2",
"ACT"
],
"description": "Ensure every ARIA toggle field has an accessible name",
"help": "ARIA toggle fields must have an accessible name",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-toggle-field-name?application=axeAPI",
"nodes": []
},
{
"id": "aria-tooltip-name",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure every ARIA tooltip node has an accessible name",
"help": "ARIA tooltip nodes must have an accessible name",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-tooltip-name?application=axeAPI",
"nodes": []
},
{
"id": "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": []
},
{
"id": "blink",
"impact": null,
"tags": [
"cat.time-and-media",
"wcag2a",
"wcag222",
"section508",
"section508.22.j",
"TTv5",
"TT2.b",
"EN-301-549",
"EN-9.2.2.2"
],
"description": "Ensure <blink> elements are not used",
"help": "<blink> elements are deprecated and must not be used",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/blink?application=axeAPI",
"nodes": []
},
{
"id": "definition-list",
"impact": null,
"tags": [
"cat.structure",
"wcag2a",
"wcag131",
"EN-301-549",
"EN-9.1.3.1"
],
"description": "Ensure <dl> elements are structured correctly",
"help": "<dl> elements must only directly contain properly-ordered <dt> and <dd> groups, <script>, <template> or <div> elements",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/definition-list?application=axeAPI",
"nodes": []
},
{
"id": "dlitem",
"impact": null,
"tags": [
"cat.structure",
"wcag2a",
"wcag131",
"EN-301-549",
"EN-9.1.3.1"
],
"description": "Ensure <dt> and <dd> elements are contained by a <dl>",
"help": "<dt> and <dd> elements must be contained by a <dl>",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/dlitem?application=axeAPI",
"nodes": []
},
{
"id": "frame-focusable-content",
"impact": null,
"tags": [
"cat.keyboard",
"wcag2a",
"wcag211",
"TTv5",
"TT4.a",
"EN-301-549",
"EN-9.2.1.1"
],
"description": "Ensure <frame> and <iframe> elements with focusable content do not have tabindex=-1",
"help": "Frames with focusable content must not have tabindex=-1",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/frame-focusable-content?application=axeAPI",
"nodes": []
},
{
"id": "frame-title-unique",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag412",
"TTv5",
"TT12.d",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure <iframe> and <frame> elements contain a unique title attribute",
"help": "Frames must have a unique title attribute",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/frame-title-unique?application=axeAPI",
"nodes": []
},
{
"id": "frame-title",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag412",
"section508",
"section508.22.i",
"TTv5",
"TT12.d",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure <iframe> and <frame> elements have an accessible name",
"help": "Frames must have an accessible name",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/frame-title?application=axeAPI",
"nodes": []
},
{
"id": "html-xml-lang-mismatch",
"impact": null,
"tags": [
"cat.language",
"wcag2a",
"wcag311",
"EN-301-549",
"EN-9.3.1.1",
"ACT"
],
"description": "Ensure that HTML elements with both valid lang and xml:lang attributes agree on the base language of the page",
"help": "HTML elements with lang and xml:lang must have the same base language",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/html-xml-lang-mismatch?application=axeAPI",
"nodes": []
},
{
"id": "input-button-name",
"impact": null,
"tags": [
"cat.name-role-value",
"wcag2a",
"wcag412",
"section508",
"section508.22.a",
"TTv5",
"TT5.c",
"EN-301-549",
"EN-9.4.1.2",
"ACT"
],
"description": "Ensure input buttons have discernible text",
"help": "Input buttons must have discernible text",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/input-button-name?application=axeAPI",
"nodes": []
},
{
"id": "input-image-alt",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag111",
"wcag412",
"section508",
"section508.22.a",
"TTv5",
"TT7.a",
"EN-301-549",
"EN-9.1.1.1",
"EN-9.4.1.2",
"ACT"
],
"description": "Ensure <input type=\"image\"> elements have alternative text",
"help": "Image buttons must have alternative text",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/input-image-alt?application=axeAPI",
"nodes": []
},
{
"id": "marquee",
"impact": null,
"tags": [
"cat.parsing",
"wcag2a",
"wcag222",
"TTv5",
"TT2.b",
"EN-301-549",
"EN-9.2.2.2"
],
"description": "Ensure <marquee> elements are not used",
"help": "<marquee> elements are deprecated and must not be used",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/marquee?application=axeAPI",
"nodes": []
},
{
"id": "meta-refresh",
"impact": null,
"tags": [
"cat.time-and-media",
"wcag2a",
"wcag221",
"TTv5",
"TT8.a",
"EN-301-549",
"EN-9.2.2.1"
],
"description": "Ensure <meta http-equiv=\"refresh\"> is not used for delayed refresh",
"help": "Delayed refresh under 20 hours must not be used",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/meta-refresh?application=axeAPI",
"nodes": []
},
{
"id": "object-alt",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag111",
"section508",
"section508.22.a",
"EN-301-549",
"EN-9.1.1.1"
],
"description": "Ensure <object> elements have alternative text",
"help": "<object> elements must have alternative text",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/object-alt?application=axeAPI",
"nodes": []
},
{
"id": "role-img-alt",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag111",
"section508",
"section508.22.a",
"TTv5",
"TT7.a",
"EN-301-549",
"EN-9.1.1.1",
"ACT"
],
"description": "Ensure [role=\"img\"] elements have alternative text",
"help": "[role=\"img\"] elements must have an alternative text",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/role-img-alt?application=axeAPI",
"nodes": []
},
{
"id": "server-side-image-map",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag211",
"section508",
"section508.22.f",
"TTv5",
"TT4.a",
"EN-301-549",
"EN-9.2.1.1"
],
"description": "Ensure that server-side image maps are not used",
"help": "Server-side image maps must not be used",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/server-side-image-map?application=axeAPI",
"nodes": []
},
{
"id": "svg-img-alt",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag111",
"section508",
"section508.22.a",
"TTv5",
"TT7.a",
"EN-301-549",
"EN-9.1.1.1",
"ACT"
],
"description": "Ensure <svg> elements with an img, graphics-document or graphics-symbol role have an accessible text",
"help": "<svg> elements with an img role must have an alternative text",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/svg-img-alt?application=axeAPI",
"nodes": []
},
{
"id": "td-headers-attr",
"impact": null,
"tags": [
"cat.tables",
"wcag2a",
"wcag131",
"section508",
"section508.22.g",
"TTv5",
"TT14.b",
"EN-301-549",
"EN-9.1.3.1"
],
"description": "Ensure that each cell in a table that uses the headers attribute refers only to other cells in that table",
"help": "Table cells that use the headers attribute must only refer to cells in the same table",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/td-headers-attr?application=axeAPI",
"nodes": []
},
{
"id": "th-has-data-cells",
"impact": null,
"tags": [
"cat.tables",
"wcag2a",
"wcag131",
"section508",
"section508.22.g",
"TTv5",
"TT14.b",
"EN-301-549",
"EN-9.1.3.1"
],
"description": "Ensure that <th> elements and elements with role=columnheader/rowheader have data cells they describe",
"help": "Table headers in a data table must refer to data cells",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/th-has-data-cells?application=axeAPI",
"nodes": []
},
{
"id": "valid-lang",
"impact": null,
"tags": [
"cat.language",
"wcag2aa",
"wcag312",
"TTv5",
"TT11.b",
"EN-301-549",
"EN-9.3.1.2",
"ACT"
],
"description": "Ensure lang attributes have valid values",
"help": "lang attribute must have a valid value",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/valid-lang?application=axeAPI",
"nodes": []
},
{
"id": "video-caption",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag122",
"section508",
"section508.22.a",
"TTv5",
"TT17.a",
"EN-301-549",
"EN-9.1.2.2"
],
"description": "Ensure <video> elements have captions",
"help": "<video> elements must have captions",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/video-caption?application=axeAPI",
"nodes": []
},
{
"id": "no-autoplay-audio",
"impact": null,
"tags": [
"cat.time-and-media",
"wcag2a",
"wcag142",
"TTv5",
"TT2.a",
"EN-301-549",
"EN-9.1.4.2",
"ACT"
],
"description": "Ensure <video> or <audio> elements do not autoplay audio for more than 3 seconds without a control mechanism to stop or mute the audio",
"help": "<video> or <audio> elements must not play automatically",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/no-autoplay-audio?application=axeAPI",
"nodes": []
}
],
"passes": [
{
"id": "aria-allowed-attr",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure an element's role supports its ARIA attributes",
"help": "Elements must only use supported ARIA attributes",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-allowed-attr?application=axeAPI",
"nodes": [
{
"any": [],
"all": [
{
"id": "aria-allowed-attr",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "ARIA attributes are used correctly for the defined role"
}
],
"none": [
{
"id": "aria-unsupported-attr",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "ARIA attribute is supported"
}
],
"impact": null,
"html": "<a class=\"brand\" href=\"#home\" aria-label=\"Field and Flame home\">",
"target": [
".nav-wrap > .brand[href$=\"#home\"][aria-label=\"Field and Flame home\"]"
]
}
]
},
{
"id": "aria-conditional-attr",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure ARIA attributes are used as described in the specification of the element's role",
"help": "ARIA attributes must be used as specified for the element's role",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-conditional-attr?application=axeAPI",
"nodes": [
{
"any": [],
"all": [
{
"id": "aria-conditional-attr",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "ARIA attribute is allowed"
}
],
"none": [],
"impact": null,
"html": "<a class=\"brand\" href=\"#home\" aria-label=\"Field and Flame home\">",
"target": [
".nav-wrap > .brand[href$=\"#home\"][aria-label=\"Field and Flame home\"]"
]
}
]
},
{
"id": "aria-deprecated-role",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure elements do not use deprecated roles",
"help": "Deprecated ARIA roles must not be used",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-deprecated-role?application=axeAPI",
"nodes": [
{
"any": [],
"all": [],
"none": [
{
"id": "deprecatedrole",
"data": null,
"relatedNodes": [],
"impact": "minor",
"message": "ARIA role is not deprecated"
}
],
"impact": null,
"html": "<div class=\"toast\" id=\"toast\" role=\"status\" aria-live=\"polite\"></div>",
"target": [
"#toast"
]
}
]
},
{
"id": "aria-hidden-body",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag131",
"wcag412",
"EN-301-549",
"EN-9.1.3.1",
"EN-9.4.1.2"
],
"description": "Ensure aria-hidden=\"true\" is not present on the document body.",
"help": "aria-hidden=\"true\" must not be present on the document body",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-hidden-body?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "aria-hidden-body",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "No aria-hidden attribute is present on document body"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<body>",
"target": [
"body"
]
}
]
},
{
"id": "aria-hidden-focus",
"impact": null,
"tags": [
"cat.name-role-value",
"wcag2a",
"wcag412",
"TTv5",
"TT6.a",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure aria-hidden elements are not focusable nor contain focusable elements",
"help": "ARIA hidden element must not be focusable or contain focusable elements",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-hidden-focus?application=axeAPI",
"nodes": [
{
"any": [],
"all": [
{
"id": "focusable-modal-open",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "No focusable elements while a modal is open"
},
{
"id": "focusable-disabled",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "No focusable elements contained within element"
},
{
"id": "focusable-not-tabbable",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "No focusable elements contained within element"
}
],
"none": [],
"impact": null,
"html": "<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" aria-hidden=\"true\">\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\n <path d=\"m20 20-4-4\"></path>\n </svg>",
"target": [
"#searchTrigger > svg[fill=\"none\"][stroke=\"currentColor\"][stroke-width=\"1.8\"]"
]
}
]
},
{
"id": "aria-prohibited-attr",
"impact": "serious",
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure ARIA attributes are not prohibited for an element's role",
"help": "Elements must only use permitted ARIA attributes",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-prohibited-attr?application=axeAPI",
"nodes": [
{
"any": [],
"all": [],
"none": [
{
"id": "aria-prohibited-attr",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "ARIA attribute is allowed"
}
],
"impact": null,
"html": "<a class=\"brand\" href=\"#home\" aria-label=\"Field and Flame home\">",
"target": [
".nav-wrap > .brand[href$=\"#home\"][aria-label=\"Field and Flame home\"]"
]
}
]
},
{
"id": "aria-required-attr",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure elements with ARIA roles have all required ARIA attributes",
"help": "Required ARIA attributes must be provided",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-required-attr?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "aria-required-attr",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "All required ARIA attributes are present"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<div class=\"toast\" id=\"toast\" role=\"status\" aria-live=\"polite\"></div>",
"target": [
"#toast"
]
}
]
},
{
"id": "aria-roles",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure all elements with a role attribute use a valid value",
"help": "ARIA roles used must conform to valid values",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-roles?application=axeAPI",
"nodes": [
{
"any": [],
"all": [],
"none": [
{
"id": "invalidrole",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "ARIA role is valid"
},
{
"id": "abstractrole",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "Abstract roles are not used"
},
{
"id": "unsupportedrole",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "ARIA role is supported"
}
],
"impact": null,
"html": "<div class=\"toast\" id=\"toast\" role=\"status\" aria-live=\"polite\"></div>",
"target": [
"#toast"
]
}
]
},
{
"id": "aria-valid-attr-value",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure all ARIA attributes have valid values",
"help": "ARIA attributes must conform to valid values",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-valid-attr-value?application=axeAPI",
"nodes": [
{
"any": [],
"all": [
{
"id": "aria-valid-attr-value",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "ARIA attribute values are valid"
},
{
"id": "aria-errormessage",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "aria-errormessage exists and references elements visible to screen readers that use a supported aria-errormessage technique"
},
{
"id": "aria-level",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "aria-level values are valid"
}
],
"none": [],
"impact": null,
"html": "<a class=\"brand\" href=\"#home\" aria-label=\"Field and Flame home\">",
"target": [
".nav-wrap > .brand[href$=\"#home\"][aria-label=\"Field and Flame home\"]"
]
}
]
},
{
"id": "aria-valid-attr",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure attributes that begin with aria- are valid ARIA attributes",
"help": "ARIA attributes must conform to valid names",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-valid-attr?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "aria-valid-attr",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "ARIA attribute name is valid"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<a class=\"brand\" href=\"#home\" aria-label=\"Field and Flame home\">",
"target": [
".nav-wrap > .brand[href$=\"#home\"][aria-label=\"Field and Flame home\"]"
]
}
]
},
{
"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": [
{
"any": [],
"all": [
{
"id": "autocomplete-valid",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "the autocomplete attribute is correctly formatted"
}
],
"none": [],
"impact": null,
"html": "<input id=\"newsletterEmail\" name=\"email\" type=\"email\" autocomplete=\"email\" placeholder=\"Your email address\" required=\"\">",
"target": [
"#newsletterEmail"
]
}
]
},
{
"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": "aria-label",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "aria-label attribute exists and is not empty"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<button class=\"icon-button\" id=\"searchTrigger\" type=\"button\" aria-label=\"Search Field and Flame\">",
"target": [
"#searchTrigger"
]
}
]
},
{
"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>Good food starts with <em>what\u2019s in season.</em></h1>",
"target": [
"h1"
]
},
{
"html": "<h2>Recipes for right now.</h2>",
"target": [
"#recipes > .container > .section-heading.reveal > div:nth-child(1) > h2"
]
},
{
"html": "<h3>Charred Tomato & Whipped Feta Toasts</h3>",
"target": [
".featured > .recipe-body > h3"
]
},
{
"html": "<h3>Lemony Orzo, Asparagus & Dill</h3>",
"target": [
"article[data-categories=\"weeknight vegetarian quick\"] > .recipe-body > h3"
]
},
{
"html": "<h3>Miso-Butter Roasted Carrots</h3>",
"target": [
"article[data-index=\"2\"] > .recipe-body > h3"
]
},
{
"html": "<h3>Rustic Peach & Almond Galette</h3>",
"target": [
"article[data-categories=\"baking summer vegetarian\"] > .recipe-body > h3"
]
},
{
"html": "<h3>Smoky White Bean Stew</h3>",
"target": [
"article[data-index=\"4\"] > .recipe-body > h3"
]
},
{
"html": "<h3>Green Herb Soup with Lemon</h3>",
"target": [
"article[data-index=\"5\"] > .recipe-body > h3"
]
},
{
"html": "<h2>The neighborhood table, carefully chosen.</h2>",
"target": [
".guide-copy > h2"
]
},
{
"html": "<h3>Alder & Ash</h3>",
"target": [
".featured-restaurant-card > h3"
]
},
{
"html": "<h3>Three tables on our list</h3>",
"target": [
"#restaurant-picks > div > h3"
]
},
{
"html": "<h4>Juniper Room</h4>",
"target": [
".restaurant-card:nth-child(1) > .restaurant-card-body > h4"
]
},
{
"html": "<h4>Marea</h4>",
"target": [
".restaurant-card:nth-child(2) > .restaurant-card-body > h4"
]
},
{
"html": "<h4>The Greenhouse</h4>",
"target": [
".restaurant-card:nth-child(3) > .restaurant-card-body > h4"
]
},
{
"html": "<h2>Better cooking, one idea at a time.</h2>",
"target": [
"#cooking-tips > .container > .section-heading.reveal > div:nth-child(1) > h2"
]
},
{
"html": "<h3>Season in layers</h3>",
"target": [
"article[data-number=\"1\"] > h3"
]
},
{
"html": "<h3>Think acid + fat</h3>",
"target": [
"article[data-number=\"2\"] > h3"
]
},
{
"html": "<h3>Brown, then braise</h3>",
"target": [
"article[data-number=\"3\"] > h3"
]
},
{
"html": "<h3>Ferment with intent</h3>",
"target": [
"article[data-number=\"4\"] > h3"
]
},
{
"html": "<h3>Five useful answers</h3>",
"target": [
".technique-notes > h3"
]
},
{
"html": "<h2>Seasonal menus, built around what is here.</h2>",
"target": [
"#seasonal > .container > .section-heading.reveal > div:nth-child(1) > h2"
]
},
{
"html": "<h2>The last tomatoes before autumn.</h2>",
"target": [
".season-panel-copy > h2"
]
},
{
"html": "<h3>Spring</h3>",
"target": [
".season-card:nth-child(1) > h3"
]
},
{
"html": "<h3>Summer</h3>",
"target": [
".is-current > h3"
]
},
{
"html": "<h3>Autumn</h3>",
"target": [
".season-card:nth-child(3) > h3"
]
},
{
"html": "<h3>Winter</h3>",
"target": [
".season-card:nth-child(4) > h3"
]
},
{
"html": "<h2>Build a week you\u2019ll actually cook.</h2>",
"target": [
"#planner > .container > .section-heading.reveal > div:nth-child(1) > h2"
]
},
{
"html": "<h3>Your week of dinners</h3>",
"target": [
".planner-controls > h3"
]
},
{
"html": "<h3 id=\"shoppingTitle\">Shopping list</h3>",
"target": [
"#shoppingTitle"
]
},
{
"html": "<h4>Produce<span>18 items</span></h4>",
"target": [
".shopping-group:nth-child(1) > h4"
]
},
{
"html": "<h4>Pantry<span>14 items</span></h4>",
"target": [
".shopping-group:nth-child(2) > h4"
]
},
{
"html": "<h4>Bakery<span>1 item</span></h4>",
"target": [
".shopping-group:nth-child(3) > h4"
]
},
{
"html": "<h4>Dairy & eggs<span>5 items</span></h4>",
"target": [
".shopping-group:nth-child(4) > h4"
]
},
{
"html": "<h2>Nutrition that respects real life.</h2>",
"target": [
".nutrition-copy > h2"
]
},
{
"html": "<h2>Stories from the field.</h2>",
"target": [
"#blog > .container > .section-heading.reveal > div:nth-child(1) > h2"
]
},
{
"html": "<h3>The quiet science of a better vinaigrette</h3>",
"target": [
".article-card:nth-child(1) > .article-body > h3"
]
},
{
"html": "<h3>A field guide to peak-season stone fruit</h3>",
"target": [
".article-card:nth-child(2) > .article-body > h3"
]
},
{
"html": "<h3>What fermentation can teach a weeknight kitchen</h3>",
"target": [
".article-card:nth-child(3) > .article-body > h3"
]
},
{
"html": "<h2>Built around the belief that food should bring us closer.</h2>",
"target": [
".about-copy > h2"
]
},
{
"html": "<h2>Cooked, shared, and loved.</h2>",
"target": [
".voices-intro > h2"
]
},
{
"html": "<h3>Frequently asked</h3>",
"target": [
".faq-wrap > h3"
]
},
{
"html": "<h2>A slower Sunday starts here.</h2>",
"target": [
".newsletter-grid > .reveal:nth-child(1) > h2"
]
},
{
"html": "<h3 class=\"footer-title\">Explore</h3>",
"target": [
"div:nth-child(2) > .footer-title"
]
},
{
"html": "<h3 class=\"footer-title\">Company</h3>",
"target": [
"div:nth-child(3) > .footer-title"
]
},
{
"html": "<h3 class=\"footer-title\">Visit the editorial table</h3>",
"target": [
".footer-contact-column > .footer-title"
]
}
],
"impact": "serious",
"message": "Page has a heading"
},
{
"id": "landmark",
"data": null,
"relatedNodes": [
{
"html": "<main id=\"main-content\">",
"target": [
"#main-content"
]
}
],
"impact": "serious",
"message": "Page has a landmark region"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<html lang=\"en\" class=\"js\">",
"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": "#b0beba",
"bgColor": "#173f35",
"contrastRatio": 6.07,
"fontSize": "9.6pt (12.8px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [],
"impact": "serious",
"message": "Element has sufficient color contrast of 6.07"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<span>Field Notes \u00b7 September issue</span>",
"target": [
".container > span"
]
}
]
},
{
"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\" class=\"js\">",
"target": [
"html"
]
}
]
},
{
"id": "duplicate-id-aria",
"impact": null,
"tags": [
"cat.parsing",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure every id attribute value used in ARIA and in labels is unique",
"help": "IDs used in ARIA and labels must be unique",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/duplicate-id-aria?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "duplicate-id-aria",
"data": "mobileNav",
"relatedNodes": [],
"impact": "critical",
"message": "Document has no elements referenced with ARIA or labels that share the same id attribute"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<nav class=\"mobile-nav\" id=\"mobileNav\" aria-label=\"Mobile navigation\">",
"target": [
"#mobileNav"
]
}
]
},
{
"id": "form-field-multiple-labels",
"impact": null,
"tags": [
"cat.forms",
"wcag2a",
"wcag332",
"TTv5",
"TT5.c",
"EN-301-549",
"EN-9.3.3.2"
],
"description": "Ensure form field does not have multiple label elements",
"help": "Form field must not have multiple label elements",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/form-field-multiple-labels?application=axeAPI",
"nodes": [
{
"any": [],
"all": [],
"none": [
{
"id": "multiple-label",
"data": null,
"relatedNodes": [
{
"html": "<label class=\"day-label\" for=\"monday\"><span>Mon</span> Monday</label>",
"target": [
"label[for=\"monday\"]"
]
}
],
"impact": "moderate",
"message": "Form field does not have multiple label elements"
}
],
"impact": null,
"html": "<select class=\"meal-select\" id=\"monday\" data-day=\"Monday\">",
"target": [
"#monday"
]
}
]
},
{
"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\" class=\"js\">",
"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\" class=\"js\">",
"target": [
"html"
]
}
]
},
{
"id": "image-alt",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag111",
"section508",
"section508.22.a",
"TTv5",
"TT7.a",
"TT7.b",
"EN-301-549",
"EN-9.1.1.1",
"ACT"
],
"description": "Ensure <img> elements have alternative text or a role of none or presentation",
"help": "Images must have alternative text",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/image-alt?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "has-alt",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "Element has an alt attribute"
}
],
"all": [],
"none": [
{
"id": "alt-space-value",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "Element has a valid alt attribute value"
}
],
"impact": null,
"html": "<img class=\"brand-logo\" src=\"https://placehold.co/72x72/173f35/fffaf0?text=F%26F&font=playfair+display\" alt=\"Field and Flame logo\" width=\"72\" height=\"72\">",
"target": [
".brand-logo"
]
}
]
},
{
"id": "label",
"impact": null,
"tags": [
"cat.forms",
"wcag2a",
"wcag412",
"section508",
"section508.22.n",
"TTv5",
"TT5.c",
"EN-301-549",
"EN-9.4.1.2",
"ACT"
],
"description": "Ensure every form element has a label",
"help": "Form elements must have labels",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/label?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "implicit-label",
"data": {
"implicitLabel": "Olive oil"
},
"relatedNodes": [
{
"html": "<label class=\"staple-chip\"><input type=\"checkbox\" data-staple=\"Olive oil\"><span>Olive oil</span></label>",
"target": [
".staple-chip:nth-child(1)"
]
}
],
"impact": "critical",
"message": "Element has an implicit (wrapped) <label>"
}
],
"all": [],
"none": [
{
"id": "hidden-explicit-label",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "Form element has a visible explicit <label>"
}
],
"impact": null,
"html": "<input type=\"checkbox\" data-staple=\"Olive oil\">",
"target": [
"input[data-staple=\"Olive oil\"]"
]
}
]
},
{
"id": "link-name",
"impact": null,
"tags": [
"cat.name-role-value",
"wcag2a",
"wcag244",
"wcag412",
"section508",
"section508.22.a",
"TTv5",
"TT6.a",
"EN-301-549",
"EN-9.2.4.4",
"EN-9.4.1.2",
"ACT"
],
"description": "Ensure links have discernible text",
"help": "Links must have discernible text",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/link-name?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "has-visible-text",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "Element has text that is visible to screen readers"
}
],
"all": [],
"none": [
{
"id": "focusable-no-name",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "Element is not in tab order or has accessible text"
}
],
"impact": null,
"html": "<a class=\"skip-link\" href=\"#main-content\">Skip to main content</a>",
"target": [
".skip-link"
]
}
]
},
{
"id": "list",
"impact": null,
"tags": [
"cat.structure",
"wcag2a",
"wcag131",
"EN-301-549",
"EN-9.1.3.1"
],
"description": "Ensure that lists are structured correctly",
"help": "<ul> and <ol> must only directly contain <li>, <script> or <template> elements",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/list?application=axeAPI",
"nodes": [
{
"any": [],
"all": [],
"none": [
{
"id": "only-listitems",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "List element only has direct children that are allowed inside <li> elements"
}
],
"impact": null,
"html": "<ul>",
"target": [
".shopping-group:nth-child(1) > 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>\n <label>\n <input type=\"checkbox\" data-shopping-item=\"\">\n <span>4 ripe tomatoes</span>\n </label>\n </li>",
"target": [
".shopping-group:nth-child(1) > 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 class=\"brand-logo\" src=\"https://placehold.co/72x72/173f35/fffaf0?text=F%26F&font=playfair+display\" alt=\"Field and Flame logo\" width=\"72\" height=\"72\">",
"target": [
".brand-logo"
]
}
]
},
{
"id": "scrollable-region-focusable",
"impact": null,
"tags": [
"cat.keyboard",
"wcag2a",
"wcag211",
"wcag213",
"TTv5",
"TT4.a",
"EN-301-549",
"EN-9.2.1.1",
"EN-9.2.1.3"
],
"description": "Ensure elements that have scrollable content are accessible by keyboard",
"help": "Scrollable region must have keyboard access",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/scrollable-region-focusable?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "focusable-content",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "Element contains focusable elements"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<div class=\"shopping-list\" id=\"shoppingList\" aria-live=\"polite\">",
"target": [
"#shoppingList"
]
}
]
},
{
"id": "select-name",
"impact": null,
"tags": [
"cat.forms",
"wcag2a",
"wcag412",
"section508",
"section508.22.n",
"TTv5",
"TT5.c",
"EN-301-549",
"EN-9.4.1.2",
"ACT"
],
"description": "Ensure select element has an accessible name",
"help": "Select element must have an accessible name",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/select-name?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "explicit-label",
"data": null,
"relatedNodes": [
{
"html": "<label class=\"day-label\" for=\"monday\"><span>Mon</span> Monday</label>",
"target": [
"label[for=\"monday\"]"
]
}
],
"impact": "critical",
"message": "Element has an explicit <label>"
}
],
"all": [],
"none": [
{
"id": "hidden-explicit-label",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "Form element has a visible explicit <label>"
}
],
"impact": null,
"html": "<select class=\"meal-select\" id=\"monday\" data-day=\"Monday\">",
"target": [
"#monday"
]
}
]
},
{
"id": "summary-name",
"impact": null,
"tags": [
"cat.name-role-value",
"wcag2a",
"wcag412",
"section508",
"section508.22.a",
"TTv5",
"TT6.a",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure summary elements have discernible text",
"help": "Summary elements must have discernible text",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/summary-name?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "has-visible-text",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "Element has text that is visible to screen readers"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<summary>How do I know my oil is hot enough for searing?</summary>",
"target": [
"details:nth-child(2) > summary"
]
}
]
},
{
"id": "target-size",
"impact": null,
"tags": [
"cat.sensory-and-visual-cues",
"wcag22aa",
"wcag258"
],
"description": "Ensure touch targets have sufficient size and space",
"help": "All touch targets must be 24px large, or leave sufficient space",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/target-size?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "target-size",
"data": {
"minSize": 24,
"width": 185.9,
"height": 46.4
},
"relatedNodes": [],
"impact": "serious",
"message": "Control has sufficient size (185.9px by 46.4px, should be at least 24px by 24px)"
},
{
"id": "target-offset",
"data": {
"closestOffset": 24,
"minOffset": 24
},
"relatedNodes": [],
"impact": "serious",
"message": "Target has sufficient space from its closest neighbors. Safe clickable space has a diameter of 24px which is at least 24px."
}
],
"all": [],
"none": [],
"impact": null,
"html": "<a class=\"skip-link\" href=\"#main-content\">Skip to main content</a>",
"target": [
".skip-link"
]
}
]
}
],
"incomplete": [
{
"id": "aria-prohibited-attr",
"impact": "serious",
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure ARIA attributes are not prohibited for an element's role",
"help": "Elements must only use permitted ARIA attributes",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-prohibited-attr?application=axeAPI",
"nodes": [
{
"any": [],
"all": [],
"none": [
{
"id": "aria-prohibited-attr",
"data": {
"role": null,
"nodeName": "span",
"messageKey": "noRoleSingular",
"prohibited": [
"aria-label"
]
},
"relatedNodes": [],
"impact": "serious",
"message": "aria-label attribute is not well supported on a span with no valid role attribute."
}
],
"impact": "serious",
"html": "<span class=\"stars\" aria-label=\"5 out of 5 stars\">\u2605\u2605\u2605\u2605\u2605</span>",
"target": [
"strong > .stars[aria-label=\"5 out of 5 stars\"]"
],
"failureSummary": "Fix all of the following:\n aria-label attribute is not well supported on a span with no valid role attribute."
}
]
},
{
"id": "color-contrast",
"impact": "serious",
"tags": [
"cat.color",
"wcag2aa",
"wcag143",
"TTv5",
"TT13.c",
"EN-301-549",
"EN-9.1.4.3",
"ACT"
],
"description": "Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds",
"help": "Elements must meet minimum color contrast ratio thresholds",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/color-contrast?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "color-contrast",
"data": {
"messageKey": "nonBmp"
},
"relatedNodes": [],
"impact": "serious",
"message": "Element content contains only non-text characters"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span aria-hidden=\"true\">\u2192</span>",
"target": [
".button--primary.button[href$=\"#subscribe\"] > span[aria-hidden=\"true\"]"
],
"failureSummary": "Fix any of the following:\n Element content contains only non-text characters"
}
]
},
{
"id": "link-in-text-block",
"impact": "serious",
"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",
"data": {
"messageKey": "bgOverlap"
},
"relatedNodes": [
{
"html": "<div class=\"footer-brand\">",
"target": [
".footer-brand"
]
}
],
"impact": "serious",
"message": "Element's contrast ratio could not be determined because of element overlap"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a class=\"brand\" href=\"#home\" aria-label=\"Field and Flame home\">\n <span class=\"brand-copy\">\n <span class=\"brand-name\">Field & Flame</span>\n <span class=\"brand-tagline\">Seasonal recipes for generous tables</span>\n </span>\n </a>",
"target": [
".footer-brand > .brand[href$=\"#home\"][aria-label=\"Field and Flame home\"]"
],
"failureSummary": "Fix any of the following:\n Element's contrast ratio could not be determined because of element overlap"
}
]
}
],
"violations": [
{
"id": "color-contrast",
"impact": "serious",
"tags": [
"cat.color",
"wcag2aa",
"wcag143",
"TTv5",
"TT13.c",
"EN-301-549",
"EN-9.1.4.3",
"ACT"
],
"description": "Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds",
"help": "Elements must meet minimum color contrast ratio thresholds",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/color-contrast?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#ffffff",
"bgColor": "#d65b38",
"contrastRatio": 3.87,
"fontSize": "9.8pt (13.12px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<a class=\"button button--primary\" href=\"#subscribe\"><span class=\"subscribe-label\">Subscribe</span><span aria-hidden=\"true\">\u2192</span></a>",
"target": [
".nav-actions > .button--primary.button[href$=\"#subscribe\"]"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.87 (foreground color: #ffffff, background color: #d65b38, font size: 9.8pt (13.12px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"subscribe-label\">Subscribe</span>",
"target": [
".subscribe-label"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.87 (foreground color: #ffffff, background color: #d65b38, font size: 9.8pt (13.12px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#ffffff",
"bgColor": "#d65b38",
"contrastRatio": 3.87,
"fontSize": "11.0pt (14.72px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<a class=\"button button--primary\" href=\"#recipes\">\n Explore new recipes\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" aria-hidden=\"true\"><path d=\"M5 12h14M13 6l6 6-6 6\"></path></svg>\n </a>",
"target": [
".button--primary.button[href$=\"#recipes\"]"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.87 (foreground color: #ffffff, background color: #d65b38, font size: 11.0pt (14.72px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a class=\"button button--primary\" href=\"#recipes\">\n Explore new recipes\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" aria-hidden=\"true\"><path d=\"M5 12h14M13 6l6 6-6 6\"></path></svg>\n </a>",
"target": [
".button--primary.button[href$=\"#recipes\"]"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.87 (foreground color: #ffffff, background color: #d65b38, font size: 11.0pt (14.72px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#d65b38",
"bgColor": "#fffdf8",
"contrastRatio": 3.81,
"fontSize": "9.1pt (12.16px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section class=\"section section--white\" id=\"recipes\">",
"target": [
"#recipes"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.81 (foreground color: #d65b38, background color: #fffdf8, font size: 9.1pt (12.16px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"eyebrow\">From the test kitchen</span>",
"target": [
".visible.section-heading.reveal > div:nth-child(1) > .eyebrow"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.81 (foreground color: #d65b38, background color: #fffdf8, font size: 9.1pt (12.16px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#d65b38",
"bgColor": "#fffdf8",
"contrastRatio": 3.81,
"fontSize": "9.1pt (12.16px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section class=\"section section--white\" id=\"recipes\">",
"target": [
"#recipes"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.81 (foreground color: #d65b38, background color: #fffdf8, font size: 9.1pt (12.16px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"eyebrow\">From the test kitchen</span>",
"target": [
".section-heading.visible.reveal > div:nth-child(1) > .eyebrow"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.81 (foreground color: #d65b38, background color: #fffdf8, font size: 9.1pt (12.16px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#d65b38",
"bgColor": "#173f35",
"contrastRatio": 3,
"fontSize": "9.1pt (12.16px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section class=\"section guide-section\" id=\"restaurant-guide\">",
"target": [
"#restaurant-guide"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3 (foreground color: #d65b38, background color: #173f35, font size: 9.1pt (12.16px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"eyebrow\">The restaurant guide</span>",
"target": [
".guide-copy > .eyebrow"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3 (foreground color: #d65b38, background color: #173f35, font size: 9.1pt (12.16px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#667068",
"bgColor": "#e7e5db",
"contrastRatio": 4.07,
"fontSize": "8.0pt (10.72px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<header class=\"site-header is-scrolled\" id=\"siteHeader\">",
"target": [
"#siteHeader"
]
},
{
"html": "<section class=\"section guide-section\" id=\"restaurant-guide\">",
"target": [
"#restaurant-guide"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.07 (foreground color: #667068, background color: #e7e5db, font size: 8.0pt (10.72px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"brand-tagline\">Seasonal recipes for generous tables</span>",
"target": [
".nav-wrap > .brand[href$=\"#home\"][aria-label=\"Field and Flame home\"] > .brand-copy > .brand-tagline"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.07 (foreground color: #667068, background color: #e7e5db, font size: 8.0pt (10.72px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#d65b38",
"bgColor": "#173f35",
"contrastRatio": 3,
"fontSize": "9.1pt (12.16px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section class=\"section guide-section\" id=\"restaurant-guide\">",
"target": [
"#restaurant-guide"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3 (foreground color: #d65b38, background color: #173f35, font size: 9.1pt (12.16px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"eyebrow\">Recently visited</span>",
"target": [
"#restaurant-picks > div > .eyebrow"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3 (foreground color: #d65b38, background color: #173f35, font size: 9.1pt (12.16px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#d65b38",
"bgColor": "#fffdf8",
"contrastRatio": 3.81,
"fontSize": "9.1pt (12.16px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section class=\"section section--white\" id=\"recipes\">",
"target": [
"#recipes"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.81 (foreground color: #d65b38, background color: #fffdf8, font size: 9.1pt (12.16px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"eyebrow\">From the test kitchen</span>",
"target": [
"#recipes > .container > .section-heading.visible.reveal > div:nth-child(1) > .eyebrow"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.81 (foreground color: #d65b38, background color: #fffdf8, font size: 9.1pt (12.16px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#d65b38",
"bgColor": "#f7f2e8",
"contrastRatio": 3.47,
"fontSize": "9.1pt (12.16px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<body>",
"target": [
"body"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.47 (foreground color: #d65b38, background color: #f7f2e8, font size: 9.1pt (12.16px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"eyebrow\">The technique notebook</span>",
"target": [
"#cooking-tips > .container > .section-heading.visible.reveal > div:nth-child(1) > .eyebrow"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.47 (foreground color: #d65b38, background color: #f7f2e8, font size: 9.1pt (12.16px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#ffffff",
"bgColor": "#d65b38",
"contrastRatio": 3.87,
"fontSize": "11.4pt (15.2px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<span class=\"technique-number\">01</span>",
"target": [
".technique-number"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.87 (foreground color: #ffffff, background color: #d65b38, font size: 11.4pt (15.2px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"technique-number\">01</span>",
"target": [
".technique-number"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.87 (foreground color: #ffffff, background color: #d65b38, font size: 11.4pt (15.2px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#d65b38",
"bgColor": "#fffdf8",
"contrastRatio": 3.81,
"fontSize": "9.1pt (12.16px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section class=\"section section--white\" id=\"seasonal\">",
"target": [
"#seasonal"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.81 (foreground color: #d65b38, background color: #fffdf8, font size: 9.1pt (12.16px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"eyebrow\">Eat with the calendar</span>",
"target": [
"#seasonal > .container > .section-heading.visible.reveal > div:nth-child(1) > .eyebrow"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.81 (foreground color: #d65b38, background color: #fffdf8, font size: 9.1pt (12.16px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#d65b38",
"bgColor": "#173f35",
"contrastRatio": 3,
"fontSize": "9.1pt (12.16px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"season-panel reveal visible\">",
"target": [
".season-panel"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3 (foreground color: #d65b38, background color: #173f35, font size: 9.1pt (12.16px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"eyebrow\">Current menu</span>",
"target": [
".season-panel-copy > .eyebrow"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3 (foreground color: #d65b38, background color: #173f35, font size: 9.1pt (12.16px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#d65b38",
"bgColor": "#fffdf8",
"contrastRatio": 3.81,
"fontSize": "8.3pt (11.04px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<article class=\"season-card reveal visible\">\n <span>March \u2013 May</span>\n <h3>Spring</h3>\n <p>Asparagus, peas, radishes, and tender herbs. These are the ingredients that taste most alive when barely cooked.</p>\n </article>",
"target": [
".season-card:nth-child(1)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.81 (foreground color: #d65b38, background color: #fffdf8, font size: 8.3pt (11.04px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>March \u2013 May</span>",
"target": [
".season-card:nth-child(1) > span"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.81 (foreground color: #d65b38, background color: #fffdf8, font size: 8.3pt (11.04px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#d65b38",
"bgColor": "#fffdf8",
"contrastRatio": 3.81,
"fontSize": "8.3pt (11.04px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<article class=\"season-card is-current reveal visible\">\n <span>June \u2013 August</span>\n <h3>Summer</h3>\n <p>Tomatoes, stone fruit, zucchini, and corn. The best summer cooking happens quickly, with fire, oil, and very little fuss.</p>\n </article>",
"target": [
".is-current"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.81 (foreground color: #d65b38, background color: #fffdf8, font size: 8.3pt (11.04px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>June \u2013 August</span>",
"target": [
".is-current > span"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.81 (foreground color: #d65b38, background color: #fffdf8, font size: 8.3pt (11.04px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#d65b38",
"bgColor": "#fffdf8",
"contrastRatio": 3.81,
"fontSize": "8.3pt (11.04px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<article class=\"season-card reveal visible\">\n <span>September \u2013 November</span>\n <h3>Autumn</h3>\n <p>Apples, squash, mushrooms, and roots bring richer flavors. Slow roasting and long braises suit the cooling weather.</p>\n </article>",
"target": [
".season-card:nth-child(3)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.81 (foreground color: #d65b38, background color: #fffdf8, font size: 8.3pt (11.04px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>September \u2013 November</span>",
"target": [
".season-card:nth-child(3) > span"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.81 (foreground color: #d65b38, background color: #fffdf8, font size: 8.3pt (11.04px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#d65b38",
"bgColor": "#fffdf8",
"contrastRatio": 3.81,
"fontSize": "8.3pt (11.04px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<article class=\"season-card reveal visible\">\n <span>December \u2013 February</span>\n <h3>Winter</h3>\n <p>Cabbage, citrus, onions, and legumes become the focus. Bright acid and careful seasoning keep cold-weather cooking alive.</p>\n </article>",
"target": [
".season-card:nth-child(4)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.81 (foreground color: #d65b38, background color: #fffdf8, font size: 8.3pt (11.04px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>December \u2013 February</span>",
"target": [
".season-card:nth-child(4) > span"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.81 (foreground color: #d65b38, background color: #fffdf8, font size: 8.3pt (11.04px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#ffffff",
"bgColor": "#d65b38",
"contrastRatio": 3.87,
"fontSize": "9.4pt (12.48px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<button class=\"button button--primary\" id=\"printList\" type=\"button\">Print shopping list</button>",
"target": [
"#printList"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.87 (foreground color: #ffffff, background color: #d65b38, font size: 9.4pt (12.48px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<button class=\"button button--primary\" id=\"printList\" type=\"button\">Print shopping list</button>",
"target": [
"#printList"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.87 (foreground color: #ffffff, background color: #d65b38, font size: 9.4pt (12.48px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#ffffff",
"bgColor": "#d65b38",
"contrastRatio": 3.87,
"fontSize": "9.4pt (12.48px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<span class=\"shopping-count\" id=\"shoppingCount\" aria-label=\"Number of shopping items\">38</span>",
"target": [
"#shoppingCount"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.87 (foreground color: #ffffff, background color: #d65b38, font size: 9.4pt (12.48px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"shopping-count\" id=\"shoppingCount\" aria-label=\"Number of shopping items\">38</span>",
"target": [
"#shoppingCount"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.87 (foreground color: #ffffff, background color: #d65b38, font size: 9.4pt (12.48px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#d65b38",
"bgColor": "#f7f2e8",
"contrastRatio": 3.47,
"fontSize": "9.1pt (12.16px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<body>",
"target": [
"body"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.47 (foreground color: #d65b38, background color: #f7f2e8, font size: 9.1pt (12.16px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"eyebrow\">Everyday nutrition</span>",
"target": [
".nutrition-copy > .eyebrow"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.47 (foreground color: #d65b38, background color: #f7f2e8, font size: 9.1pt (12.16px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#d65b38",
"bgColor": "#fffdf8",
"contrastRatio": 3.81,
"fontSize": "9.1pt (12.16px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section class=\"section section--white\" id=\"blog\">",
"target": [
"#blog"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.81 (foreground color: #d65b38, background color: #fffdf8, font size: 9.1pt (12.16px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"eyebrow\">The journal</span>",
"target": [
"#blog > .container > .section-heading.visible.reveal > div:nth-child(1) > .eyebrow"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.81 (foreground color: #d65b38, background color: #fffdf8, font size: 9.1pt (12.16px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#d65b38",
"bgColor": "#fffdf8",
"contrastRatio": 3.81,
"fontSize": "8.3pt (11.04px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<article class=\"article-card reveal visible\">",
"target": [
".article-card:nth-child(1)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.81 (foreground color: #d65b38, background color: #fffdf8, font size: 8.3pt (11.04px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>Technique</span>",
"target": [
".article-card:nth-child(1) > .article-body > .article-kicker > span:nth-child(1)"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.81 (foreground color: #d65b38, background color: #fffdf8, font size: 8.3pt (11.04px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#d65b38",
"bgColor": "#fffdf8",
"contrastRatio": 3.81,
"fontSize": "8.3pt (11.04px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<article class=\"article-card reveal visible\">",
"target": [
".article-card:nth-child(2)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.81 (foreground color: #d65b38, background color: #fffdf8, font size: 8.3pt (11.04px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>Produce guide</span>",
"target": [
".article-card:nth-child(2) > .article-body > .article-kicker > span:nth-child(1)"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.81 (foreground color: #d65b38, background color: #fffdf8, font size: 8.3pt (11.04px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#d65b38",
"bgColor": "#fffdf8",
"contrastRatio": 3.81,
"fontSize": "8.3pt (11.04px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<article class=\"article-card reveal visible\">",
"target": [
".article-card:nth-child(3)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.81 (foreground color: #d65b38, background color: #fffdf8, font size: 8.3pt (11.04px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>Food science</span>",
"target": [
".article-card:nth-child(3) > .article-body > .article-kicker > span:nth-child(1)"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.81 (foreground color: #d65b38, background color: #fffdf8, font size: 8.3pt (11.04px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#f4d3c9",
"bgColor": "#d65b38",
"contrastRatio": 2.77,
"fontSize": "7.8pt (10.4px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"about-badge\">\n <span>Founded in 2018</span>\n <strong>By Mara Ellis, recipe director & founder</strong>\n </div>",
"target": [
".about-badge"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 2.77 (foreground color: #f4d3c9, background color: #d65b38, font size: 7.8pt (10.4px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>Founded in 2018</span>",
"target": [
".about-badge > span"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 2.77 (foreground color: #f4d3c9, background color: #d65b38, font size: 7.8pt (10.4px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#d65b38",
"bgColor": "#e9dfcf",
"contrastRatio": 2.94,
"fontSize": "9.1pt (12.16px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section class=\"section about-section\" id=\"about\">",
"target": [
"#about"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 2.94 (foreground color: #d65b38, background color: #e9dfcf, font size: 9.1pt (12.16px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"eyebrow\">About Field & Flame</span>",
"target": [
".about-copy > .eyebrow"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 2.94 (foreground color: #d65b38, background color: #e9dfcf, font size: 9.1pt (12.16px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#667068",
"bgColor": "#e9dfcf",
"contrastRatio": 3.89,
"fontSize": "12.0pt (16px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section class=\"section about-section\" id=\"about\">",
"target": [
"#about"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.89 (foreground color: #667068, background color: #e9dfcf, font size: 12.0pt (16px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<p>Field & Flame began with a weekly notebook of market observations, restaurant notes, and recipes scribbled after long dinners. Its founder, Mara Ellis, wanted to create a food publication that valued curiosity over certainty and expertise without intimidation.</p>",
"target": [
".about-copy > p:nth-child(3)"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.89 (foreground color: #667068, background color: #e9dfcf, font size: 12.0pt (16px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#667068",
"bgColor": "#e9dfcf",
"contrastRatio": 3.89,
"fontSize": "12.0pt (16px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section class=\"section about-section\" id=\"about\">",
"target": [
"#about"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.89 (foreground color: #667068, background color: #e9dfcf, font size: 12.0pt (16px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<p>",
"target": [
".about-copy > p:nth-child(4)"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.89 (foreground color: #667068, background color: #e9dfcf, font size: 12.0pt (16px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#667068",
"bgColor": "#e9dfcf",
"contrastRatio": 3.89,
"fontSize": "12.0pt (16px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section class=\"section about-section\" id=\"about\">",
"target": [
"#about"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.89 (foreground color: #667068, background color: #e9dfcf, font size: 12.0pt (16px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<p>We are independent, reader-supported, and committed to keeping our recommendations clear, practical, and rooted in a genuine love of the table.</p>",
"target": [
".about-copy > p:nth-child(5)"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.89 (foreground color: #667068, background color: #e9dfcf, font size: 12.0pt (16px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#667068",
"bgColor": "#e9dfcf",
"contrastRatio": 3.89,
"fontSize": "8.8pt (11.68px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section class=\"section about-section\" id=\"about\">",
"target": [
"#about"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.89 (foreground color: #667068, background color: #e9dfcf, font size: 8.8pt (11.68px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>Core editorial team</span>",
"target": [
".about-stats > div:nth-child(1) > span"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.89 (foreground color: #667068, background color: #e9dfcf, font size: 8.8pt (11.68px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#667068",
"bgColor": "#e9dfcf",
"contrastRatio": 3.89,
"fontSize": "8.8pt (11.68px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section class=\"section about-section\" id=\"about\">",
"target": [
"#about"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.89 (foreground color: #667068, background color: #e9dfcf, font size: 8.8pt (11.68px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>Local food makers</span>",
"target": [
".about-stats > div:nth-child(2) > span"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.89 (foreground color: #667068, background color: #e9dfcf, font size: 8.8pt (11.68px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#667068",
"bgColor": "#e9dfcf",
"contrastRatio": 3.89,
"fontSize": "8.8pt (11.68px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section class=\"section about-section\" id=\"about\">",
"target": [
"#about"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.89 (foreground color: #667068, background color: #e9dfcf, font size: 8.8pt (11.68px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>Test-kitchen recipes monthly</span>",
"target": [
".about-stats > div:nth-child(3) > span"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.89 (foreground color: #667068, background color: #e9dfcf, font size: 8.8pt (11.68px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#d65b38",
"bgColor": "#fffdf8",
"contrastRatio": 3.81,
"fontSize": "9.1pt (12.16px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section class=\"section voices-section\">",
"target": [
".voices-section"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.81 (foreground color: #d65b38, background color: #fffdf8, font size: 9.1pt (12.16px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"eyebrow\">Around the table</span>",
"target": [
".voices-intro > .eyebrow"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.81 (foreground color: #d65b38, background color: #fffdf8, font size: 9.1pt (12.16px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#667068",
"bgColor": "#e9dfcf",
"contrastRatio": 3.89,
"fontSize": "10.7pt (14.24px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"faq-wrap reveal visible\">",
"target": [
".faq-wrap"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.89 (foreground color: #667068, background color: #e9dfcf, font size: 10.7pt (14.24px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<p>A few details about our recipes, guides, and editorial approach.</p>",
"target": [
".faq-wrap > p"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.89 (foreground color: #667068, background color: #e9dfcf, font size: 10.7pt (14.24px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#d65b38",
"bgColor": "#fffdf8",
"contrastRatio": 3.81,
"fontSize": "9.1pt (12.16px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section class=\"section section--white\" id=\"recipes\">",
"target": [
"#recipes"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.81 (foreground color: #d65b38, background color: #fffdf8, font size: 9.1pt (12.16px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"eyebrow\">From the test kitchen</span>",
"target": [
"#recipes > .container > .section-heading.reveal.visible > div:nth-child(1) > .eyebrow"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.81 (foreground color: #d65b38, background color: #fffdf8, font size: 9.1pt (12.16px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#d65b38",
"bgColor": "#f7f2e8",
"contrastRatio": 3.47,
"fontSize": "9.1pt (12.16px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<body>",
"target": [
"body"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.47 (foreground color: #d65b38, background color: #f7f2e8, font size: 9.1pt (12.16px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"eyebrow\">The technique notebook</span>",
"target": [
"#cooking-tips > .container > .section-heading.reveal.visible > div:nth-child(1) > .eyebrow"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.47 (foreground color: #d65b38, background color: #f7f2e8, font size: 9.1pt (12.16px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#d65b38",
"bgColor": "#fffdf8",
"contrastRatio": 3.81,
"fontSize": "9.1pt (12.16px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section class=\"section section--white\" id=\"seasonal\">",
"target": [
"#seasonal"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.81 (foreground color: #d65b38, background color: #fffdf8, font size: 9.1pt (12.16px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"eyebrow\">Eat with the calendar</span>",
"target": [
"#seasonal > .container > .section-heading.reveal.visible > div:nth-child(1) > .eyebrow"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.81 (foreground color: #d65b38, background color: #fffdf8, font size: 9.1pt (12.16px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#d65b38",
"bgColor": "#fffdf8",
"contrastRatio": 3.81,
"fontSize": "9.1pt (12.16px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section class=\"section section--white\" id=\"blog\">",
"target": [
"#blog"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.81 (foreground color: #d65b38, background color: #fffdf8, font size: 9.1pt (12.16px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"eyebrow\">The journal</span>",
"target": [
"#blog > .container > .section-heading.reveal.visible > div:nth-child(1) > .eyebrow"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.81 (foreground color: #d65b38, background color: #fffdf8, font size: 9.1pt (12.16px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#ffffff",
"bgColor": "#d65b38",
"contrastRatio": 3.87,
"fontSize": "9.1pt (12.16px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section class=\"newsletter-section\" id=\"subscribe\">",
"target": [
"#subscribe"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.87 (foreground color: #ffffff, background color: #d65b38, font size: 9.1pt (12.16px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"eyebrow\" style=\"color:#fff\">Field Notes, every Sunday</span>",
"target": [
".newsletter-grid > .reveal.visible:nth-child(1) > .eyebrow"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.87 (foreground color: #ffffff, background color: #d65b38, font size: 9.1pt (12.16px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#f6ddd5",
"bgColor": "#d65b38",
"contrastRatio": 2.99,
"fontSize": "12.0pt (16px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section class=\"newsletter-section\" id=\"subscribe\">",
"target": [
"#subscribe"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 2.99 (foreground color: #f6ddd5, background color: #d65b38, font size: 12.0pt (16px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<p>One seasonal recipe, one market note, one technique worth keeping, and a thoughtful restaurant pick. Join 18,000 readers who want to cook with more curiosity.</p>",
"target": [
".newsletter-grid > .reveal.visible:nth-child(1) > p"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 2.99 (foreground color: #f6ddd5, background color: #d65b38, font size: 12.0pt (16px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#ffffff",
"bgColor": "#fffdf8",
"contrastRatio": 1.01,
"fontSize": "12.0pt (16px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<form class=\"newsletter-form\" id=\"newsletterForm\">",
"target": [
"#newsletterForm"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 1.01 (foreground color: #ffffff, background color: #fffdf8, font size: 12.0pt (16px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<input id=\"newsletterEmail\" name=\"email\" type=\"email\" autocomplete=\"email\" placeholder=\"Your email address\" required=\"\">",
"target": [
"#newsletterEmail"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 1.01 (foreground color: #ffffff, background color: #fffdf8, font size: 12.0pt (16px), font weight: normal). Expected contrast ratio of 4.5:1"
}
]
},
{
"id": "target-size",
"impact": "serious",
"tags": [
"cat.sensory-and-visual-cues",
"wcag22aa",
"wcag258"
],
"description": "Ensure touch targets have sufficient size and space",
"help": "All touch targets must be 24px large, or leave sufficient space",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/target-size?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "target-size",
"data": {
"messageKey": "partiallyObscured",
"minSize": 24,
"width": 347.6,
"height": 17.8
},
"relatedNodes": [
{
"html": "<a href=\"#cooking-tips\">Cooking Tips</a>",
"target": [
".primary-nav > a[href$=\"#cooking-tips\"]"
]
},
{
"html": "<a href=\"#nutrition\">Nutrition</a>",
"target": [
".primary-nav > a[href$=\"#nutrition\"]"
]
},
{
"html": "<a href=\"#blog\">Blog</a>",
"target": [
".primary-nav > a[href$=\"#blog\"]"
]
},
{
"html": "<a href=\"#about\">About</a>",
"target": [
".primary-nav > a[href$=\"#about\"]"
]
}
],
"impact": "serious",
"message": "Target has insufficient size because it is partially obscured (smallest space is 347.6px by 17.8px, should be at least 24px by 24px)"
},
{
"id": "target-offset",
"data": {
"closestOffset": 22,
"minOffset": 24
},
"relatedNodes": [
{
"html": "<a href=\"#nutrition\">Nutrition</a>",
"target": [
".primary-nav > a[href$=\"#nutrition\"]"
]
}
],
"impact": "serious",
"message": "Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 22px instead of at least 24px."
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<input id=\"newsletterEmail\" name=\"email\" type=\"email\" autocomplete=\"email\" placeholder=\"Your email address\" required=\"\">",
"target": [
"#newsletterEmail"
],
"failureSummary": "Fix any of the following:\n Target has insufficient size because it is partially obscured (smallest space is 347.6px by 17.8px, should be at least 24px by 24px)\n Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 22px instead of at least 24px."
}
]
}
],
"coverage": {
"contract": "main-document-vertical-scroll",
"complete": true,
"positions": [
{
"y": 0,
"height": 13627
},
{
"y": 576,
"height": 13627
},
{
"y": 1152,
"height": 13627
},
{
"y": 1728,
"height": 13627
},
{
"y": 2304,
"height": 13627
},
{
"y": 2880,
"height": 13627
},
{
"y": 3456,
"height": 13627
},
{
"y": 4032,
"height": 13627
},
{
"y": 4608,
"height": 13627
},
{
"y": 5184,
"height": 13627
},
{
"y": 5760,
"height": 13627
},
{
"y": 6336,
"height": 13627
},
{
"y": 6912,
"height": 13627
},
{
"y": 7488,
"height": 13627
},
{
"y": 8064,
"height": 13627
},
{
"y": 8640,
"height": 13627
},
{
"y": 9216,
"height": 13627
},
{
"y": 9792,
"height": 13627
},
{
"y": 10368,
"height": 13627
},
{
"y": 10944,
"height": 13627
},
{
"y": 11520,
"height": 13627
},
{
"y": 12096,
"height": 13627
},
{
"y": 12672,
"height": 13627
},
{
"y": 12907,
"height": 13627
}
],
"scans": 25,
"max_states": 512,
"settle_ms": 5000,
"page_timeout_seconds": 150,
"layout_stability": "consecutive 100ms size samples within one CSS pixel",
"animation_settling": "finite animations present when scroll resources are ready finish or are cancelled",
"interactive_states": "not exercised",
"horizontal_scroll": "not exercised"
}
}
System Prompt
You are a lead web developer at a top digital agency, tasked with creating a one-page website for a new client based on the given specifications, delivered as an HTML file. First non-whitespace char '<', last non-whitespace char '>'. Use the following services to generate placeholder images where needed:
- placehold.co (text): https://placehold.co/[{w}x{h}|{size}][/{bg-color}/{text-color}]?text={text}&font=[lato|lora|montserrat|noto sans|open sans|oswald|playfair display|poppins|pt sans|raleway|roboto|source sans|source sans pro]
- picsum.photos (photos): https://picsum.photos/[{w}/{h}|{size}]?[grayscale][&blur={1-10}]
- pravatar.cc (avatars): https://i.pravatar.cc/{size}?u={identifier}
Choose sizes appropriate to layout.
User Prompt
Create a **complete, polished, production-quality** primary web page for a new client in the "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: "Recipes", "About", "Blog".
- **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: "Restaurant Guide", "Cooking Tips", "Seasonal Menus".
- **Content Depth:** Populate each section with **substantial, realistic text** (multiple sentences/paragraphs). Use authentic industry language and terminology like: "terroir", "fermentation", "seasoning".
- **Visuals:** Integrate relevant placeholder images logically within the content sections.
- **Calls to Action:** Include clear and contextually relevant CTAs. Use strong verbs similar to: "Start Order", "Subscribe", "Order Now".
- **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: "meal planner".
- **SIDEBAR (Optional):** If your design includes a sidebar, populate it with **useful, relevant content**. Ideas: "chef interviews", "food news", "restaurant picks".
- **FOOTER:** Include a professional footer with invented contact details, copyright (current year), social media links, and standard links (Privacy, Terms).
- **MODERN WEB PATTERNS:** Include modern web patterns like testimonial cards, feature grids, or FAQ accordions where appropriate.