SpaceXAI Grok 4.7 – Travel

via xAI · Generated

  • AIMAC Debt 4.94
  • Cost $0.11
  • Total Violations 22
  • HTML Size 50 KB
  • Em Dashes 27

Screenshot

View SpaceXAI Grok 4.7 Travel page View Live Page

Accessibility Issues Found

22 Serious

  • color-contrast serious 22 instances

    Elements must meet minimum color contrast ratio thresholds

    Example HTML <p class="eyebrow">Travel studio · Est. 2014</p>

Artifacts

View Generated HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Northline Travel — Guides, flights, and field notes</title>
<meta name="description" content="Northline Travel publishes destination guides, flight intelligence, adventure booking resources, and practical tourism advice for travelers who plan with care.">
<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=Fraunces:opsz,wght@9..144,500;9..144,620;9..144,700&family=Outfit:wght@300;400;500;600&display=swap" rel="stylesheet">
<style>
:root {
  --ink: #172028;
  --ink-soft: #3d4a54;
  --paper: #f4efe6;
  --paper-2: #ebe4d6;
  --white: #fffcf7;
  --teal: #0e3b43;
  --teal-deep: #08282e;
  --foam: #d7ebe6;
  --clay: #c4542c;
  --clay-deep: #9a3d1c;
  --gold: #b8884a;
  --line: rgba(23, 32, 40, 0.12);
  --shadow: 0 18px 50px rgba(14, 40, 46, 0.12);
  --serif: "Fraunces", Georgia, serif;
  --sans: "Outfit", "Segoe UI", sans-serif;
  --max: 1180px;
}
* { box-sizing: border-box; }
html { scroll-behavior: smooth; }
body {
  margin: 0;
  color: var(--ink);
  background: var(--paper);
  font-family: var(--sans);
  font-weight: 400;
  line-height: 1.65;
  font-size: 17px;
}
img { max-width: 100%; display: block; }
a { color: inherit; }
button, input, select, textarea { font-family: inherit; }
.skip {
  position: absolute; left: 12px; top: -40px; background: var(--clay); color: white;
  padding: 8px 12px; z-index: 20;
}
.skip:focus { top: 12px; }
.wrap { width: min(var(--max), calc(100% - 40px)); margin: 0 auto; }
.eyebrow {
  letter-spacing: 0.16em; text-transform: uppercase; font-size: 12px;
  font-weight: 600; color: var(--clay); margin: 0 0 10px;
}
h1, h2, h3, h4 { font-family: var(--serif); line-height: 1.12; font-weight: 620; margin: 0 0 12px; }
h1 { font-size: clamp(42px, 6vw, 76px); letter-spacing: -0.03em; }
h2 { font-size: clamp(32px, 4vw, 48px); letter-spacing: -0.02em; }
h3 { font-size: 26px; }
p { margin: 0 0 14px; color: var(--ink-soft); }
.lede { font-size: 19px; color: var(--ink); }
.topbar {
  background: var(--teal-deep); color: #e7f2ef; font-size: 13px;
  letter-spacing: 0.04em;
}
.topbar .wrap { display: flex; justify-content: space-between; gap: 16px; padding: 8px 0; flex-wrap: wrap; }
.topbar a { color: #f0d7b0; text-decoration: none; }
header.site {
  position: sticky; top: 0; z-index: 30;
  background: rgba(244, 239, 230, 0.92);
  backdrop-filter: blur(12px);
  border-bottom: 1px solid var(--line);
}
.nav-row { display: flex; align-items: center; gap: 22px; padding: 14px 0; }
.brand { display: flex; align-items: center; gap: 12px; text-decoration: none; min-width: 240px; }
.brand img { width: 56px; height: 56px; border-radius: 14px; object-fit: cover; }
.brand strong { display: block; font-family: var(--serif); font-size: 22px; letter-spacing: -0.03em; color: var(--ink); }
.brand span { display: block; font-size: 12.5px; color: var(--ink-soft); max-width: 280px; line-height: 1.35; }
.nav-toggle { position: absolute; opacity: 0; pointer-events: none; }
.nav-burger {
  display: none; margin-left: auto; border: 1px solid var(--line); background: var(--white);
  padding: 8px 12px; border-radius: 999px; cursor: pointer; font-weight: 600;
}
nav.primary { margin-left: auto; }
nav.primary ul { display: flex; gap: 6px; list-style: none; margin: 0; padding: 0; flex-wrap: wrap; justify-content: flex-end; }
nav.primary a {
  text-decoration: none; font-size: 14.5px; font-weight: 500; padding: 8px 10px; border-radius: 999px;
}
nav.primary a:hover, nav.primary a:focus { background: var(--foam); color: var(--teal-deep); }
.hero { padding: 42px 0 20px; }
.hero-grid { display: grid; grid-template-columns: 1.05fr 0.95fr; gap: 36px; align-items: end; }
.hero-copy p { max-width: 62ch; }
.cta-row { display: flex; flex-wrap: wrap; gap: 12px; margin: 22px 0 8px; }
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  text-decoration: none; border: 0; cursor: pointer; border-radius: 999px;
  padding: 13px 20px; font-weight: 600; font-size: 15px;
}
.btn-primary { background: var(--clay); color: white; }
.btn-primary:hover { background: var(--clay-deep); }
.btn-dark { background: var(--teal); color: white; }
.btn-dark:hover { background: var(--teal-deep); }
.btn-ghost { background: transparent; color: var(--ink); border: 1px solid rgba(23,32,40,0.25); }
.btn-ghost:hover { border-color: var(--ink); }
.hero-photo { position: relative; }
.hero-photo img { width: 100%; height: 520px; object-fit: cover; border-radius: 28px 28px 80px 28px; }
.hero-card {
  position: absolute; left: -28px; bottom: 28px; background: var(--white);
  padding: 16px 18px; width: min(280px, 80%); border-radius: 18px; box-shadow: var(--shadow);
}
.hero-card strong { font-family: var(--serif); font-size: 22px; display: block; }
.stats { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; margin-top: 28px; }
.stat { background: var(--white); border-radius: 16px; padding: 14px 16px; border: 1px solid var(--line); }
.stat b { display: block; font-family: var(--serif); font-size: 28px; color: var(--teal); }
.stat span { font-size: 13px; color: var(--ink-soft); }
section { padding: 64px 0; }
.section-head { display: flex; justify-content: space-between; gap: 24px; align-items: end; margin-bottom: 28px; }
.section-head p { max-width: 62ch; }
.guide-grid, .deal-grid, .feature-grid, .testi-grid { display: grid; gap: 18px; }
.guide-grid { grid-template-columns: 1.3fr 1fr 1fr; }
.card {
  background: var(--white); border-radius: 22px; overflow: hidden; border: 1px solid var(--line);
  display: flex; flex-direction: column;
}
.card img { width: 100%; height: 210px; object-fit: cover; }
.card.feature img { height: 320px; }
.card .body { padding: 18px 18px 20px; }
.meta { font-size: 12px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--gold); font-weight: 600; }
.card h3 { font-size: 28px; }
.card p { font-size: 15.5px; }
.split { display: grid; grid-template-columns: 1.45fr 0.75fr; gap: 28px; align-items: start; }
.prose h3 { margin-top: 22px; }
aside.rail { display: flex; flex-direction: column; gap: 16px; }
.panel { background: var(--teal); color: #e8f3f1; border-radius: 22px; padding: 20px; }
.panel h3, .panel p, .panel li { color: #e8f3f1; }
.panel.sand { background: var(--white); color: var(--ink); border: 1px solid var(--line); }
.panel.sand h3, .panel.sand p, .panel.sand li { color: var(--ink); }
.panel ol, .panel ul { margin: 0; padding-left: 18px; }
.panel li { margin: 8px 0; font-size: 15px; }
.gallery { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
.gallery img { height: 110px; width: 100%; object-fit: cover; border-radius: 12px; }
.band { background: var(--teal-deep); color: #f4efe6; }
.band p { color: #d5e4e1; }
.adventure { display: grid; grid-template-columns: 0.9fr 1.1fr; gap: 32px; align-items: center; }
.adventure img { height: 460px; width: 100%; object-fit: cover; border-radius: 24px; }
.feature-grid { grid-template-columns: repeat(3, 1fr); }
.feature { background: rgba(255,255,255,0.06); border: 1px solid rgba(255,255,255,0.12); border-radius: 18px; padding: 18px; }
.feature h3 { font-size: 22px; color: white; }
.feature p { color: #d5e4e1; font-size: 15px; }
.tools { background: linear-gradient(180deg, #efe7d8 0%, var(--paper) 100%); }
.tool-box {
  background: var(--white); border-radius: 24px; padding: 22px; border: 1px solid var(--line); box-shadow: var(--shadow);
}
.filters { display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px; margin-bottom: 16px; }
label.field { display: flex; flex-direction: column; gap: 6px; font-size: 13px; font-weight: 600; color: var(--ink); }
input, select, textarea {
  border: 1px solid var(--line); background: #fff; border-radius: 12px; padding: 11px 12px; font-size: 15px; color: var(--ink);
}
textarea { min-height: 120px; resize: vertical; }
.pack-list { list-style: none; margin: 12px 0 0; padding: 0; display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
.pack-list li { background: var(--paper); border-radius: 12px; padding: 10px 12px; display: flex; gap: 10px; align-items: flex-start; }
.pack-list input { margin-top: 4px; }
.note { font-size: 14px; }
.deal-grid { grid-template-columns: repeat(3, 1fr); }
.deal { padding: 18px; border-radius: 20px; background: var(--white); border: 1px solid var(--line); }
.price { font-family: var(--serif); font-size: 34px; color: var(--teal); }
.price small { font-size: 14px; color: var(--ink-soft); font-family: var(--sans); }
.route { font-weight: 600; }
.testi-grid { grid-template-columns: repeat(3, 1fr); }
.testi { background: var(--white); border-radius: 22px; padding: 20px; border: 1px solid var(--line); }
.testi img { width: 56px; height: 56px; border-radius: 50%; object-fit: cover; }
.who { display: flex; gap: 12px; align-items: center; margin-top: 16px; }
.who strong { display: block; font-size: 15px; }
.who span { font-size: 13px; color: var(--ink-soft); }
.faq details { background: var(--white); border-radius: 16px; border: 1px solid var(--line); padding: 14px 18px; margin-bottom: 10px; }
.faq summary { cursor: pointer; font-weight: 600; font-size: 17px; }
.faq details p { margin-top: 10px; }
.contact-grid { display: grid; grid-template-columns: 0.8fr 1.2fr; gap: 28px; }
.form-card { background: var(--white); border-radius: 24px; padding: 22px; border: 1px solid var(--line); }
.form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
.toast { display: none; background: var(--foam); color: var(--teal-deep); padding: 12px 14px; border-radius: 12px; margin-top: 12px; }
footer { background: #10181d; color: #d7e0e4; padding: 48px 0 24px; }
footer a { color: #f0d7b0; text-decoration: none; }
footer h3 { color: white; font-size: 18px; }
.foot-grid { display: grid; grid-template-columns: 1.4fr 1fr 1fr 1fr; gap: 24px; }
.socials { display: flex; gap: 12px; margin-top: 10px; }
.legal { border-top: 1px solid rgba(255,255,255,0.08); margin-top: 28px; padding-top: 16px; display: flex; justify-content: space-between; gap: 12px; flex-wrap: wrap; font-size: 14px; }
.policy { padding-top: 10px; }
@media (max-width: 980px) {
  .hero-grid, .split, .adventure, .contact-grid, .foot-grid { grid-template-columns: 1fr; }
  .guide-grid, .deal-grid, .feature-grid, .testi-grid, .filters, .pack-list, .form-row { grid-template-columns: 1fr; }
  .hero-photo img, .adventure img { height: 320px; }
  .hero-card { left: 12px; }
  .nav-burger { display: inline-flex; }
  nav.primary { display: none; width: 100%; }
  .nav-toggle:checked ~ nav.primary { display: block; }
  .nav-row { flex-wrap: wrap; }
  nav.primary ul { flex-direction: column; align-items: flex-start; padding-bottom: 10px; }
  .section-head { flex-direction: column; align-items: start; }
}
@media print {
  .topbar, header.site, footer, .no-print { display: none !important; }
  body { background: white; }
  .tool-box { box-shadow: none; }
}
</style>
</head>
<body>
<a class="skip" href="#main">Skip to content</a>
<div class="topbar">
  <div class="wrap">
    <span>Field office · Portland, Maine · Weekday desk hours 9–5 ET</span>
    <span>Trip desk: <a href="tel:+12075550148">+1 (207) 555-0148</a> · <a href="mailto:hello@northlinetravel.com">hello@northlinetravel.com</a></span>
  </div>
</div>
<header class="site">
  <div class="wrap nav-row">
    <a class="brand" href="#main">
      <img src="https://placehold.co/112x112/0e3b43/f4efe6?text=NL&font=playfair+display" alt="Northline Travel logo">
      <div>
        <strong>Northline Travel</strong>
        <span>Guides, flights, and field notes for travelers who plan well—and leave room to wander.</span>
      </div>
    </a>
    <input class="nav-toggle" type="checkbox" id="nav-toggle" aria-label="Open navigation">
    <label class="nav-burger" for="nav-toggle">Menu</label>
    <nav class="primary" aria-label="Primary">
      <ul>
        <li><a href="#destinations">Destinations</a></li>
        <li><a href="#guides">Guides</a></li>
        <li><a href="#flights">Flights</a></li>
        <li><a href="#adventures">Adventures</a></li>
        <li><a href="#deals">Deals</a></li>
        <li><a href="#about">About</a></li>
        <li><a href="#contact">Contact</a></li>
      </ul>
    </nav>
  </div>
</header>
<main id="main">
  <section class="hero">
    <div class="wrap hero-grid">
      <div class="hero-copy">
        <p class="eyebrow">Travel studio · Est. 2014</p>
        <h1>Chart a route that still feels like yours.</h1>
        <p class="lede">Northline is a destination desk for people who want more than a carousel of attractions. We publish guides written like letters from a well-traveled friend, watch fare patterns worth acting on, and help you book with the context that keeps a trip from unraveling at the gate.</p>
        <p>Whether you are comparing travel insurance for a three-week Andes trek, brushing up on cultural etiquette before a family stay in Kyoto, or simply trying to understand why a “cheap” fare becomes expensive once bags and positioning flights are added, the work is the same: fewer surprises, better days, and a plan flexible enough to follow a good recommendation.</p>
        <div class="cta-row">
          <a class="btn btn-primary" href="#flights">Search Flights</a>
          <a class="btn btn-dark" href="#adventures">Book Adventure</a>
          <a class="btn btn-ghost" href="#deals">Find Deals</a>
        </div>
        <div class="stats">
          <div class="stat"><b>86</b><span>destination guides updated this season</span></div>
          <div class="stat"><b>14</b><span>years advising independent travelers</span></div>
          <div class="stat"><b>4.9</b><span>average note from returning readers</span></div>
        </div>
      </div>
      <div class="hero-photo">
        <img src="https://picsum.photos/1200/800" alt="Coastal ridgeline above a quiet harbor at late afternoon">
        <div class="hero-card">
          <span class="meta">This week’s field note</span>
          <strong>Shoulder season, done properly</strong>
          <p>Lisbon in late October still has terrace weather, thinner queues, and fares that do not assume you are on holiday with everyone else.</p>
        </div>
      </div>
    </div>
  </section>

  <section id="destinations">
    <div class="wrap">
      <div class="section-head">
        <div>
          <p class="eyebrow">Destination guides</p>
          <h2>Places we know well enough to argue about.</h2>
        </div>
        <p>Each guide covers neighborhoods worth your time, the booking windows that actually matter, how locals move through the day, and the small cultural etiquette notes that keep a visit gracious. We revise them after every season, not once a decade.</p>
      </div>
      <div class="guide-grid">
        <article class="card feature">
          <img src="https://picsum.photos/900/640" alt="Sunlit tiled street in a historic European city">
          <div class="body">
            <span class="meta">City · 6–8 days</span>
            <h3>Lisbon, unhurried</h3>
            <p>Lisbon rewards travelers who treat hills as part of the itinerary rather than an obstacle. We map tram lines against walking routes, flag the miradouros that are lovely at 8 a.m. and crowded by noon, and explain how to book a fado house without landing in a tourist revue. Seafood lunches in Alfama are still a better use of a euro than most set menus near the river.</p>
            <p>Our guide also covers day trips that justify the train—Sintra only if you go early, Cascais if you want sea air without a full excursion—and the travel insurance details worth checking if you are renting a scooter on those famous cobbles.</p>
            <a class="btn btn-ghost" href="#guides">Read the guide</a>
          </div>
        </article>
        <article class="card">
          <img src="https://picsum.photos/700/520" alt="Temple garden with raked gravel and maple trees">
          <div class="body">
            <span class="meta">Culture · 8–10 days</span>
            <h3>Kyoto, with manners</h3>
            <p>Temple hours, quiet carriage rules, and the difference between a ryokan stay and a business hotel are not footnotes. We walk through seasonal booking, rail pass math, and the etiquette of photographing neighborhoods that are also someone’s commute.</p>
            <a class="btn btn-ghost" href="#guides">Open notes</a>
          </div>
        </article>
        <article class="card">
          <img src="https://picsum.photos/680/500" alt="Wind-shaped mountains under a wide southern sky">
          <div class="body">
            <span class="meta">Wilderness · 10–14 days</span>
            <h3>Patagonia, paced</h3>
            <p>Weather writes the itinerary. We explain refugio booking, wind-proof layering, and why a flexible flight home is not a luxury when you are crossing from Chile to Argentina on a calendar the Andes does not respect.</p>
            <a class="btn btn-ghost" href="#adventures">Plan the trek</a>
          </div>
        </article>
      </div>
    </div>
  </section>

  <section id="guides" class="tools">
    <div class="wrap split">
      <article class="prose">
        <p class="eyebrow">How a Northline guide works</p>
        <h2>Practical enough to pack, specific enough to trust.</h2>
        <p>A destination guide from our desk is not a dump of “top ten” lists. It is a working document: where to stay relative to how you actually move, which reservations deserve anxiety and which can be left to the afternoon you arrive, and what a fair price looks like once taxes, city fees, and the cost of getting from the airport are included. We write for independent travelers who still want a professional second opinion.</p>
        <p>Every city chapter opens with a pace recommendation. A long weekend in Mexico City is a different trip from ten days that include neighborhoods beyond the historic core. We say so plainly, then give you sample days that can be rearranged when a museum is closed or a friend insists you try a market we had ranked second. The point of a good plan is that it survives contact with real life.</p>
        <h3>What we always include</h3>
        <p>Neighborhood fit, transit logic, a short cultural etiquette briefing, seasonal notes, and a booking sequence—what to lock first, what to leave open. For trips that involve hiking, driving, or remote lodges, we add a travel insurance checkpoint: medical evacuation, trip interruption, and gear coverage are not interchangeable, and the wrong policy is a false comfort. We also flag passport validity rules and entry forms that have a habit of changing quietly between seasons.</p>
        <p>Guides are written by editors who have stayed in the places they describe, then reviewed by a second reader whose job is to find the advice that only works if you already know the city. If a tip depends on a single café that may close, we say that. If a neighborhood is better after dark for the food and worse after dark for the walk back, we say that too.</p>
        <h3>Marrakech, as a worked example</h3>
        <p>In Marrakech we separate the medina’s useful chaos from the moments when a riad’s location will cost you an hour of luggage-hauling through lanes a taxi cannot enter. We explain how to greet shopkeepers without committing to a purchase, why Friday timings shift, and how to book a day in the Atlas without treating a village as scenery. The guide includes a modest packing note—closed shoes for the souks, a scarf that is practical rather than costume—and a reminder that travel insurance with medical coverage matters more than a flashy “cancel for any reason” upgrade if your real risk is a twisted ankle far from a clinic you know.</p>
        <p>Readers use the Marrakech notes alongside our flight desk, because the fare into Menara is only half the journey. Positioning through Madrid or Paris can be cheaper and kinder on arrival time, provided you leave enough connection margin. That is the Northline habit: the guide and the ticket are one conversation.</p>
        <a class="btn btn-primary" href="#contact">Request a guide briefing</a>
      </article>
      <aside class="rail" aria-label="Travel desk sidebar">
        <div class="panel">
          <p class="eyebrow" style="color:#f0d7b0">Trending destinations</p>
          <h3>Where readers are leaning</h3>
          <ol>
            <li>Oaxaca — food-first, festival-aware</li>
            <li>Slovenia — lakes before the July crush</li>
            <li>Busan — city energy, coastal day trips</li>
            <li>Azores — weather windows and car booking</li>
            <li>Jordan — pace, permits, and heat planning</li>
          </ol>
        </div>
        <div class="panel sand">
          <p class="eyebrow">Deal alerts</p>
          <h3>Fare notes, not noise</h3>
          <p>We send a short Wednesday note when a route we already recommend drops into a price band that makes sense after bags and seats. No daily spam, no mystery “from $99” that excludes the airport you actually use.</p>
          <form id="alert-form">
            <label class="field">Email for Wednesday alerts
              <input type="email" name="email" required placeholder="you@example.com">
            </label>
            <button class="btn btn-dark" type="submit" style="margin-top:10px">Find Deals</button>
            <p class="toast" id="alert-toast">You are on the list. The next note goes out Wednesday.</p>
          </form>
        </div>
        <div class="panel sand">
          <p class="eyebrow">Inspiration gallery</p>
          <h3>Recent field frames</h3>
          <div class="gallery">
            <img src="https://picsum.photos/400/280" alt="Market stalls with citrus and textiles">
            <img src="https://picsum.photos/420/300" alt="Quiet alpine lake in morning light">
            <img src="https://picsum.photos/380/260?grayscale" alt="Black and white harbor cranes and water">
            <img src="https://picsum.photos/440/300" alt="Desert road toward distant hills">
          </div>
        </div>
      </aside>
    </div>
  </section>

  <section id="adventures" class="band">
    <div class="wrap adventure">
      <img src="https://picsum.photos/1000/760" alt="Hikers on a high trail above a glacial valley">
      <div>
        <p class="eyebrow">Adventure travel</p>
        <h2>Wild routes, booked with adult supervision.</h2>
        <p>Adventure travel should feel expansive, not improvised to the point of risk. Northline plans treks, small-boat journeys, and overland routes with the unglamorous pieces handled first: permits, guide ratios, weather contingencies, and a travel insurance policy that actually names evacuation. Romance is welcome. Wishful logistics are not.</p>
        <p>Our adventure desk works with operators we have either traveled with or audited against a plain checklist—licensed guides, documented emergency protocols, fair wages, and a cancellation policy you can read without a lawyer. We will talk you out of a summit if the season is wrong. We will also talk you into an extra day in town so the interesting part of the trip is not spent recovering from the transfer.</p>
        <p>Popular requests this year include the W Trek with realistic daily distances, a lesser-known Dolomites hut route for hikers who prefer rifugio dinners to camping, and a Morocco-to-Atlas combination that keeps driving days short. If you want something rarer—a shoulder-season fjord kayak, a supervised volcano hike, a family safari that does not pretend children have adult attention spans—we scope it before anyone takes a deposit.</p>
        <div class="feature-grid" style="margin: 18px 0 22px;">
          <div class="feature"><h3>Fit before flash</h3><p>We match mileage, altitude, and lodging style to the people actually going, including the friend who says they hike and means flat paths.</p></div>
          <div class="feature"><h3>Insurance, named</h3><p>Medical, evacuation, delay, and gear are reviewed line by line so “comprehensive” is not just a brochure word.</p></div>
          <div class="feature"><h3>Booking sequence</h3><p>Huts and internal flights first, international tickets once the spine of the trip can flex by a day.</p></div>
        </div>
        <a class="btn btn-primary" href="#contact">Book Adventure</a>
      </div>
    </div>
  </section>

  <section id="flights">
    <div class="wrap">
      <div class="section-head">
        <div>
          <p class="eyebrow">Flight deals</p>
          <h2>Fares we would actually buy.</h2>
        </div>
        <p>A low number is not a deal if it lands at 1 a.m., excludes a bag you cannot live without, or requires a connection you would not wish on a colleague. We publish routes with the total shape of the journey attached.</p>
      </div>
      <form class="tool-box no-print" id="flight-form" style="margin-bottom:18px">
        <div class="filters">
          <label class="field">From
            <select id="from">
              <option>Boston (BOS)</option>
              <option>New York (JFK)</option>
              <option>Chicago (ORD)</option>
              <option>Seattle (SEA)</option>
            </select>
          </label>
          <label class="field">Region
            <select id="region">
              <option value="all">Anywhere we recommend</option>
              <option value="europe">Europe</option>
              <option value="asia">Asia</option>
              <option value="americas">Americas</option>
              <option value="africa">Africa &amp; Middle East</option>
            </select>
          </label>
          <label class="field">Cabin preference
            <select id="cabin">
              <option value="any">Any sensible fare</option>
              <option value="economy">Economy</option>
              <option value="premium">Premium economy or better</option>
            </select>
          </label>
          <label class="field">Max base fare
            <select id="max">
              <option value="9999">No ceiling</option>
              <option value="700">Under $700</option>
              <option value="1100">Under $1,100</option>
              <option value="1600">Under $1,600</option>
            </select>
          </label>
        </div>
        <button class="btn btn-primary" type="submit">Search Flights</button>
        <p class="note" id="flight-count" style="margin-top:10px">Showing routes our desk is comfortable recommending this month. Prices are sample round-trips before bags and seats.</p>
      </form>
      <div class="deal-grid" id="deals">
        <article class="deal" data-region="europe" data-price="640" data-cabin="economy">
          <span class="meta">Europe · shoulder</span>
          <p class="route">Boston → Lisbon</p>
          <p class="price">$640 <small>round-trip</small></p>
          <p>One stop, daytime arrival, bag not included. Best if you can travel Tuesday to Tuesday in late October. We like TAP or a codeshare that keeps the return on a single ticket.</p>
        </article>
        <article class="deal" data-region="asia" data-price="1180" data-cabin="economy">
          <span class="meta">Asia · 11 days+</span>
          <p class="route">Seattle → Osaka</p>
          <p class="price">$1,180 <small>round-trip</small></p>
          <p>Nonstop window in March. Build Kyoto nights after you land, not before—you will want the first evening horizontal. Rail pass math is in the guide, not in the fare.</p>
        </article>
        <article class="deal" data-region="americas" data-price="890" data-cabin="economy">
          <span class="meta">Americas · trek</span>
          <p class="route">New York → Buenos Aires</p>
          <p class="price">$890 <small>round-trip</small></p>
          <p>Leave connection slack before any domestic hop toward El Calafate. This fare only works if your Patagonia dates can slide by 24 hours when wind closes a runway.</p>
        </article>
        <article class="deal" data-region="africa" data-price="980" data-cabin="economy">
          <span class="meta">Africa · city + Atlas</span>
          <p class="route">Chicago → Marrakech</p>
          <p class="price">$980 <small>round-trip</small></p>
          <p>Via Europe, with a legal connection over three hours. Do not book the 55-minute option. Riad transfers should be arranged before you land; the medina is not a curbside pickup.</p>
        </article>
        <article class="deal" data-region="europe" data-price="1540" data-cabin="premium">
          <span class="meta">Europe · premium</span>
          <p class="route">Boston → Reykjavík</p>
          <p class="price">$1,540 <small>premium economy</small></p>
          <p>Useful as a stopover rather than a blur. Four nights is the minimum if you want a lagoon, a weather-flexible south coast day, and one evening that is not a transfer.</p>
        </article>
        <article class="deal" data-region="asia" data-price="1420" data-cabin="premium">
          <span class="meta">Asia · long haul</span>
          <p class="route">New York → Singapore</p>
          <p class="price">$1,420 <small>premium economy</small></p>
          <p>A fair band when the schedule avoids a red-eye into a same-day meeting with humidity. We pair this with neighborhood stays, not a resort island bolted on at the last minute.</p>
        </article>
      </div>
    </div>
  </section>

  <section id="deals">
    <div class="wrap split">
      <article class="prose">
        <p class="eyebrow">Booking resources</p>
        <h2>The unglamorous half of a good trip.</h2>
        <p>Most travel regret is administrative. A beautiful itinerary still fails if the name on the ticket does not match the passport, if a lodging deposit is non-refundable the week your hike permits are denied, or if travel insurance was bought after the storm watch became a named event. Northline’s booking notes exist to keep those failures rare.</p>
        <h3>Travel insurance, without the fog</h3>
        <p>We ask three questions before recommending a policy: where you are going, what could actually go wrong, and what you cannot self-fund. A city weekend may need little more than trip interruption and medical. A trek, a scuba liveaboard, or any itinerary with bush flights needs evacuation language you can point to. “Adventure sports” riders are not universal—if your plan includes altitude above a stated limit, say so before you pay. We also remind readers that credit-card coverage is a supplement, not a personality. Read the exclusion for pre-existing conditions and the deadline to insure a pre-paid trip.</p>
        <p>Buy insurance when the first substantial payment is made, not the night before departure. If you want cancel-for-any-reason, know that it is partial reimbursement, time-limited, and rarely the smartest dollar if your real exposure is medical care abroad. Our desk will review a policy summary you already hold; we do not earn a commission for steering you toward a brand.</p>
        <h3>Cultural etiquette that travels</h3>
        <p>Etiquette is not a costume and it is not a list of fears. It is a way of moving through someone else’s weekday. In Japan, that means quieter voices on trains, shoes off where indicated, and photographs that do not turn a resident’s gate into content. In Morocco, it means asking before photographing people, dressing so shoulders and knees are covered in religious spaces, and understanding that a firm “no, thank you” in the souk is kinder than a vague maybe. In much of Latin America, greetings come before business—even the business of ordering coffee.</p>
        <p>Our guides include a one-page etiquette brief you can read on the flight: greetings, tipping norms, dress for sacred sites, and the local view of bargaining. We would rather you feel slightly formal on day one than apologetic on day three. When customs differ inside a country—as they do between a capital and a village—we say which note applies where.</p>
        <h3>A booking order that holds</h3>
        <p>Lock the scarce thing first. On many adventure trips that is a hut, a guide permit, or an internal flight with two departures a week. International tickets come next, with a change policy that matches the uncertainty of the scarce thing. Lodging in major cities can often wait a little longer, except during festivals, when “we’ll find something” becomes a very expensive sentence. Keep confirmation names identical to your passport, store them offline, and share a copy with someone who is not on the trip.</p>
        <p>If you want us to sequence the booking for you, the trip desk does that as a paid briefing or a full plan. Either way, you leave with a calendar, a document checklist, and a clear note on what is refundable. That is the product: confidence you can pack.</p>
      </article>
      <aside class="rail">
        <div class="panel sand">
          <p class="eyebrow">Document checklist</p>
          <h3>Before you pay the deposit</h3>
          <ul>
            <li>Passport validity beyond the destination’s stated minimum</li>
            <li>Entry form or visa timeline, including transit countries</li>
            <li>Name match across tickets, lodging, and permits</li>
            <li>Travel insurance effective date aligned to first payment</li>
            <li>Offline copies of confirmations and emergency contacts</li>
            <li>A realistic connection minimum, especially with bags</li>
          </ul>
        </div>
        <div class="panel">
          <h3>Need a second set of eyes?</h3>
          <p>Send your draft itinerary. We reply with sequencing, insurance gaps, and etiquette notes specific to the places on your list—not a generic packing PDF.</p>
          <a class="btn btn-primary" href="#contact">Talk to the desk</a>
        </div>
      </aside>
    </div>
  </section>

  <section class="tools" id="packing">
    <div class="wrap">
      <div class="section-head">
        <div>
          <p class="eyebrow">Packing studio</p>
          <h2>A list that matches the trip you are actually taking.</h2>
        </div>
        <p>Tell us the shape of the journey. We will build a practical list—documents, climate layers, and the extras that matter for cities, trails, or coastlines. Check items off, add your own, and print it before the bag gets optimistic.</p>
      </div>
      <div class="tool-box">
        <form id="pack-form">
          <div class="filters">
            <label class="field">Trip style
              <select id="style">
                <option value="city">City &amp; culture</option>
                <option value="beach">Coast &amp; islands</option>
                <option value="trek">Trek &amp; adventure</option>
              </select>
            </label>
            <label class="field">Climate
              <select id="climate">
                <option value="mild">Mild / changeable</option>
                <option value="warm">Warm</option>
                <option value="cold">Cold</option>
              </select>
            </label>
            <label class="field">Length
              <select id="length">
                <option value="short">Under a week</option>
                <option value="long">A week or more</option>
              </select>
            </label>
            <label class="field">Add a personal item
              <input id="custom-item" type="text" placeholder="e.g. prescription glasses">
            </label>
          </div>
          <div class="cta-row">
            <button class="btn btn-dark" type="submit">Build packing list</button>
            <button class="btn btn-ghost" type="button" id="print-list">Print list</button>
          </div>
        </form>
        <p class="note" id="pack-progress">Your list will appear here. Essentials include travel insurance documents and passport copies on every trip.</p>
        <ul class="pack-list" id="pack-list" aria-live="polite"></ul>
      </div>
    </div>
  </section>

  <section id="about">
    <div class="wrap">
      <div class="section-head">
        <div>
          <p class="eyebrow">About Northline</p>
          <h2>A small desk with a long memory for routes.</h2>
        </div>
        <p>Northline Travel began as a shared notebook between two editors who were tired of recommending trips they would not take themselves. It is still independent, still based in Portland, and still more interested in a well-paced week than a logo-covered itinerary.</p>
      </div>
      <div class="feature-grid">
        <article class="card"><div class="body"><h3>Editors, not influencers</h3><p>Guides are reported, revised, and dated. If we have not been recently, we say whose notes we are trusting and when they were last checked. Affiliate links, when used for booking tools, are labeled. Advice does not bend toward the highest commission.</p></div></article>
        <article class="card"><div class="body"><h3>Travelers, not templates</h3><p>A honeymoon, a solo research trip, and a three-generation family holiday do not share a packing list or a daily mileage. We ask how you like mornings, what you refuse to skip, and where you want the plan to go quiet.</p></div></article>
        <article class="card"><div class="body"><h3>Care for the places</h3><p>We favor operators who hire locally, lodgings that can absorb visitors without crowding out residents, and seasons that are kinder to both landscapes and queues. Cultural etiquette is part of the product, not a footnote after the gift shop.</p></div></article>
      </div>
      <div class="testi-grid" style="margin-top:28px">
        <article class="testi">
          <p>“Northline talked us out of a too-tight Patagonia connection and into travel insurance that covered the wind delay we actually had. The guide read like someone had walked the town with a suitcase, not a drone.”</p>
          <div class="who">
            <img src="https://i.pravatar.cc/80?u=amira-northline" alt="Portrait of Amira Shah">
            <div><strong>Amira Shah</strong><span>Architect, Chicago · Andes trip</span></div>
          </div>
        </article>
        <article class="testi">
          <p>“I booked Kyoto with their etiquette notes open on my phone. Nothing dramatic happened, which is the point. Trains were calmer, temples felt respectful, and the ryokan reservation matched the passport name on the first try.”</p>
          <div class="who">
            <img src="https://i.pravatar.cc/80?u=jonas-veld" alt="Portrait of Jonas Veld">
            <div><strong>Jonas Veld</strong><span>Teacher, Utrecht · Japan</span></div>
          </div>
        </article>
        <article class="testi">
          <p>“The flight note saved us more than the fare difference. They flagged a ‘deal’ that arrived at midnight with no checked bag. We paid a little more, slept, and started Lisbon properly. That is the whole service.”</p>
          <div class="who">
            <img src="https://i.pravatar.cc/80?u=lena-okonkwo" alt="Portrait of Lena Okonkwo">
            <div><strong>Lena Okonkwo</strong><span>Physician, Boston · Portugal</span></div>
          </div>
        </article>
      </div>
    </div>
  </section>

  <section>
    <div class="wrap faq">
      <p class="eyebrow">Questions from the desk</p>
      <h2>Before you write to us.</h2>
      <details open>
        <summary>When should I buy travel insurance?</summary>
        <p>As soon as you have made a payment you would hate to lose, and before a foreseeable event—storm season, a known strike, a medical change—becomes the reason you want coverage. Compare medical limits, evacuation, and whether your activities are excluded. If you already have a policy, send us the summary and we will mark the gaps rather than sell you a second one by default.</p>
      </details>
      <details>
        <summary>Do you book flights directly?</summary>
        <p>We advise, sequence, and can ticket through licensed partners when you want a single responsible party. Many readers prefer to book the recommended fare themselves once they understand bags, changes, and connection risk. Either path is fine. We will not push a worse schedule because it pays us more.</p>
      </details>
      <details>
        <summary>How far ahead should adventure travel be booked?</summary>
        <p>Permits and huts on famous routes can require several months, sometimes a full season. Internal flights in Patagonia, the Arctic, and parts of the Pacific fill in irregular bursts. City hotels are usually more forgiving outside festivals. We build the calendar backward from the scarce inventory, then choose international tickets that can move a day without a penalty that ruins the math.</p>
      </details>
      <details>
        <summary>What cultural etiquette mistakes do you see most?</summary>
        <p>Treating a neighborhood as a set, skipping greetings, photographing people without asking, and dressing for the climate while ignoring the sacred site. Volume is the other one—trains, temples, and early courtyards are not cocktail bars. Our briefs are short on purpose so they get read.</p>
      </details>
      <details>
        <summary>Can you help if I already booked the wrong thing?</summary>
        <p>Often, yes. Send confirmations and dates. We look for change windows, unused credit, and a revised pace that salvages the trip rather than pretending the original plan still fits. Recovery is less glamorous than a blank map, and it is some of our most useful work.</p>
      </details>
    </div>
  </section>

  <section id="contact">
    <div class="wrap contact-grid">
      <div>
        <p class="eyebrow">Contact</p>
        <h2>Tell us where you want to go, and how you like to travel.</h2>
        <p>Northline Travel<br>184 Harbor Walk, Suite 400<br>Portland, Maine 04101</p>
        <p>Phone: <a href="tel:+12075550148">+1 (207) 555-0148</a><br>Email: <a href="mailto:hello@northlinetravel.com">hello@northlinetravel.com</a></p>
        <p>The desk reads new inquiries each weekday morning. If your departure is inside ten days, call—email is for planning, not for a gate change. For press and partnerships, write editors@northlinetravel.com. We do not sell reader lists.</p>
      </div>
      <form class="form-card" id="contact-form">
        <div class="form-row">
          <label class="field">Name
            <input name="name" required autocomplete="name">
          </label>
          <label class="field">Email
            <input type="email" name="email" required autocomplete="email">
          </label>
        </div>
        <label class="field" style="margin-top:12px">What should we help with?
          <select name="interest">
            <option>Destination guide briefing</option>
            <option>Flight search review</option>
            <option>Adventure booking</option>
            <option>Travel insurance check</option>
            <option>Something already booked</option>
          </select>
        </label>
        <label class="field" style="margin-top:12px">Trip notes
          <textarea name="notes" required placeholder="Dates, travelers, places you are considering, and anything you refuse to do."></textarea>
        </label>
        <button class="btn btn-primary" type="submit" style="margin-top:14px">Send to the desk</button>
        <p class="toast" id="contact-toast">Received. A planner will reply on the next weekday with questions, not a canned itinerary.</p>
      </form>
    </div>
  </section>

  <section id="privacy" class="policy">
    <div class="wrap prose">
      <h2>Privacy</h2>
      <p>Northline Travel collects only what we need to answer an inquiry, deliver a guide, or send the Wednesday deal note you requested. That typically means your name, email, trip details, and any documents you choose to share. We do not sell personal information. Form data on this demonstration page stays in your browser and is not transmitted to a server.</p>
      <p>If you subscribe to deal alerts, you can leave the list by writing unsubscribe in the subject line to hello@northlinetravel.com. Analytics, if enabled on a future production host, would be used to understand which guides are useful—not to build a profile for unrelated advertising. Questions about your information can be sent to the same address.</p>
    </div>
  </section>
  <section id="terms" class="policy">
    <div class="wrap prose">
      <h2>Terms</h2>
      <p>Guides, fare notes, and sample itineraries are editorial advice, not a guarantee of availability, visa approval, weather, or operator performance. You are responsible for confirming entry rules, names on tickets, and the terms of any booking you complete with an airline, insurer, or lodge. Prices shown on this page are illustrative planning figures.</p>
      <p>Paid briefings are scoped in writing before work begins. Unless a separate agreement says otherwise, planning fees cover research and recommendations, not the cost of travel itself. Adventure bookings made through partners remain subject to those partners’ cancellation rules, which we will surface before you pay.</p>
    </div>
  </section>
</main>
<footer>
  <div class="wrap">
    <div class="foot-grid">
      <div>
        <h3>Northline Travel</h3>
        <p>Destination guides, flight intelligence, and tourism advice from a desk that still answers the phone.</p>
        <p>184 Harbor Walk, Suite 400<br>Portland, Maine 04101</p>
        <div class="socials">
          <a href="#contact">Instagram</a>
          <a href="#contact">Journal</a>
          <a href="#contact">Pinterest</a>
        </div>
      </div>
      <div>
        <h3>Explore</h3>
        <p><a href="#destinations">Destinations</a></p>
        <p><a href="#guides">Guides</a></p>
        <p><a href="#flights">Flights</a></p>
        <p><a href="#adventures">Adventures</a></p>
      </div>
      <div>
        <h3>Desk</h3>
        <p><a href="#deals">Deals</a></p>
        <p><a href="#about">About</a></p>
        <p><a href="#contact">Contact</a></p>
        <p><a href="#packing">Packing studio</a></p>
      </div>
      <div>
        <h3>Policies</h3>
        <p><a href="#privacy">Privacy</a></p>
        <p><a href="#terms">Terms</a></p>
        <p><a href="mailto:hello@northlinetravel.com">hello@northlinetravel.com</a></p>
        <p><a href="tel:+12075550148">+1 (207) 555-0148</a></p>
      </div>
    </div>
    <div class="legal">
      <span>&copy; <span id="year">2026</span> Northline Travel. All rights reserved.</span>
      <span>Plan well. Leave room to wander.</span>
    </div>
  </div>
</footer>
<script>
document.getElementById("year").textContent = new Date().getFullYear();
document.getElementById("alert-form").addEventListener("submit", function (e) {
  e.preventDefault();
  document.getElementById("alert-toast").style.display = "block";
  this.reset();
});
document.getElementById("contact-form").addEventListener("submit", function (e) {
  e.preventDefault();
  document.getElementById("contact-toast").style.display = "block";
  this.reset();
});
var deals = Array.prototype.slice.call(document.querySelectorAll("#deals .deal"));
document.getElementById("flight-form").addEventListener("submit", function (e) {
  e.preventDefault();
  var region = document.getElementById("region").value;
  var cabin = document.getElementById("cabin").value;
  var max = Number(document.getElementById("max").value);
  var shown = 0;
  deals.forEach(function (card) {
    var okRegion = region === "all" || card.dataset.region === region;
    var okCabin = cabin === "any" || card.dataset.cabin === cabin || (cabin === "economy" && card.dataset.cabin === "economy");
    var okPrice = Number(card.dataset.price) <= max;
    var visible = okRegion && okCabin && okPrice;
    card.style.display = visible ? "block" : "none";
    if (visible) shown += 1;
  });
  var from = document.getElementById("from").value;
  document.getElementById("flight-count").textContent = shown
    ? "Showing " + shown + " route" + (shown === 1 ? "" : "s") + " that fit a search from " + from + ". Compare bags and arrival times before you book."
    : "No sample fares match those filters. Widen the region or ceiling, or write the desk with your dates.";
});
var catalog = {
  essentials: ["Passport plus two photocopies stored separately", "Travel insurance documents and emergency numbers", "Offline maps and lodging confirmations", "Medications in original packaging", "Universal adapter and a short charging cable", "Reusable bottle and a small day bag"],
  city: ["Broken-in walking shoes", "Compact crossbody that closes fully", "Layers for air-conditioned museums", "Transit card or contactless payment backup"],
  beach: ["Reef-safe sunscreen", "Swimwear and a quick-dry layer", "Sandals that can handle uneven paths", "Light scarf for sun and modest dress codes"],
  trek: ["Boots you have already walked in", "Rain shell and pack cover", "Headlamp with spare batteries", "Electrolytes and a basic blister kit", "Copy of permits and guide contacts"],
  warm: ["Breathable shirts", "Sun hat", "After-sun lotion"],
  cold: ["Insulating midlayer", "Warm hat and gloves", "Thermal base layer"],
  mild: ["Light sweater or shirt-jacket", "Scarf that works indoors and out"],
  long: ["Travel laundry soap", "Extra prescription buffer", "A second pair of socks you trust"]
};
var packList = document.getElementById("pack-list");
var progress = document.getElementById("pack-progress");
function renderPack(items) {
  packList.innerHTML = "";
  items.forEach(function (item, i) {
    var li = document.createElement("li");
    var box = document.createElement("input");
    box.type = "checkbox";
    box.id = "pack-" + i;
    box.addEventListener("change", updateProgress);
    var label = document.createElement("label");
    label.setAttribute("for", box.id);
    label.textContent = item;
    li.appendChild(box);
    li.appendChild(label);
    packList.appendChild(li);
  });
  updateProgress();
}
function updateProgress() {
  var boxes = packList.querySelectorAll("input");
  var done = packList.querySelectorAll("input:checked").length;
  progress.textContent = boxes.length
    ? done + " of " + boxes.length + " packed. Keep insurance papers and passport copies near the top of the bag, not in checked luggage."
    : "Your list will appear here.";
}
document.getElementById("pack-form").addEventListener("submit", function (e) {
  e.preventDefault();
  var style = document.getElementById("style").value;
  var climate = document.getElementById("climate").value;
  var length = document.getElementById("length").value;
  var items = catalog.essentials.concat(catalog[style], catalog[climate]);
  if (length === "long") items = items.concat(catalog.long);
  var custom = document.getElementById("custom-item").value.trim();
  if (custom) items.push(custom);
  renderPack(items);
});
document.getElementById("print-list").addEventListener("click", function () {
  if (!packList.children.length) {
    document.getElementById("pack-form").requestSubmit();
  }
  window.print();
});
</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:04:10.377Z",
  "url": "https://benchmark.aimac.invalid/073792abaf14c4707fb9949fad7da6595e5118ace8f80f32f7a1858e6b1ddc11.html",
  "toolOptions": {
    "runOnly": {
      "type": "tag",
      "values": [
        "wcag2a",
        "wcag2aa",
        "wcag21a",
        "wcag21aa",
        "wcag22a",
        "wcag22aa"
      ]
    },
    "resultTypes": [
      "violations"
    ],
    "reporter": "v1"
  },
  "inapplicable": [
    {
      "id": "area-alt",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag244",
        "wcag412",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT6.a",
        "EN-301-549",
        "EN-9.2.4.4",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure <area> elements of image maps have alternative text",
      "help": "Active <area> elements must have alternative text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/area-alt?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-braille-equivalent",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure aria-braillelabel and aria-brailleroledescription have a non-braille equivalent",
      "help": "aria-braille attributes must have a non-braille equivalent",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-braille-equivalent?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-command-name",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "TTv5",
        "TT6.a",
        "EN-301-549",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure every ARIA button, link and menuitem has an accessible name",
      "help": "ARIA commands must have an accessible name",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-command-name?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-deprecated-role",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure elements do not use deprecated roles",
      "help": "Deprecated ARIA roles must not be used",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-deprecated-role?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-hidden-focus",
      "impact": null,
      "tags": [
        "cat.name-role-value",
        "wcag2a",
        "wcag412",
        "TTv5",
        "TT6.a",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure aria-hidden elements are not focusable nor contain focusable elements",
      "help": "ARIA hidden element must not be focusable or contain focusable elements",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-hidden-focus?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-input-field-name",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "TTv5",
        "TT5.c",
        "EN-301-549",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure every ARIA input field has an accessible name",
      "help": "ARIA input fields must have an accessible name",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-input-field-name?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-meter-name",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag111",
        "EN-301-549",
        "EN-9.1.1.1"
      ],
      "description": "Ensure every ARIA meter node has an accessible name",
      "help": "ARIA meter nodes must have an accessible name",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-meter-name?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-progressbar-name",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag111",
        "EN-301-549",
        "EN-9.1.1.1"
      ],
      "description": "Ensure every ARIA progressbar node has an accessible name",
      "help": "ARIA progressbar nodes must have an accessible name",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-progressbar-name?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-required-attr",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure elements with ARIA roles have all required ARIA attributes",
      "help": "Required ARIA attributes must be provided",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-required-attr?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-required-children",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag131",
        "EN-301-549",
        "EN-9.1.3.1"
      ],
      "description": "Ensure elements with an ARIA role that require child roles contain them",
      "help": "Certain ARIA roles must contain particular children",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-required-children?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-required-parent",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag131",
        "EN-301-549",
        "EN-9.1.3.1"
      ],
      "description": "Ensure elements with an ARIA role that require parent roles are contained by them",
      "help": "Certain ARIA roles must be contained by particular parents",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-required-parent?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-roles",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure all elements with a role attribute use a valid value",
      "help": "ARIA roles used must conform to valid values",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-roles?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-toggle-field-name",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "TTv5",
        "TT5.c",
        "EN-301-549",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure every ARIA toggle field has an accessible name",
      "help": "ARIA toggle fields must have an accessible name",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-toggle-field-name?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-tooltip-name",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure every ARIA tooltip node has an accessible name",
      "help": "ARIA tooltip nodes must have an accessible name",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-tooltip-name?application=axeAPI",
      "nodes": []
    },
    {
      "id": "blink",
      "impact": null,
      "tags": [
        "cat.time-and-media",
        "wcag2a",
        "wcag222",
        "section508",
        "section508.22.j",
        "TTv5",
        "TT2.b",
        "EN-301-549",
        "EN-9.2.2.2"
      ],
      "description": "Ensure <blink> elements are not used",
      "help": "<blink> elements are deprecated and must not be used",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/blink?application=axeAPI",
      "nodes": []
    },
    {
      "id": "definition-list",
      "impact": null,
      "tags": [
        "cat.structure",
        "wcag2a",
        "wcag131",
        "EN-301-549",
        "EN-9.1.3.1"
      ],
      "description": "Ensure <dl> elements are structured correctly",
      "help": "<dl> elements must only directly contain properly-ordered <dt> and <dd> groups, <script>, <template> or <div> elements",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/definition-list?application=axeAPI",
      "nodes": []
    },
    {
      "id": "dlitem",
      "impact": null,
      "tags": [
        "cat.structure",
        "wcag2a",
        "wcag131",
        "EN-301-549",
        "EN-9.1.3.1"
      ],
      "description": "Ensure <dt> and <dd> elements are contained by a <dl>",
      "help": "<dt> and <dd> elements must be contained by a <dl>",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/dlitem?application=axeAPI",
      "nodes": []
    },
    {
      "id": "frame-focusable-content",
      "impact": null,
      "tags": [
        "cat.keyboard",
        "wcag2a",
        "wcag211",
        "TTv5",
        "TT4.a",
        "EN-301-549",
        "EN-9.2.1.1"
      ],
      "description": "Ensure <frame> and <iframe> elements with focusable content do not have tabindex=-1",
      "help": "Frames with focusable content must not have tabindex=-1",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/frame-focusable-content?application=axeAPI",
      "nodes": []
    },
    {
      "id": "frame-title-unique",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag412",
        "TTv5",
        "TT12.d",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure <iframe> and <frame> elements contain a unique title attribute",
      "help": "Frames must have a unique title attribute",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/frame-title-unique?application=axeAPI",
      "nodes": []
    },
    {
      "id": "frame-title",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag412",
        "section508",
        "section508.22.i",
        "TTv5",
        "TT12.d",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure <iframe> and <frame> elements have an accessible name",
      "help": "Frames must have an accessible name",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/frame-title?application=axeAPI",
      "nodes": []
    },
    {
      "id": "html-xml-lang-mismatch",
      "impact": null,
      "tags": [
        "cat.language",
        "wcag2a",
        "wcag311",
        "EN-301-549",
        "EN-9.3.1.1",
        "ACT"
      ],
      "description": "Ensure that HTML elements with both valid lang and xml:lang attributes agree on the base language of the page",
      "help": "HTML elements with lang and xml:lang must have the same base language",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/html-xml-lang-mismatch?application=axeAPI",
      "nodes": []
    },
    {
      "id": "input-button-name",
      "impact": null,
      "tags": [
        "cat.name-role-value",
        "wcag2a",
        "wcag412",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT5.c",
        "EN-301-549",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure input buttons have discernible text",
      "help": "Input buttons must have discernible text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/input-button-name?application=axeAPI",
      "nodes": []
    },
    {
      "id": "input-image-alt",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag111",
        "wcag412",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT7.a",
        "EN-301-549",
        "EN-9.1.1.1",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure <input type=\"image\"> elements have alternative text",
      "help": "Image buttons must have alternative text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/input-image-alt?application=axeAPI",
      "nodes": []
    },
    {
      "id": "marquee",
      "impact": null,
      "tags": [
        "cat.parsing",
        "wcag2a",
        "wcag222",
        "TTv5",
        "TT2.b",
        "EN-301-549",
        "EN-9.2.2.2"
      ],
      "description": "Ensure <marquee> elements are not used",
      "help": "<marquee> elements are deprecated and must not be used",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/marquee?application=axeAPI",
      "nodes": []
    },
    {
      "id": "meta-refresh",
      "impact": null,
      "tags": [
        "cat.time-and-media",
        "wcag2a",
        "wcag221",
        "TTv5",
        "TT8.a",
        "EN-301-549",
        "EN-9.2.2.1"
      ],
      "description": "Ensure <meta http-equiv=\"refresh\"> is not used for delayed refresh",
      "help": "Delayed refresh under 20 hours must not be used",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/meta-refresh?application=axeAPI",
      "nodes": []
    },
    {
      "id": "object-alt",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag111",
        "section508",
        "section508.22.a",
        "EN-301-549",
        "EN-9.1.1.1"
      ],
      "description": "Ensure <object> elements have alternative text",
      "help": "<object> elements must have alternative text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/object-alt?application=axeAPI",
      "nodes": []
    },
    {
      "id": "role-img-alt",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag111",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT7.a",
        "EN-301-549",
        "EN-9.1.1.1",
        "ACT"
      ],
      "description": "Ensure [role=\"img\"] elements have alternative text",
      "help": "[role=\"img\"] elements must have an alternative text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/role-img-alt?application=axeAPI",
      "nodes": []
    },
    {
      "id": "scrollable-region-focusable",
      "impact": null,
      "tags": [
        "cat.keyboard",
        "wcag2a",
        "wcag211",
        "wcag213",
        "TTv5",
        "TT4.a",
        "EN-301-549",
        "EN-9.2.1.1",
        "EN-9.2.1.3"
      ],
      "description": "Ensure elements that have scrollable content are accessible by keyboard",
      "help": "Scrollable region must have keyboard access",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/scrollable-region-focusable?application=axeAPI",
      "nodes": []
    },
    {
      "id": "server-side-image-map",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag211",
        "section508",
        "section508.22.f",
        "TTv5",
        "TT4.a",
        "EN-301-549",
        "EN-9.2.1.1"
      ],
      "description": "Ensure that server-side image maps are not used",
      "help": "Server-side image maps must not be used",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/server-side-image-map?application=axeAPI",
      "nodes": []
    },
    {
      "id": "svg-img-alt",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag111",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT7.a",
        "EN-301-549",
        "EN-9.1.1.1",
        "ACT"
      ],
      "description": "Ensure <svg> elements with an img, graphics-document or graphics-symbol role have an accessible text",
      "help": "<svg> elements with an img role must have an alternative text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/svg-img-alt?application=axeAPI",
      "nodes": []
    },
    {
      "id": "td-headers-attr",
      "impact": null,
      "tags": [
        "cat.tables",
        "wcag2a",
        "wcag131",
        "section508",
        "section508.22.g",
        "TTv5",
        "TT14.b",
        "EN-301-549",
        "EN-9.1.3.1"
      ],
      "description": "Ensure that each cell in a table that uses the headers attribute refers only to other cells in that table",
      "help": "Table cells that use the headers attribute must only refer to cells in the same table",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/td-headers-attr?application=axeAPI",
      "nodes": []
    },
    {
      "id": "th-has-data-cells",
      "impact": null,
      "tags": [
        "cat.tables",
        "wcag2a",
        "wcag131",
        "section508",
        "section508.22.g",
        "TTv5",
        "TT14.b",
        "EN-301-549",
        "EN-9.1.3.1"
      ],
      "description": "Ensure that <th> elements and elements with role=columnheader/rowheader have data cells they describe",
      "help": "Table headers in a data table must refer to data cells",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/th-has-data-cells?application=axeAPI",
      "nodes": []
    },
    {
      "id": "valid-lang",
      "impact": null,
      "tags": [
        "cat.language",
        "wcag2aa",
        "wcag312",
        "TTv5",
        "TT11.b",
        "EN-301-549",
        "EN-9.3.1.2",
        "ACT"
      ],
      "description": "Ensure lang attributes have valid values",
      "help": "lang attribute must have a valid value",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/valid-lang?application=axeAPI",
      "nodes": []
    },
    {
      "id": "video-caption",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag122",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT17.a",
        "EN-301-549",
        "EN-9.1.2.2"
      ],
      "description": "Ensure <video> elements have captions",
      "help": "<video> elements must have captions",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/video-caption?application=axeAPI",
      "nodes": []
    },
    {
      "id": "no-autoplay-audio",
      "impact": null,
      "tags": [
        "cat.time-and-media",
        "wcag2a",
        "wcag142",
        "TTv5",
        "TT2.a",
        "EN-301-549",
        "EN-9.1.4.2",
        "ACT"
      ],
      "description": "Ensure <video> or <audio> elements do not autoplay audio for more than 3 seconds without a control mechanism to stop or mute the audio",
      "help": "<video> or <audio> elements must not play automatically",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/no-autoplay-audio?application=axeAPI",
      "nodes": []
    }
  ],
  "passes": [
    {
      "id": "aria-allowed-attr",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure an element's role supports its ARIA attributes",
      "help": "Elements must only use supported ARIA attributes",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-allowed-attr?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [
            {
              "id": "aria-allowed-attr",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "ARIA attributes are used correctly for the defined role"
            }
          ],
          "none": [
            {
              "id": "aria-unsupported-attr",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "ARIA attribute is supported"
            }
          ],
          "impact": null,
          "html": "<input class=\"nav-toggle\" type=\"checkbox\" id=\"nav-toggle\" aria-label=\"Open navigation\">",
          "target": [
            "#nav-toggle"
          ]
        }
      ]
    },
    {
      "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": "<input class=\"nav-toggle\" type=\"checkbox\" id=\"nav-toggle\" aria-label=\"Open navigation\">",
          "target": [
            "#nav-toggle"
          ]
        }
      ]
    },
    {
      "id": "aria-hidden-body",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag131",
        "wcag412",
        "EN-301-549",
        "EN-9.1.3.1",
        "EN-9.4.1.2"
      ],
      "description": "Ensure aria-hidden=\"true\" is not present on the document body.",
      "help": "aria-hidden=\"true\" must not be present on the document body",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-hidden-body?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "aria-hidden-body",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "No aria-hidden attribute is present on document body"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<body>",
          "target": [
            "body"
          ]
        }
      ]
    },
    {
      "id": "aria-prohibited-attr",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure ARIA attributes are not prohibited for an element's role",
      "help": "Elements must only use permitted ARIA attributes",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-prohibited-attr?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [],
          "none": [
            {
              "id": "aria-prohibited-attr",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "ARIA attribute is allowed"
            }
          ],
          "impact": null,
          "html": "<input class=\"nav-toggle\" type=\"checkbox\" id=\"nav-toggle\" aria-label=\"Open navigation\">",
          "target": [
            "#nav-toggle"
          ]
        }
      ]
    },
    {
      "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": "<input class=\"nav-toggle\" type=\"checkbox\" id=\"nav-toggle\" aria-label=\"Open navigation\">",
          "target": [
            "#nav-toggle"
          ]
        }
      ]
    },
    {
      "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": "<input class=\"nav-toggle\" type=\"checkbox\" id=\"nav-toggle\" aria-label=\"Open navigation\">",
          "target": [
            "#nav-toggle"
          ]
        }
      ]
    },
    {
      "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 name=\"name\" required=\"\" autocomplete=\"name\">",
          "target": [
            "input[name=\"name\"]"
          ]
        }
      ]
    },
    {
      "id": "avoid-inline-spacing",
      "impact": null,
      "tags": [
        "cat.structure",
        "wcag21aa",
        "wcag1412",
        "EN-301-549",
        "EN-9.1.4.12",
        "ACT"
      ],
      "description": "Ensure that text spacing set through style attributes can be adjusted with custom stylesheets",
      "help": "Inline text spacing must be adjustable with custom stylesheets",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/avoid-inline-spacing?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [
            {
              "id": "important-letter-spacing",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "Letter-spacing in the style attribute is not set to !important, or meets the minimum"
            },
            {
              "id": "important-word-spacing",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "word-spacing in the style attribute is not set to !important, or meets the minimum"
            },
            {
              "id": "important-line-height",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "line-height in the style attribute is not set to !important, or meets the minimum"
            }
          ],
          "none": [],
          "impact": null,
          "html": "<p class=\"eyebrow\" style=\"color:#f0d7b0\">Trending destinations</p>",
          "target": [
            "aside[aria-label=\"Travel desk sidebar\"] > .panel:nth-child(1) > .eyebrow"
          ]
        }
      ]
    },
    {
      "id": "button-name",
      "impact": null,
      "tags": [
        "cat.name-role-value",
        "wcag2a",
        "wcag412",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT6.a",
        "EN-301-549",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure buttons have discernible text",
      "help": "Buttons must have discernible text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/button-name?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "button-has-visible-text",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "Element has inner text that is visible to screen readers"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<button class=\"btn btn-dark\" type=\"submit\" style=\"margin-top:10px\">Find Deals</button>",
          "target": [
            "#alert-form > .btn-dark[type=\"submit\"]"
          ]
        }
      ]
    },
    {
      "id": "bypass",
      "impact": null,
      "tags": [
        "cat.keyboard",
        "wcag2a",
        "wcag241",
        "section508",
        "section508.22.o",
        "TTv5",
        "TT9.a",
        "EN-301-549",
        "EN-9.2.4.1"
      ],
      "description": "Ensure each page has at least one mechanism for a user to bypass navigation and jump straight to the content",
      "help": "Page must have means to bypass repeated blocks",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/bypass?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "internal-link-present",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "Valid skip link found"
            },
            {
              "id": "header-present",
              "data": null,
              "relatedNodes": [
                {
                  "html": "<h1>Chart a route that still feels like yours.</h1>",
                  "target": [
                    "h1"
                  ]
                },
                {
                  "html": "<h2>Places we know well enough to argue about.</h2>",
                  "target": [
                    "#destinations > .wrap > .section-head > div > h2"
                  ]
                },
                {
                  "html": "<h3>Lisbon, unhurried</h3>",
                  "target": [
                    ".feature.card > .body > h3"
                  ]
                },
                {
                  "html": "<h3>Kyoto, with manners</h3>",
                  "target": [
                    ".guide-grid > .card:nth-child(2) > .body > h3"
                  ]
                },
                {
                  "html": "<h3>Patagonia, paced</h3>",
                  "target": [
                    ".guide-grid > .card:nth-child(3) > .body > h3"
                  ]
                },
                {
                  "html": "<h2>Practical enough to pack, specific enough to trust.</h2>",
                  "target": [
                    "#guides > .split.wrap > .prose > h2"
                  ]
                },
                {
                  "html": "<h3>What we always include</h3>",
                  "target": [
                    "h3:nth-child(5)"
                  ]
                },
                {
                  "html": "<h3>Marrakech, as a worked example</h3>",
                  "target": [
                    "h3:nth-child(8)"
                  ]
                },
                {
                  "html": "<h3>Where readers are leaning</h3>",
                  "target": [
                    "aside[aria-label=\"Travel desk sidebar\"] > .panel:nth-child(1) > h3"
                  ]
                },
                {
                  "html": "<h3>Fare notes, not noise</h3>",
                  "target": [
                    ".sand.panel:nth-child(2) > h3"
                  ]
                },
                {
                  "html": "<h3>Recent field frames</h3>",
                  "target": [
                    ".sand.panel:nth-child(3) > h3"
                  ]
                },
                {
                  "html": "<h2>Wild routes, booked with adult supervision.</h2>",
                  "target": [
                    ".adventure > div > h2"
                  ]
                },
                {
                  "html": "<h3>Fit before flash</h3>",
                  "target": [
                    ".feature:nth-child(1) > h3"
                  ]
                },
                {
                  "html": "<h3>Insurance, named</h3>",
                  "target": [
                    ".feature:nth-child(2) > h3"
                  ]
                },
                {
                  "html": "<h3>Booking sequence</h3>",
                  "target": [
                    ".feature:nth-child(3) > h3"
                  ]
                },
                {
                  "html": "<h2>Fares we would actually buy.</h2>",
                  "target": [
                    "#flights > .wrap > .section-head > div > h2"
                  ]
                },
                {
                  "html": "<h2>The unglamorous half of a good trip.</h2>",
                  "target": [
                    "section:nth-child(6) > .split.wrap > .prose > h2"
                  ]
                },
                {
                  "html": "<h3>Travel insurance, without the fog</h3>",
                  "target": [
                    "h3:nth-child(4)"
                  ]
                },
                {
                  "html": "<h3>Cultural etiquette that travels</h3>",
                  "target": [
                    "h3:nth-child(7)"
                  ]
                },
                {
                  "html": "<h3>A booking order that holds</h3>",
                  "target": [
                    "h3:nth-child(10)"
                  ]
                },
                {
                  "html": "<h3>Before you pay the deposit</h3>",
                  "target": [
                    "section:nth-child(6) > .split.wrap > aside > .sand.panel > h3"
                  ]
                },
                {
                  "html": "<h3>Need a second set of eyes?</h3>",
                  "target": [
                    "section:nth-child(6) > .split.wrap > aside > .panel:nth-child(2) > h3"
                  ]
                },
                {
                  "html": "<h2>A list that matches the trip you are actually taking.</h2>",
                  "target": [
                    "#packing > .wrap > .section-head > div > h2"
                  ]
                },
                {
                  "html": "<h2>A small desk with a long memory for routes.</h2>",
                  "target": [
                    "#about > .wrap > .section-head > div > h2"
                  ]
                },
                {
                  "html": "<h3>Editors, not influencers</h3>",
                  "target": [
                    ".feature-grid > .card:nth-child(1) > .body > h3"
                  ]
                },
                {
                  "html": "<h3>Travelers, not templates</h3>",
                  "target": [
                    ".feature-grid > .card:nth-child(2) > .body > h3"
                  ]
                },
                {
                  "html": "<h3>Care for the places</h3>",
                  "target": [
                    ".feature-grid > .card:nth-child(3) > .body > h3"
                  ]
                },
                {
                  "html": "<h2>Before you write to us.</h2>",
                  "target": [
                    ".faq > h2"
                  ]
                },
                {
                  "html": "<h2>Tell us where you want to go, and how you like to travel.</h2>",
                  "target": [
                    ".contact-grid > div > h2"
                  ]
                },
                {
                  "html": "<h2>Privacy</h2>",
                  "target": [
                    "#privacy > .prose.wrap > h2"
                  ]
                },
                {
                  "html": "<h2>Terms</h2>",
                  "target": [
                    "#terms > .prose.wrap > h2"
                  ]
                },
                {
                  "html": "<h3>Northline Travel</h3>",
                  "target": [
                    ".foot-grid > div:nth-child(1) > h3"
                  ]
                },
                {
                  "html": "<h3>Explore</h3>",
                  "target": [
                    ".foot-grid > div:nth-child(2) > h3"
                  ]
                },
                {
                  "html": "<h3>Desk</h3>",
                  "target": [
                    ".foot-grid > div:nth-child(3) > h3"
                  ]
                },
                {
                  "html": "<h3>Policies</h3>",
                  "target": [
                    "div:nth-child(4) > h3"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Page has a heading"
            },
            {
              "id": "landmark",
              "data": null,
              "relatedNodes": [
                {
                  "html": "<main id=\"main\">",
                  "target": [
                    "#main"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Page has a landmark region"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<html lang=\"en\">",
          "target": [
            "html"
          ]
        }
      ]
    },
    {
      "id": "color-contrast",
      "impact": "serious",
      "tags": [
        "cat.color",
        "wcag2aa",
        "wcag143",
        "TTv5",
        "TT13.c",
        "EN-301-549",
        "EN-9.1.4.3",
        "ACT"
      ],
      "description": "Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds",
      "help": "Elements must meet minimum color contrast ratio thresholds",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/color-contrast?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#ffffff",
                "bgColor": "#c4542c",
                "contrastRatio": 4.51,
                "fontSize": "12.8pt (17px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [],
              "impact": "serious",
              "message": "Element has sufficient color contrast of 4.51"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<a class=\"skip\" href=\"#main\">Skip to content</a>",
          "target": [
            ".skip"
          ]
        }
      ]
    },
    {
      "id": "document-title",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag242",
        "TTv5",
        "TT12.a",
        "EN-301-549",
        "EN-9.2.4.2",
        "ACT"
      ],
      "description": "Ensure each HTML document contains a non-empty <title> element",
      "help": "Documents must have <title> element to aid in navigation",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/document-title?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "doc-has-title",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "Document has a non-empty <title> element"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<html lang=\"en\">",
          "target": [
            "html"
          ]
        }
      ]
    },
    {
      "id": "duplicate-id-aria",
      "impact": null,
      "tags": [
        "cat.parsing",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure every id attribute value used in ARIA and in labels is unique",
      "help": "IDs used in ARIA and labels must be unique",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/duplicate-id-aria?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "duplicate-id-aria",
              "data": "nav-toggle",
              "relatedNodes": [],
              "impact": "critical",
              "message": "Document has no elements referenced with ARIA or labels that share the same id attribute"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<input class=\"nav-toggle\" type=\"checkbox\" id=\"nav-toggle\" aria-label=\"Open navigation\">",
          "target": [
            "#nav-toggle"
          ]
        }
      ]
    },
    {
      "id": "form-field-multiple-labels",
      "impact": null,
      "tags": [
        "cat.forms",
        "wcag2a",
        "wcag332",
        "TTv5",
        "TT5.c",
        "EN-301-549",
        "EN-9.3.3.2"
      ],
      "description": "Ensure form field does not have multiple label elements",
      "help": "Form field must not have multiple label elements",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/form-field-multiple-labels?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [],
          "none": [
            {
              "id": "multiple-label",
              "data": null,
              "relatedNodes": [],
              "impact": "moderate",
              "message": "Form field does not have multiple label elements"
            }
          ],
          "impact": null,
          "html": "<input class=\"nav-toggle\" type=\"checkbox\" id=\"nav-toggle\" aria-label=\"Open navigation\">",
          "target": [
            "#nav-toggle"
          ]
        }
      ]
    },
    {
      "id": "html-has-lang",
      "impact": null,
      "tags": [
        "cat.language",
        "wcag2a",
        "wcag311",
        "TTv5",
        "TT11.a",
        "EN-301-549",
        "EN-9.3.1.1",
        "ACT"
      ],
      "description": "Ensure every HTML document has a lang attribute",
      "help": "<html> element must have a lang attribute",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/html-has-lang?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "has-lang",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "The <html> element has a lang attribute"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<html lang=\"en\">",
          "target": [
            "html"
          ]
        }
      ]
    },
    {
      "id": "html-lang-valid",
      "impact": null,
      "tags": [
        "cat.language",
        "wcag2a",
        "wcag311",
        "TTv5",
        "TT11.a",
        "EN-301-549",
        "EN-9.3.1.1",
        "ACT"
      ],
      "description": "Ensure the lang attribute of the <html> element has a valid value",
      "help": "<html> element must have a valid value for the lang attribute",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/html-lang-valid?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [],
          "none": [
            {
              "id": "valid-lang",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "Value of lang attribute is included in the list of valid languages"
            }
          ],
          "impact": null,
          "html": "<html lang=\"en\">",
          "target": [
            "html"
          ]
        }
      ]
    },
    {
      "id": "image-alt",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag111",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT7.a",
        "TT7.b",
        "EN-301-549",
        "EN-9.1.1.1",
        "ACT"
      ],
      "description": "Ensure <img> elements have alternative text or a role of none or presentation",
      "help": "Images must have alternative text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/image-alt?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "has-alt",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "Element has an alt attribute"
            }
          ],
          "all": [],
          "none": [
            {
              "id": "alt-space-value",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "Element has a valid alt attribute value"
            }
          ],
          "impact": null,
          "html": "<img src=\"https://placehold.co/112x112/0e3b43/f4efe6?text=NL&amp;font=playfair+display\" alt=\"Northline Travel logo\">",
          "target": [
            "img[alt=\"Northline Travel 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": "explicit-label",
              "data": null,
              "relatedNodes": [
                {
                  "html": "<label class=\"nav-burger\" for=\"nav-toggle\">Menu</label>",
                  "target": [
                    ".nav-burger"
                  ]
                }
              ],
              "impact": "critical",
              "message": "Element has an explicit <label>"
            },
            {
              "id": "aria-label",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "aria-label attribute exists and is not empty"
            }
          ],
          "all": [],
          "none": [
            {
              "id": "hidden-explicit-label",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "Form element has a visible explicit <label>"
            }
          ],
          "impact": null,
          "html": "<input class=\"nav-toggle\" type=\"checkbox\" id=\"nav-toggle\" aria-label=\"Open navigation\">",
          "target": [
            "#nav-toggle"
          ]
        }
      ]
    },
    {
      "id": "link-in-text-block",
      "impact": null,
      "tags": [
        "cat.color",
        "wcag2a",
        "wcag141",
        "TTv5",
        "TT13.a",
        "EN-301-549",
        "EN-9.1.4.1"
      ],
      "description": "Ensure links are distinguished from surrounding text in a way that does not rely on color",
      "help": "Links must be distinguishable without relying on color",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/link-in-text-block?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "link-in-text-block-style",
              "data": null,
              "relatedNodes": [
                {
                  "html": "<div class=\"body\">",
                  "target": [
                    ".feature.card > .body"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Links can be distinguished from surrounding text by visual styling"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<a class=\"btn btn-ghost\" href=\"#guides\">Read the guide</a>",
          "target": [
            ".feature.card > .body > .btn-ghost.btn[href$=\"#guides\"]"
          ]
        }
      ]
    },
    {
      "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\" href=\"#main\">Skip to content</a>",
          "target": [
            ".skip"
          ]
        }
      ]
    },
    {
      "id": "list",
      "impact": null,
      "tags": [
        "cat.structure",
        "wcag2a",
        "wcag131",
        "EN-301-549",
        "EN-9.1.3.1"
      ],
      "description": "Ensure that lists are structured correctly",
      "help": "<ul> and <ol> must only directly contain <li>, <script> or <template> elements",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/list?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [],
          "none": [
            {
              "id": "only-listitems",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "List element only has direct children that are allowed inside <li> elements"
            }
          ],
          "impact": null,
          "html": "<ul>",
          "target": [
            "nav > ul"
          ]
        }
      ]
    },
    {
      "id": "listitem",
      "impact": null,
      "tags": [
        "cat.structure",
        "wcag2a",
        "wcag131",
        "EN-301-549",
        "EN-9.1.3.1"
      ],
      "description": "Ensure <li> elements are used semantically",
      "help": "<li> elements must be contained in a <ul> or <ol>",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/listitem?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "listitem",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "List item has a <ul>, <ol> or role=\"list\" parent element"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<li><a href=\"#destinations\">Destinations</a></li>",
          "target": [
            "nav > ul > li:nth-child(1)"
          ]
        }
      ]
    },
    {
      "id": "meta-viewport",
      "impact": null,
      "tags": [
        "cat.sensory-and-visual-cues",
        "wcag2aa",
        "wcag144",
        "EN-301-549",
        "EN-9.1.4.4",
        "ACT"
      ],
      "description": "Ensure <meta name=\"viewport\"> does not disable text scaling and zooming",
      "help": "Zooming and scaling must not be disabled",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/meta-viewport?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "meta-viewport",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "<meta> tag does not disable zooming on mobile devices"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">",
          "target": [
            "meta[name=\"viewport\"]"
          ]
        }
      ]
    },
    {
      "id": "nested-interactive",
      "impact": null,
      "tags": [
        "cat.keyboard",
        "wcag2a",
        "wcag412",
        "TTv5",
        "TT6.a",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure interactive controls are not nested as they are not always announced by screen readers or can cause focus problems for assistive technologies",
      "help": "Interactive controls must not be nested",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/nested-interactive?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "no-focusable-content",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "Element does not have focusable descendants"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<img src=\"https://placehold.co/112x112/0e3b43/f4efe6?text=NL&amp;font=playfair+display\" alt=\"Northline Travel logo\">",
          "target": [
            "img[alt=\"Northline Travel logo\"]"
          ]
        }
      ]
    },
    {
      "id": "select-name",
      "impact": null,
      "tags": [
        "cat.forms",
        "wcag2a",
        "wcag412",
        "section508",
        "section508.22.n",
        "TTv5",
        "TT5.c",
        "EN-301-549",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure select element has an accessible name",
      "help": "Select element must have an accessible name",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/select-name?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "implicit-label",
              "data": {
                "implicitLabel": "From"
              },
              "relatedNodes": [
                {
                  "html": "<label class=\"field\">From\n            <select id=\"from\">\n              <option>Boston (BOS)</option>\n              <option>New York (JFK)</option>\n              <option>Chicago (ORD)</option>\n              <option>Seattle (SEA)</option>\n            </select>\n          </label>",
                  "target": [
                    "#flight-form > .filters > .field: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": "<select id=\"from\">\n              <option>Boston (BOS)</option>\n              <option>New York (JFK)</option>\n              <option>Chicago (ORD)</option>\n              <option>Seattle (SEA)</option>\n            </select>",
          "target": [
            "#from"
          ]
        }
      ]
    },
    {
      "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>When should I buy travel insurance?</summary>",
          "target": [
            "details[open=\"\"] > summary"
          ]
        }
      ]
    },
    {
      "id": "target-size",
      "impact": null,
      "tags": [
        "cat.sensory-and-visual-cues",
        "wcag22aa",
        "wcag258"
      ],
      "description": "Ensure touch targets have sufficient size and space",
      "help": "All touch targets must be 24px large, or leave sufficient space",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/target-size?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "target-size",
              "data": {
                "minSize": 24,
                "width": 135.5,
                "height": 44
              },
              "relatedNodes": [],
              "impact": "serious",
              "message": "Control has sufficient size (135.5px by 44px, 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\" href=\"#main\">Skip to content</a>",
          "target": [
            ".skip"
          ]
        }
      ]
    }
  ],
  "incomplete": [
    {
      "id": "color-contrast",
      "impact": "serious",
      "tags": [
        "cat.color",
        "wcag2aa",
        "wcag143",
        "TTv5",
        "TT13.c",
        "EN-301-549",
        "EN-9.1.4.3",
        "ACT"
      ],
      "description": "Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds",
      "help": "Elements must meet minimum color contrast ratio thresholds",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/color-contrast?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": null,
                "bgColor": null,
                "contrastRatio": 0,
                "fontSize": "9.0pt (12px)",
                "fontWeight": "normal",
                "messageKey": "bgGradient",
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<section id=\"guides\" class=\"tools\">",
                  "target": [
                    "#guides"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element's background color could not be determined due to a background gradient"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<p class=\"eyebrow\">How a Northline guide works</p>",
          "target": [
            "#guides > .split.wrap > .prose > .eyebrow"
          ],
          "failureSummary": "Fix any of the following:\n  Element's background color could not be determined due to a background gradient"
        }
      ]
    }
  ],
  "violations": [
    {
      "id": "color-contrast",
      "impact": "serious",
      "tags": [
        "cat.color",
        "wcag2aa",
        "wcag143",
        "TTv5",
        "TT13.c",
        "EN-301-549",
        "EN-9.1.4.3",
        "ACT"
      ],
      "description": "Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds",
      "help": "Elements must meet minimum color contrast ratio thresholds",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/color-contrast?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#c4542c",
                "bgColor": "#f4efe6",
                "contrastRatio": 3.94,
                "fontSize": "9.0pt (12px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<body>",
                  "target": [
                    "body"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.94 (foreground color: #c4542c, background color: #f4efe6, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<p class=\"eyebrow\">Travel studio \u00b7 Est. 2014</p>",
          "target": [
            ".hero-copy > .eyebrow"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.94 (foreground color: #c4542c, background color: #f4efe6, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b8884a",
                "bgColor": "#fffcf7",
                "contrastRatio": 3.08,
                "fontSize": "9.0pt (12px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<div class=\"hero-card\">",
                  "target": [
                    ".hero-card"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.08 (foreground color: #b8884a, background color: #fffcf7, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"meta\">This week\u2019s field note</span>",
          "target": [
            ".hero-card > .meta"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.08 (foreground color: #b8884a, background color: #fffcf7, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#c4542c",
                "bgColor": "#f4efe6",
                "contrastRatio": 3.94,
                "fontSize": "9.0pt (12px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<body>",
                  "target": [
                    "body"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.94 (foreground color: #c4542c, background color: #f4efe6, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<p class=\"eyebrow\">Destination guides</p>",
          "target": [
            "#destinations > .wrap > .section-head > div > .eyebrow"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.94 (foreground color: #c4542c, background color: #f4efe6, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b8884a",
                "bgColor": "#f5f0e8",
                "contrastRatio": 2.78,
                "fontSize": "9.0pt (12px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<article class=\"card feature\">",
                  "target": [
                    ".feature.card"
                  ]
                },
                {
                  "html": "<body>",
                  "target": [
                    "body"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 2.78 (foreground color: #b8884a, background color: #f5f0e8, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"meta\">City \u00b7 6\u20138 days</span>",
          "target": [
            ".feature.card > .body > .meta"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 2.78 (foreground color: #b8884a, background color: #f5f0e8, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#ffffff",
                "bgColor": "#f5f0e8",
                "contrastRatio": 1.13,
                "fontSize": "16.5pt (22px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<article class=\"card feature\">",
                  "target": [
                    ".feature.card"
                  ]
                },
                {
                  "html": "<body>",
                  "target": [
                    "body"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 1.13 (foreground color: #ffffff, background color: #f5f0e8, font size: 16.5pt (22px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<h3>Lisbon, unhurried</h3>",
          "target": [
            ".feature.card > .body > h3"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 1.13 (foreground color: #ffffff, background color: #f5f0e8, font size: 16.5pt (22px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#d5e4e1",
                "bgColor": "#f5f0e8",
                "contrastRatio": 1.15,
                "fontSize": "11.3pt (15px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<article class=\"card feature\">",
                  "target": [
                    ".feature.card"
                  ]
                },
                {
                  "html": "<body>",
                  "target": [
                    "body"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 1.15 (foreground color: #d5e4e1, background color: #f5f0e8, font size: 11.3pt (15px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<p>",
          "target": [
            ".feature.card > .body > p:nth-child(3)"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 1.15 (foreground color: #d5e4e1, background color: #f5f0e8, font size: 11.3pt (15px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#d5e4e1",
                "bgColor": "#f5f0e8",
                "contrastRatio": 1.15,
                "fontSize": "11.3pt (15px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<article class=\"card feature\">",
                  "target": [
                    ".feature.card"
                  ]
                },
                {
                  "html": "<body>",
                  "target": [
                    "body"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 1.15 (foreground color: #d5e4e1, background color: #f5f0e8, font size: 11.3pt (15px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<p>Our guide also covers day trips that justify the train\u2014Sintra only if you go early, Cascais if you want sea air without a full excursion\u2014and the travel insurance details worth checking if you are renting a scooter on those famous cobbles.</p>",
          "target": [
            ".body > p:nth-child(4)"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 1.15 (foreground color: #d5e4e1, background color: #f5f0e8, font size: 11.3pt (15px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b8884a",
                "bgColor": "#fffcf7",
                "contrastRatio": 3.08,
                "fontSize": "9.0pt (12px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<article class=\"card\">",
                  "target": [
                    ".guide-grid > .card:nth-child(2)"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.08 (foreground color: #b8884a, background color: #fffcf7, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"meta\">Culture \u00b7 8\u201310 days</span>",
          "target": [
            ".card:nth-child(2) > .body > .meta"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.08 (foreground color: #b8884a, background color: #fffcf7, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b8884a",
                "bgColor": "#fffcf7",
                "contrastRatio": 3.08,
                "fontSize": "9.0pt (12px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<article class=\"card\">",
                  "target": [
                    ".guide-grid > .card:nth-child(3)"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.08 (foreground color: #b8884a, background color: #fffcf7, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"meta\">Wilderness \u00b7 10\u201314 days</span>",
          "target": [
            ".card:nth-child(3) > .body > .meta"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.08 (foreground color: #b8884a, background color: #fffcf7, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#c4542c",
                "bgColor": "#f4efe6",
                "contrastRatio": 3.94,
                "fontSize": "9.0pt (12px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<body>",
                  "target": [
                    "body"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.94 (foreground color: #c4542c, background color: #f4efe6, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<p class=\"eyebrow\">Flight deals</p>",
          "target": [
            "#flights > .wrap > .section-head > div > .eyebrow"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.94 (foreground color: #c4542c, background color: #f4efe6, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b8884a",
                "bgColor": "#fffcf7",
                "contrastRatio": 3.08,
                "fontSize": "9.0pt (12px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<article class=\"deal\" data-region=\"europe\" data-price=\"640\" data-cabin=\"economy\">",
                  "target": [
                    "article[data-price=\"640\"]"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.08 (foreground color: #b8884a, background color: #fffcf7, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"meta\">Europe \u00b7 shoulder</span>",
          "target": [
            "article[data-price=\"640\"] > .meta"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.08 (foreground color: #b8884a, background color: #fffcf7, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b8884a",
                "bgColor": "#fffcf7",
                "contrastRatio": 3.08,
                "fontSize": "9.0pt (12px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<article class=\"deal\" data-region=\"asia\" data-price=\"1180\" data-cabin=\"economy\">",
                  "target": [
                    "article[data-price=\"1180\"]"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.08 (foreground color: #b8884a, background color: #fffcf7, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"meta\">Asia \u00b7 11 days+</span>",
          "target": [
            "article[data-price=\"1180\"] > .meta"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.08 (foreground color: #b8884a, background color: #fffcf7, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b8884a",
                "bgColor": "#fffcf7",
                "contrastRatio": 3.08,
                "fontSize": "9.0pt (12px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<article class=\"deal\" data-region=\"americas\" data-price=\"890\" data-cabin=\"economy\">",
                  "target": [
                    "article[data-region=\"americas\"]"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.08 (foreground color: #b8884a, background color: #fffcf7, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"meta\">Americas \u00b7 trek</span>",
          "target": [
            "article[data-region=\"americas\"] > .meta"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.08 (foreground color: #b8884a, background color: #fffcf7, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b8884a",
                "bgColor": "#fffcf7",
                "contrastRatio": 3.08,
                "fontSize": "9.0pt (12px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<article class=\"deal\" data-region=\"africa\" data-price=\"980\" data-cabin=\"economy\">",
                  "target": [
                    "article[data-region=\"africa\"]"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.08 (foreground color: #b8884a, background color: #fffcf7, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"meta\">Africa \u00b7 city + Atlas</span>",
          "target": [
            "article[data-region=\"africa\"] > .meta"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.08 (foreground color: #b8884a, background color: #fffcf7, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b8884a",
                "bgColor": "#fffcf7",
                "contrastRatio": 3.08,
                "fontSize": "9.0pt (12px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<article class=\"deal\" data-region=\"europe\" data-price=\"1540\" data-cabin=\"premium\">",
                  "target": [
                    "article[data-price=\"1540\"]"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.08 (foreground color: #b8884a, background color: #fffcf7, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"meta\">Europe \u00b7 premium</span>",
          "target": [
            "article[data-price=\"1540\"] > .meta"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.08 (foreground color: #b8884a, background color: #fffcf7, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b8884a",
                "bgColor": "#fffcf7",
                "contrastRatio": 3.08,
                "fontSize": "9.0pt (12px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<article class=\"deal\" data-region=\"asia\" data-price=\"1420\" data-cabin=\"premium\">",
                  "target": [
                    "article[data-price=\"1420\"]"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.08 (foreground color: #b8884a, background color: #fffcf7, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"meta\">Asia \u00b7 long haul</span>",
          "target": [
            "article[data-price=\"1420\"] > .meta"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.08 (foreground color: #b8884a, background color: #fffcf7, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#c4542c",
                "bgColor": "#f4efe6",
                "contrastRatio": 3.94,
                "fontSize": "9.0pt (12px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<body>",
                  "target": [
                    "body"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.94 (foreground color: #c4542c, background color: #f4efe6, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<p class=\"eyebrow\">Booking resources</p>",
          "target": [
            "section:nth-child(6) > .split.wrap > .prose > .eyebrow"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.94 (foreground color: #c4542c, background color: #f4efe6, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#c4542c",
                "bgColor": "#f4efe6",
                "contrastRatio": 3.94,
                "fontSize": "9.0pt (12px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<body>",
                  "target": [
                    "body"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.94 (foreground color: #c4542c, background color: #f4efe6, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<p class=\"eyebrow\">About Northline</p>",
          "target": [
            "#about > .wrap > .section-head > div > .eyebrow"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.94 (foreground color: #c4542c, background color: #f4efe6, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#c4542c",
                "bgColor": "#f4efe6",
                "contrastRatio": 3.94,
                "fontSize": "9.0pt (12px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<body>",
                  "target": [
                    "body"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.94 (foreground color: #c4542c, background color: #f4efe6, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<p class=\"eyebrow\">Questions from the desk</p>",
          "target": [
            ".faq > .eyebrow"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.94 (foreground color: #c4542c, background color: #f4efe6, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#c4542c",
                "bgColor": "#f4efe6",
                "contrastRatio": 3.94,
                "fontSize": "9.0pt (12px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<body>",
                  "target": [
                    "body"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.94 (foreground color: #c4542c, background color: #f4efe6, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<p class=\"eyebrow\">Contact</p>",
          "target": [
            ".contact-grid > div > .eyebrow"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.94 (foreground color: #c4542c, background color: #f4efe6, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#3d4a54",
                "bgColor": "#10181d",
                "contrastRatio": 1.97,
                "fontSize": "12.8pt (17px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<footer>",
                  "target": [
                    "footer"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 1.97 (foreground color: #3d4a54, background color: #10181d, font size: 12.8pt (17px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<p>Destination guides, flight intelligence, and tourism advice from a desk that still answers the phone.</p>",
          "target": [
            ".foot-grid > div:nth-child(1) > p:nth-child(2)"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 1.97 (foreground color: #3d4a54, background color: #10181d, font size: 12.8pt (17px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#3d4a54",
                "bgColor": "#10181d",
                "contrastRatio": 1.97,
                "fontSize": "12.8pt (17px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<footer>",
                  "target": [
                    "footer"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 1.97 (foreground color: #3d4a54, background color: #10181d, font size: 12.8pt (17px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<p>184 Harbor Walk, Suite 400<br>Portland, Maine 04101</p>",
          "target": [
            ".foot-grid > div:nth-child(1) > p:nth-child(3)"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 1.97 (foreground color: #3d4a54, background color: #10181d, font size: 12.8pt (17px), font weight: normal). Expected contrast ratio of 4.5:1"
        }
      ]
    }
  ],
  "coverage": {
    "contract": "main-document-vertical-scroll",
    "complete": true,
    "positions": [
      {
        "y": 0,
        "height": 11027
      },
      {
        "y": 576,
        "height": 11027
      },
      {
        "y": 1152,
        "height": 11027
      },
      {
        "y": 1728,
        "height": 11027
      },
      {
        "y": 2304,
        "height": 11027
      },
      {
        "y": 2880,
        "height": 11027
      },
      {
        "y": 3456,
        "height": 11027
      },
      {
        "y": 4032,
        "height": 11027
      },
      {
        "y": 4608,
        "height": 11027
      },
      {
        "y": 5184,
        "height": 11027
      },
      {
        "y": 5760,
        "height": 11027
      },
      {
        "y": 6336,
        "height": 11027
      },
      {
        "y": 6912,
        "height": 11027
      },
      {
        "y": 7488,
        "height": 11027
      },
      {
        "y": 8064,
        "height": 11027
      },
      {
        "y": 8640,
        "height": 11027
      },
      {
        "y": 9216,
        "height": 11027
      },
      {
        "y": 9792,
        "height": 11027
      },
      {
        "y": 10307,
        "height": 11027
      }
    ],
    "scans": 20,
    "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 "Travel" 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: "Travel"
- Description: Travel guides, destinations, booking resources, and tourism tips.

**Your Creative Task:**
1.  **Invent:** Create a unique, professional-sounding site name and a strong tagline fitting the "Travel" 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: "Contact", "Flights", "About".
-   **MAIN CONTENT:** Structure this area with **at least 3-4 distinct, well-developed sections**.
    -   Address key topics relevant to the "Travel" category. Consider themes similar to: "Adventure Travel", "Destination Guides", "Flight Deals".
    -   **Content Depth:** Populate each section with **substantial, realistic text** (multiple sentences/paragraphs). Use authentic industry language and terminology like: "travel insurance", "cultural etiquette", "booking".
    -   **Visuals:** Integrate relevant placeholder images logically within the content sections.
    -   **Calls to Action:** Include clear and contextually relevant CTAs. Use strong verbs similar to: "Search Flights", "Book Adventure", "Find Deals".
-   **ENGAGEMENT (Recommended):** Strongly consider incorporating **one meaningful interactive element** that would genuinely benefit a user in the "Travel" sector. Ideas similar but not limited to: "packing list generator".
-   **SIDEBAR (Optional):** If your design includes a sidebar, populate it with **useful, relevant content**. Ideas: "inspiration gallery", "deal alerts", "trending destinations".
-   **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.