Anthropic Claude Sonnet 5.5 – Travel
via Anthropic · Generated
- AIMAC Debt 7.99
- Cost $0.23
- Total Violations 25
- HTML Size 51 KB
- Em Dashes 15
Screenshot
View Live Page
Accessibility Issues Found
25 Serious
-
color-contrast serious 23 instances
Elements must meet minimum color contrast ratio thresholds
Example HTML
<button class="btn btn-primary" type="submit">Get Quote</button> -
link-in-text-block serious 2 instances
Links must be distinguishable without relying on color
Example HTML
<a href="#newsletter">Get yours</a>
Artifacts
View Generated HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Meridian Atlas — Plan boldly. Travel wisely. | Travel Guides, Hotels & Flight Deals</title>
<meta name="description" content="Meridian Atlas is your trusted resource for destination guides, flight deals, hotel reviews, cultural experiences and expert tourism tips.">
<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=Inter:wght@400;500;600;700&family=Playfair+Display:wght@500;600;700&display=swap" rel="stylesheet">
<style>
:root{
--navy:#0f2a43;
--navy-2:#173a5a;
--teal:#0e7c86;
--teal-dark:#0a5f67;
--coral:#e8664a;
--coral-dark:#cf5237;
--sand:#f7f1e8;
--sand-2:#efe5d5;
--ink:#1d2733;
--muted:#5d6b7a;
--line:#e3dccf;
--white:#fff;
--radius:14px;
--shadow:0 10px 30px rgba(15,42,67,.10);
--shadow-lg:0 18px 50px rgba(15,42,67,.18);
}
*{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth}
body{font-family:'Inter',system-ui,sans-serif;color:var(--ink);background:#fff;line-height:1.65;font-size:16px}
img{max-width:100%;display:block}
a{color:var(--teal);text-decoration:none}
a:hover{color:var(--teal-dark)}
h1,h2,h3,h4{font-family:'Playfair Display',Georgia,serif;line-height:1.2;color:var(--navy)}
.container{width:min(1200px,92%);margin-inline:auto}
.btn{display:inline-flex;align-items:center;gap:.5rem;padding:.8rem 1.4rem;border-radius:999px;font-weight:600;font-size:.95rem;border:2px solid transparent;cursor:pointer;transition:.2s;font-family:inherit}
.btn-primary{background:var(--coral);color:#fff}
.btn-primary:hover{background:var(--coral-dark);color:#fff;transform:translateY(-2px)}
.btn-outline{border-color:var(--teal);color:var(--teal);background:transparent}
.btn-outline:hover{background:var(--teal);color:#fff}
.btn-light{background:#fff;color:var(--navy)}
.btn-light:hover{background:var(--sand);color:var(--navy)}
.btn-sm{padding:.55rem 1rem;font-size:.85rem}
.eyebrow{display:inline-block;text-transform:uppercase;letter-spacing:.14em;font-size:.75rem;font-weight:700;color:var(--coral);margin-bottom:.6rem}
.section-head{max-width:720px;margin-bottom:2rem}
.section-head h2{font-size:clamp(1.8rem,3.4vw,2.6rem);margin-bottom:.8rem}
.section-head p{color:var(--muted)}
/* Top bar & header */
.topbar{background:var(--navy);color:#cfdbe8;font-size:.82rem}
.topbar .container{display:flex;justify-content:space-between;gap:1rem;padding:.5rem 0;flex-wrap:wrap}
.topbar a{color:#fff}
header.site{position:sticky;top:0;z-index:50;background:rgba(255,255,255,.96);backdrop-filter:blur(8px);border-bottom:1px solid var(--line)}
.header-inner{display:flex;align-items:center;justify-content:space-between;gap:1.5rem;padding:.8rem 0}
.brand{display:flex;align-items:center;gap:.8rem;color:var(--navy)}
.brand img{width:48px;height:48px;border-radius:12px}
.brand strong{display:block;font-family:'Playfair Display',serif;font-size:1.35rem;line-height:1.1}
.brand span{display:block;font-size:.75rem;color:var(--muted);letter-spacing:.04em}
nav.primary ul{display:flex;list-style:none;gap:.3rem;align-items:center}
nav.primary a{display:block;padding:.5rem .8rem;color:var(--ink);font-weight:500;font-size:.95rem;border-radius:8px}
nav.primary a:hover{background:var(--sand);color:var(--teal-dark)}
nav.primary a.cta{background:var(--teal);color:#fff;margin-left:.4rem}
nav.primary a.cta:hover{background:var(--teal-dark)}
.menu-toggle{display:none;background:none;border:1px solid var(--line);border-radius:8px;padding:.5rem .7rem;font-size:1.2rem;cursor:pointer}
/* Hero */
.hero{position:relative;color:#fff;background:linear-gradient(180deg,rgba(15,42,67,.55),rgba(15,42,67,.8)),url('https://picsum.photos/1800/900?random=11') center/cover;padding:6rem 0 7rem}
.hero h1{color:#fff;font-size:clamp(2.4rem,5.5vw,4.2rem);max-width:820px;margin-bottom:1.2rem}
.hero p.lead{font-size:1.15rem;max-width:640px;color:#e6eef6;margin-bottom:2rem}
.search{background:#fff;color:var(--ink);border-radius:18px;padding:1.2rem;box-shadow:var(--shadow-lg);display:grid;grid-template-columns:repeat(4,1fr) auto;gap:.8rem;align-items:end;max-width:1050px}
.search label{display:block;font-size:.72rem;text-transform:uppercase;letter-spacing:.08em;font-weight:700;color:var(--muted);margin-bottom:.3rem}
.search input,.search select{width:100%;padding:.75rem .8rem;border:1px solid var(--line);border-radius:10px;font:inherit;background:#fff}
.search input:focus,.search select:focus,.conv input:focus,.conv select:focus,.newsletter input:focus{outline:2px solid var(--teal);outline-offset:1px}
.search-msg{margin-top:.8rem;font-size:.9rem;color:#e6eef6;min-height:1.4em}
.hero-badges{display:flex;gap:1.6rem;flex-wrap:wrap;margin-top:2rem;font-size:.9rem;color:#dbe6f1}
.hero-badges span::before{content:"✓ ";color:#7fe0c3;font-weight:700}
/* Stats */
.stats{background:var(--sand);border-bottom:1px solid var(--line)}
.stats .container{display:grid;grid-template-columns:repeat(4,1fr);gap:1rem;padding:2rem 0;text-align:center}
.stats strong{display:block;font-family:'Playfair Display',serif;font-size:2.1rem;color:var(--navy)}
.stats span{color:var(--muted);font-size:.9rem}
/* Destinations */
.destinations{padding:5rem 0}
.dest-grid{display:grid;grid-template-columns:repeat(4,1fr);grid-auto-rows:230px;gap:1rem}
.dest{position:relative;border-radius:var(--radius);overflow:hidden;color:#fff;display:flex;align-items:flex-end}
.dest.tall{grid-row:span 2}
.dest.wide{grid-column:span 2}
.dest img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;transition:transform .5s}
.dest:hover img{transform:scale(1.07)}
.dest::after{content:"";position:absolute;inset:0;background:linear-gradient(180deg,transparent 40%,rgba(10,25,40,.85))}
.dest div{position:relative;z-index:2;padding:1.2rem}
.dest h3{color:#fff;font-size:1.4rem}
.dest p{font-size:.85rem;color:#e0e9f2}
.dest a.stretch{position:absolute;inset:0;z-index:3}
/* Main + sidebar */
.layout{display:grid;grid-template-columns:minmax(0,1fr) 340px;gap:3rem;padding:1rem 0 5rem}
.block{padding:3rem 0;border-top:1px solid var(--line)}
.block:first-child{border-top:none}
.tabs{display:flex;gap:.5rem;flex-wrap:wrap;margin-bottom:1.5rem}
.tab{padding:.5rem 1.1rem;border-radius:999px;border:1px solid var(--line);background:#fff;cursor:pointer;font:inherit;font-size:.9rem;font-weight:500;color:var(--ink)}
.tab[aria-pressed="true"]{background:var(--navy);color:#fff;border-color:var(--navy)}
.deals{display:grid;grid-template-columns:repeat(2,1fr);gap:1.2rem}
.deal{border:1px solid var(--line);border-radius:var(--radius);overflow:hidden;background:#fff;transition:.25s;display:flex;flex-direction:column}
.deal:hover{box-shadow:var(--shadow);transform:translateY(-3px)}
.deal .img{position:relative}
.deal img{width:100%;height:170px;object-fit:cover}
.tag{position:absolute;top:.8rem;left:.8rem;background:var(--coral);color:#fff;font-size:.72rem;font-weight:700;padding:.25rem .6rem;border-radius:999px;letter-spacing:.04em}
.deal .body{padding:1.1rem;display:flex;flex-direction:column;gap:.4rem;flex:1}
.deal h3{font-size:1.15rem;font-family:'Inter',sans-serif;font-weight:700}
.deal .meta{font-size:.85rem;color:var(--muted)}
.deal .foot{margin-top:auto;display:flex;justify-content:space-between;align-items:center;padding-top:.8rem}
.price small{display:block;font-size:.7rem;color:var(--muted);text-transform:uppercase;letter-spacing:.06em}
.price b{font-size:1.4rem;color:var(--navy)}
.note{font-size:.85rem;color:var(--muted);margin-top:1rem;background:var(--sand);padding:.9rem 1rem;border-radius:10px;border-left:4px solid var(--teal)}
.split{display:grid;grid-template-columns:1fr 1fr;gap:2rem;align-items:center}
.split img{border-radius:var(--radius);box-shadow:var(--shadow);width:100%;height:100%;object-fit:cover;min-height:320px}
.split h3{font-size:1.6rem;margin-bottom:.8rem}
.split p{margin-bottom:.9rem;color:#3a4756}
.checks{list-style:none;margin:1rem 0 1.4rem}
.checks li{padding-left:1.6rem;position:relative;margin-bottom:.4rem;font-size:.95rem}
.checks li::before{content:"✦";position:absolute;left:0;color:var(--coral)}
.exp-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:1rem;margin-top:2rem}
.exp{background:var(--sand);border-radius:var(--radius);padding:1.3rem}
.exp .ico{font-size:1.6rem;margin-bottom:.4rem}
.exp h4{font-size:1.05rem;margin-bottom:.4rem;font-family:'Inter',sans-serif;font-weight:700}
.exp p{font-size:.9rem;color:var(--muted)}
.luxury{background:var(--navy);color:#dbe6f1;border-radius:20px;padding:2rem;margin:0}
.luxury h2,.luxury h3{color:#fff}
.lux-cards{display:grid;grid-template-columns:repeat(2,1fr);gap:1.2rem;margin-top:1.5rem}
.lux{background:var(--navy-2);border-radius:var(--radius);overflow:hidden}
.lux img{width:100%;height:190px;object-fit:cover}
.lux div{padding:1.1rem}
.lux h3{font-size:1.2rem;margin-bottom:.4rem}
.lux p{font-size:.9rem;margin-bottom:.8rem;color:#c3d3e3}
.stars{color:#f5b942;letter-spacing:2px;font-size:.9rem}
.lux-wrap{padding:3rem 0}
.eco-list{display:grid;grid-template-columns:repeat(2,1fr);gap:1.2rem;margin-top:1.5rem}
.guide{display:flex;gap:1rem;border:1px solid var(--line);border-radius:var(--radius);padding:.8rem;background:#fff;align-items:center}
.guide img{width:110px;height:100px;object-fit:cover;border-radius:10px;flex-shrink:0}
.guide h4{font-size:1rem;font-family:'Inter',sans-serif;font-weight:700;margin-bottom:.2rem}
.guide p{font-size:.82rem;color:var(--muted);margin-bottom:.3rem}
/* Sidebar */
aside .sticky{position:sticky;top:90px;display:flex;flex-direction:column;gap:1.5rem;padding-top:3rem}
.widget{border:1px solid var(--line);border-radius:var(--radius);padding:1.3rem;background:#fff}
.widget h3{font-size:1.2rem;margin-bottom:.8rem}
.widget.conv{background:linear-gradient(160deg,var(--teal),var(--teal-dark));color:#fff;border:none;box-shadow:var(--shadow)}
.widget.conv h3{color:#fff}
.conv label{font-size:.72rem;text-transform:uppercase;letter-spacing:.08em;font-weight:700;display:block;margin:.6rem 0 .25rem;opacity:.9}
.conv input,.conv select{width:100%;padding:.65rem .7rem;border-radius:10px;border:none;font:inherit;color:var(--ink)}
.conv .row{display:grid;grid-template-columns:1fr auto 1fr;gap:.5rem;align-items:end}
.conv .swap{background:rgba(255,255,255,.2);color:#fff;border:none;border-radius:50%;width:38px;height:38px;cursor:pointer;font-size:1.1rem;margin-bottom:2px}
.conv .swap:hover{background:rgba(255,255,255,.35)}
.conv .result{margin-top:1rem;background:rgba(255,255,255,.14);border-radius:10px;padding:.9rem}
.conv .result b{font-size:1.5rem;display:block}
.conv .result small{opacity:.85;font-size:.78rem}
.hacks{list-style:none;counter-reset:h}
.hacks li{counter-increment:h;padding-left:2.2rem;position:relative;margin-bottom:.9rem;font-size:.9rem;color:#3a4756}
.hacks li::before{content:counter(h);position:absolute;left:0;top:0;width:1.6rem;height:1.6rem;border-radius:50%;background:var(--sand-2);color:var(--navy);font-weight:700;font-size:.8rem;display:flex;align-items:center;justify-content:center}
.hacks b{color:var(--navy)}
.spot img{border-radius:10px;margin-bottom:.8rem;width:100%;height:160px;object-fit:cover}
.spot p{font-size:.9rem;color:var(--muted);margin-bottom:.8rem}
.gallery{display:grid;grid-template-columns:repeat(3,1fr);gap:.4rem}
.gallery img{border-radius:8px;aspect-ratio:1;object-fit:cover;width:100%}
/* Testimonials */
.reviews{background:var(--sand);padding:5rem 0}
.t-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:1.3rem}
.t-card{background:#fff;border-radius:var(--radius);padding:1.6rem;box-shadow:var(--shadow);display:flex;flex-direction:column;gap:1rem}
.t-card blockquote{font-size:.98rem;color:#34414f}
.t-user{display:flex;align-items:center;gap:.8rem;margin-top:auto}
.t-user img{width:52px;height:52px;border-radius:50%}
.t-user strong{display:block;color:var(--navy);font-size:.95rem}
.t-user span{font-size:.8rem;color:var(--muted)}
/* Why us */
.why{padding:5rem 0}
.feat-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:1.4rem}
.feat{padding:1.6rem;border:1px solid var(--line);border-radius:var(--radius)}
.feat .ico{width:50px;height:50px;border-radius:12px;background:var(--sand);display:flex;align-items:center;justify-content:center;font-size:1.5rem;margin-bottom:1rem}
.feat h3{font-size:1.2rem;margin-bottom:.5rem}
.feat p{color:var(--muted);font-size:.95rem}
/* FAQ */
.faq{padding:1rem 0 5rem}
.faq-wrap{display:grid;grid-template-columns:1fr 1.5fr;gap:3rem;align-items:start}
details{border:1px solid var(--line);border-radius:12px;margin-bottom:.8rem;background:#fff}
summary{cursor:pointer;padding:1.1rem 1.3rem;font-weight:600;color:var(--navy);list-style:none;display:flex;justify-content:space-between;gap:1rem}
summary::-webkit-details-marker{display:none}
summary::after{content:"+";font-size:1.4rem;line-height:1;color:var(--coral);transition:.2s}
details[open] summary::after{transform:rotate(45deg)}
details[open]{box-shadow:var(--shadow)}
details p{padding:0 1.3rem 1.2rem;color:#3a4756;font-size:.95rem}
/* Newsletter */
.newsletter{background:linear-gradient(rgba(15,42,67,.88),rgba(15,42,67,.88)),url('https://picsum.photos/1600/600?random=44') center/cover;color:#fff;padding:4.5rem 0;text-align:center}
.newsletter h2{color:#fff;font-size:clamp(1.8rem,3.4vw,2.5rem);margin-bottom:.8rem}
.newsletter p{max-width:620px;margin:0 auto 1.6rem;color:#d4e0ec}
.newsletter form{display:flex;gap:.6rem;max-width:560px;margin:0 auto;flex-wrap:wrap;justify-content:center}
.newsletter input{flex:1;min-width:220px;padding:.9rem 1.2rem;border-radius:999px;border:none;font:inherit}
.form-msg{margin-top:1rem;min-height:1.4em;font-size:.92rem;color:#9ff0d4}
/* Footer */
footer{background:#0a1d2f;color:#a9bacb;padding:4rem 0 1.5rem;font-size:.92rem}
.foot-grid{display:grid;grid-template-columns:1.6fr 1fr 1fr 1.3fr;gap:2.5rem;margin-bottom:2.5rem}
footer h4{color:#fff;font-family:'Inter',sans-serif;font-size:.85rem;text-transform:uppercase;letter-spacing:.1em;margin-bottom:1rem}
footer a{color:#a9bacb}
footer a:hover{color:#fff}
footer ul{list-style:none}
footer li{margin-bottom:.5rem}
footer .brand{color:#fff;margin-bottom:1rem}
footer .brand span{color:#8ea2b6}
.social{display:flex;gap:.6rem;margin-top:1rem}
.social a{width:38px;height:38px;border-radius:50%;background:#16324b;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:.8rem;color:#fff}
.social a:hover{background:var(--coral)}
.copyright{border-top:1px solid #1c3a55;padding-top:1.4rem;display:flex;justify-content:space-between;flex-wrap:wrap;gap:1rem;font-size:.85rem}
.copyright nav a{margin-left:1.2rem}
/* Responsive */
@media (max-width:1050px){
.layout{grid-template-columns:1fr}
aside .sticky{position:static;padding-top:0}
aside .sticky{display:grid;grid-template-columns:repeat(2,1fr)}
.dest-grid{grid-template-columns:repeat(2,1fr)}
.search{grid-template-columns:repeat(2,1fr)}
.foot-grid{grid-template-columns:1fr 1fr}
.faq-wrap{grid-template-columns:1fr}
}
@media (max-width:860px){
.menu-toggle{display:block}
nav.primary{position:absolute;left:0;right:0;top:100%;background:#fff;border-bottom:1px solid var(--line);display:none;padding:1rem 4%}
nav.primary.open{display:block}
nav.primary ul{flex-direction:column;align-items:stretch}
nav.primary a.cta{margin:.4rem 0 0;text-align:center}
header.site .container{position:relative}
.t-grid,.feat-grid{grid-template-columns:1fr}
.stats .container{grid-template-columns:repeat(2,1fr)}
}
@media (max-width:700px){
.deals,.lux-cards,.eco-list,.split,.exp-grid{grid-template-columns:1fr}
aside .sticky{grid-template-columns:1fr}
.dest-grid{grid-template-columns:1fr;grid-auto-rows:220px}
.dest.tall,.dest.wide{grid-row:auto;grid-column:auto}
.search{grid-template-columns:1fr}
.foot-grid{grid-template-columns:1fr}
.hero{padding:4rem 0 5rem}
.topbar .container div:last-child{display:none}
}
@media (prefers-reduced-motion:reduce){*{transition:none!important;scroll-behavior:auto!important}}
</style>
</head>
<body>
<div class="topbar">
<div class="container">
<div>✈ Free itinerary review with every booking inquiry — <a href="#newsletter">Get yours</a></div>
<div>Need help? Call <a href="tel:+18005550142">+1 (800) 555-0142</a> · Mon–Sat, 8am–8pm ET</div>
</div>
</div>
<header class="site">
<div class="container header-inner">
<a href="#top" class="brand" aria-label="Meridian Atlas home">
<img src="https://placehold.co/96x96/0e7c86/ffffff?text=MA&font=playfair%20display" alt="Meridian Atlas logo" width="48" height="48">
<div>
<strong>Meridian Atlas</strong>
<span>Plan boldly. Travel wisely.</span>
</div>
</a>
<button class="menu-toggle" aria-label="Toggle navigation" aria-expanded="false" aria-controls="nav">☰</button>
<nav class="primary" id="nav" aria-label="Primary">
<ul>
<li><a href="#destinations">Destinations</a></li>
<li><a href="#flights">Flights</a></li>
<li><a href="#hotels">Hotels</a></li>
<li><a href="#guides">Guides</a></li>
<li><a href="#experiences">Experiences</a></li>
<li><a href="#reviews">Reviews</a></li>
<li><a href="#faq">FAQ</a></li>
<li><a href="#newsletter" class="cta">Plan My Trip</a></li>
</ul>
</nav>
</div>
</header>
<main id="top">
<!-- HERO -->
<section class="hero">
<div class="container">
<span class="eyebrow" style="color:#ffb59f">Travel guides · Booking resources · Tourism tips</span>
<h1>The world is wide. Your itinerary should be effortless.</h1>
<p class="lead">Meridian Atlas pairs on-the-ground destination expertise with transparent booking tools, so you can compare flights, find the right hotel and travel with confidence — from first idea to final boarding pass.</p>
<form class="search" id="searchForm" aria-label="Trip search">
<div>
<label for="from">Flying from</label>
<input id="from" type="text" placeholder="e.g. New York (JFK)" required>
</div>
<div>
<label for="to">Destination</label>
<input id="to" type="text" placeholder="e.g. Lisbon, Portugal" required>
</div>
<div>
<label for="depart">Depart</label>
<input id="depart" type="date" required>
</div>
<div>
<label for="trav">Travelers</label>
<select id="trav">
<option>1 traveler</option>
<option selected>2 travelers</option>
<option>3 travelers</option>
<option>4 travelers</option>
<option>5+ travelers</option>
</select>
</div>
<button class="btn btn-primary" type="submit">Get Quote</button>
</form>
<p class="search-msg" id="searchMsg" role="status" aria-live="polite"></p>
<div class="hero-badges">
<span>No hidden booking fees</span>
<span>Real traveler reviews</span>
<span>24/7 trip support</span>
<span>ATOL & ASTA protected</span>
</div>
</div>
</section>
<!-- STATS -->
<section class="stats" aria-label="Meridian Atlas at a glance">
<div class="container">
<div><strong>140+</strong><span>Destinations covered</span></div>
<div><strong>2.3M</strong><span>Travelers helped each year</span></div>
<div><strong>18,500</strong><span>Verified hotel reviews</span></div>
<div><strong>4.8/5</strong><span>Average trip satisfaction</span></div>
</div>
</section>
<!-- DESTINATIONS -->
<section class="destinations" id="destinations">
<div class="container">
<div class="section-head">
<span class="eyebrow">Trending destinations</span>
<h2>Where will the season take you?</h2>
<p>Our editors and local contributors surface the places worth your time right now — from shoulder-season city breaks to remote landscapes that reward the extra connection. Every destination page includes a day-by-day sample itinerary, neighborhood-by-neighborhood stay advice and honest notes on what to skip.</p>
</div>
<div class="dest-grid">
<article class="dest tall">
<img src="https://picsum.photos/700/900?random=21" alt="Terracotta rooftops and river in a historic European capital" loading="lazy">
<div><h3>Lisbon, Portugal</h3><p>Tiled facades, tram rides and sunset miradouros</p></div>
<a class="stretch" href="#guides" aria-label="Explore Destination: Lisbon"></a>
</article>
<article class="dest wide">
<img src="https://picsum.photos/1000/500?random=22" alt="Misty mountains and temples at dawn in Japan" loading="lazy">
<div><h3>Kyoto & Kansai, Japan</h3><p>Temples, tea houses and cherry-blossom corridors</p></div>
<a class="stretch" href="#guides" aria-label="Explore Destination: Kyoto"></a>
</article>
<article class="dest">
<img src="https://picsum.photos/500/500?random=23" alt="Turquoise coastline with white sand" loading="lazy">
<div><h3>Amalfi Coast</h3><p>Cliffside villages & lemon groves</p></div>
<a class="stretch" href="#guides" aria-label="Explore Destination: Amalfi Coast"></a>
</article>
<article class="dest">
<img src="https://picsum.photos/500/500?random=24" alt="Desert dunes at golden hour" loading="lazy">
<div><h3>Marrakech, Morocco</h3><p>Souks, riads & Atlas Mountain day trips</p></div>
<a class="stretch" href="#guides" aria-label="Explore Destination: Marrakech"></a>
</article>
<article class="dest wide">
<img src="https://picsum.photos/1000/500?random=25" alt="Glacier lagoon and volcanic landscape in Iceland" loading="lazy">
<div><h3>South Iceland</h3><p>Waterfalls, black-sand beaches and northern lights</p></div>
<a class="stretch" href="#guides" aria-label="Explore Destination: Iceland"></a>
</article>
<article class="dest">
<img src="https://picsum.photos/500/500?random=26" alt="Tropical rainforest canopy and river" loading="lazy">
<div><h3>Costa Rica</h3><p>Rainforest lodges & eco-tourism</p></div>
<a class="stretch" href="#guides" aria-label="Explore Destination: Costa Rica"></a>
</article>
</div>
</div>
</section>
<!-- MAIN + SIDEBAR -->
<div class="container layout">
<div class="content">
<!-- FLIGHT DEALS -->
<section class="block" id="flights">
<div class="section-head">
<span class="eyebrow">Flight Deals</span>
<h2>Fares worth booking this month</h2>
<p>Our fare analysts monitor thousands of routes daily and flag genuine price drops — not inflated "sale" fares. Each deal lists the cabin, typical baggage allowance and the travel window, so you can judge the true cost before you commit.</p>
</div>
<div class="tabs" role="group" aria-label="Filter flight deals by region">
<button class="tab" data-filter="all" aria-pressed="true">All deals</button>
<button class="tab" data-filter="europe" aria-pressed="false">Europe</button>
<button class="tab" data-filter="asia" aria-pressed="false">Asia</button>
<button class="tab" data-filter="americas" aria-pressed="false">Americas</button>
</div>
<div class="deals" id="deals">
<article class="deal" data-region="europe">
<div class="img"><img src="https://picsum.photos/600/340?random=31" alt="Aerial view of Lisbon rooftops" loading="lazy"><span class="tag">−32%</span></div>
<div class="body">
<h3>New York → Lisbon</h3>
<p class="meta">Round-trip · Economy · 1 checked bag included · Sep–Nov</p>
<div class="foot"><div class="price"><small>from</small><b>$379</b></div><a href="#newsletter" class="btn btn-primary btn-sm">Get Quote</a></div>
</div>
</article>
<article class="deal" data-region="asia">
<div class="img"><img src="https://picsum.photos/600/340?random=32" alt="Neon-lit street in Tokyo at night" loading="lazy"><span class="tag">Error fare</span></div>
<div class="body">
<h3>Los Angeles → Tokyo</h3>
<p class="meta">Round-trip · Premium Economy · 2 bags · Oct–Dec</p>
<div class="foot"><div class="price"><small>from</small><b>$648</b></div><a href="#newsletter" class="btn btn-primary btn-sm">Get Quote</a></div>
</div>
</article>
<article class="deal" data-region="americas">
<div class="img"><img src="https://picsum.photos/600/340?random=33" alt="Colorful colonial buildings in Cartagena" loading="lazy"><span class="tag">−24%</span></div>
<div class="body">
<h3>Miami → Cartagena</h3>
<p class="meta">Round-trip · Economy · Carry-on only · Year-round</p>
<div class="foot"><div class="price"><small>from</small><b>$219</b></div><a href="#newsletter" class="btn btn-primary btn-sm">Get Quote</a></div>
</div>
</article>
<article class="deal" data-region="europe">
<div class="img"><img src="https://picsum.photos/600/340?random=34" alt="Reykjavik harbor with colorful houses" loading="lazy"><span class="tag">Limited seats</span></div>
<div class="body">
<h3>Boston → Reykjavík</h3>
<p class="meta">Round-trip · Economy · Carry-on included · Jan–Mar</p>
<div class="foot"><div class="price"><small>from</small><b>$289</b></div><a href="#newsletter" class="btn btn-primary btn-sm">Get Quote</a></div>
</div>
</article>
<article class="deal" data-region="asia">
<div class="img"><img src="https://picsum.photos/600/340?random=35" alt="Temple spires in Bangkok at sunset" loading="lazy"><span class="tag">−28%</span></div>
<div class="body">
<h3>San Francisco → Bangkok</h3>
<p class="meta">Round-trip · Economy · 1 checked bag · Nov–Feb</p>
<div class="foot"><div class="price"><small>from</small><b>$574</b></div><a href="#newsletter" class="btn btn-primary btn-sm">Get Quote</a></div>
</div>
</article>
<article class="deal" data-region="americas">
<div class="img"><img src="https://picsum.photos/600/340?random=36" alt="Mountain peaks near Cusco, Peru" loading="lazy"><span class="tag">−19%</span></div>
<div class="body">
<h3>Houston → Cusco</h3>
<p class="meta">Round-trip · Economy · 1 checked bag · Apr–Jun</p>
<div class="foot"><div class="price"><small>from</small><b>$512</b></div><a href="#newsletter" class="btn btn-primary btn-sm">Get Quote</a></div>
</div>
</article>
</div>
<p class="note"><strong>Booking tip:</strong> Fares shown are the lowest recently found by our team and may change. Always check the airline's baggage allowance and change policy — a cheaper basic fare can cost more once seat selection and checked bags are added.</p>
</section>
<!-- HOTELS / LUXURY -->
<section class="lux-wrap" id="hotels">
<div class="luxury">
<span class="eyebrow">Luxury Escapes & Hotels</span>
<h2 style="font-size:clamp(1.8rem,3.2vw,2.4rem);margin-bottom:.8rem">Stays that become the reason for the trip</h2>
<p style="margin-bottom:.8rem">A great hotel does more than provide a bed. It shapes your pace, your meals and the stories you bring home. Our inspectors stay at least two nights incognito, scoring service, sleep quality, design, sustainability practices and value — then publish the full report, including the things the brochure leaves out.</p>
<p>Whether you're planning a honeymoon, a milestone anniversary or a restorative week away, our concierge team can build a bespoke itinerary with private transfers, spa credits and room upgrades negotiated on your behalf.</p>
<div class="lux-cards">
<article class="lux">
<img src="https://picsum.photos/700/400?random=41" alt="Infinity pool overlooking the sea at a luxury resort" loading="lazy">
<div>
<span class="stars" aria-label="5 stars">★★★★★</span>
<h3>Casa Alvorada, Algarve</h3>
<p>Clifftop suites, a Michelin-recognized tasting menu and private beach access. Best booked for 5+ nights.</p>
<a href="#newsletter" class="btn btn-light btn-sm">Get Quote</a>
</div>
</article>
<article class="lux">
<img src="https://picsum.photos/700/400?random=42" alt="Overwater bungalows in a calm lagoon" loading="lazy">
<div>
<span class="stars" aria-label="5 stars">★★★★★</span>
<h3>Nalu Atoll Villas, Maldives</h3>
<p>Solar-powered overwater villas, reef restoration programs and seaplane transfers included.</p>
<a href="#newsletter" class="btn btn-light btn-sm">Get Quote</a>
</div>
</article>
<article class="lux">
<img src="https://picsum.photos/700/400?random=43" alt="Stone ryokan with garden in Kyoto" loading="lazy">
<div>
<span class="stars" aria-label="4.5 stars">★★★★☆</span>
<h3>Higashiyama Ryokan, Kyoto</h3>
<p>Twelve tatami rooms, kaiseki dinners and private onsen baths, a short walk from Gion.</p>
<a href="#newsletter" class="btn btn-light btn-sm">Get Quote</a>
</div>
</article>
<article class="lux">
<img src="https://picsum.photos/700/400?random=45" alt="Safari lodge terrace at sunrise" loading="lazy">
<div>
<span class="stars" aria-label="5 stars">★★★★★</span>
<h3>Kopje Ridge Lodge, Tanzania</h3>
<p>Eight canvas suites in the Serengeti with guided game drives and community-owned conservation.</p>
<a href="#newsletter" class="btn btn-light btn-sm">Get Quote</a>
</div>
</article>
</div>
</div>
</section>
<!-- CULTURAL EXPERIENCES -->
<section class="block" id="experiences">
<div class="section-head">
<span class="eyebrow">Cultural Experiences</span>
<h2>Travel that connects you with people and place</h2>
</div>
<div class="split">
<img src="https://picsum.photos/800/700?random=51" alt="Local chef teaching a cooking class in a bright kitchen" loading="lazy">
<div>
<h3>Learn from locals, not just a guidebook</h3>
<p>The most memorable moments rarely happen at the main attraction. They happen at a family table in Oaxaca, in a weaving studio in Chiang Mai, or on a pre-dawn walk through a fish market with someone who has worked there for thirty years.</p>
<p>Every Meridian Atlas experience is vetted for fair pay, small group sizes and genuine local ownership. We cap most tours at ten guests so you can ask questions, linger and actually be part of the conversation.</p>
<ul class="checks">
<li>Small-group workshops led by local artisans and chefs</li>
<li>Fully flexible cancellation up to 48 hours before</li>
<li>Accessible options flagged on every listing</li>
</ul>
<a href="#newsletter" class="btn btn-primary">Explore Destination Experiences</a>
</div>
</div>
<div class="exp-grid">
<div class="exp"><div class="ico">🍜</div><h4>Food & Market Walks</h4><p>Taste your way through street stalls and family-run kitchens with a neighborhood host.</p></div>
<div class="exp"><div class="ico">🏛️</div><h4>Heritage & History</h4><p>Skip-the-line access and historian-led tours of UNESCO sites, castles and old quarters.</p></div>
<div class="exp"><div class="ico">🎨</div><h4>Craft & Creative Studios</h4><p>Try ceramics, indigo dyeing or flamenco guitar with practicing masters.</p></div>
</div>
</section>
<!-- GUIDES / ECO -->
<section class="block" id="guides">
<div class="section-head">
<span class="eyebrow">Guides & Eco-Tourism</span>
<h2>Thoughtful travel, explained clearly</h2>
<p>Responsible travel isn't about giving things up — it's about making smarter choices. Our eco-tourism guides show you how to reduce your footprint, support local communities and still enjoy a deeply rewarding itinerary. Below are our most-read, most-updated resources.</p>
</div>
<div class="eco-list">
<article class="guide">
<img src="https://picsum.photos/220/200?random=61" alt="Hiker on a forest trail" loading="lazy">
<div><h4>The Slow-Travel Itinerary: 10 Days in Northern Italy by Rail</h4><p>Trains, agriturismi and zero rental cars.</p><a href="#guides">Read Guide →</a></div>
</article>
<article class="guide">
<img src="https://picsum.photos/220/200?random=62" alt="Sea turtle swimming over coral" loading="lazy">
<div><h4>Eco-Tourism in Costa Rica: Lodges That Truly Give Back</h4><p>How to spot greenwashing before you book.</p><a href="#guides">Read Guide →</a></div>
</article>
<article class="guide">
<img src="https://picsum.photos/220/200?random=63" alt="Suitcase and travel documents on a bed" loading="lazy">
<div><h4>Baggage Allowance Decoded: Carry-On, Checked & Budget Fares</h4><p>Dimensions, weight limits and fee traps.</p><a href="#guides">Read Guide →</a></div>
</article>
<article class="guide">
<img src="https://picsum.photos/220/200?random=64" alt="Passport and boarding pass" loading="lazy">
<div><h4>Visas, Vaccines & Entry Rules: The 2025 Checklist</h4><p>What you need before you fly, by region.</p><a href="#guides">Read Guide →</a></div>
</article>
<article class="guide">
<img src="https://picsum.photos/220/200?random=65" alt="Family walking on a beach at sunset" loading="lazy">
<div><h4>Family Travel With Toddlers: A Realistic Itinerary Framework</h4><p>Nap-friendly planning that keeps everyone happy.</p><a href="#guides">Read Guide →</a></div>
</article>
<article class="guide">
<img src="https://picsum.photos/220/200?random=66" alt="Travel insurance documents with a laptop" loading="lazy">
<div><h4>Travel Insurance: What Policies Actually Cover</h4><p>Medical, cancellation and adventure add-ons explained.</p><a href="#guides">Read Guide →</a></div>
</article>
</div>
<p style="margin-top:1.8rem"><a class="btn btn-outline" href="#guides">Browse All 400+ Guides</a></p>
</section>
</div>
<!-- SIDEBAR -->
<aside aria-label="Travel tools and tips">
<div class="sticky">
<div class="widget conv" id="converter">
<h3>💱 Currency Converter</h3>
<p style="font-size:.88rem;opacity:.92">Budget your trip in local money. Rates are indicative mid-market values.</p>
<label for="amount">Amount</label>
<input id="amount" type="number" min="0" step="any" value="100" inputmode="decimal">
<div class="row">
<div>
<label for="cFrom">From</label>
<select id="cFrom"></select>
</div>
<button class="swap" id="swap" type="button" aria-label="Swap currencies">⇄</button>
<div>
<label for="cTo">To</label>
<select id="cTo"></select>
</div>
</div>
<div class="result" aria-live="polite">
<b id="convOut">—</b>
<small id="convRate"></small>
</div>
</div>
<div class="widget">
<h3>Smart Travel Hacks</h3>
<ol class="hacks">
<li><b>Fly midweek.</b> Tuesday and Wednesday departures are often 15–20% cheaper than weekends.</li>
<li><b>Pay in local currency.</b> Decline "dynamic currency conversion" at card terminals to avoid poor rates.</li>
<li><b>Photograph your documents.</b> Store passport and insurance copies offline and in secure cloud storage.</li>
<li><b>Pack a soft tote.</b> It doubles as a personal item and saves you from budget-airline bag fees.</li>
<li><b>Check airport transit visas.</b> A layover can require paperwork even if you never leave the terminal.</li>
</ol>
</div>
<div class="widget spot">
<h3>Destination Spotlight</h3>
<img src="https://picsum.photos/600/340?random=71" alt="Quiet Greek island village with whitewashed houses" loading="lazy">
<h4 style="font-size:1.1rem;margin-bottom:.4rem">Naxos, Greece</h4>
<p>Quieter than Santorini, richer in food and beaches. Visit in late May or September for warm seas and half the crowds.</p>
<a href="#guides" class="btn btn-outline btn-sm">Explore Destination</a>
</div>
<div class="widget">
<h3>Inspiration Gallery</h3>
<div class="gallery">
<img src="https://picsum.photos/200/200?random=81" alt="Lake and mountains" loading="lazy">
<img src="https://picsum.photos/200/200?random=82" alt="City skyline at dusk" loading="lazy">
<img src="https://picsum.photos/200/200?random=83" alt="Palm-lined beach" loading="lazy">
<img src="https://picsum.photos/200/200?random=84" alt="Narrow cobbled street" loading="lazy">
<img src="https://picsum.photos/200/200?random=85" alt="Desert road" loading="lazy">
<img src="https://picsum.photos/200/200?random=86" alt="Snowy alpine village" loading="lazy">
</div>
</div>
</div>
</aside>
</div>
<!-- WHY US -->
<section class="why" id="why">
<div class="container">
<div class="section-head">
<span class="eyebrow">Why Meridian Atlas</span>
<h2>Built by travelers, backed by specialists</h2>
<p>We started in 2012 as a small blog documenting overland trips and have grown into a team of 60 editors, fare analysts and trip designers. Our principle hasn't changed: give people the honest information they need to travel better.</p>
</div>
<div class="feat-grid">
<div class="feat"><div class="ico">🧭</div><h3>Independent recommendations</h3><p>We never accept payment for placement. Hotels and tours are ranked on inspection scores and verified guest feedback.</p></div>
<div class="feat"><div class="ico">🛡️</div><h3>Protected bookings</h3><p>Flexible rebooking options, transparent cancellation terms and financial protection on all packaged itineraries.</p></div>
<div class="feat"><div class="ico">🌱</div><h3>Responsible by design</h3><p>Carbon estimates on every flight, plus a curated collection of certified eco-lodges and community-led tours.</p></div>
<div class="feat"><div class="ico">💬</div><h3>Human support, around the clock</h3><p>Real specialists on chat and phone when plans change — from delayed connections to last-minute room swaps.</p></div>
<div class="feat"><div class="ico">🗺️</div><h3>Custom itinerary planning</h3><p>Tell us your pace, interests and budget. We'll craft a day-by-day plan with bookings, transfers and local tips.</p></div>
<div class="feat"><div class="ico">💳</div><h3>Transparent pricing</h3><p>Taxes, baggage and service fees are shown upfront. What you see is what you pay — in your preferred currency.</p></div>
</div>
</div>
</section>
<!-- REVIEWS -->
<section class="reviews" id="reviews">
<div class="container">
<div class="section-head">
<span class="eyebrow">Reviews</span>
<h2>Trusted by travelers worldwide</h2>
<p>From first-time backpackers to seasoned luxury travelers, here's what our community says about planning with us.</p>
</div>
<div class="t-grid">
<figure class="t-card">
<div class="stars" aria-label="5 out of 5 stars">★★★★★</div>
<blockquote>“Our two-week Japan itinerary was flawless. The rail pass advice alone saved us over $300, and the ryokan they recommended was the highlight of our honeymoon.”</blockquote>
<figcaption class="t-user"><img src="https://i.pravatar.cc/104?u=meridian-sarah" alt="Portrait of Sarah Mitchell" width="52" height="52"><div><strong>Sarah Mitchell</strong><span>Denver, USA · Japan honeymoon</span></div></figcaption>
</figure>
<figure class="t-card">
<div class="stars" aria-label="5 out of 5 stars">★★★★★</div>
<blockquote>“Their flight alerts are the real thing. I booked Lisbon at $379 round-trip and the fare was gone the next morning. The baggage allowance breakdown prevented a nasty surprise too.”</blockquote>
<figcaption class="t-user"><img src="https://i.pravatar.cc/104?u=meridian-daniel" alt="Portrait of Daniel Okafor" width="52" height="52"><div><strong>Daniel Okafor</strong><span>London, UK · Frequent flyer</span></div></figcaption>
</figure>
<figure class="t-card">
<div class="stars" aria-label="4.5 out of 5 stars">★★★★★</div>
<blockquote>“We wanted eco-tourism without compromise. Meridian Atlas found us a lodge in Costa Rica that was genuinely sustainable and still beautiful. The kids are still talking about the sloths.”</blockquote>
<figcaption class="t-user"><img src="https://i.pravatar.cc/104?u=meridian-elena" alt="Portrait of Elena Rossi" width="52" height="52"><div><strong>Elena Rossi</strong><span>Milan, Italy · Family traveler</span></div></figcaption>
</figure>
</div>
</div>
</section>
<!-- FAQ -->
<section class="faq" id="faq" style="padding-top:5rem">
<div class="container faq-wrap">
<div>
<span class="eyebrow">FAQ</span>
<h2 style="font-size:clamp(1.8rem,3.2vw,2.4rem);margin-bottom:1rem">Questions travelers ask us most</h2>
<p style="color:var(--muted);margin-bottom:1.4rem">Can't find what you're looking for? Our trip specialists are happy to help with itinerary advice, booking changes and special requests.</p>
<a href="mailto:hello@meridianatlas.example" class="btn btn-outline">Contact Support</a>
</div>
<div>
<details open>
<summary>When is the best time to book international flights?</summary>
<p>For most long-haul routes, the sweet spot is 2–4 months before departure; for peak-season travel such as summer holidays, aim for 4–6 months. Midweek departures and flexible dates often unlock the best fares. Set a fare alert and we'll notify you when prices drop.</p>
</details>
<details>
<summary>What's the difference between carry-on and checked baggage allowance?</summary>
<p>Carry-on bags travel in the cabin and typically must fit within airline-specific dimensions (often 55×40×20 cm) and weight limits. Checked bags go in the hold and are usually 20–23 kg on economy fares. Budget and basic fares often exclude checked bags, so always verify before booking.</p>
</details>
<details>
<summary>Can I change or cancel a booking made through Meridian Atlas?</summary>
<p>Yes. Flexible rates can be amended free of charge up to the deadline shown on your confirmation. For non-flexible fares, airline and hotel rules apply, but our support team can often negotiate credits or alternative dates on your behalf.</p>
</details>
<details>
<summary>How do you choose which hotels and experiences to feature?</summary>
<p>Every listing is inspected or verified by our editorial team and scored on service, location, cleanliness, sustainability and value. We don't accept payment for rankings, and any affiliate relationships are disclosed on the page.</p>
</details>
<details>
<summary>Do you offer custom itinerary planning?</summary>
<p>Absolutely. Share your dates, interests and budget, and a specialist will design a day-by-day itinerary with flights, stays, transfers and activities. Initial consultations are complimentary, and you only pay if you book.</p>
</details>
<details>
<summary>Is travel insurance included?</summary>
<p>Insurance is optional but strongly recommended. When you request a quote, we'll present comprehensive plans covering medical care, trip cancellation, delays and lost baggage, plus add-ons for adventure activities.</p>
</details>
</div>
</div>
</section>
<!-- NEWSLETTER -->
<section class="newsletter" id="newsletter">
<div class="container">
<span class="eyebrow" style="color:#ffb59f">The Atlas Dispatch</span>
<h2>Get deals, guides and itinerary ideas, weekly</h2>
<p>Join 480,000 subscribers receiving hand-picked flight deals, destination guides and insider tips every Thursday. No spam, unsubscribe in one click.</p>
<form id="newsForm" novalidate>
<label for="email" class="sr" style="position:absolute;left:-9999px">Email address</label>
<input id="email" type="email" placeholder="you@example.com" required>
<button type="submit" class="btn btn-primary">Subscribe</button>
</form>
<p class="form-msg" id="formMsg" role="status" aria-live="polite"></p>
</div>
</section>
</main>
<footer>
<div class="container">
<div class="foot-grid">
<div>
<a href="#top" class="brand">
<img src="https://placehold.co/96x96/0e7c86/ffffff?text=MA&font=playfair%20display" alt="Meridian Atlas logo" width="48" height="48">
<div><strong>Meridian Atlas</strong><span>Plan boldly. Travel wisely.</span></div>
</a>
<p>Independent travel guides, honest hotel reviews and transparent booking tools — helping you travel further, smarter and more responsibly.</p>
<div class="social">
<a href="#" aria-label="Instagram">IG</a>
<a href="#" aria-label="Facebook">FB</a>
<a href="#" aria-label="X (Twitter)">X</a>
<a href="#" aria-label="YouTube">YT</a>
<a href="#" aria-label="Pinterest">P</a>
</div>
</div>
<div>
<h4>Explore</h4>
<ul>
<li><a href="#destinations">Destinations</a></li>
<li><a href="#flights">Flight Deals</a></li>
<li><a href="#hotels">Hotels</a></li>
<li><a href="#guides">Guides</a></li>
<li><a href="#experiences">Experiences</a></li>
</ul>
</div>
<div>
<h4>Company</h4>
<ul>
<li><a href="#why">About Us</a></li>
<li><a href="#reviews">Reviews</a></li>
<li><a href="#faq">Help & FAQ</a></li>
<li><a href="#">Careers</a></li>
<li><a href="#">Press</a></li>
</ul>
</div>
<div>
<h4>Contact</h4>
<ul>
<li>214 Harborview Avenue, Suite 400<br>Portland, OR 97204, USA</li>
<li><a href="tel:+18005550142">+1 (800) 555-0142</a></li>
<li><a href="mailto:hello@meridianatlas.example">hello@meridianatlas.example</a></li>
<li>Mon–Sat, 8am–8pm ET</li>
</ul>
</div>
</div>
<div class="copyright">
<div>© <span id="year">2025</span> Meridian Atlas Travel Group, Inc. All rights reserved.</div>
<nav aria-label="Legal">
<a href="#">Privacy Policy</a>
<a href="#">Terms of Service</a>
<a href="#">Cookie Settings</a>
</nav>
</div>
</div>
</footer>
<script>
(function(){
// Year
document.getElementById('year').textContent = new Date().getFullYear();
// Mobile nav
var toggle = document.querySelector('.menu-toggle');
var nav = document.getElementById('nav');
toggle.addEventListener('click', function(){
var open = nav.classList.toggle('open');
toggle.setAttribute('aria-expanded', open);
});
nav.querySelectorAll('a').forEach(function(a){
a.addEventListener('click', function(){ nav.classList.remove('open'); toggle.setAttribute('aria-expanded', false); });
});
// Date min
var dep = document.getElementById('depart');
dep.min = new Date().toISOString().split('T')[0];
// Search form
document.getElementById('searchForm').addEventListener('submit', function(e){
e.preventDefault();
var f = document.getElementById('from').value.trim();
var t = document.getElementById('to').value.trim();
var tr = document.getElementById('trav').value;
document.getElementById('searchMsg').textContent = 'Thanks! A specialist is preparing options from ' + f + ' to ' + t + ' for ' + tr.toLowerCase() + '. Expect your quote by email within 2 hours.';
});
// Deal filters
var tabs = document.querySelectorAll('.tab');
var deals = document.querySelectorAll('#deals .deal');
tabs.forEach(function(tab){
tab.addEventListener('click', function(){
tabs.forEach(function(t){ t.setAttribute('aria-pressed','false'); });
tab.setAttribute('aria-pressed','true');
var f = tab.dataset.filter;
deals.forEach(function(d){
d.style.display = (f === 'all' || d.dataset.region === f) ? '' : 'none';
});
});
});
// Currency converter (indicative rates, USD base)
var rates = {USD:1, EUR:0.92, GBP:0.79, JPY:149.5, AUD:1.52, CAD:1.36, CHF:0.88, THB:35.8, MXN:17.1, INR:83.2, AED:3.67, BRL:5.0};
var names = {USD:'US Dollar', EUR:'Euro', GBP:'British Pound', JPY:'Japanese Yen', AUD:'Australian Dollar', CAD:'Canadian Dollar', CHF:'Swiss Franc', THB:'Thai Baht', MXN:'Mexican Peso', INR:'Indian Rupee', AED:'UAE Dirham', BRL:'Brazilian Real'};
var cFrom = document.getElementById('cFrom'), cTo = document.getElementById('cTo');
var amount = document.getElementById('amount');
Object.keys(rates).forEach(function(c){
cFrom.add(new Option(c + ' — ' + names[c], c));
cTo.add(new Option(c + ' — ' + names[c], c));
});
cFrom.value = 'USD'; cTo.value = 'EUR';
function convert(){
var a = parseFloat(amount.value);
var out = document.getElementById('convOut');
var rate = rates[cTo.value] / rates[cFrom.value];
if (isNaN(a) || a < 0){ out.textContent = '—'; document.getElementById('convRate').textContent = 'Enter a valid amount.'; return; }
var res = a * rate;
var digits = (cTo.value === 'JPY' || cTo.value === 'INR') ? 0 : 2;
out.textContent = res.toLocaleString(undefined, {minimumFractionDigits:digits, maximumFractionDigits:digits}) + ' ' + cTo.value;
document.getElementById('convRate').textContent = '1 ' + cFrom.value + ' = ' + rate.toLocaleString(undefined,{maximumFractionDigits:4}) + ' ' + cTo.value;
}
[amount, cFrom, cTo].forEach(function(el){ el.addEventListener('input', convert); });
document.getElementById('swap').addEventListener('click', function(){
var tmp = cFrom.value; cFrom.value = cTo.value; cTo.value = tmp; convert();
});
convert();
// Newsletter
document.getElementById('newsForm').addEventListener('submit', function(e){
e.preventDefault();
var email = document.getElementById('email');
var msg = document.getElementById('formMsg');
var ok = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email.value.trim());
msg.style.color = ok ? '#9ff0d4' : '#ffb59f';
msg.textContent = ok ? 'Welcome aboard! Check your inbox to confirm your subscription.' : 'Please enter a valid email address.';
if (ok) email.value = '';
});
})();
</script>
</body>
</html>
View Axe Report (JSON)
{
"testEngine": {
"name": "axe-core",
"version": "4.10.2"
},
"testRunner": {
"name": "axe"
},
"testEnvironment": {
"userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36",
"windowWidth": 1280,
"windowHeight": 720,
"orientationAngle": 0,
"orientationType": "landscape-primary"
},
"timestamp": "2026-11-12T09:52:30.102Z",
"url": "https://benchmark.aimac.invalid/18aa325dd2a1582a9eabf1c6ed9c76e42afa8da896a7931d3eeebe6515bd7b75.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-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-children",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag131",
"EN-301-549",
"EN-9.1.3.1"
],
"description": "Ensure elements with an ARIA role that require child roles contain them",
"help": "Certain ARIA roles must contain particular children",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-required-children?application=axeAPI",
"nodes": []
},
{
"id": "aria-required-parent",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag131",
"EN-301-549",
"EN-9.1.3.1"
],
"description": "Ensure elements with an ARIA role that require parent roles are contained by them",
"help": "Certain ARIA roles must be contained by particular parents",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-required-parent?application=axeAPI",
"nodes": []
},
{
"id": "aria-toggle-field-name",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"TTv5",
"TT5.c",
"EN-301-549",
"EN-9.4.1.2",
"ACT"
],
"description": "Ensure every ARIA toggle field has an accessible name",
"help": "ARIA toggle fields must have an accessible name",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-toggle-field-name?application=axeAPI",
"nodes": []
},
{
"id": "aria-tooltip-name",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure every ARIA tooltip node has an accessible name",
"help": "ARIA tooltip nodes must have an accessible name",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-tooltip-name?application=axeAPI",
"nodes": []
},
{
"id": "autocomplete-valid",
"impact": null,
"tags": [
"cat.forms",
"wcag21aa",
"wcag135",
"EN-301-549",
"EN-9.1.3.5",
"ACT"
],
"description": "Ensure the autocomplete attribute is correct and suitable for the form field",
"help": "autocomplete attribute must be used correctly",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/autocomplete-valid?application=axeAPI",
"nodes": []
},
{
"id": "blink",
"impact": null,
"tags": [
"cat.time-and-media",
"wcag2a",
"wcag222",
"section508",
"section508.22.j",
"TTv5",
"TT2.b",
"EN-301-549",
"EN-9.2.2.2"
],
"description": "Ensure <blink> elements are not used",
"help": "<blink> elements are deprecated and must not be used",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/blink?application=axeAPI",
"nodes": []
},
{
"id": "definition-list",
"impact": null,
"tags": [
"cat.structure",
"wcag2a",
"wcag131",
"EN-301-549",
"EN-9.1.3.1"
],
"description": "Ensure <dl> elements are structured correctly",
"help": "<dl> elements must only directly contain properly-ordered <dt> and <dd> groups, <script>, <template> or <div> elements",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/definition-list?application=axeAPI",
"nodes": []
},
{
"id": "dlitem",
"impact": null,
"tags": [
"cat.structure",
"wcag2a",
"wcag131",
"EN-301-549",
"EN-9.1.3.1"
],
"description": "Ensure <dt> and <dd> elements are contained by a <dl>",
"help": "<dt> and <dd> elements must be contained by a <dl>",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/dlitem?application=axeAPI",
"nodes": []
},
{
"id": "frame-focusable-content",
"impact": null,
"tags": [
"cat.keyboard",
"wcag2a",
"wcag211",
"TTv5",
"TT4.a",
"EN-301-549",
"EN-9.2.1.1"
],
"description": "Ensure <frame> and <iframe> elements with focusable content do not have tabindex=-1",
"help": "Frames with focusable content must not have tabindex=-1",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/frame-focusable-content?application=axeAPI",
"nodes": []
},
{
"id": "frame-title-unique",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag412",
"TTv5",
"TT12.d",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure <iframe> and <frame> elements contain a unique title attribute",
"help": "Frames must have a unique title attribute",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/frame-title-unique?application=axeAPI",
"nodes": []
},
{
"id": "frame-title",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag412",
"section508",
"section508.22.i",
"TTv5",
"TT12.d",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure <iframe> and <frame> elements have an accessible name",
"help": "Frames must have an accessible name",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/frame-title?application=axeAPI",
"nodes": []
},
{
"id": "html-xml-lang-mismatch",
"impact": null,
"tags": [
"cat.language",
"wcag2a",
"wcag311",
"EN-301-549",
"EN-9.3.1.1",
"ACT"
],
"description": "Ensure that HTML elements with both valid lang and xml:lang attributes agree on the base language of the page",
"help": "HTML elements with lang and xml:lang must have the same base language",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/html-xml-lang-mismatch?application=axeAPI",
"nodes": []
},
{
"id": "input-button-name",
"impact": null,
"tags": [
"cat.name-role-value",
"wcag2a",
"wcag412",
"section508",
"section508.22.a",
"TTv5",
"TT5.c",
"EN-301-549",
"EN-9.4.1.2",
"ACT"
],
"description": "Ensure input buttons have discernible text",
"help": "Input buttons must have discernible text",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/input-button-name?application=axeAPI",
"nodes": []
},
{
"id": "input-image-alt",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag111",
"wcag412",
"section508",
"section508.22.a",
"TTv5",
"TT7.a",
"EN-301-549",
"EN-9.1.1.1",
"EN-9.4.1.2",
"ACT"
],
"description": "Ensure <input type=\"image\"> elements have alternative text",
"help": "Image buttons must have alternative text",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/input-image-alt?application=axeAPI",
"nodes": []
},
{
"id": "marquee",
"impact": null,
"tags": [
"cat.parsing",
"wcag2a",
"wcag222",
"TTv5",
"TT2.b",
"EN-301-549",
"EN-9.2.2.2"
],
"description": "Ensure <marquee> elements are not used",
"help": "<marquee> elements are deprecated and must not be used",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/marquee?application=axeAPI",
"nodes": []
},
{
"id": "meta-refresh",
"impact": null,
"tags": [
"cat.time-and-media",
"wcag2a",
"wcag221",
"TTv5",
"TT8.a",
"EN-301-549",
"EN-9.2.2.1"
],
"description": "Ensure <meta http-equiv=\"refresh\"> is not used for delayed refresh",
"help": "Delayed refresh under 20 hours must not be used",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/meta-refresh?application=axeAPI",
"nodes": []
},
{
"id": "object-alt",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag111",
"section508",
"section508.22.a",
"EN-301-549",
"EN-9.1.1.1"
],
"description": "Ensure <object> elements have alternative text",
"help": "<object> elements must have alternative text",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/object-alt?application=axeAPI",
"nodes": []
},
{
"id": "role-img-alt",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag111",
"section508",
"section508.22.a",
"TTv5",
"TT7.a",
"EN-301-549",
"EN-9.1.1.1",
"ACT"
],
"description": "Ensure [role=\"img\"] elements have alternative text",
"help": "[role=\"img\"] elements must have an alternative text",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/role-img-alt?application=axeAPI",
"nodes": []
},
{
"id": "scrollable-region-focusable",
"impact": null,
"tags": [
"cat.keyboard",
"wcag2a",
"wcag211",
"wcag213",
"TTv5",
"TT4.a",
"EN-301-549",
"EN-9.2.1.1",
"EN-9.2.1.3"
],
"description": "Ensure elements that have scrollable content are accessible by keyboard",
"help": "Scrollable region must have keyboard access",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/scrollable-region-focusable?application=axeAPI",
"nodes": []
},
{
"id": "server-side-image-map",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag211",
"section508",
"section508.22.f",
"TTv5",
"TT4.a",
"EN-301-549",
"EN-9.2.1.1"
],
"description": "Ensure that server-side image maps are not used",
"help": "Server-side image maps must not be used",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/server-side-image-map?application=axeAPI",
"nodes": []
},
{
"id": "svg-img-alt",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag111",
"section508",
"section508.22.a",
"TTv5",
"TT7.a",
"EN-301-549",
"EN-9.1.1.1",
"ACT"
],
"description": "Ensure <svg> elements with an img, graphics-document or graphics-symbol role have an accessible text",
"help": "<svg> elements with an img role must have an alternative text",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/svg-img-alt?application=axeAPI",
"nodes": []
},
{
"id": "td-headers-attr",
"impact": null,
"tags": [
"cat.tables",
"wcag2a",
"wcag131",
"section508",
"section508.22.g",
"TTv5",
"TT14.b",
"EN-301-549",
"EN-9.1.3.1"
],
"description": "Ensure that each cell in a table that uses the headers attribute refers only to other cells in that table",
"help": "Table cells that use the headers attribute must only refer to cells in the same table",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/td-headers-attr?application=axeAPI",
"nodes": []
},
{
"id": "th-has-data-cells",
"impact": null,
"tags": [
"cat.tables",
"wcag2a",
"wcag131",
"section508",
"section508.22.g",
"TTv5",
"TT14.b",
"EN-301-549",
"EN-9.1.3.1"
],
"description": "Ensure that <th> elements and elements with role=columnheader/rowheader have data cells they describe",
"help": "Table headers in a data table must refer to data cells",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/th-has-data-cells?application=axeAPI",
"nodes": []
},
{
"id": "valid-lang",
"impact": null,
"tags": [
"cat.language",
"wcag2aa",
"wcag312",
"TTv5",
"TT11.b",
"EN-301-549",
"EN-9.3.1.2",
"ACT"
],
"description": "Ensure lang attributes have valid values",
"help": "lang attribute must have a valid value",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/valid-lang?application=axeAPI",
"nodes": []
},
{
"id": "video-caption",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag122",
"section508",
"section508.22.a",
"TTv5",
"TT17.a",
"EN-301-549",
"EN-9.1.2.2"
],
"description": "Ensure <video> elements have captions",
"help": "<video> elements must have captions",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/video-caption?application=axeAPI",
"nodes": []
},
{
"id": "no-autoplay-audio",
"impact": null,
"tags": [
"cat.time-and-media",
"wcag2a",
"wcag142",
"TTv5",
"TT2.a",
"EN-301-549",
"EN-9.1.4.2",
"ACT"
],
"description": "Ensure <video> or <audio> elements do not autoplay audio for more than 3 seconds without a control mechanism to stop or mute the audio",
"help": "<video> or <audio> elements must not play automatically",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/no-autoplay-audio?application=axeAPI",
"nodes": []
}
],
"passes": [
{
"id": "aria-allowed-attr",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure an element's role supports its ARIA attributes",
"help": "Elements must only use supported ARIA attributes",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-allowed-attr?application=axeAPI",
"nodes": [
{
"any": [],
"all": [
{
"id": "aria-allowed-attr",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "ARIA attributes are used correctly for the defined role"
}
],
"none": [
{
"id": "aria-unsupported-attr",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "ARIA attribute is supported"
}
],
"impact": null,
"html": "<a href=\"#top\" class=\"brand\" aria-label=\"Meridian Atlas home\">",
"target": [
"a[aria-label=\"Meridian Atlas home\"]"
]
}
]
},
{
"id": "aria-conditional-attr",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure ARIA attributes are used as described in the specification of the element's role",
"help": "ARIA attributes must be used as specified for the element's role",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-conditional-attr?application=axeAPI",
"nodes": [
{
"any": [],
"all": [
{
"id": "aria-conditional-attr",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "ARIA attribute is allowed"
}
],
"none": [],
"impact": null,
"html": "<a href=\"#top\" class=\"brand\" aria-label=\"Meridian Atlas home\">",
"target": [
"a[aria-label=\"Meridian Atlas home\"]"
]
}
]
},
{
"id": "aria-deprecated-role",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure elements do not use deprecated roles",
"help": "Deprecated ARIA roles must not be used",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-deprecated-role?application=axeAPI",
"nodes": [
{
"any": [],
"all": [],
"none": [
{
"id": "deprecatedrole",
"data": null,
"relatedNodes": [],
"impact": "minor",
"message": "ARIA role is not deprecated"
}
],
"impact": null,
"html": "<p class=\"search-msg\" id=\"searchMsg\" role=\"status\" aria-live=\"polite\"></p>",
"target": [
"#searchMsg"
]
}
]
},
{
"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": "serious",
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure ARIA attributes are not prohibited for an element's role",
"help": "Elements must only use permitted ARIA attributes",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-prohibited-attr?application=axeAPI",
"nodes": [
{
"any": [],
"all": [],
"none": [
{
"id": "aria-prohibited-attr",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "ARIA attribute is allowed"
}
],
"impact": null,
"html": "<a href=\"#top\" class=\"brand\" aria-label=\"Meridian Atlas home\">",
"target": [
"a[aria-label=\"Meridian Atlas home\"]"
]
}
]
},
{
"id": "aria-required-attr",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure elements with ARIA roles have all required ARIA attributes",
"help": "Required ARIA attributes must be provided",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-required-attr?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "aria-required-attr",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "All required ARIA attributes are present"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<p class=\"search-msg\" id=\"searchMsg\" role=\"status\" aria-live=\"polite\"></p>",
"target": [
"#searchMsg"
]
}
]
},
{
"id": "aria-roles",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure all elements with a role attribute use a valid value",
"help": "ARIA roles used must conform to valid values",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-roles?application=axeAPI",
"nodes": [
{
"any": [],
"all": [],
"none": [
{
"id": "invalidrole",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "ARIA role is valid"
},
{
"id": "abstractrole",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "Abstract roles are not used"
},
{
"id": "unsupportedrole",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "ARIA role is supported"
}
],
"impact": null,
"html": "<p class=\"search-msg\" id=\"searchMsg\" role=\"status\" aria-live=\"polite\"></p>",
"target": [
"#searchMsg"
]
}
]
},
{
"id": "aria-valid-attr-value",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure all ARIA attributes have valid values",
"help": "ARIA attributes must conform to valid values",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-valid-attr-value?application=axeAPI",
"nodes": [
{
"any": [],
"all": [
{
"id": "aria-valid-attr-value",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "ARIA attribute values are valid"
},
{
"id": "aria-errormessage",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "aria-errormessage exists and references elements visible to screen readers that use a supported aria-errormessage technique"
},
{
"id": "aria-level",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "aria-level values are valid"
}
],
"none": [],
"impact": null,
"html": "<a href=\"#top\" class=\"brand\" aria-label=\"Meridian Atlas home\">",
"target": [
"a[aria-label=\"Meridian Atlas home\"]"
]
}
]
},
{
"id": "aria-valid-attr",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure attributes that begin with aria- are valid ARIA attributes",
"help": "ARIA attributes must conform to valid names",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-valid-attr?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "aria-valid-attr",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "ARIA attribute name is valid"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<a href=\"#top\" class=\"brand\" aria-label=\"Meridian Atlas home\">",
"target": [
"a[aria-label=\"Meridian Atlas home\"]"
]
}
]
},
{
"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": "<span class=\"eyebrow\" style=\"color:#ffb59f\">Travel guides \u00b7 Booking resources \u00b7 Tourism tips</span>",
"target": [
".hero > .container > .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-primary\" type=\"submit\">Get Quote</button>",
"target": [
"#searchForm > button[type=\"submit\"]"
]
}
]
},
{
"id": "bypass",
"impact": null,
"tags": [
"cat.keyboard",
"wcag2a",
"wcag241",
"section508",
"section508.22.o",
"TTv5",
"TT9.a",
"EN-301-549",
"EN-9.2.4.1"
],
"description": "Ensure each page has at least one mechanism for a user to bypass navigation and jump straight to the content",
"help": "Page must have means to bypass repeated blocks",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/bypass?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "internal-link-present",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "Valid skip link found"
},
{
"id": "header-present",
"data": null,
"relatedNodes": [
{
"html": "<h1>The world is wide. Your itinerary should be effortless.</h1>",
"target": [
"h1"
]
},
{
"html": "<h2>Where will the season take you?</h2>",
"target": [
"#destinations > .container > .section-head > h2"
]
},
{
"html": "<h3>Lisbon, Portugal</h3>",
"target": [
".tall > div > h3"
]
},
{
"html": "<h3>Kyoto & Kansai, Japan</h3>",
"target": [
".wide.dest:nth-child(2) > div > h3"
]
},
{
"html": "<h3>Amalfi Coast</h3>",
"target": [
".dest:nth-child(3) > div > h3"
]
},
{
"html": "<h3>Marrakech, Morocco</h3>",
"target": [
".dest:nth-child(4) > div > h3"
]
},
{
"html": "<h3>South Iceland</h3>",
"target": [
".wide.dest:nth-child(5) > div > h3"
]
},
{
"html": "<h3>Costa Rica</h3>",
"target": [
".dest:nth-child(6) > div > h3"
]
},
{
"html": "<h2>Fares worth booking this month</h2>",
"target": [
"#flights > .section-head > h2"
]
},
{
"html": "<h3>New York \u2192 Lisbon</h3>",
"target": [
".deal[data-region=\"europe\"]:nth-child(1) > .body > h3"
]
},
{
"html": "<h3>Los Angeles \u2192 Tokyo</h3>",
"target": [
".deal[data-region=\"asia\"]:nth-child(2) > .body > h3"
]
},
{
"html": "<h3>Miami \u2192 Cartagena</h3>",
"target": [
".deal[data-region=\"americas\"]:nth-child(3) > .body > h3"
]
},
{
"html": "<h3>Boston \u2192 Reykjav\u00edk</h3>",
"target": [
".deal[data-region=\"europe\"]:nth-child(4) > .body > h3"
]
},
{
"html": "<h3>San Francisco \u2192 Bangkok</h3>",
"target": [
".deal[data-region=\"asia\"]:nth-child(5) > .body > h3"
]
},
{
"html": "<h3>Houston \u2192 Cusco</h3>",
"target": [
".deal[data-region=\"americas\"]:nth-child(6) > .body > h3"
]
},
{
"html": "<h2 style=\"font-size:clamp(1.8rem,3.2vw,2.4rem);margin-bottom:.8rem\">Stays that become the reason for the trip</h2>",
"target": [
".luxury > h2"
]
},
{
"html": "<h3>Casa Alvorada, Algarve</h3>",
"target": [
".lux:nth-child(1) > div > h3"
]
},
{
"html": "<h3>Nalu Atoll Villas, Maldives</h3>",
"target": [
".lux:nth-child(2) > div > h3"
]
},
{
"html": "<h3>Higashiyama Ryokan, Kyoto</h3>",
"target": [
".lux:nth-child(3) > div > h3"
]
},
{
"html": "<h3>Kopje Ridge Lodge, Tanzania</h3>",
"target": [
".lux:nth-child(4) > div > h3"
]
},
{
"html": "<h2>Travel that connects you with people and place</h2>",
"target": [
"#experiences > .section-head > h2"
]
},
{
"html": "<h3>Learn from locals, not just a guidebook</h3>",
"target": [
".split > div > h3"
]
},
{
"html": "<h4>Food & Market Walks</h4>",
"target": [
".exp:nth-child(1) > h4"
]
},
{
"html": "<h4>Heritage & History</h4>",
"target": [
".exp:nth-child(2) > h4"
]
},
{
"html": "<h4>Craft & Creative Studios</h4>",
"target": [
".exp:nth-child(3) > h4"
]
},
{
"html": "<h2>Thoughtful travel, explained clearly</h2>",
"target": [
"#guides > .section-head > h2"
]
},
{
"html": "<h4>The Slow-Travel Itinerary: 10 Days in Northern Italy by Rail</h4>",
"target": [
".guide:nth-child(1) > div > h4"
]
},
{
"html": "<h4>Eco-Tourism in Costa Rica: Lodges That Truly Give Back</h4>",
"target": [
".guide:nth-child(2) > div > h4"
]
},
{
"html": "<h4>Baggage Allowance Decoded: Carry-On, Checked & Budget Fares</h4>",
"target": [
".guide:nth-child(3) > div > h4"
]
},
{
"html": "<h4>Visas, Vaccines & Entry Rules: The 2025 Checklist</h4>",
"target": [
".guide:nth-child(4) > div > h4"
]
},
{
"html": "<h4>Family Travel With Toddlers: A Realistic Itinerary Framework</h4>",
"target": [
".guide:nth-child(5) > div > h4"
]
},
{
"html": "<h4>Travel Insurance: What Policies Actually Cover</h4>",
"target": [
".guide:nth-child(6) > div > h4"
]
},
{
"html": "<h3>\ud83d\udcb1 Currency Converter</h3>",
"target": [
"#converter > h3"
]
},
{
"html": "<h3>Smart Travel Hacks</h3>",
"target": [
".widget:nth-child(2) > h3"
]
},
{
"html": "<h3>Destination Spotlight</h3>",
"target": [
".spot > h3"
]
},
{
"html": "<h4 style=\"font-size:1.1rem;margin-bottom:.4rem\">Naxos, Greece</h4>",
"target": [
".spot > h4"
]
},
{
"html": "<h3>Inspiration Gallery</h3>",
"target": [
".widget:nth-child(4) > h3"
]
},
{
"html": "<h2>Built by travelers, backed by specialists</h2>",
"target": [
"#why > .container > .section-head > h2"
]
},
{
"html": "<h3>Independent recommendations</h3>",
"target": [
".feat:nth-child(1) > h3"
]
},
{
"html": "<h3>Protected bookings</h3>",
"target": [
".feat:nth-child(2) > h3"
]
},
{
"html": "<h3>Responsible by design</h3>",
"target": [
".feat:nth-child(3) > h3"
]
},
{
"html": "<h3>Human support, around the clock</h3>",
"target": [
".feat:nth-child(4) > h3"
]
},
{
"html": "<h3>Custom itinerary planning</h3>",
"target": [
".feat:nth-child(5) > h3"
]
},
{
"html": "<h3>Transparent pricing</h3>",
"target": [
".feat:nth-child(6) > h3"
]
},
{
"html": "<h2>Trusted by travelers worldwide</h2>",
"target": [
"#reviews > .container > .section-head > h2"
]
},
{
"html": "<h2 style=\"font-size:clamp(1.8rem,3.2vw,2.4rem);margin-bottom:1rem\">Questions travelers ask us most</h2>",
"target": [
".faq-wrap > div:nth-child(1) > h2"
]
},
{
"html": "<h2>Get deals, guides and itinerary ideas, weekly</h2>",
"target": [
".container > h2"
]
},
{
"html": "<h4>Explore</h4>",
"target": [
".foot-grid > div:nth-child(2) > h4"
]
},
{
"html": "<h4>Company</h4>",
"target": [
".foot-grid > div:nth-child(3) > h4"
]
},
{
"html": "<h4>Contact</h4>",
"target": [
"div:nth-child(4) > h4"
]
}
],
"impact": "serious",
"message": "Page has a heading"
},
{
"id": "landmark",
"data": null,
"relatedNodes": [
{
"html": "<main id=\"top\">",
"target": [
"#top"
]
}
],
"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": "#cfdbe8",
"bgColor": "#0f2a43",
"contrastRatio": 10.43,
"fontSize": "9.8pt (13.12px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [],
"impact": "serious",
"message": "Element has sufficient color contrast of 10.43"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<div>\u2708 Free itinerary review with every booking inquiry \u2014 <a href=\"#newsletter\">Get yours</a></div>",
"target": [
".topbar > .container > div:nth-child(1)"
]
}
]
},
{
"id": "document-title",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag242",
"TTv5",
"TT12.a",
"EN-301-549",
"EN-9.2.4.2",
"ACT"
],
"description": "Ensure each HTML document contains a non-empty <title> element",
"help": "Documents must have <title> element to aid in navigation",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/document-title?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "doc-has-title",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "Document has a non-empty <title> element"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<html lang=\"en\">",
"target": [
"html"
]
}
]
},
{
"id": "duplicate-id-aria",
"impact": null,
"tags": [
"cat.parsing",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure every id attribute value used in ARIA and in labels is unique",
"help": "IDs used in ARIA and labels must be unique",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/duplicate-id-aria?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "duplicate-id-aria",
"data": "nav",
"relatedNodes": [],
"impact": "critical",
"message": "Document has no elements referenced with ARIA or labels that share the same id attribute"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<nav class=\"primary\" id=\"nav\" aria-label=\"Primary\">",
"target": [
"#nav"
]
}
]
},
{
"id": "form-field-multiple-labels",
"impact": null,
"tags": [
"cat.forms",
"wcag2a",
"wcag332",
"TTv5",
"TT5.c",
"EN-301-549",
"EN-9.3.3.2"
],
"description": "Ensure form field does not have multiple label elements",
"help": "Form field must not have multiple label elements",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/form-field-multiple-labels?application=axeAPI",
"nodes": [
{
"any": [],
"all": [],
"none": [
{
"id": "multiple-label",
"data": null,
"relatedNodes": [
{
"html": "<label for=\"from\">Flying from</label>",
"target": [
"label[for=\"from\"]"
]
}
],
"impact": "moderate",
"message": "Form field does not have multiple label elements"
}
],
"impact": null,
"html": "<input id=\"from\" type=\"text\" placeholder=\"e.g. New York (JFK)\" required=\"\">",
"target": [
"#from"
]
}
]
},
{
"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/96x96/0e7c86/ffffff?text=MA&font=playfair%20display\" alt=\"Meridian Atlas logo\" width=\"48\" height=\"48\">",
"target": [
"a[aria-label=\"Meridian Atlas home\"] > img[alt=\"Meridian Atlas logo\"][width=\"48\"][height=\"48\"]"
]
}
]
},
{
"id": "label",
"impact": null,
"tags": [
"cat.forms",
"wcag2a",
"wcag412",
"section508",
"section508.22.n",
"TTv5",
"TT5.c",
"EN-301-549",
"EN-9.4.1.2",
"ACT"
],
"description": "Ensure every form element has a label",
"help": "Form elements must have labels",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/label?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "explicit-label",
"data": {
"explicitLabel": "Flying from"
},
"relatedNodes": [
{
"html": "<label for=\"from\">Flying from</label>",
"target": [
"label[for=\"from\"]"
]
}
],
"impact": "critical",
"message": "Element has an explicit <label>"
},
{
"id": "non-empty-placeholder",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "Element has a placeholder attribute"
}
],
"all": [],
"none": [
{
"id": "hidden-explicit-label",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "Form element has a visible explicit <label>"
}
],
"impact": null,
"html": "<input id=\"from\" type=\"text\" placeholder=\"e.g. New York (JFK)\" required=\"\">",
"target": [
"#from"
]
}
]
},
{
"id": "link-in-text-block",
"impact": "serious",
"tags": [
"cat.color",
"wcag2a",
"wcag141",
"TTv5",
"TT13.a",
"EN-301-549",
"EN-9.1.4.1"
],
"description": "Ensure links are distinguished from surrounding text in a way that does not rely on color",
"help": "Links must be distinguishable without relying on color",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/link-in-text-block?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "link-in-text-block-style",
"data": null,
"relatedNodes": [
{
"html": "<div>",
"target": [
".lux:nth-child(1) > div"
]
}
],
"impact": "serious",
"message": "Links can be distinguished from surrounding text by visual styling"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<a href=\"#newsletter\" class=\"btn btn-light btn-sm\">Get Quote</a>",
"target": [
".lux:nth-child(1) > div > .btn-light.btn-sm[href$=\"#newsletter\"]"
]
}
]
},
{
"id": "link-name",
"impact": null,
"tags": [
"cat.name-role-value",
"wcag2a",
"wcag244",
"wcag412",
"section508",
"section508.22.a",
"TTv5",
"TT6.a",
"EN-301-549",
"EN-9.2.4.4",
"EN-9.4.1.2",
"ACT"
],
"description": "Ensure links have discernible text",
"help": "Links must have discernible text",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/link-name?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "has-visible-text",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "Element has text that is visible to screen readers"
}
],
"all": [],
"none": [
{
"id": "focusable-no-name",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "Element is not in tab order or has accessible text"
}
],
"impact": null,
"html": "<a href=\"#newsletter\">Get yours</a>",
"target": [
"div:nth-child(1) > a[href$=\"#newsletter\"]"
]
}
]
},
{
"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\">",
"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/96x96/0e7c86/ffffff?text=MA&font=playfair%20display\" alt=\"Meridian Atlas logo\" width=\"48\" height=\"48\">",
"target": [
"a[aria-label=\"Meridian Atlas home\"] > img[alt=\"Meridian Atlas logo\"][width=\"48\"][height=\"48\"]"
]
}
]
},
{
"id": "select-name",
"impact": null,
"tags": [
"cat.forms",
"wcag2a",
"wcag412",
"section508",
"section508.22.n",
"TTv5",
"TT5.c",
"EN-301-549",
"EN-9.4.1.2",
"ACT"
],
"description": "Ensure select element has an accessible name",
"help": "Select element must have an accessible name",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/select-name?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "explicit-label",
"data": {
"explicitLabel": "Travelers"
},
"relatedNodes": [
{
"html": "<label for=\"trav\">Travelers</label>",
"target": [
"label[for=\"trav\"]"
]
}
],
"impact": "critical",
"message": "Element has an explicit <label>"
}
],
"all": [],
"none": [
{
"id": "hidden-explicit-label",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "Form element has a visible explicit <label>"
}
],
"impact": null,
"html": "<select id=\"trav\">\n <option>1 traveler</option>\n <option selected=\"\">2 travelers</option>\n <option>3 travelers</option>\n <option>4 travelers</option>\n <option>5+ travelers</option>\n </select>",
"target": [
"#trav"
]
}
]
},
{
"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 is the best time to book international flights?</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": 219,
"height": 48
},
"relatedNodes": [],
"impact": "serious",
"message": "Control has sufficient size (219px by 48px, should be at least 24px by 24px)"
},
{
"id": "target-offset",
"data": {
"closestOffset": 24,
"minOffset": 24
},
"relatedNodes": [],
"impact": "serious",
"message": "Target has sufficient space from its closest neighbors. Safe clickable space has a diameter of 24px which is at least 24px."
}
],
"all": [],
"none": [],
"impact": null,
"html": "<a href=\"#top\" class=\"brand\" aria-label=\"Meridian Atlas home\">",
"target": [
"a[aria-label=\"Meridian Atlas home\"]"
]
}
]
}
],
"incomplete": [
{
"id": "aria-prohibited-attr",
"impact": "serious",
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure ARIA attributes are not prohibited for an element's role",
"help": "Elements must only use permitted ARIA attributes",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-prohibited-attr?application=axeAPI",
"nodes": [
{
"any": [],
"all": [],
"none": [
{
"id": "aria-prohibited-attr",
"data": {
"role": null,
"nodeName": "span",
"messageKey": "noRoleSingular",
"prohibited": [
"aria-label"
]
},
"relatedNodes": [],
"impact": "serious",
"message": "aria-label attribute is not well supported on a span with no valid role attribute."
}
],
"impact": "serious",
"html": "<span class=\"stars\" aria-label=\"5 stars\">\u2605\u2605\u2605\u2605\u2605</span>",
"target": [
".lux:nth-child(1) > div > .stars[aria-label=\"5 stars\"]"
],
"failureSummary": "Fix all of the following:\n aria-label attribute is not well supported on a span with no valid role attribute."
}
]
},
{
"id": "color-contrast",
"impact": "serious",
"tags": [
"cat.color",
"wcag2aa",
"wcag143",
"TTv5",
"TT13.c",
"EN-301-549",
"EN-9.1.4.3",
"ACT"
],
"description": "Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds",
"help": "Elements must meet minimum color contrast ratio thresholds",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/color-contrast?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": null,
"bgColor": null,
"contrastRatio": 0,
"fontSize": "9.0pt (12px)",
"fontWeight": "bold",
"messageKey": "bgGradient",
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section class=\"hero\">",
"target": [
".hero"
]
}
],
"impact": "serious",
"message": "Element's background color could not be determined due to a background gradient"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"eyebrow\" style=\"color:#ffb59f\">Travel guides \u00b7 Booking resources \u00b7 Tourism tips</span>",
"target": [
".hero > .container > .eyebrow"
],
"failureSummary": "Fix any of the following:\n Element's background color could not be determined due to a background gradient"
}
]
},
{
"id": "link-in-text-block",
"impact": "serious",
"tags": [
"cat.color",
"wcag2a",
"wcag141",
"TTv5",
"TT13.a",
"EN-301-549",
"EN-9.1.4.1"
],
"description": "Ensure links are distinguished from surrounding text in a way that does not rely on color",
"help": "Links must be distinguishable without relying on color",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/link-in-text-block?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "link-in-text-block",
"data": {
"messageKey": "bgOverlap"
},
"relatedNodes": [
{
"html": "<div><h4>The Slow-Travel Itinerary: 10 Days in Northern Italy by Rail</h4><p>Trains, agriturismi and zero rental cars.</p><a href=\"#guides\">Read Guide \u2192</a></div>",
"target": [
".guide:nth-child(1) > div"
]
}
],
"impact": "serious",
"message": "Element's contrast ratio could not be determined because of element overlap"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#guides\">Read Guide \u2192</a>",
"target": [
".guide:nth-child(1) > div > a[href$=\"#guides\"]"
],
"failureSummary": "Fix any of the following:\n Element's contrast ratio could not be determined because of element overlap"
}
]
}
],
"violations": [
{
"id": "color-contrast",
"impact": "serious",
"tags": [
"cat.color",
"wcag2aa",
"wcag143",
"TTv5",
"TT13.c",
"EN-301-549",
"EN-9.1.4.3",
"ACT"
],
"description": "Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds",
"help": "Elements must meet minimum color contrast ratio thresholds",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/color-contrast?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#ffffff",
"bgColor": "#e8664a",
"contrastRatio": 3.26,
"fontSize": "11.4pt (15.2px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<button class=\"btn btn-primary\" type=\"submit\">Get Quote</button>",
"target": [
"#searchForm > button[type=\"submit\"]"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.26 (foreground color: #ffffff, background color: #e8664a, font size: 11.4pt (15.2px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<button class=\"btn btn-primary\" type=\"submit\">Get Quote</button>",
"target": [
"#searchForm > button[type=\"submit\"]"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.26 (foreground color: #ffffff, background color: #e8664a, font size: 11.4pt (15.2px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#e8664a",
"bgColor": "#ffffff",
"contrastRatio": 3.26,
"fontSize": "9.0pt (12px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<body>",
"target": [
"body"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.26 (foreground color: #e8664a, background color: #ffffff, font size: 9.0pt (12px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"eyebrow\">Trending destinations</span>",
"target": [
"#destinations > .container > .section-head > .eyebrow"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.26 (foreground color: #e8664a, background color: #ffffff, font size: 9.0pt (12px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#e8664a",
"bgColor": "#ffffff",
"contrastRatio": 3.26,
"fontSize": "9.0pt (12px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<body>",
"target": [
"body"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.26 (foreground color: #e8664a, background color: #ffffff, font size: 9.0pt (12px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"eyebrow\">Flight Deals</span>",
"target": [
"#flights > .section-head > .eyebrow"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.26 (foreground color: #e8664a, background color: #ffffff, font size: 9.0pt (12px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#ffffff",
"bgColor": "#e8664a",
"contrastRatio": 3.26,
"fontSize": "8.6pt (11.52px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<span class=\"tag\">\u221232%</span>",
"target": [
".deal[data-region=\"europe\"]:nth-child(1) > .img > .tag"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.26 (foreground color: #ffffff, background color: #e8664a, font size: 8.6pt (11.52px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"tag\">\u221232%</span>",
"target": [
".deal[data-region=\"europe\"]:nth-child(1) > .img > .tag"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.26 (foreground color: #ffffff, background color: #e8664a, font size: 8.6pt (11.52px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#ffffff",
"bgColor": "#e8664a",
"contrastRatio": 3.26,
"fontSize": "10.2pt (13.6px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<a href=\"#newsletter\" class=\"btn btn-primary btn-sm\">Get Quote</a>",
"target": [
".deal[data-region=\"europe\"]:nth-child(1) > .body > .foot > .btn-primary.btn-sm[href$=\"#newsletter\"]"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.26 (foreground color: #ffffff, background color: #e8664a, font size: 10.2pt (13.6px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#newsletter\" class=\"btn btn-primary btn-sm\">Get Quote</a>",
"target": [
".deal[data-region=\"europe\"]:nth-child(1) > .body > .foot > .btn-primary.btn-sm[href$=\"#newsletter\"]"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.26 (foreground color: #ffffff, background color: #e8664a, font size: 10.2pt (13.6px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#ffffff",
"bgColor": "#e8664a",
"contrastRatio": 3.26,
"fontSize": "8.6pt (11.52px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<span class=\"tag\">Error fare</span>",
"target": [
".deal[data-region=\"asia\"]:nth-child(2) > .img > .tag"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.26 (foreground color: #ffffff, background color: #e8664a, font size: 8.6pt (11.52px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"tag\">Error fare</span>",
"target": [
".deal[data-region=\"asia\"]:nth-child(2) > .img > .tag"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.26 (foreground color: #ffffff, background color: #e8664a, font size: 8.6pt (11.52px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#ffffff",
"bgColor": "#e8664a",
"contrastRatio": 3.26,
"fontSize": "10.2pt (13.6px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<a href=\"#newsletter\" class=\"btn btn-primary btn-sm\">Get Quote</a>",
"target": [
".deal[data-region=\"asia\"]:nth-child(2) > .body > .foot > .btn-primary.btn-sm[href$=\"#newsletter\"]"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.26 (foreground color: #ffffff, background color: #e8664a, font size: 10.2pt (13.6px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#newsletter\" class=\"btn btn-primary btn-sm\">Get Quote</a>",
"target": [
".deal[data-region=\"asia\"]:nth-child(2) > .body > .foot > .btn-primary.btn-sm[href$=\"#newsletter\"]"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.26 (foreground color: #ffffff, background color: #e8664a, font size: 10.2pt (13.6px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#ffffff",
"bgColor": "#e8664a",
"contrastRatio": 3.26,
"fontSize": "8.6pt (11.52px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<span class=\"tag\">\u221224%</span>",
"target": [
".deal[data-region=\"americas\"]:nth-child(3) > .img > .tag"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.26 (foreground color: #ffffff, background color: #e8664a, font size: 8.6pt (11.52px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"tag\">\u221224%</span>",
"target": [
".deal[data-region=\"americas\"]:nth-child(3) > .img > .tag"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.26 (foreground color: #ffffff, background color: #e8664a, font size: 8.6pt (11.52px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#ffffff",
"bgColor": "#e8664a",
"contrastRatio": 3.26,
"fontSize": "10.2pt (13.6px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<a href=\"#newsletter\" class=\"btn btn-primary btn-sm\">Get Quote</a>",
"target": [
".deal[data-region=\"americas\"]:nth-child(3) > .body > .foot > .btn-primary.btn-sm[href$=\"#newsletter\"]"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.26 (foreground color: #ffffff, background color: #e8664a, font size: 10.2pt (13.6px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#newsletter\" class=\"btn btn-primary btn-sm\">Get Quote</a>",
"target": [
".deal[data-region=\"americas\"]:nth-child(3) > .body > .foot > .btn-primary.btn-sm[href$=\"#newsletter\"]"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.26 (foreground color: #ffffff, background color: #e8664a, font size: 10.2pt (13.6px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#ffffff",
"bgColor": "#e8664a",
"contrastRatio": 3.26,
"fontSize": "8.6pt (11.52px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<span class=\"tag\">Limited seats</span>",
"target": [
".deal[data-region=\"europe\"]:nth-child(4) > .img > .tag"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.26 (foreground color: #ffffff, background color: #e8664a, font size: 8.6pt (11.52px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"tag\">Limited seats</span>",
"target": [
".deal[data-region=\"europe\"]:nth-child(4) > .img > .tag"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.26 (foreground color: #ffffff, background color: #e8664a, font size: 8.6pt (11.52px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#ffffff",
"bgColor": "#e8664a",
"contrastRatio": 3.26,
"fontSize": "10.2pt (13.6px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<a href=\"#newsletter\" class=\"btn btn-primary btn-sm\">Get Quote</a>",
"target": [
".deal[data-region=\"europe\"]:nth-child(4) > .body > .foot > .btn-primary.btn-sm[href$=\"#newsletter\"]"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.26 (foreground color: #ffffff, background color: #e8664a, font size: 10.2pt (13.6px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#newsletter\" class=\"btn btn-primary btn-sm\">Get Quote</a>",
"target": [
".deal[data-region=\"europe\"]:nth-child(4) > .body > .foot > .btn-primary.btn-sm[href$=\"#newsletter\"]"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.26 (foreground color: #ffffff, background color: #e8664a, font size: 10.2pt (13.6px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#ffffff",
"bgColor": "#e8664a",
"contrastRatio": 3.26,
"fontSize": "8.6pt (11.52px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<span class=\"tag\">\u221228%</span>",
"target": [
".deal[data-region=\"asia\"]:nth-child(5) > .img > .tag"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.26 (foreground color: #ffffff, background color: #e8664a, font size: 8.6pt (11.52px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"tag\">\u221228%</span>",
"target": [
".deal[data-region=\"asia\"]:nth-child(5) > .img > .tag"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.26 (foreground color: #ffffff, background color: #e8664a, font size: 8.6pt (11.52px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#ffffff",
"bgColor": "#e8664a",
"contrastRatio": 3.26,
"fontSize": "10.2pt (13.6px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<a href=\"#newsletter\" class=\"btn btn-primary btn-sm\">Get Quote</a>",
"target": [
".deal[data-region=\"asia\"]:nth-child(5) > .body > .foot > .btn-primary.btn-sm[href$=\"#newsletter\"]"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.26 (foreground color: #ffffff, background color: #e8664a, font size: 10.2pt (13.6px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#newsletter\" class=\"btn btn-primary btn-sm\">Get Quote</a>",
"target": [
".deal[data-region=\"asia\"]:nth-child(5) > .body > .foot > .btn-primary.btn-sm[href$=\"#newsletter\"]"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.26 (foreground color: #ffffff, background color: #e8664a, font size: 10.2pt (13.6px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#ffffff",
"bgColor": "#e8664a",
"contrastRatio": 3.26,
"fontSize": "8.6pt (11.52px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<span class=\"tag\">\u221219%</span>",
"target": [
".deal[data-region=\"americas\"]:nth-child(6) > .img > .tag"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.26 (foreground color: #ffffff, background color: #e8664a, font size: 8.6pt (11.52px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"tag\">\u221219%</span>",
"target": [
".deal[data-region=\"americas\"]:nth-child(6) > .img > .tag"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.26 (foreground color: #ffffff, background color: #e8664a, font size: 8.6pt (11.52px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#ffffff",
"bgColor": "#e8664a",
"contrastRatio": 3.26,
"fontSize": "10.2pt (13.6px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<a href=\"#newsletter\" class=\"btn btn-primary btn-sm\">Get Quote</a>",
"target": [
".deal[data-region=\"americas\"]:nth-child(6) > .body > .foot > .btn-primary.btn-sm[href$=\"#newsletter\"]"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.26 (foreground color: #ffffff, background color: #e8664a, font size: 10.2pt (13.6px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#newsletter\" class=\"btn btn-primary btn-sm\">Get Quote</a>",
"target": [
".deal[data-region=\"americas\"]:nth-child(6) > .body > .foot > .btn-primary.btn-sm[href$=\"#newsletter\"]"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.26 (foreground color: #ffffff, background color: #e8664a, font size: 10.2pt (13.6px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#e8664a",
"bgColor": "#0f2a43",
"contrastRatio": 4.48,
"fontSize": "9.0pt (12px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"luxury\">",
"target": [
".luxury"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.48 (foreground color: #e8664a, background color: #0f2a43, font size: 9.0pt (12px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"eyebrow\">Luxury Escapes & Hotels</span>",
"target": [
".luxury > .eyebrow"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.48 (foreground color: #e8664a, background color: #0f2a43, font size: 9.0pt (12px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#e8664a",
"bgColor": "#ffffff",
"contrastRatio": 3.26,
"fontSize": "9.0pt (12px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<body>",
"target": [
"body"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.26 (foreground color: #e8664a, background color: #ffffff, font size: 9.0pt (12px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"eyebrow\">Cultural Experiences</span>",
"target": [
"#experiences > .section-head > .eyebrow"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.26 (foreground color: #e8664a, background color: #ffffff, font size: 9.0pt (12px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#ffffff",
"bgColor": "#e8664a",
"contrastRatio": 3.26,
"fontSize": "11.4pt (15.2px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<a href=\"#newsletter\" class=\"btn btn-primary\">Explore Destination Experiences</a>",
"target": [
".split > div > .btn-primary.btn[href$=\"#newsletter\"]"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.26 (foreground color: #ffffff, background color: #e8664a, font size: 11.4pt (15.2px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#newsletter\" class=\"btn btn-primary\">Explore Destination Experiences</a>",
"target": [
".split > div > .btn-primary.btn[href$=\"#newsletter\"]"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.26 (foreground color: #ffffff, background color: #e8664a, font size: 11.4pt (15.2px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#e8664a",
"bgColor": "#ffffff",
"contrastRatio": 3.26,
"fontSize": "9.0pt (12px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<body>",
"target": [
"body"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.26 (foreground color: #e8664a, background color: #ffffff, font size: 9.0pt (12px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"eyebrow\">Guides & Eco-Tourism</span>",
"target": [
"#guides > .section-head > .eyebrow"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.26 (foreground color: #e8664a, background color: #ffffff, font size: 9.0pt (12px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#e8664a",
"bgColor": "#ffffff",
"contrastRatio": 3.26,
"fontSize": "9.0pt (12px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<body>",
"target": [
"body"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.26 (foreground color: #e8664a, background color: #ffffff, font size: 9.0pt (12px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"eyebrow\">Why Meridian Atlas</span>",
"target": [
"#why > .container > .section-head > .eyebrow"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.26 (foreground color: #e8664a, background color: #ffffff, font size: 9.0pt (12px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#e8664a",
"bgColor": "#f7f1e8",
"contrastRatio": 2.9,
"fontSize": "9.0pt (12px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section class=\"reviews\" id=\"reviews\">",
"target": [
"#reviews"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 2.9 (foreground color: #e8664a, background color: #f7f1e8, font size: 9.0pt (12px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"eyebrow\">Reviews</span>",
"target": [
"#reviews > .container > .section-head > .eyebrow"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 2.9 (foreground color: #e8664a, background color: #f7f1e8, font size: 9.0pt (12px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#e8664a",
"bgColor": "#ffffff",
"contrastRatio": 3.26,
"fontSize": "9.0pt (12px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<body>",
"target": [
"body"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.26 (foreground color: #e8664a, background color: #ffffff, font size: 9.0pt (12px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"eyebrow\">FAQ</span>",
"target": [
".faq-wrap > div:nth-child(1) > .eyebrow"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.26 (foreground color: #e8664a, background color: #ffffff, font size: 9.0pt (12px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#ffffff",
"bgColor": "#e8664a",
"contrastRatio": 3.26,
"fontSize": "11.4pt (15.2px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<button type=\"submit\" class=\"btn btn-primary\">Subscribe</button>",
"target": [
"#newsForm > button[type=\"submit\"]"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.26 (foreground color: #ffffff, background color: #e8664a, font size: 11.4pt (15.2px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<button type=\"submit\" class=\"btn btn-primary\">Subscribe</button>",
"target": [
"#newsForm > button[type=\"submit\"]"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.26 (foreground color: #ffffff, background color: #e8664a, font size: 11.4pt (15.2px), font weight: normal). Expected contrast ratio of 4.5:1"
}
]
},
{
"id": "link-in-text-block",
"impact": "serious",
"tags": [
"cat.color",
"wcag2a",
"wcag141",
"TTv5",
"TT13.a",
"EN-301-549",
"EN-9.1.4.1"
],
"description": "Ensure links are distinguished from surrounding text in a way that does not rely on color",
"help": "Links must be distinguishable without relying on color",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/link-in-text-block?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "link-in-text-block",
"data": {
"messageKey": "fgContrast",
"contrastRatio": 1.4,
"requiredContrastRatio": 3,
"nodeColor": "#ffffff",
"parentColor": "#cfdbe8"
},
"relatedNodes": [
{
"html": "<div>\u2708 Free itinerary review with every booking inquiry \u2014 <a href=\"#newsletter\">Get yours</a></div>",
"target": [
".topbar > .container > div:nth-child(1)"
]
}
],
"impact": "serious",
"message": "The link has insufficient color contrast of 1.4:1 with the surrounding text. (Minimum contrast is 3:1, link text: #ffffff, surrounding text: #cfdbe8)"
},
{
"id": "link-in-text-block-style",
"data": null,
"relatedNodes": [
{
"html": "<div>\u2708 Free itinerary review with every booking inquiry \u2014 <a href=\"#newsletter\">Get yours</a></div>",
"target": [
".topbar > .container > div:nth-child(1)"
]
}
],
"impact": "serious",
"message": "The link has no styling (such as underline) to distinguish it from the surrounding text"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#newsletter\">Get yours</a>",
"target": [
"div:nth-child(1) > a[href$=\"#newsletter\"]"
],
"failureSummary": "Fix any of the following:\n The link has insufficient color contrast of 1.4:1 with the surrounding text. (Minimum contrast is 3:1, link text: #ffffff, surrounding text: #cfdbe8)\n The link has no styling (such as underline) to distinguish it from the surrounding text"
},
{
"any": [
{
"id": "link-in-text-block",
"data": {
"messageKey": "fgContrast",
"contrastRatio": 1.4,
"requiredContrastRatio": 3,
"nodeColor": "#ffffff",
"parentColor": "#cfdbe8"
},
"relatedNodes": [
{
"html": "<div>Need help? Call <a href=\"tel:+18005550142\">+1 (800) 555-0142</a> \u00b7 Mon\u2013Sat, 8am\u20138pm ET</div>",
"target": [
".topbar > .container > div:nth-child(2)"
]
}
],
"impact": "serious",
"message": "The link has insufficient color contrast of 1.4:1 with the surrounding text. (Minimum contrast is 3:1, link text: #ffffff, surrounding text: #cfdbe8)"
},
{
"id": "link-in-text-block-style",
"data": null,
"relatedNodes": [
{
"html": "<div>Need help? Call <a href=\"tel:+18005550142\">+1 (800) 555-0142</a> \u00b7 Mon\u2013Sat, 8am\u20138pm ET</div>",
"target": [
".topbar > .container > div:nth-child(2)"
]
}
],
"impact": "serious",
"message": "The link has no styling (such as underline) to distinguish it from the surrounding text"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"tel:+18005550142\">+1 (800) 555-0142</a>",
"target": [
"div:nth-child(2) > a[href=\"tel:+18005550142\"]"
],
"failureSummary": "Fix any of the following:\n The link has insufficient color contrast of 1.4:1 with the surrounding text. (Minimum contrast is 3:1, link text: #ffffff, surrounding text: #cfdbe8)\n The link has no styling (such as underline) to distinguish it from the surrounding text"
}
]
}
],
"coverage": {
"contract": "main-document-vertical-scroll",
"complete": true,
"positions": [
{
"y": 0,
"height": 10141
},
{
"y": 576,
"height": 10141
},
{
"y": 1152,
"height": 10141
},
{
"y": 1728,
"height": 10141
},
{
"y": 2304,
"height": 10141
},
{
"y": 2880,
"height": 10141
},
{
"y": 3456,
"height": 10141
},
{
"y": 4032,
"height": 10141
},
{
"y": 4608,
"height": 10141
},
{
"y": 5184,
"height": 10141
},
{
"y": 5760,
"height": 10141
},
{
"y": 6336,
"height": 10141
},
{
"y": 6912,
"height": 10141
},
{
"y": 7488,
"height": 10141
},
{
"y": 8064,
"height": 10141
},
{
"y": 8640,
"height": 10141
},
{
"y": 9216,
"height": 10141
},
{
"y": 9421,
"height": 10141
}
],
"scans": 19,
"max_states": 512,
"settle_ms": 5000,
"page_timeout_seconds": 150,
"layout_stability": "consecutive 100ms size samples within one CSS pixel",
"animation_settling": "finite animations present when scroll resources are ready finish or are cancelled",
"interactive_states": "not exercised",
"horizontal_scroll": "not exercised"
}
}
System Prompt
You are a lead web developer at a top digital agency, tasked with creating a one-page website for a new client based on the given specifications, delivered as an HTML file. First non-whitespace char '<', last non-whitespace char '>'. Use the following services to generate placeholder images where needed:
- placehold.co (text): https://placehold.co/[{w}x{h}|{size}][/{bg-color}/{text-color}]?text={text}&font=[lato|lora|montserrat|noto sans|open sans|oswald|playfair display|poppins|pt sans|raleway|roboto|source sans|source sans pro]
- picsum.photos (photos): https://picsum.photos/[{w}/{h}|{size}]?[grayscale][&blur={1-10}]
- pravatar.cc (avatars): https://i.pravatar.cc/{size}?u={identifier}
Choose sizes appropriate to layout.
User Prompt
Create a **complete, polished, production-quality** primary web page for a new client in the "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: "Hotels", "Guides", "Reviews".
- **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: "Flight Deals", "Cultural Experiences", "Luxury Escapes".
- **Content Depth:** Populate each section with **substantial, realistic text** (multiple sentences/paragraphs). Use authentic industry language and terminology like: "itinerary", "eco-tourism", "baggage allowance".
- **Visuals:** Integrate relevant placeholder images logically within the content sections.
- **Calls to Action:** Include clear and contextually relevant CTAs. Use strong verbs similar to: "Get Quote", "Read Guide", "Explore Destination".
- **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: "currency converter".
- **SIDEBAR (Optional):** If your design includes a sidebar, populate it with **useful, relevant content**. Ideas: "travel hacks", "destination spotlights", "inspiration gallery".
- **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.