Qwen Qwen3.8 27B – Travel
via AkashML · Generated
- AIMAC Debt 9.31
- Cost $0.15
- Total Violations 53
- HTML Size 84 KB
- Em Dashes 59
Screenshot
View Live Page
Accessibility Issues Found
53 Serious
-
color-contrast serious 50 instances
Elements must meet minimum color contrast ratio thresholds
Example HTML
<a href="#fares" class="btn btn-primary btn-sm head-cta">Start planning</a> -
target-size serious 3 instances
All touch targets must be 24px large, or leave sufficient space
Example HTML
<a href="#destinations">Destinations</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.0">
<title>Atlas & Tide — Field Guides, Honest Reviews & Fair Fares</title>
<meta name="description" content="Atlas & Tide publishes field-tested travel guides, ground-truthed hotel reviews and nightly fare intelligence for travelers who check twice.">
<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=Archivo:wght@400;500;600;700&family=Fraunces:ital,opsz,wght@0,9..144,300;0,9..144,400;0,9..144,500;0,9..144,600;0,9..144,700;1,9..144,400;1,9..144,500;1,9..144,600&family=IBM+Plex+Mono:wght@400;500;600&display=swap" rel="stylesheet">
<style>
:root{
--paper:#F4EFE3; --paper-2:#FBF7EC; --ink:#1B2A23; --ink-2:#4A5A51;
--accent:#C64B24; --gold:#C99B3F; --teal:#315F58;
--dark:#12201A; --dark-2:#182B23;
--serif:'Fraunces',Georgia,serif; --sans:'Archivo',system-ui,sans-serif; --mono:'IBM Plex Mono',ui-monospace,monospace;
}
*{margin:0;padding:0;box-sizing:border-box}
html{scroll-behavior:smooth}
body{background:var(--paper);color:var(--ink);font-family:var(--sans);font-size:16px;line-height:1.6;-webkit-font-smoothing:antialiased;overflow-x:hidden}
img{display:block;max-width:100%}
a{color:inherit}
::selection{background:var(--accent);color:var(--paper)}
:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
.wrap{max-width:1240px;margin:0 auto;padding:0 28px}
.mono{font-family:var(--mono)}
.skip{position:absolute;left:-999px;top:8px;background:var(--ink);color:var(--paper);padding:.6rem 1rem;z-index:200;font-family:var(--mono);font-size:.75rem}
.skip:focus{left:8px}
.grain{position:fixed;inset:0;pointer-events:none;z-index:80;opacity:.05;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23n)' opacity='0.7'/%3E%3C/svg%3E")}
/* ---------- type ---------- */
.kicker{font-family:var(--mono);font-size:.68rem;letter-spacing:.3em;text-transform:uppercase;color:var(--ink-2)}
.kicker::before{content:"— ";color:var(--accent)}
.sec-head{max-width:760px;margin-bottom:3rem}
.sec-h{font-family:var(--serif);font-weight:500;font-size:clamp(2rem,4.4vw,3.3rem);line-height:1.05;letter-spacing:-.015em;margin:.9rem 0 1rem}
.sec-h em,.hero-h em{font-style:italic;color:var(--accent);font-weight:500}
.sec-sub{color:var(--ink-2);max-width:640px}
section{scroll-margin-top:92px}
.section{padding:96px 0}
/* ---------- buttons ---------- */
.btn{display:inline-flex;align-items:center;gap:.55rem;font-family:var(--mono);font-size:.74rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;padding:.95rem 1.35rem;border:1.5px solid var(--ink);background:var(--paper-2);color:var(--ink);cursor:pointer;text-decoration:none;box-shadow:4px 4px 0 var(--ink);transition:transform .18s ease,box-shadow .18s ease,background .18s ease}
.btn:hover{transform:translate(-2px,-2px);box-shadow:7px 7px 0 var(--ink)}
.btn:active{transform:translate(1px,1px);box-shadow:2px 2px 0 var(--ink)}
.btn-primary{background:var(--accent);color:#FFF4EA}
.btn-ghost{background:transparent;box-shadow:4px 4px 0 rgba(244,239,227,.25);border-color:rgba(244,239,227,.5);color:var(--paper)}
.btn-ghost:hover{box-shadow:7px 7px 0 rgba(244,239,227,.3)}
.btn-sm{padding:.65rem .95rem;font-size:.66rem}
.btn.done{background:var(--teal);color:var(--paper);border-color:var(--teal)}
/* ---------- topbar ---------- */
.topbar{background:var(--ink);color:rgba(244,239,227,.85);font-family:var(--mono);font-size:.62rem;letter-spacing:.18em;text-transform:uppercase}
.topbar-in{display:flex;justify-content:space-between;gap:1rem;padding:.55rem 28px}
.topbar span b{color:var(--gold);font-weight:500}
/* ---------- header ---------- */
.site-head{position:sticky;top:0;z-index:70;background:var(--paper);border-bottom:1px solid transparent;transition:border-color .3s,box-shadow .3s}
.site-head.scrolled{border-color:var(--ink);box-shadow:0 6px 24px rgba(27,42,35,.08)}
.head-in{display:flex;align-items:center;gap:2rem;padding:.9rem 28px}
.brand{display:flex;align-items:center;gap:.85rem;text-decoration:none;margin-right:auto}
.brand-mark{width:46px;height:46px;border:1.5px solid var(--ink)}
.brand-txt{display:flex;flex-direction:column;line-height:1.15}
.brand-txt strong{font-family:var(--serif);font-weight:600;font-size:1.45rem;letter-spacing:.01em}
.brand-txt em{font-style:normal;font-family:var(--mono);font-size:.56rem;letter-spacing:.24em;text-transform:uppercase;color:var(--ink-2)}
.nav{display:flex;gap:1.55rem}
.nav a{position:relative;text-decoration:none;font-weight:600;font-size:.74rem;letter-spacing:.1em;text-transform:uppercase;padding:.35rem 0}
.nav a::after{content:"";position:absolute;left:0;bottom:0;height:2px;width:100%;background:var(--accent);transform:scaleX(0);transform-origin:right;transition:transform .32s cubic-bezier(.2,.7,.2,1)}
.nav a:hover::after{transform:scaleX(1);transform-origin:left}
.nav-toggle{display:none;font-family:var(--mono);font-size:.7rem;letter-spacing:.14em;text-transform:uppercase;background:none;border:1.5px solid var(--ink);padding:.6rem .9rem;cursor:pointer;box-shadow:3px 3px 0 var(--ink)}
.mnav{border-top:1px solid var(--ink);background:var(--paper-2);display:flex;flex-direction:column}
.mnav a{padding:1rem 28px;text-decoration:none;font-weight:600;font-size:.85rem;letter-spacing:.08em;text-transform:uppercase;border-bottom:1px dashed rgba(27,42,35,.25)}
.mnav a:hover{background:var(--paper);color:var(--accent)}
/* ---------- ticker / departure board ---------- */
.ticker{background:var(--dark);border-block:1px solid var(--ink);overflow:hidden}
.ticker-track{display:flex;width:max-content;animation:tick 44s linear infinite}
.ticker:hover .ticker-track{animation-play-state:paused}
.ticker-track span{white-space:nowrap;font-family:var(--mono);font-size:.72rem;letter-spacing:.14em;padding:.7rem 1.6rem;color:rgba(244,239,227,.75);border-right:1px solid rgba(244,239,227,.12);display:flex;align-items:center;gap:.6rem}
.ticker-track b{color:var(--gold);font-weight:500}
.st{font-style:normal;padding:.1rem .5rem;font-size:.6rem;letter-spacing:.18em;border:1px solid}
.st-ok{color:var(--paper);border-color:rgba(244,239,227,.4)}
.st-board{color:#0F0F0F;background:var(--gold);border-color:var(--gold)}
.st-delay{color:var(--paper);background:var(--accent);border-color:var(--accent)}
.st-gate{color:var(--paper);border-color:var(--teal);background:rgba(49,95,88,.5)}
@keyframes tick{to{transform:translateX(-50%)}}
/* ---------- hero ---------- */
.hero{display:grid;grid-template-columns:7fr 5fr;gap:4rem;align-items:center;padding:72px 28px 84px;min-height:78vh}
.hero-h{font-family:var(--serif);font-weight:500;font-size:clamp(3rem,7.4vw,6.3rem);line-height:.98;letter-spacing:-.02em;margin:1.4rem 0 1.6rem}
.hline{display:block;overflow:hidden;padding-bottom:.06em}
.hline>span{display:inline-block;transform:translateY(115%);transition:transform 1s cubic-bezier(.19,1,.22,1)}
body.loaded .hline:nth-child(1)>span{transform:none;transition-delay:.1s}
body.loaded .hline:nth-child(2)>span{transform:none;transition-delay:.24s}
body.loaded .hline:nth-child(3)>span{transform:none;transition-delay:.38s}
.hero-lede{max-width:520px;color:var(--ink-2);font-size:1.06rem;margin-bottom:2rem}
.hero-cta{display:flex;gap:1rem;flex-wrap:wrap;margin-bottom:1.6rem}
.hero-meta{font-size:.64rem;letter-spacing:.2em;text-transform:uppercase;color:var(--ink-2)}
.hero-media{position:relative}
.hero-frame{border:1.5px solid var(--ink);box-shadow:12px 12px 0 var(--accent)}
.kb{overflow:hidden}
.kb img{width:100%;height:100%;object-fit:cover;animation:kb 18s ease-in-out infinite alternate;filter:saturate(.88) contrast(1.03) sepia(.07)}
@keyframes kb{from{transform:scale(1) translate(0,0)}to{transform:scale(1.1) translate(-1.6%,1.4%)}}
.hero-frame .kb{aspect-ratio:4/5}
.hero-media figcaption{font-family:var(--mono);font-size:.62rem;letter-spacing:.2em;color:var(--ink-2);margin-top:.8rem;text-transform:uppercase}
.hero-polaroid{position:absolute;bottom:-34px;right:-14px;width:170px;border:1.5px solid var(--ink);background:var(--paper-2);padding:7px 7px 26px;transform:rotate(4deg);box-shadow:6px 8px 0 rgba(27,42,35,.15)}
.hero-polaroid img{filter:saturate(.9) sepia(.1)}
.stamp{position:absolute;top:-42px;right:22px;width:118px;height:118px;animation:spin 24s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
.stamp-ring{fill:var(--accent);opacity:.08;stroke:var(--accent);stroke-width:1.5;stroke-dasharray:3 4}
.stamp text{font-family:var(--mono);font-size:10.5px;letter-spacing:.28em;fill:var(--accent)}
.stamp-plane{fill:var(--accent)}
/* ---------- stats ---------- */
.stats{border-block:1.5px solid var(--ink);background:var(--paper-2)}
.stats-in{display:grid;grid-template-columns:repeat(4,1fr)}
.stat{padding:1.8rem 1.5rem;border-right:1px solid rgba(27,42,35,.18)}
.stat:last-child{border-right:0}
.stat-n{display:block;font-size:1.9rem;font-weight:500;letter-spacing:-.02em;color:var(--ink)}
.stat-n i{font-style:normal;color:var(--accent)}
.stat-l{font-family:var(--mono);font-size:.6rem;letter-spacing:.2em;text-transform:uppercase;color:var(--ink-2)}
/* ---------- destinations ---------- */
.dest-layout{display:grid;grid-template-columns:8fr 4fr;gap:2.6rem;align-items:start}
.dest-grid{display:grid;grid-template-columns:repeat(6,1fr);gap:1.5rem}
.dest-card{background:var(--paper-2);border:1px solid var(--ink);display:flex;flex-direction:column;transition:transform .3s ease,box-shadow .3s ease}
.dest-card:hover{transform:translateY(-5px);box-shadow:8px 8px 0 rgba(27,42,35,.14)}
.d1,.d2{grid-column:span 3}
.d3,.d4,.d5{grid-column:span 2}
.d6{grid-column:span 6;display:grid;grid-template-columns:1.25fr 1fr}
.dc-img{overflow:hidden;position:relative;border-bottom:1px solid var(--ink)}
.d1 .dc-img{aspect-ratio:4/4.4}
.d2,.d3,.d4,.d5 .dc-img{aspect-ratio:4/3}
.d6 .dc-img{aspect-ratio:auto;height:100%;border-bottom:0;border-right:1px solid var(--ink)}
.dc-img img{width:100%;height:100%;object-fit:cover;transition:transform 1.1s cubic-bezier(.2,.7,.2,1);filter:saturate(.85) contrast(1.04) sepia(.08)}
.dest-card:hover .dc-img img{transform:scale(1.06)}
.dc-tag{position:absolute;top:12px;left:12px;background:var(--ink);color:var(--paper);font-size:.56rem;letter-spacing:.22em;padding:.35rem .6rem}
.dc-body{padding:1.3rem 1.35rem 1.4rem;display:flex;flex-direction:column;gap:.6rem;flex:1}
.dc-top{display:flex;justify-content:space-between;align-items:baseline;gap:.8rem}
.dc-top h3{font-family:var(--serif);font-weight:600;font-size:1.35rem;letter-spacing:-.01em}
.dc-co{font-size:.56rem;letter-spacing:.14em;color:var(--ink-2);white-space:nowrap}
.dc-body p{font-size:.9rem;color:var(--ink-2);flex:1}
.dc-meta{display:flex;justify-content:space-between;gap:.6rem;font-size:.58rem;letter-spacing:.14em;border-top:1px dashed rgba(27,42,35,.3);padding-top:.8rem;flex-wrap:wrap}
.dc-meta a{color:var(--accent);font-weight:600;text-decoration:none}
.dc-meta a:hover{text-decoration:underline}
/* sidebar */
.dest-side{position:sticky;top:100px;display:flex;flex-direction:column;gap:1.4rem}
.side-box{border:1.5px solid var(--ink);background:var(--paper-2);padding:1.25rem 1.3rem}
.side-h{font-size:.62rem;letter-spacing:.28em;text-transform:uppercase;color:var(--accent);margin-bottom:1rem}
.trend li{list-style:none;display:flex;align-items:center;gap:.7rem;padding:.55rem 0;border-bottom:1px dotted rgba(27,42,35,.3);font-size:.9rem}
.trend li:last-child{border-bottom:0}
.trend .rk{font-size:.62rem;color:var(--accent)}
.trend .nm{flex:1;font-weight:600}
.trend .up{color:var(--accent);font-weight:600}
.trend .down{color:var(--teal);font-weight:600}
.trend-note{font-size:.56rem;letter-spacing:.16em;color:var(--ink-2);margin-top:.7rem;text-transform:uppercase}
.side-deal{background:var(--dark);border-color:var(--dark);color:var(--paper)}
.side-deal .side-h{color:var(--gold)}
.deal-row{display:flex;justify-content:space-between;align-items:center;gap:.6rem;padding:.55rem 0;border-bottom:1px dotted rgba(244,239,227,.25);font-size:.82rem}
.deal-row:last-of-type{border-bottom:0}
.deal-row b{font-family:var(--serif);font-size:1.05rem;font-weight:600}
.deal-row a{font-family:var(--mono);font-size:.58rem;letter-spacing:.18em;color:var(--gold);text-decoration:none;border-bottom:1px solid var(--gold)}
.deal-row a:hover{color:var(--paper);border-color:var(--paper)}
.side-note{font-family:var(--mono);font-size:.56rem;letter-spacing:.12em;color:rgba(244,239,227,.6);margin-top:.8rem;text-transform:uppercase}
.gal{display:grid;grid-template-columns:repeat(3,1fr);gap:.6rem}
.gal figure{border:1px solid var(--ink);background:var(--paper)}
.gal img{aspect-ratio:1;object-fit:cover;width:100%;filter:saturate(.85) sepia(.1)}
.gal figcaption{font-family:var(--mono);font-size:.5rem;letter-spacing:.14em;padding:.4rem .3rem;color:var(--ink-2);text-transform:uppercase}
/* ---------- guides ---------- */
.guides{background:var(--paper-2);border-block:1.5px solid var(--ink)}
.guides-layout{display:grid;grid-template-columns:5fr 7fr;gap:4rem}
.guides-side{position:sticky;top:100px;align-self:start}
.guides-side p{color:var(--ink-2);margin-bottom:1.1rem;font-size:.98rem}
.g-verif{font-family:var(--mono);font-size:.58rem;letter-spacing:.2em;color:var(--teal);margin-top:1.6rem;text-transform:uppercase}
.guide-list{list-style:none}
.guide-item{border-top:1px solid var(--ink)}
.guide-item:last-child{border-bottom:1px solid var(--ink)}
.guide-item a{display:grid;grid-template-columns:52px 104px 1fr 34px;gap:1.3rem;align-items:start;padding:1.5rem .6rem;text-decoration:none;transition:background .25s,transform .25s}
.guide-item a:hover{background:var(--paper);transform:translateX(6px)}
.gi-num{font-size:.7rem;color:var(--accent);padding-top:.3rem}
.gi-thumb{border:1px solid var(--ink);overflow:hidden}
.gi-thumb img{aspect-ratio:4/3;width:100%;object-fit:cover;transition:transform .8s ease;filter:saturate(.85) sepia(.08)}
.guide-item a:hover .gi-thumb img{transform:scale(1.08)}
.gi-body h3{font-family:var(--serif);font-weight:600;font-size:1.3rem;line-height:1.2;letter-spacing:-.01em;margin-bottom:.45rem;transition:color .2s}
.guide-item a:hover .gi-body h3{color:var(--accent)}
.gi-body p{font-size:.88rem;color:var(--ink-2);margin-bottom:.7rem}
.gi-meta{display:flex;gap:1.1rem;font-size:.56rem;letter-spacing:.18em;color:var(--ink-2);text-transform:uppercase}
.gi-meta span:first-child{color:var(--accent)}
.gi-arrow{font-family:var(--serif);font-size:1.4rem;padding-top:.1rem;transition:transform .25s}
.guide-item a:hover .gi-arrow{transform:translateX(6px);color:var(--accent)}
/* ---------- fares (dark) ---------- */
.fares{background:var(--dark);color:var(--paper);border-bottom:1.5px solid var(--ink)}
.fares .kicker{color:rgba(244,239,227,.6)}
.fares .sec-sub{color:rgba(244,239,227,.68)}
.fare-grid{display:grid;grid-template-columns:8fr 4fr;gap:1.6rem;margin-bottom:1.6rem}
.fare-tool{border:1px solid rgba(244,239,227,.3);background:var(--dark-2);padding:1.5rem}
.ft-fields{display:grid;grid-template-columns:repeat(5,1fr);gap:.9rem;margin-bottom:1.1rem}
.ft-field label{display:block;font-family:var(--mono);font-size:.55rem;letter-spacing:.24em;text-transform:uppercase;color:rgba(244,239,227,.55);margin-bottom:.45rem}
.ft-field select{width:100%;background:var(--dark);color:var(--paper);border:1px solid rgba(244,239,227,.35);font-family:var(--mono);font-size:.82rem;padding:.75rem .6rem;cursor:pointer;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23C99B3F'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 10px center}
.ft-field select:focus{outline:2px solid var(--gold);outline-offset:1px}
.deal-card{border:1px solid var(--gold);background:rgba(201,155,63,.07);padding:1.5rem;display:flex;flex-direction:column;gap:.7rem}
.deal-k{font-size:.56rem;letter-spacing:.26em;color:var(--gold);text-transform:uppercase}
.deal-card h3{font-family:var(--serif);font-size:1.7rem;font-weight:600;letter-spacing:-.01em}
.deal-p{font-family:var(--mono);font-size:1.05rem}
.deal-p b{font-size:1.7rem;color:var(--gold)}
.deal-p s{color:rgba(244,239,227,.4);font-size:.85rem;margin-left:.5rem}
.deal-p span{display:block;font-size:.58rem;letter-spacing:.18em;color:rgba(244,239,227,.55);margin-top:.3rem}
.deal-card p{font-size:.85rem;color:rgba(244,239,227,.72);flex:1}
.fare-result{border:1px solid rgba(244,239,227,.3);background:var(--dark-2);padding:1.6rem 1.7rem}
.fr-head{display:flex;justify-content:space-between;gap:1rem;flex-wrap:wrap;font-size:.62rem;letter-spacing:.2em;text-transform:uppercase;color:rgba(244,239,227,.6);border-bottom:1px solid rgba(244,239,227,.2);padding-bottom:.9rem;margin-bottom:.4rem}
.fr-head b{color:var(--gold);font-weight:500}
.fr-row{display:grid;grid-template-columns:1.4fr 1fr auto;align-items:center;gap:1rem;padding:1rem 0;border-bottom:1px dashed rgba(244,239,227,.2)}
.fr-r1 b{font-family:var(--serif);font-size:1.25rem;font-weight:600;display:block}
.fr-r1 span{font-size:.56rem;letter-spacing:.18em;color:rgba(244,239,227,.5);text-transform:uppercase}
.fr-r2{text-align:right}
.fr-price{font-family:var(--serif);font-size:1.9rem;font-weight:600;color:var(--gold);letter-spacing:-.02em}
.fr-per{font-size:.55rem;letter-spacing:.18em;color:rgba(244,239,227,.5);text-transform:uppercase}
.fr-badge{font-family:var(--mono);font-size:.55rem;letter-spacing:.2em;background:var(--accent);color:var(--paper);padding:.3rem .6rem}
.fr-badge.dim{background:transparent;border:1px solid rgba(244,239,227,.3);color:rgba(244,239,227,.55)}
.fr-chart{margin-top:1.4rem}
.fr-chart svg{width:100%;height:150px;display:block}
.sp-line{fill:none;stroke:var(--gold);stroke-width:2}
.sp-area{fill:rgba(201,155,63,.1)}
.sp-dot{fill:var(--accent);stroke:var(--paper);stroke-width:2}
.sp-grid{stroke:rgba(244,239,227,.1);stroke-dasharray:2 4}
.fr-months{display:flex;justify-content:space-between;font-size:.56rem;letter-spacing:.1em;color:rgba(244,239,227,.45);margin-top:.4rem}
.fr-months b{color:var(--gold);font-weight:600}
.fr-foot{display:flex;justify-content:space-between;align-items:center;gap:1rem;flex-wrap:wrap;margin-top:1.5rem;padding-top:1.2rem;border-top:1px solid rgba(244,239,227,.2)}
.fr-foot p{font-size:.6rem;letter-spacing:.16em;text-transform:uppercase;color:rgba(244,239,227,.6)}
/* ---------- hotels ---------- */
.stack{display:grid;gap:2.4rem}
.stack-card{position:sticky;top:calc(96px + var(--i)*16px);background:var(--paper-2);border:1.5px solid var(--ink);box-shadow:0 -8px 24px rgba(27,42,35,.08)}
.hotel-card{display:grid;grid-template-columns:1fr 1.15fr;min-height:380px}
.hc-img{position:relative;border-right:1px solid var(--ink);overflow:hidden}
.hc-img img{width:100%;height:100%;object-fit:cover;filter:saturate(.85) contrast(1.04) sepia(.08)}
.hc-from{position:absolute;left:14px;bottom:14px;background:var(--ink);color:var(--paper);font-size:.6rem;letter-spacing:.2em;padding:.5rem .8rem}
.hc-body{padding:1.9rem 2rem;display:flex;flex-direction:column;gap:.85rem}
.hc-top{display:flex;justify-content:space-between;align-items:baseline;gap:1rem;flex-wrap:wrap}
.hc-top h3{font-family:var(--serif);font-weight:600;font-size:1.7rem;letter-spacing:-.015em}
.hc-top h3 span{font-size:1.05rem;font-weight:400;font-style:italic;color:var(--ink-2)}
.stars{color:var(--gold);letter-spacing:2px;font-size:.95rem;white-space:nowrap}
.stars i{font-style:normal;color:#D8CCB2}
.stars b{font-family:var(--mono);font-size:.72rem;color:var(--ink);margin-left:.4rem}
.hc-body>p{font-size:.93rem;color:var(--ink-2)}
.hc-body blockquote{font-family:var(--serif);font-style:italic;font-size:1.06rem;border-left:3px solid var(--accent);padding-left:1rem;color:var(--ink)}
.hc-body blockquote cite{display:block;font-family:var(--mono);font-style:normal;font-size:.56rem;letter-spacing:.2em;color:var(--ink-2);margin-top:.4rem;text-transform:uppercase}
.hc-tags{list-style:none;display:flex;flex-wrap:wrap;gap:.5rem}
.hc-tags li{font-family:var(--mono);font-size:.54rem;letter-spacing:.16em;border:1px solid rgba(27,42,35,.4);padding:.32rem .6rem;text-transform:uppercase}
.hc-body .btn{align-self:flex-start;margin-top:.3rem}
/* ---------- planner ---------- */
.planner{background:var(--paper-2);border-block:1.5px solid var(--ink)}
.planner-grid{display:grid;grid-template-columns:1.1fr 1fr;gap:4rem;align-items:start}
.pl-copy p{color:var(--ink-2);margin-bottom:1.1rem;font-size:.98rem}
.rules{counter-reset:r;list-style:none;margin:1.6rem 0 0;border-top:1px solid var(--ink)}
.rules li{counter-increment:r;display:grid;grid-template-columns:44px 1fr;gap:1rem;padding:1rem 0;border-bottom:1px solid rgba(27,42,35,.25);font-size:.93rem}
.rules li::before{content:"R."counter(r,decimal-leading-zero);font-family:var(--mono);font-size:.72rem;color:var(--accent);padding-top:.2rem}
.pl-tool{position:sticky;top:100px;border:1.5px solid var(--ink);background:var(--paper);padding:1.7rem;box-shadow:10px 10px 0 rgba(198,75,36,.25)}
.pl-head{display:flex;justify-content:space-between;align-items:baseline;flex-wrap:wrap;gap:.5rem;border-bottom:1.5px solid var(--ink);padding-bottom:1rem;margin-bottom:1.4rem}
.pl-head h3{font-size:.68rem;letter-spacing:.26em;text-transform:uppercase}
#plPerDay{font-family:var(--serif);font-size:1.7rem;font-weight:600;color:var(--accent);letter-spacing:-.02em}
.pl-field{margin-bottom:1.3rem}
.pl-field label{display:flex;justify-content:space-between;font-family:var(--mono);font-size:.58rem;letter-spacing:.22em;text-transform:uppercase;color:var(--ink-2);margin-bottom:.5rem}
.pl-field output{color:var(--ink);font-weight:600}
.pl-field input[type=range]{width:100%;appearance:none;height:3px;background:var(--ink);cursor:pointer}
.pl-field input[type=range]::-webkit-slider-thumb{appearance:none;width:18px;height:18px;background:var(--accent);border:2px solid var(--ink);cursor:grab}
.pl-field input[type=range]::-moz-range-thumb{width:16px;height:16px;background:var(--accent);border:2px solid var(--ink);border-radius:0;cursor:grab}
.pl-bar{margin-bottom:1rem}
.pl-btop{display:flex;justify-content:space-between;font-size:.85rem;font-weight:600;margin-bottom:.35rem}
.pl-btop b{font-family:var(--mono);font-weight:500}
.pl-track{height:14px;border:1px solid var(--ink);background:var(--paper-2)}
.pl-track span{display:block;height:100%;background:repeating-linear-gradient(-45deg,var(--accent) 0 6px,#A83E1D 6px 12px);transition:width .7s cubic-bezier(.2,.7,.2,1)}
.pl-bnote{display:block;font-family:var(--mono);font-size:.55rem;letter-spacing:.14em;color:var(--ink-2);margin-top:.3rem;text-transform:uppercase}
.pl-tip{font-family:var(--serif);font-style:italic;font-size:1rem;border-left:3px solid var(--teal);padding-left:1rem;margin:1.2rem 0 1.3rem;color:var(--ink)}
.pl-tool .btn{width:100%;justify-content:center}
/* ---------- mailbag ---------- */
.postcards{display:grid;grid-template-columns:repeat(2,1fr);gap:2.6rem 2.4rem;max-width:1020px;margin:0 auto}
.postcard{position:relative;background:var(--paper-2);border:1px solid var(--ink);padding:2.1rem 1.7rem 1.6rem;box-shadow:7px 9px 0 rgba(27,42,35,.13);transition:transform .35s cubic-bezier(.2,.7,.2,1)}
.pc1{transform:rotate(-2.2deg)}
.pc2{transform:rotate(1.6deg) translateY(20px)}
.pc3{transform:rotate(1.9deg)}
.pc4{transform:rotate(-1.5deg) translateY(16px)}
.postcard:hover{transform:rotate(0deg) translateY(0) scale(1.02);z-index:2}
.pc-stamp{position:absolute;top:14px;right:14px;width:46px;height:52px;border:1.5px dashed var(--accent);display:flex;align-items:center;justify-content:center;color:var(--accent);font-size:1.1rem;background:rgba(198,75,36,.05)}
.postcard blockquote{font-family:var(--serif);font-size:1.08rem;line-height:1.5;font-style:italic;margin-bottom:1.2rem}
.postcard figcaption{display:flex;align-items:center;gap:.8rem;border-top:1px dashed rgba(27,42,35,.35);padding-top:1rem}
.postcard figcaption img{width:44px;height:44px;border:1px solid var(--ink)}
.postcard figcaption b{display:block;font-size:.9rem}
.postcard figcaption span{font-family:var(--mono);font-size:.55rem;letter-spacing:.18em;color:var(--ink-2);text-transform:uppercase}
/* ---------- about ---------- */
.about{background:var(--paper)}
.about-grid{display:grid;grid-template-columns:1fr 1.15fr;gap:4.5rem;align-items:center}
.about-img{border:1.5px solid var(--ink);box-shadow:16px 16px 0 var(--teal)}
.about-img .kb{aspect-ratio:4/4.6}
.about-copy p{color:var(--ink-2);margin-bottom:1.1rem}
/* ---------- dispatch ---------- */
.dispatch{background:var(--dark);color:var(--paper);border-block:1.5px solid var(--ink)}
.dispatch-in{display:grid;grid-template-columns:1.2fr 1fr;gap:4rem;align-items:center}
.dispatch h2{font-family:var(--serif);font-weight:500;font-size:clamp(2.2rem,4.6vw,3.6rem);letter-spacing:-.015em;line-height:1.05;margin:.9rem 0 1rem}
.dispatch h2 em{color:var(--gold)}
.dispatch .kicker{color:rgba(244,239,227,.55)}
.dispatch-in>p{color:rgba(244,239,227,.7);max-width:520px}
.nl-form label{display:block;font-family:var(--mono);font-size:.58rem;letter-spacing:.26em;text-transform:uppercase;color:rgba(244,239,227,.55);margin-bottom:.6rem}
.nl-row{display:flex;gap:0}
.nl-row input{flex:1;min-width:0;background:transparent;border:1px solid rgba(244,239,227,.4);border-right:0;color:var(--paper);padding:1rem 1.1rem;font-family:var(--mono);font-size:.88rem}
.nl-row input::placeholder{color:rgba(244,239,227,.35)}
.nl-row input:focus{outline:2px solid var(--gold);outline-offset:-1px}
.nl-note{font-family:var(--mono);font-size:.55rem;letter-spacing:.18em;color:rgba(244,239,227,.45);margin-top:.9rem;text-transform:uppercase}
.nl-note.ok{color:var(--gold)}
/* ---------- faq ---------- */
.wrap-narrow{max-width:840px}
.faq-item{border-bottom:1px solid var(--ink)}
.faq-item:first-of-type{border-top:1.5px solid var(--ink)}
.faq-q{width:100%;display:flex;justify-content:space-between;align-items:center;gap:1.5rem;background:none;border:0;cursor:pointer;padding:1.35rem .3rem;text-align:left;font-family:var(--serif);font-size:1.25rem;font-weight:600;color:var(--ink);letter-spacing:-.01em}
.faq-q:hover{color:var(--accent)}
.faq-ic{font-family:var(--mono);font-size:1.3rem;color:var(--accent);transition:transform .35s ease;flex-shrink:0}
.faq-item.open .faq-ic{transform:rotate(45deg)}
.faq-a{display:grid;grid-template-rows:0fr;transition:grid-template-rows .5s cubic-bezier(.2,.7,.2,1)}
.faq-item.open .faq-a{grid-template-rows:1fr}
.faq-a>div{overflow:hidden}
.faq-a p{padding:0 .3rem 1.5rem;color:var(--ink-2);max-width:700px;font-size:.95rem}
/* ---------- footer ---------- */
.site-foot{background:var(--dark);color:var(--paper)}
.foot-top{display:grid;grid-template-columns:2fr 1fr 1fr 1fr 1.5fr;gap:2.6rem;padding:4.5rem 28px 3rem}
.foot-word{font-family:var(--serif);font-style:italic;font-weight:500;font-size:3.1rem;letter-spacing:-.02em;line-height:1}
.foot-word span{color:var(--gold)}
.foot-tag{color:rgba(244,239,227,.6);font-size:.9rem;margin:1rem 0 1.4rem;max-width:280px}
.social{display:flex;gap:.7rem}
.social a{width:38px;height:38px;border:1px solid rgba(244,239,227,.35);display:flex;align-items:center;justify-content:center;transition:background .25s,border-color .25s,transform .25s}
.social a:hover{background:var(--accent);border-color:var(--accent);transform:translateY(-3px)}
.social svg{width:16px;height:16px;fill:var(--paper);stroke:var(--paper)}
.foot-col h4{font-family:var(--mono);font-size:.58rem;letter-spacing:.28em;text-transform:uppercase;color:var(--gold);margin-bottom:1.1rem}
.foot-col a{display:block;color:rgba(244,239,227,.72);text-decoration:none;font-size:.88rem;padding:.28rem 0}
.foot-col a:hover{color:var(--paper);text-decoration:underline;text-underline-offset:3px}
.foot-contact p{color:rgba(244,239,227,.72);font-size:.88rem;line-height:1.7}
.foot-contact a{color:rgba(244,239,227,.72)}
.foot-bot{display:flex;justify-content:space-between;align-items:center;gap:1rem;flex-wrap:wrap;border-top:1px solid rgba(244,239,227,.18);padding:1.4rem 28px;font-family:var(--mono);font-size:.6rem;letter-spacing:.14em;color:rgba(244,239,227,.5);text-transform:uppercase}
.foot-links{display:flex;gap:1.4rem}
.foot-links a{color:rgba(244,239,227,.5);text-decoration:none}
.foot-links a:hover{color:var(--paper)}
/* ---------- toasts ---------- */
.toasts{position:fixed;bottom:22px;right:22px;z-index:100;display:flex;flex-direction:column;gap:.7rem;max-width:340px}
.toast{background:var(--ink);color:var(--paper);font-family:var(--mono);font-size:.72rem;letter-spacing:.04em;padding:.95rem 1.2rem;border-left:3px solid var(--accent);box-shadow:0 12px 30px rgba(18,32,26,.35);animation:toastIn .35s cubic-bezier(.2,.7,.2,1);transition:opacity .35s,transform .35s}
.toast.out{opacity:0;transform:translateY(10px)}
@keyframes toastIn{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}
/* ---------- reveals ---------- */
.reveal{opacity:0;transform:translateY(28px);transition:opacity .8s ease,transform .8s cubic-bezier(.2,.7,.2,1);transition-delay:var(--d,0s)}
.reveal.in{opacity:1;transform:none}
/* ---------- responsive ---------- */
@media (max-width:1080px){
.nav{display:none}
.nav-toggle{display:block}
.head-cta{display:none}
.hero{grid-template-columns:1fr;gap:3.5rem;min-height:auto}
.hero-media{max-width:520px}
.dest-layout{grid-template-columns:1fr}
.dest-side{position:static;display:grid;grid-template-columns:1fr 1fr;align-items:start}
.guides-layout{grid-template-columns:1fr;gap:2.5rem}
.guides-side{position:static}
.fare-grid{grid-template-columns:1fr}
.ft-fields{grid-template-columns:repeat(2,1fr)}
.planner-grid{grid-template-columns:1fr;gap:3rem}
.pl-tool{position:static}
.about-grid,.dispatch-in{grid-template-columns:1fr;gap:2.8rem}
.foot-top{grid-template-columns:1fr 1fr}
.stats-in{grid-template-columns:1fr 1fr}
.stat{border-bottom:1px solid rgba(27,42,35,.18)}
}
@media (max-width:720px){
.topbar-in{justify-content:center}
.topbar .tb-hide{display:none}
.dest-side{grid-template-columns:1fr}
.dest-grid{grid-template-columns:1fr}
.d1,.d2,.d3,.d4,.d5,.d6{grid-column:span 1}
.d6{grid-template-columns:1fr}
.d6 .dc-img{aspect-ratio:16/9;border-right:0;border-bottom:1px solid var(--ink)}
.hotel-card{grid-template-columns:1fr}
.hc-img{border-right:0;border-bottom:1px solid var(--ink);aspect-ratio:16/10}
.stack-card{position:relative;top:0}
.guide-item a{grid-template-columns:1fr;gap:.7rem}
.gi-num,.gi-arrow{display:none}
.gi-thumb{max-width:220px}
.postcards{grid-template-columns:1fr}
.pc1,.pc2,.pc3,.pc4{transform:none}
.fr-row{grid-template-columns:1fr auto}
.fr-badge{display:none}
.stats-in{grid-template-columns:1fr}
.stat{border-right:0}
.foot-top{grid-template-columns:1fr}
.hero-polaroid{width:120px;bottom:-24px}
.stamp{width:92px;height:92px;top:-30px}
}
@media (prefers-reduced-motion:reduce){
html{scroll-behavior:auto}
*,*::before,*::after{animation-duration:.001s!important;animation-iteration-count:1!important;transition-duration:.001s!important}
.ticker-track{animation:none;flex-wrap:wrap;width:100%}
.kb img{animation:none}
.hline>span{transform:none}
}
</style>
</head>
<body>
<a class="skip" href="#main">Skip to content</a>
<div class="grain" aria-hidden="true"></div>
<div class="toasts" id="toasts" aria-live="polite"></div>
<!-- ============ TOPBAR ============ -->
<div class="topbar">
<div class="topbar-in">
<span>Field Guide Nº 148 · Oct 2025</span>
<span class="tb-hide">Lisbon <b id="clock">--:--:--</b> · 18°C · Wind 4 kt</span>
<span class="tb-hide">38.7169° N · 9.1399° W</span>
</div>
</div>
<!-- ============ HEADER ============ -->
<header class="site-head" id="top">
<div class="head-in wrap" style="padding-left:28px;padding-right:28px">
<a class="brand" href="#top">
<img class="brand-mark" src="https://placehold.co/72x72/1B2A23/F4EFE3?text=A%26T&font=playfair+display" alt="Atlas & Tide monogram logo">
<span class="brand-txt">
<strong>Atlas & Tide</strong>
<em>Field guides & fair fares · est. 2016</em>
</span>
</a>
<nav class="nav" aria-label="Primary">
<a href="#destinations">Destinations</a>
<a href="#guides">Guides</a>
<a href="#hotels">Hotels</a>
<a href="#fares">Flight Deals</a>
<a href="#planner">Trip Planner</a>
<a href="#dispatch">The Dispatch</a>
<a href="#about">About</a>
</nav>
<a href="#fares" class="btn btn-primary btn-sm head-cta">Start planning</a>
<button class="nav-toggle" aria-expanded="false" aria-controls="mnav">Menu</button>
</div>
<nav id="mnav" class="mnav" hidden aria-label="Mobile">
<a href="#destinations">Destinations</a>
<a href="#guides">Guides</a>
<a href="#hotels">Hotels</a>
<a href="#fares">Flight Deals</a>
<a href="#planner">Trip Planner</a>
<a href="#dispatch">The Dispatch</a>
<a href="#about">About</a>
</nav>
</header>
<!-- ============ DEPARTURE BOARD ============ -->
<div class="ticker" aria-label="Live fare board">
<div class="ticker-track" id="tickerTrack"></div>
</div>
<main id="main">
<!-- ============ HERO ============ -->
<section class="hero wrap" aria-labelledby="heroTitle">
<div class="hero-copy">
<p class="kicker" data-scramble>Cover story — Axarquía, Andalusia</p>
<h1 class="hero-h" id="heroTitle">
<span class="hline"><span>The quiet coast</span></span>
<span class="hline"><span>has a <em>flight</em></span></span>
<span class="hline"><span>number.</span></span>
</h1>
<p class="hero-lede">Two charter routes, one low-cost hub, and a stretch of white cliffs that most itineraries skip entirely. We flew into Madrid, caught the 07:40 coach to Nerja, and spent eleven days for the cost of one long weekend in the city. Here's the exact fare window, the two villages worth the detour, and the guesthouse we'd book before it prices itself up.</p>
<div class="hero-cta">
<button class="btn btn-primary" id="heroSearch" type="button">Search this route ✈</button>
<a class="btn" href="#guides">Read the field guide</a>
</div>
<p class="hero-meta mono">Best window May 4–18 · FLYS INTO MAD · $62/DAY ALL-IN</p>
</div>
<figure class="hero-media reveal" style="--d:.2s">
<div class="hero-frame">
<div class="kb">
<img src="https://picsum.photos/seed/andalusia-cost/980/1225" alt="Cliff path above the turquoise sea on the Axarquía coast, southern Spain" fetchpriority="high">
</div>
</div>
<figcaption>36.7894° N · 4.4580° W — Campo de Gijón, ES</figcaption>
<img class="hero-polaroid" src="https://picsum.photos/seed/orange-grove/420/420" alt="Sunlit orange grove near Nerja" loading="lazy">
<svg class="stamp" viewBox="0 0 120 120" aria-hidden="true">
<defs><path id="circ" d="M60,60 m-45,0 a45,45 0 1,1 90,0 a45,45 0 1,1 -90,0"/></defs>
<circle cx="60" cy="60" r="56" class="stamp-ring"/>
<text><textPath href="#circ">ATLAS & TIDE · FIELD GUIDE Nº 148 · EST. 2016 · </textPath></text>
<path class="stamp-plane" d="M48 66 L74 50 L60 67 L58 76 Z"/>
</svg>
</figure>
</section>
<!-- ============ STATS ============ -->
<section class="stats" aria-label="Atlas and Tide in numbers">
<div class="wrap stats-in" style="padding-left:0;padding-right:0">
<div class="stat"><span class="stat-n mono"><span data-count="1247">0</span></span><span class="stat-l">Hotels reviewed on the ground</span></div>
<div class="stat"><span class="stat-n mono"><span data-count="96">0</span></span><span class="stat-l">Airports in the fare network</span></div>
<div class="stat"><span class="stat-n mono"><span data-count="12.4" data-decimals="1" data-prefix="$" data-suffix="M">$0M</span></span><span class="stat-l">Reader fare savings since 2016</span></div>
<div class="stat"><span class="stat-n mono"><span data-count="48213">0</span></span><span class="stat-l">Sunday Dispatch readers</span></div>
</div>
</section>
<!-- ============ DESTINATIONS + SIDEBAR ============ -->
<section id="destinations" class="section wrap" aria-labelledby="destTitle">
<header class="sec-head reveal">
<p class="kicker" data-scramble>Where we're pointing — October</p>
<h2 class="sec-h" id="destTitle">Six routes worth a <em>fare alert</em> this month.</h2>
<p class="sec-sub">Every destination below is re-priced weekly against its own twelve-month fare history. Budgets are what our editors actually spent — meals, local transport and one bad taxi included — not brochure math.</p>
</header>
<div class="dest-layout">
<div class="dest-grid">
<article class="dest-card d1 reveal">
<div class="dc-img"><img src="https://picsum.photos/seed/kyoto-lantern/900/1080" alt="Lantern-lit alley in Kyoto at dusk" loading="lazy"><span class="dc-tag mono">Trending</span></div>
<div class="dc-body">
<div class="dc-top"><h3>Kyoto, Japan</h3><span class="mono dc-co">35.01° N · 135.77° E</span></div>
<p>Lantern alleys before the tour buses, kaiseki lunches that undercut the hotel buffet, and a March fare window so good it's almost suspicious. Stay in a ryokan north of Gion; the south end is a selfie queue.</p>
<div class="dc-meta mono"><span>BEST NOV 2–10</span><span>$140 / DAY</span><a href="#guides">Read guide →</a></div>
</div>
</article>
<article class="dest-card d2 reveal" style="--d:.08s">
<div class="dc-img"><img src="https://picsum.photos/seed/oaxaca-market/900/675" alt="Marigold-laden market stalls in Oaxaca's historic center" loading="lazy"><span class="dc-tag mono">Value pick</span></div>
<div class="dc-body">
<div class="dc-top"><h3>Oaxaca, Mexico</h3><span class="mono dc-co">17.07° N · 96.72° W</span></div>
<p>Tamarindo season is here, mezcal flights run $47, and East-Coast US fares have been under $300 all spring. Base yourself in Centro and eat wherever the marigolds cross the street.</p>
<div class="dc-meta mono"><span>BEST NOV 1–8</span><span>$55 / DAY</span><a href="#guides">Read guide →</a></div>
</div>
</article>
<article class="dest-card d3 reveal">
<div class="dc-img"><img src="https://picsum.photos/seed/faroe-cliff/800/600" alt="Green Faroe Islands cliffs meeting a grey North Atlantic sea" loading="lazy"></div>
<div class="dc-body">
<div class="dc-top"><h3>Faroe Islands</h3><span class="mono dc-co">62.01° N · 6.77° W</span></div>
<p>Weather is the amenity. Two August weeks are the only window that behaves, and the small airfield sells out by January — we're tracking the fare curve in the Fare Desk.</p>
<div class="dc-meta mono"><span>BEST AUG 12–24</span><span>$180 / DAY</span></div>
</div>
</article>
<article class="dest-card d4 reveal" style="--d:.08s">
<div class="dc-img"><img src="https://picsum.photos/seed/amalfi-terrace/800/600" alt="Terraced citrus garden above the Amalfi coastline" loading="lazy"><span class="dc-tag mono">Peak alert</span></div>
<div class="dc-body">
<div class="dc-top"><h3>Amalfi Coast</h3><span class="mono dc-co">40.63° N · 14.60° E</span></div>
<p>We love the coast and we hate the price. Book an agriturismo forty minutes inland in the May shoulder, drive down at nine in the morning, and take the ferry as the upgrade.</p>
<div class="dc-meta mono"><span>BEST MAY 4–11</span><span>$210 / DAY</span></div>
</div>
</article>
<article class="dest-card d5 reveal" style="--d:.16s">
<div class="dc-img"><img src="https://picsum.photos/seed/cusco-valley/800/600" alt="Andean terraces in the Sacred Valley at first light" loading="lazy"></div>
<div class="dc-body">
<div class="dc-top"><h3>Cusco & the Sacred Valley</h3><span class="mono dc-co">13.53° S · 71.96° W</span></div>
<p>Two acclimatisation days in Písac, then the valley at first light before the terraces fill. Seventy dollars a day buys a suite, two pisco sours and a private Salkantay porter.</p>
<div class="dc-meta mono"><span>BEST MAY 2–14</span><span>$70 / DAY</span></div>
</div>
</article>
<article class="dest-card d6 wide reveal">
<div class="dc-img"><img src="https://picsum.photos/seed/hoian-oldtown/1300/760" alt="Paper lanterns over Hoi An's old town river at night" loading="lazy"><span class="dc-tag mono">Editor's wildcard</span></div>
<div class="dc-body">
<div class="dc-top"><h3>Hoi An, Vietnam</h3><span class="mono dc-co">15.88° N · 108.33° E</span></div>
<p>Lantern-lit tailors, all-in days for $31, and a hub that has quietly become the best value in all of Vietnam. Our nine-person grad-student group spent less on Hoi An than a single week in Austin — full ledger in the October Dispatch, receipts and all.</p>
<div class="dc-meta mono"><span>BEST FEB 3–9</span><span>$45 / DAY</span><a href="#planner">See the ledger →</a></div>
</div>
</article>
</div>
<aside class="dest-side" aria-label="Destinations sidebar">
<div class="side-box reveal">
<h3 class="side-h mono">Trending this week</h3>
<ol class="trend">
<li><span class="rk mono">01</span><span class="nm">Kyoto</span><b class="mono up">▲ 12%</b></li>
<li><span class="rk mono">02</span><span class="nm">Oaxaca</span><b class="mono down">▼ 8%</b></li>
<li><span class="rk mono">03</span><span class="nm">Reykjavík</span><b class="mono up">▲ 4%</b></li>
<li><span class="rk mono">04</span><span class="nm">Cusco</span><b class="mono down">▼ 11%</b></li>
<li><span class="rk mono">05</span><span class="nm">Hoi An</span><b class="mono up">▲ 22%</b></li>
</ol>
<p class="trend-note mono">▲ price rising · ▼ price falling · vs. 90-day avg</p>
</div>
<div class="side-box side-deal reveal" style="--d:.1s">
<h3 class="side-h mono">Deal alerts</h3>
<div class="deal-row"><span class="mono">CDG → LIS</span><span><b>€84</b> <span class="mono" style="font-size:.6rem">MAR 12</span></span><a href="#fares" data-alert="CDG → LIS in March">WATCH</a></div>
<div class="deal-row"><span class="mono">ORD → CUN</span><span><b>$212</b> <span class="mono" style="font-size:.6rem">APR 03</span></span><a href="#fares" data-alert="ORD → CUN in April">WATCH</a></div>
<p class="side-note">Alerts fire when a route beats its 90-day low by 6% or more.</p>
</div>
<div class="side-box reveal" style="--d:.15s">
<h3 class="side-h mono">From the gallery</h3>
<div class="gal">
<figure><img src="https://picsum.photos/seed/rio-dusk/300/300" alt="Rio de Janeiro shoreline at dusk" loading="lazy"><figcaption>Rio · 19:42</figcaption></figure>
<figure><img src="https://picsum.photos/seed/cairo-souk/300/300" alt="Spice stalls in a Cairo souk" loading="lazy"><figcaption>Cairo · Souk</figcaption></figure>
<figure><img src="https://picsum.photos/seed/north-sea-fog/300/300" alt="Fog over the North Sea" loading="lazy"><figcaption>North Sea · 06:05</figcaption></figure>
</div>
</div>
</aside>
</div>
</section>
<!-- ============ GUIDES ============ -->
<section id="guides" class="section guides" aria-labelledby="guidesTitle">
<div class="wrap guides-layout">
<div class="guides-side reveal">
<p class="kicker" data-scramble>The Guides Desk</p>
<h2 class="sec-h" id="guidesTitle">Written after the trip, not for the press release.</h2>
<p>Every guide on this desk is written after at least one trip on the ground, re-verified within 90 days, and stress-tested against a real budget. If a hotel changed its breakfast menu, a ferry was cancelled, or a "free" shuttle turned out to be a 40-minute hike, the guide says so — usually in the corrections box, always in the body.</p>
<p>We publish prices with dates attached. A $120 room in May is a different review than the same room in August, and we won't pretend otherwise. When we're wrong, the addendum goes on top of the article, not in a footnote.</p>
<a class="btn" href="#faq">How we verify ↓</a>
<p class="g-verif">✓ Trip-tested · 90-day fresh · Budget-stressed</p>
</div>
<ol class="guide-list">
<li class="guide-item reveal"><a href="#faq">
<span class="gi-num mono">01</span>
<div class="gi-thumb"><img src="https://picsum.photos/seed/flight-board/420/315" alt="Airport departure board" loading="lazy"></div>
<div class="gi-body">
<h3>Booking Flights: the 11-4-1 Window That Actually Works</h3>
<p>Forty months of data across 96 routes point to an 11-week domestic window, a 4-month international window, and an 11-day transatlantic sweet spot. Here's how to tell when you're inside it, when dynamic pricing is working against you, and the one booking setting airlines hope you've never opened.</p>
<div class="gi-meta mono"><span>12 min read</span><span>Flights</span><span>Strategy</span></div>
</div>
<span class="gi-arrow" aria-hidden="true">→</span>
</a></li>
<li class="guide-item reveal" style="--d:.05s"><a href="#faq">
<span class="gi-num mono">02</span>
<div class="gi-thumb"><img src="https://picsum.photos/seed/resort-pool/420/315" alt="Pool at a coastal all-inclusive resort" loading="lazy"></div>
<div class="gi-body">
<h3>All-Inclusive, Decoded: When the Package Pays</h3>
<p>The math flips at five days. Under that, à la carte wins; over it, a well-chosen all-inclusive can beat a boutique hotel by $40 a night. We price out three Caribbean, two Mexican and two East African properties side by side — minibar, spa day and the "happy hour" included in the totals.</p>
<div class="gi-meta mono"><span>9 min read</span><span>Hotels</span><span>Booking</span></div>
</div>
<span class="gi-arrow" aria-hidden="true">→</span>
</a></li>
<li class="guide-item reveal" style="--d:.1s"><a href="#faq">
<span class="gi-num mono">03</span>
<div class="gi-thumb"><img src="https://picsum.photos/seed/mangrove-trail/420/315" alt="Boardwalk trail through a mangrove" loading="lazy"></div>
<div class="gi-body">
<h3>Eco-Tourism Without the Greenwashing</h3>
<p>Certification labels multiply like weeds. This one shows the three that actually audit water use, waste and local hiring — and the red flags that read as "sustainable" in English but not in the operating ledger. Includes our 12-point lobby checklist.</p>
<div class="gi-meta mono"><span>14 min read</span><span>Slow travel</span><span>Ethics</span></div>
</div>
<span class="gi-arrow" aria-hidden="true">→</span>
</a></li>
<li class="guide-item reveal" style="--d:.15s"><a href="#faq">
<span class="gi-num mono">04</span>
<div class="gi-thumb"><img src="https://picsum.photos/seed/lisa-luggage/420/315" alt="Light carry-on luggage on a station platform" loading="lazy"></div>
<div class="gi-body">
<h3>Shoulder Season: The Traveler's Cheat Code</h3>
<p>The weeks either side of peak are where 30% discounts hide in plain sight. We map shoulder windows for 24 popular routes, flag the two where it doesn't work (and why), and build a sample Lisbon October itinerary as the template.</p>
<div class="gi-meta mono"><span>8 min read</span><span>Timing</span><span>Budget</span></div>
</div>
<span class="gi-arrow" aria-hidden="true">→</span>
</a></li>
<li class="guide-item reveal" style="--d:.2s"><a href="#faq">
<span class="gi-num mono">05</span>
<div class="gi-thumb"><img src="https://picsum.photos/seed/japan-street/420/315" alt="Narrow street in a Japanese city at golden hour" loading="lazy"></div>
<div class="gi-body">
<h3>The $150/Day Japan Itinerary</h3>
<p>Nine days, four cities, two Shinkansen legs and one ryokan night that anchors the whole budget. Every hotel is named with the actual rate we paid in August, and every meal has a receipt photo. It lands at $1,318 — under the $1,500 cap.</p>
<div class="gi-meta mono"><span>16 min read</span><span>Itinerary</span><span>Japan</span></div>
</div>
<span class="gi-arrow" aria-hidden="true">→</span>
</a></li>
</ol>
</div>
</section>
<!-- ============ FARE DESK ============ -->
<section id="fares" class="section fares" aria-labelledby="faresTitle">
<div class="wrap">
<header class="sec-head reveal">
<p class="kicker" data-scramble>The Fare Desk</p>
<h2 class="sec-h" id="faresTitle">Nightly fares. <em>No middleman margin.</em></h2>
<p class="sec-sub">We ingest roughly 1.2 million fare points every night — every schedule change, promo window and price bump — and publish the thing that matters: when a route is genuinely cheap against its own 12-month history. The tool below runs on the same data our editors use. No affiliate markups, no partner offers, no "from" prices that existed for four minutes.</p>
</header>
<div class="fare-grid">
<form class="fare-tool reveal" id="fareForm" aria-label="Fare finder">
<div class="ft-fields">
<div class="ft-field"><label for="fFrom">From</label>
<select id="fFrom">
<option value="LIS" selected>LIS — Lisbon</option>
<option value="MAD">MAD — Madrid</option>
<option value="CDG">CDG — Paris</option>
<option value="JFK">JFK — New York</option>
<option value="LHR">LHR — London</option>
<option value="SIN">SIN — Singapore</option>
</select>
</div>
<div class="ft-field"><label for="fTo">To</label>
<select id="fTo">
<option value="OAX" selected>OAX — Oaxaca</option>
<option value="MAD">MAD — Madrid</option>
<option value="KYO">KYO — Kyoto</option>
<option value="KEF">KEF — Reykjavík</option>
<option value="CUN">CUN — Cancún</option>
<option value="HAN">HAN — Hanoi</option>
<option value="CPT">CPT — Cape Town</option>
</select>
</div>
<div class="ft-field"><label for="fMonth">Month</label>
<select id="fMonth"></select>
</div>
<div class="ft-field"><label for="fPax">Travelers</label>
<select id="fPax">
<option value="1">1</option><option value="2" selected>2</option><option value="3">3</option>
<option value="4">4</option><option value="5">5</option><option value="6">6</option>
</select>
</div>
<div class="ft-field"><label for="fCabin">Cabin</label>
<select id="fCabin">
<option value="Economy" selected>Economy</option>
<option value="Premium">Premium</option>
<option value="Business">Business</option>
</select>
</div>
</div>
<button class="btn btn-primary" type="submit">Search fares</button>
</form>
<aside class="deal-card reveal" style="--d:.1s" aria-label="Deal of the week">
<p class="deal-k mono">Deal of the week · verified 06:12 UTC</p>
<h3>Lisbon → Oaxaca</h3>
<p class="deal-p"><b>$418</b><s>$611</s><span>ROUND TRIP · MAR 12 – 26 · K-CLASS SEATS</span></p>
<p>The 11-4-1 window stays open on this route until the 22nd, and K-class is fully refundable — rarer than we'd like. We re-verify the price every six hours; if it moves, the alert list hears it first.</p>
<button class="btn btn-ghost btn-sm" type="button" data-alert="LIS → OAX in March">Set fare alert</button>
</aside>
</div>
<div class="fare-result reveal" id="fareResult" aria-live="polite">
<div class="fr-head mono"><span id="frRoute">—</span><span><b>●</b> LIVE · 1.2M FARES / NIGHT</span></div>
<div id="frRows"></div>
<div class="fr-chart">
<svg id="spark" viewBox="0 0 560 140" preserveAspectRatio="none" aria-hidden="true"></svg>
<div class="fr-months mono" id="frMonths"></div>
</div>
<div class="fr-foot">
<p class="mono" id="frDays">—</p>
<button class="btn btn-ghost btn-sm" type="button" id="frAlert" data-alert="—">Set fare alert</button>
</div>
</div>
</div>
</section>
<!-- ============ HOTELS ============ -->
<section id="hotels" class="section wrap" aria-labelledby="hotelsTitle">
<header class="sec-head reveal">
<p class="kicker" data-scramble>The Stay Desk</p>
<h2 class="sec-h" id="hotelsTitle">Reviews we'd stake a <em>passport</em> on.</h2>
<p class="sec-sub">We book through public channels at the published rate, stay two to three nights, and pay the actual checkout bill — resort fee, city tax and overpriced minibar incident included. The "from" price is the one on your statement, and the review is re-verified within 90 days.</p>
</header>
<div class="stack">
<article class="hotel-card stack-card" style="--i:0">
<div class="hc-img"><img src="https://picsum.photos/seed/setubal-house/900/720" alt="Whitewashed guesthouse courtyard in Setúbal, Portugal" loading="lazy"><span class="hc-from mono">FROM €92 / NIGHT</span></div>
<div class="hc-body">
<div class="hc-top">
<h3>Casa Farol <span>— Setúbal, PT</span></h3>
<span class="stars" aria-label="Rated 4.7 out of 5">★★★★<i>★</i><b>4.7</b></span>
</div>
<p>A whitewashed guesthouse nine hundred metres from Setúbal's fish market, where breakfast includes actual orange juice and the sea is a four-minute walk. Our editor's stay came to €89 a night after the city tax — the number we publish, not the sticker. Rooms face the harbour or the olive yard; take the yard, it's quieter and, honestly, better.</p>
<blockquote>"The sea was a four-minute walk and the bill was a four-figure save."<cite>— Stay #412 · June checkout</cite></blockquote>
<ul class="hc-tags"><li>Walkable</li><li>Pet-friendly</li><li>No resort fee</li><li>Olive yard</li></ul>
<a class="btn btn-sm" href="#faq">View full review</a>
</div>
</article>
<article class="hotel-card stack-card" style="--i:1">
<div class="hc-img"><img src="https://picsum.photos/seed/kyoto-ryokan/900/720" alt="Tatami room with open-air bath at a Kyoto ryokan" loading="lazy"><span class="hc-from mono">FROM ¥23,800 / NIGHT</span></div>
<div class="hc-body">
<div class="hc-top">
<h3>Hotel Tsuru <span>— Kyoto, JP</span></h3>
<span class="stars" aria-label="Rated 4.8 out of 5">★★★★<i>★</i><b>4.8</b></span>
</div>
<p>Fourteen rooms, two blocks off the Kamo river, and a private open-air bath in every north-wing room. Family-run, English optional, warmth guaranteed. We paid ¥23,800 for a tatami double with breakfast included — ask for the north wing when booking, because the south wing hears the street by six in the morning.</p>
<blockquote>"The midnight open-air bath is worth the entire airfare."<cite>— Stay #388 · November checkout</cite></blockquote>
<ul class="hc-tags"><li>Open-air bath</li><li>Family-run</li><li>Breakfast incl.</li><li>14 rooms only</li></ul>
<a class="btn btn-sm" href="#faq">View full review</a>
</div>
</article>
<article class="hotel-card stack-card" style="--i:2">
<div class="hc-img"><img src="https://picsum.photos/seed/oaxaca-courtyard/900/720" alt="Courtyard with pool at a historic Oaxaca merchant house" loading="lazy"><span class="hc-from mono">FROM $128 / NIGHT</span></div>
<div class="hc-body">
<div class="hc-top">
<h3>Panga Suites <span>— Oaxaca, MX</span></h3>
<span class="stars" aria-label="Rated 4.6 out of 5">★★★★<i>★</i><b>4.6</b></span>
</div>
<p>Nine courtyard suites in a 19th-century merchant house in Centro, with a mezcal shelf holding 61 bottles and a daily all-inclusive that covers breakfast, one tasting menu and the pool. It's the rare all-inclusive that reads as boutique. The bikes in the valet are real, the valet is fast, and the courtyard at dusk is the best free show in the city.</p>
<blockquote>"All-inclusive, but you'd never guess it until the tasting menu arrives."<cite>— Stay #401 · April checkout</cite></blockquote>
<ul class="hc-tags"><li>Daily all-inclusive</li><li>Bike valet</li><li>Courtyard pool</li><li>Centro</li></ul>
<a class="btn btn-sm" href="#faq">View full review</a>
</div>
</article>
<article class="hotel-card stack-card" style="--i:3">
<div class="hc-img"><img src="https://picsum.photos/seed/faroe-lodge/900/720" alt="Cliff-side lodge above a harbour in the Faroe Islands" loading="lazy"><span class="hc-from mono">FROM DKK 2,100 / NIGHT</span></div>
<div class="hc-body">
<div class="hc-top">
<h3>Tinde Føroya <span>— Faroe Islands, FO</span></h3>
<span class="stars" aria-label="Rated 4.9 out of 5">★★★★<i>★</i><b>4.9</b></span>
</div>
<p>A cliff-side lodge above the harbour where the wood stove in the lobby is the front desk and the weather is the amenity. Geothermal hot tub, locally sourced breakfast, and rooms that sell out six months ahead — our fare alert includes a "rooms open" ping for this one. The wind will rearrange your plans; that's the point, and it's why you're going.</p>
<blockquote>"Book the north room. The storm is the amenity."<cite>— Stay #377 · August checkout</cite></blockquote>
<ul class="hc-tags"><li>Eco-certified</li><li>Geothermal</li><li>Book 6 mo ahead</li><li>Harbour view</li></ul>
<a class="btn btn-sm" href="#faq">View full review</a>
</div>
</article>
</div>
</section>
<!-- ============ TRIP PLANNER / LEDGER ============ -->
<section id="planner" class="section planner" aria-labelledby="plannerTitle">
<div class="wrap planner-grid">
<div class="pl-copy reveal">
<p class="kicker" data-scramble>The Frugal Flyer's Ledger</p>
<h2 class="sec-h" id="plannerTitle">Plan the trip before the <em>price</em> does it for you.</h2>
<p>Budget travel isn't a category of hotels — it's a category of timing. The same seat, the same room and the same dinner can swing by 40% depending on the week you choose, and the Ledger exists to move your trip toward the cheap side of that swing without touching the itinerary.</p>
<p>The tools here are the ones our editors run before every trip: a budget splitter that forces a per-day number before anyone looks at hotels, fare watches that only alert on genuine discounts (never against invented list prices), and the five rules below, which have survived thirty-eight trips and counting.</p>
<p>Start with the splitter. If the per-day number reads under $90, you're in long-haul watch mode. If it reads over $180, you're in shoulder-everything mode. Either way, the flight gets booked first — it's the one line item that never comes back.</p>
<ol class="rules">
<li>Book air 3–8 weeks out domestic, 2–4 months international — then stop refreshing the page. Staring is a strategy.</li>
<li>Keep a 20% buffer for the "one thing will go wrong" fund. It always goes wrong exactly once.</li>
<li>Shoulder season beats promo season: 30% less, the same weather, half the queue, and the hotel has time to talk to you.</li>
<li>All-inclusive pays above five days per person. Below that, à la carte wins every time.</li>
<li>Check prices in a private window. A third search isn't a third chance — it's a price increase.</li>
</ol>
</div>
<div class="pl-tool reveal" style="--d:.1s" aria-label="Trip budget splitter">
<div class="pl-head">
<h3 class="mono">Trip budget splitter</h3>
<span id="plPerDay">$0 / day</span>
</div>
<div class="pl-field">
<label for="pDays">Trip length <output id="pDaysOut" class="mono">7 days</output></label>
<input type="range" id="pDays" min="3" max="21" value="7">
</div>
<div class="pl-field">
<label for="pBudget">Total per person <output id="pBudgetOut" class="mono">$1,200</output></label>
<input type="range" id="pBudget" min="400" max="4000" step="50" value="1200">
</div>
<div id="plBars"></div>
<p class="pl-tip" id="plTip">Drag the sliders — the split updates with your numbers.</p>
<button class="btn btn-primary" type="button" id="plSave">Save to my trips</button>
</div>
</div>
</section>
<!-- ============ MAILBAG ============ -->
<section class="section" aria-labelledby="mailTitle">
<div class="wrap">
<header class="sec-head reveal" style="margin-inline:auto;text-align:center;max-width:560px">
<p class="kicker" data-scramble>From the mailbag</p>
<h2 class="sec-h" id="mailTitle">Postcards from readers.</h2>
</header>
<div class="postcards">
<figure class="postcard pc1 reveal">
<span class="pc-stamp" aria-hidden="true">✈</span>
<blockquote>"Booked the Kyoto itinerary from the May guide. August pricing came in within eight percent of every line item. I checked. I actually checked."</blockquote>
<figcaption><img src="https://i.pravatar.cc/96?u=mara-k" alt="Portrait of Mara K." loading="lazy"><div><b>Mara K.</b><span>Portland · Kyoto, 9 days</span></div></figcaption>
</figure>
<figure class="postcard pc2 reveal" style="--d:.08s">
<span class="pc-stamp" aria-hidden="true">✈</span>
<blockquote>"The fare alert pinged three weeks early on a CDG-to-Lisbon price and saved $410 on our anniversary trip. My partner now only trusts the Dispatch for numbers."</blockquote>
<figcaption><img src="https://i.pravatar.cc/96?u=jonas-priya" alt="Portrait of Jonas" loading="lazy"><div><b>Jonas & Priya</b><span>Berlin · Lisbon, 6 days</span></div></figcaption>
</figure>
<figure class="postcard pc3 reveal" style="--d:.12s">
<span class="pc-stamp" aria-hidden="true">✈</span>
<blockquote>"I stopped overpaying for all-inclusives the week I read the Decoded guide. We booked two boutique stays instead and kept the difference for a day trip we still talk about."</blockquote>
<figcaption><img src="https://i.pravatar.cc/96?u=denise-a" alt="Portrait of Denise A." loading="lazy"><div><b>Denise A.</b><span>Toronto · Cancún, 8 days</span></div></figcaption>
</figure>
<figure class="postcard pc4 reveal" style="--d:.16s">
<span class="pc-stamp" aria-hidden="true">✈</span>
<blockquote>"Sent the Frugal Flyer ledger to my entire grad-student travel group. Nine of us, Hoi An, $31 a day all-in. The ledger paid for our own visas."</blockquote>
<figcaption><img src="https://i.pravatar.cc/96?u=theo-m" alt="Portrait of Theo M." loading="lazy"><div><b>Theo M.</b><span>Austin · Hoi An, 12 days</span></div></figcaption>
</figure>
</div>
</div>
</section>
<!-- ============ ABOUT ============ -->
<section id="about" class="section about" aria-labelledby="aboutTitle">
<div class="wrap about-grid">
<div class="about-img kb reveal"><img src="https://picsum.photos/seed/editing-desk/900/1035" alt="The Atlas and Tide editing desk in Lisbon, maps and receipts pinned to the wall" loading="lazy"></div>
<div class="about-copy reveal" style="--d:.1s">
<p class="kicker" data-scramble>The desk</p>
<h2 class="sec-h" id="aboutTitle">A small crew in Lisbon that <em>actually goes.</em></h2>
<p>Atlas & Tide started in 2016 as a shared spreadsheet: a former IATA fare analyst and a freelance travel editor comparing what airlines charged against what travelers actually paid. The spreadsheet got 400 readers, then 4,000, then a small desk in a third-floor office above a Lisbon bakery.</p>
<p>Today we're fourteen writers and two editors across six time zones. We book our own flights, pay the real checkout bill, and publish the numbers — which is why our reviews come with dates, receipts and the occasional "we got this wrong" addendum stapled to the top.</p>
<p>We take affiliate money where it's disclosed and no money from anywhere else. No sponsored rankings, no pay-to-play destinations, no "partner offers." If a hotel or airline wants to be in a guide, its path is the same as everyone else's: be good enough.</p>
<a class="btn" href="mailto:desk@atlasandtide.travel">Write to the desk</a>
</div>
</div>
</section>
<!-- ============ DISPATCH ============ -->
<section id="dispatch" class="section dispatch" aria-labelledby="dispatchTitle">
<div class="wrap dispatch-in">
<div class="reveal">
<p class="kicker" data-scramble>One email · Sundays · 07:00 UTC</p>
<h2 id="dispatchTitle">The Sunday <em>Dispatch.</em></h2>
<p>Three fares worth setting an alarm for, one destination deep-dive, one booking tactic you can use before Monday's price check. 48,213 readers, free forever, and an unsubscribe that works in one tap. We write it the way we'd email a friend who's about to book a mistake.</p>
</div>
<form class="nl-form reveal" id="nlForm" style="--d:.1s">
<label for="nlEmail">Email address</label>
<div class="nl-row">
<input type="email" id="nlEmail" placeholder="you@somewhere.travel" required autocomplete="email">
<button class="btn btn-primary" type="submit">Subscribe</button>
</div>
<p class="nl-note" id="nlNote">No spam · no list-sharing · unsubscribe anytime</p>
</form>
</div>
</section>
<!-- ============ FAQ ============ -->
<section class="section" aria-labelledby="faqTitle">
<div class="wrap wrap-narrow">
<header class="sec-head reveal">
<p class="kicker" data-scramble>Questions from the lobby</p>
<h2 class="sec-h" id="faqTitle">Before you ask the concierge.</h2>
</header>
<div class="faq reveal">
<div class="faq-item">
<button class="faq-q" aria-expanded="false" aria-controls="fa1">How do you verify hotel reviews?<span class="faq-ic" aria-hidden="true">+</span></button>
<div class="faq-a" id="fa1" role="region"><div><p>Every stay is booked through public channels at the published rate — no press rates, no sponsored rooms. Our editor stays two to three nights, pays the actual checkout bill, and we publish that figure as the "from" price. Reviews are re-verified within 90 days or carry a "last checked" date in the header, so you always know the age of the number you're relying on.</p></div></div>
</div>
<div class="faq-item">
<button class="faq-q" aria-expanded="false" aria-controls="fa2">How do the fare alerts actually work?<span class="faq-ic" aria-hidden="true">+</span></button>
<div class="faq-a" id="fa2" role="region"><div><p>We ingest roughly 1.2 million fare points nightly across 96 airports. When a route's lowest round-trip beats its 90-day low by 6% or more, the Dispatch list gets an email with a direct search link and the last twelve months of price history for that exact route. No affiliate markup, no "partner offers," no urgency copy — just the number and the window it's open.</p></div></div>
</div>
<div class="faq-item">
<button class="faq-q" aria-expanded="false" aria-controls="fa3">Do you make money from bookings?<span class="faq-ic" aria-hidden="true">+</span></button>
<div class="faq-a" id="fa3" role="region"><div><p>Some links are affiliate links and they're always disclosed where they appear. We never accept payment to rank a hotel or airline higher, and every "best of" list is built from our own review data first. Affiliate revenue is what keeps the guides ad-free — the arrangement readers have kept, year after year, by not unsubscribing.</p></div></div>
</div>
<div class="faq-item">
<button class="faq-q" aria-expanded="false" aria-controls="fa4">Can the Trip Planner export my itinerary?<span class="faq-ic" aria-hidden="true">+</span></button>
<div class="faq-a" id="fa4" role="region"><div><p>Yes. Anything you save in the Planner exports as a printable PDF, an ICS calendar with time zones corrected per city, or plain text that pastes cleanly into a group chat. Export is free on every tier, and the PDF includes the per-day budget breakdown so the person paying isn't surprised on the last evening.</p></div></div>
</div>
<div class="faq-item">
<button class="faq-q" aria-expanded="false" aria-controls="fa5">What's your take on paying for travel in installments?<span class="faq-ic" aria-hidden="true">+</span></button>
<div class="faq-a" id="fa5" role="region"><div><p>For trips over $3,000 we usually recommend the 3-2-1 split: book flights at the price you'd defend, reserve the stay at a free-cancellation rate, and keep the third of the budget in a high-yield account until 30 days out. Never put a non-refundable deposit on credit you can't see — the trip is more fun that way.</p></div></div>
</div>
</div>
</div>
</section>
</main>
<!-- ============ FOOTER ============ -->
<footer class="site-foot">
<div class="foot-top wrap" style="padding-left:28px;padding-right:28px">
<div class="foot-brand">
<p class="foot-word">Atlas <span>&</span> Tide</p>
<p class="foot-tag">Field guides, honest reviews and fare intelligence for travelers who check twice.</p>
<div class="social">
<a href="#" aria-label="Instagram"><svg viewBox="0 0 24 24" fill="none" stroke-width="2"><rect x="3" y="3" width="18" height="18" rx="4"/><circle cx="12" cy="12" r="4"/><circle cx="17.2" cy="6.8" r="1.1" fill="currentColor" stroke="none"/></svg></a>
<a href="#" aria-label="X (Twitter)"><svg viewBox="0 0 24 24"><path d="M4 4l7.1 9.3L4.4 20h2.5l5.3-6.2L17 20h4l-7.5-9.9L19.4 4h-2.5l-4.8 5.6L8 4H4z"/></svg></a>
<a href="#" aria-label="YouTube"><svg viewBox="0 0 24 24"><path d="M22 12s0-3.4-.4-5c-.3-1-1-1.7-2-2C17.6 4.5 12 4.5 12 4.5s-5.6 0-7.6.5c-1 .3-1.7 1-2 2C2 8.6 2 12 2 12s0 3.4.4 5c.3 1 1 1.7 2 2 2 .5 7.6.5 7.6.5s5.6 0 7.6-.5c1-.3 1.7-1 2-2 .4-1.6.4-5 .4-5zM10 15.5v-7l6 3.5-6 3.5z"/></svg></a>
<a href="#" aria-label="RSS feed"><svg viewBox="0 0 24 24" fill="none" stroke-width="2"><path d="M4 11a9 9 0 0 1 9 9"/><path d="M4 4a16 16 0 0 1 16 16"/><circle cx="5.5" cy="18.5" r="1.6" fill="currentColor" stroke="none"/></svg></a>
</div>
</div>
<nav class="foot-col" aria-label="Explore">
<h4>Explore</h4>
<a href="#destinations">Destinations</a>
<a href="#guides">Guides</a>
<a href="#hotels">Hotels</a>
<a href="#fares">Flight Deals</a>
<a href="#mailbag">Mailbag</a>
</nav>
<nav class="foot-col" aria-label="Tools">
<h4>Tools</h4>
<a href="#planner">Trip Planner</a>
<a href="#fares">Fare Desk</a>
<a href="#planner">Budget Splitter</a>
<a href="#destinations">Deal Alerts</a>
<a href="#guides">Visa & Gear</a>
</nav>
<nav class="foot-col" aria-label="Company">
<h4>Company</h4>
<a href="#about">About the Desk</a>
<a href="#about">Writers</a>
<a href="#dispatch">The Dispatch</a>
<a href="#">Careers</a>
<a href="#">Press Kit</a>
</nav>
<div class="foot-col foot-contact">
<h4>Write to us</h4>
<p>Atlas & Tide Media, Lda.<br>44 Larkspur Lane, Suite 300<br>1200-012 Lisbon, Portugal<br><a href="mailto:desk@atlasandtide.travel">desk@atlasandtide.travel</a><br><a href="tel:+351215550148">+351 21 555 0148</a></p>
</div>
</div>
<div class="foot-bot">
<span>© <span id="year">2025</span> Atlas & Tide Media, Lda. All rights reserved.</span>
<span class="foot-links"><a href="#">Privacy</a><a href="#">Terms</a><a href="#">Cookie settings</a><a href="#">Sitemap</a></span>
<span>Made slowly in Lisboa</span>
</div>
</footer>
<script>
document.addEventListener('DOMContentLoaded', function(){
var reduced = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
document.getElementById('year').textContent = new Date().getFullYear();
/* ---------- toasts ---------- */
var toasts = document.getElementById('toasts');
function toast(msg){
var t = document.createElement('div');
t.className = 'toast'; t.textContent = msg;
toasts.appendChild(t);
setTimeout(function(){ t.classList.add('out'); setTimeout(function(){ t.remove(); }, 400); }, 3800);
}
/* ---------- header ---------- */
var head = document.querySelector('.site-head');
var onScroll = function(){ head.classList.toggle('scrolled', window.scrollY > 24); };
onScroll(); window.addEventListener('scroll', onScroll, {passive:true});
var tog = document.querySelector('.nav-toggle'), mnav = document.getElementById('mnav');
tog.addEventListener('click', function(){
var open = mnav.hasAttribute('hidden');
if(open){ mnav.removeAttribute('hidden'); tog.setAttribute('aria-expanded','true'); }
else { mnav.setAttribute('hidden',''); tog.setAttribute('aria-expanded','false'); }
});
mnav.querySelectorAll('a').forEach(function(a){ a.addEventListener('click', function(){ mnav.setAttribute('hidden',''); tog.setAttribute('aria-expanded','false'); }); });
/* ---------- hero line reveal ---------- */
requestAnimationFrame(function(){ requestAnimationFrame(function(){ document.body.classList.add('loaded'); }); });
/* ---------- clock ---------- */
var clock = document.getElementById('clock');
function tickClock(){ if(clock) clock.textContent = new Date().toLocaleTimeString('en-GB'); }
tickClock(); setInterval(tickClock, 1000);
/* ---------- departure ticker ---------- */
var TK = [
['AT·118','LISBON','G12','€84','ON TIME','st-ok'],
['AT·204','KYOTO','G27','$392','BOARDING','st-board'],
['AT·077','OAXACA','G03','$212','ON TIME','st-ok'],
['AT·311','REYKJAVÍK','G18','$356','DELAYED','st-delay'],
['AT·142','HANOI','G09','$428','ON TIME','st-ok'],
['AT·260','ZANZIBAR','G31','$296','GATE OPEN','st-gate'],
['AT·095','TALLINN','G07','€96','ON TIME','st-ok'],
['AT·333','VALPARAÍSO','G22','$284','BOARDING','st-board'],
['AT·410','MADRID','G05','€38','ON TIME','st-ok'],
['AT·288','CUENCA','G14','$241','ON TIME','st-ok']
];
var track = document.getElementById('tickerTrack');
function half(){
return TK.map(function(r){
return '<span><b>'+r[0]+'</b> '+r[1]+' · GATE '+r[2]+' · '+r[3]+' · <em class="st '+r[5]+'">'+r[4]+'</em></span>';
}).join('');
}
track.innerHTML = half() + '<span aria-hidden="true" style="display:contents">'+half()+'</span>';
track.innerHTML = half() + half().split('<span>').map(function(s,i){ return i===0?s:'<span aria-hidden="true">'+s; }).join('');
/* ---------- reveals ---------- */
var io = new IntersectionObserver(function(es){
es.forEach(function(e){ if(e.isIntersecting){ e.target.classList.add('in'); io.unobserve(e.target); } });
}, {threshold:.12});
document.querySelectorAll('.reveal').forEach(function(el){ io.observe(el); });
/* ---------- scramble decode ---------- */
var CH = 'ABCDEFGHJKMNPQRSTUVWXYZ0123456789·—°';
function scramble(el){
var txt = el.dataset.text || el.textContent; el.dataset.text = txt;
var total = Math.max(16, txt.length + 4), f = 0;
(function step(){
f++;
el.textContent = txt.split('').map(function(c,i){
if(c === ' ') return ' ';
return i < (f/total)*txt.length ? c : CH[Math.floor(Math.random()*CH.length)];
}).join('');
if(f < total) requestAnimationFrame(step); else el.textContent = txt;
})();
}
if(!reduced){
var sio = new IntersectionObserver(function(es){
es.forEach(function(e){ if(e.isIntersecting){ scramble(e.target); sio.unobserve(e.target); } });
}, {threshold:.6});
document.querySelectorAll('[data-scramble]').forEach(function(el){ sio.observe(el); });
}
/* ---------- count-up stats ---------- */
function countUp(el){
var to = parseFloat(el.dataset.count), dec = +(el.dataset.decimals||0),
pre = el.dataset.prefix||'', suf = el.dataset.suffix||'',
dur = reduced ? 0 : 1300, t0 = performance.now();
(function fr(t){
var p = dur ? Math.min(1,(t-t0)/dur) : 1, e = 1-Math.pow(1-p,3);
el.textContent = pre + (to*e).toLocaleString('en-US',{minimumFractionDigits:dec,maximumFractionDigits:dec}) + suf;
if(p<1) requestAnimationFrame(fr);
})(t0);
}
var cio = new IntersectionObserver(function(es){
es.forEach(function(e){ if(e.isIntersecting){ countUp(e.target); cio.unobserve(e.target); } });
}, {threshold:.6});
document.querySelectorAll('[data-count]').forEach(function(el){ cio.observe(el); });
/* ---------- fare desk ---------- */
var MONTHS = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
var SEASON = [.78,.74,.9,.95,1.02,1.12,1.22,1.18,1.08,.96,1.15,1.28];
var fMonth = document.getElementById('fMonth');
MONTHS.forEach(function(m,i){
var o = document.createElement('option'); o.value = i; o.textContent = m + ' 2026';
fMonth.appendChild(o);
});
function hash(s){ var h = 2166136261; for(var i=0;i<s.length;i++){ h ^= s.charCodeAt(i); h = Math.imul(h,16777619); } return h>>>0; }
function fmt(n){ return '$' + Math.round(n).toLocaleString('en-US'); }
function priceUp(el, to){
if(reduced){ el.textContent = fmt(to); return; }
var t0 = performance.now(), dur = 800;
(function fr(t){
var p = Math.min(1,(t-t0)/dur), e = 1-Math.pow(1-p,3);
el.textContent = fmt(to*e);
if(p<1) requestAnimationFrame(fr);
})(t0);
}
var lastRoute = {o:'LIS', d:'OAX', m:2};
function searchFares(o, d, m){
var pax = +document.getElementById('fPax').value, cab = document.getElementById('fCabin').value;
var h = hash(o+d), base = 140 + (h % 420);
var paxMul = pax >= 2 ? 1 - 0.04*(pax-1) : 1;
var cabMul = {Economy:1, Premium:1.85, Business:3.4}[cab];
var std = base * SEASON[m] * paxMul * cabMul;
lastRoute = {o:o, d:d, m:m};
document.getElementById('frRoute').innerHTML =
'<b>'+o+' → '+d+'</b> · '+MONTHS[m].toUpperCase()+' 2026 · '+pax+' TRAVELER'+(pax>1?'S':'')+' · '+cab.toUpperCase();
var rows = [
['Budget','23 kg bag · no changes', std*.82],
['Standard','1 checked bag · date locked', std],
['Flex','free changes · max mileage', std*1.3]
];
document.getElementById('frRows').innerHTML = rows.map(function(r,i){
return '<div class="fr-row"><div class="fr-r1"><b>'+r[0]+'</b><span class="mono">'+r[1]+'</span></div>' +
'<div class="fr-r2"><span class="fr-price" id="fp'+i+'">$0</span><br><span class="mono fr-per">/ person · RT</span></div>' +
'<span class="fr-badge '+(i===0?'':'dim')+'">'+(i===0?'BEST VALUE':'BOOKABLE')+'</span></div>';
}).join('');
rows.forEach(function(r,i){ priceUp(document.getElementById('fp'+i), r[2]); });
var series = MONTHS.map(function(_,i){
return base * SEASON[i] * (1 + (((h >> (i*3)) % 19) - 9)/100) * paxMul * cabMul;
});
drawSpark(series, m);
var day = ['Tuesday','Wednesday','Saturday','Sunday'][h % 4];
document.getElementById('frDays').textContent =
'Cheapest departure: ' + day.toUpperCase() + ' · Data: last 30 days · Re-verified 06:12 UTC';
var frAlert = document.getElementById('frAlert');
frAlert.dataset.alert = o+' → '+d+' in '+MONTHS[m];
frAlert.classList.remove('done'); frAlert.textContent = 'Set fare alert';
}
function drawSpark(series, m){
var W=560,H=140,P=14, min=Math.min.apply(null,series), max=Math.max.apply(null,series), span=(max-min)||1;
var pts = series.map(function(v,i){
return [P + i*(W-2*P)/(series.length-1), H-P-((v-min)/span)*(H-2*P)];
});
var line = pts.map(function(p){ return p.map(function(n){ return n.toFixed(1); }).join(','); }).join(' ');
var grid = [.25,.5,.75].map(function(f){
var y = (H-P-f*(H-2*P)).toFixed(1);
return '<line x1="'+P+'" x2="'+(W-P)+'" y1="'+y+'" y2="'+y+'" class="sp-grid"/>';
}).join('');
document.getElementById('spark').innerHTML = grid +
'<polygon points="'+P+','+(H-P)+' '+line+' '+(W-P)+','+(H-P)+'" class="sp-area"/>' +
'<polyline points="'+line+'" class="sp-line"/>' +
'<circle cx="'+pts[m][0].toFixed(1)+'" cy="'+pts[m][1].toFixed(1)+'" r="5.5" class="sp-dot"/>';
document.getElementById('frMonths').innerHTML = MONTHS.map(function(mm,i){
return '<b style="'+(i===m?'color:var(--gold)':'')+'">'+mm[0]+'</b>';
}).join('');
}
document.getElementById('fareForm').addEventListener('submit', function(e){
e.preventDefault();
var o = document.getElementById('fFrom').value, d = document.getElementById('fTo').value;
if(o === d){ toast('Pick two different cities — we don\u2019t sell round trips to the same airport.'); return; }
searchFares(o, d, +fMonth.value);
toast('Fares pulled for '+o+' → '+d+' · '+MONTHS[+fMonth.value]+' 2026.');
});
document.getElementById('heroSearch').addEventListener('click', function(){
document.getElementById('fFrom').value = 'LIS';
document.getElementById('fTo').value = 'MAD';
fMonth.value = 4;
searchFares('LIS','MAD',4);
document.getElementById('fares').scrollIntoView({behavior: reduced ? 'auto' : 'smooth'});
});
document.getElementById('frAlert').addEventListener('click', function(){
toast('Fare alert set: '+this.dataset.alert+'. We\u2019ll ping you at the 90-day low.');
this.classList.add('done'); this.textContent = '✓ Alert active';
});
document.querySelectorAll('[data-alert]').forEach(function(b){
if(b.id === 'frAlert') return;
b.addEventListener('click', function(){
toast('Fare alert set: '+b.dataset.alert+'. We\u2019ll ping you at the 90-day low.');
b.classList.add('done'); b.textContent = '✓ Active';
});
});
searchFares('LIS','OAX',2);
/* ---------- budget splitter ---------- */
var SHARES = [['Flights',.32],['Stay',.31],['Food & drink',.16],['Local transport',.09],['Experiences',.12]];
var pDays = document.getElementById('pDays'), pBudget = document.getElementById('pBudget');
function renderPlanner(){
var days = +pDays.value, bud = +pBudget.value;
document.getElementById('pDaysOut').textContent = days + (days===1?' day':' days');
document.getElementById('pBudgetOut').textContent = fmt(bud);
document.getElementById('plPerDay').textContent = fmt(bud/days) + ' / day';
document.getElementById('plBars').innerHTML = SHARES.map(function(s){
var amt = bud*s[1];
return '<div class="pl-bar"><div class="pl-btop"><span>'+s[0]+'</span><b>'+fmt(amt)+'</b></div>' +
'<div class="pl-track"><span style="width:0%"></span></div>' +
'<span class="pl-bnote">'+Math.round(s[1]*100)+'% of budget · '+fmt(amt/days)+'/day</span></div>';
}).join('');
requestAnimationFrame(function(){
var fills = document.querySelectorAll('#plBars .pl-track span');
fills.forEach(function(f,i){ f.style.width = (SHARES[i][1]*100) + '%'; });
});
var per = bud/days, tip;
if(per < 90) tip = 'Sub-$90/day: long-haul watch mode. One hub city, hostels with kitchens, and the error-fare list does the heavy lifting.';
else if(per < 180) tip = 'Sweet spot: boutique guesthouses, two sales on the long-haul, and one splurge per week. Book the flight first — it\u2019s the line item that never comes back.';
else tip = 'Premium budget: go shoulder-season on everything, keep the 20% buffer, and spend the reserve on experiences, not rooms.';
document.getElementById('plTip').textContent = tip;
}
pDays.addEventListener('input', renderPlanner);
pBudget.addEventListener('input', renderPlanner);
renderPlanner();
document.getElementById('plSave').addEventListener('click', function(){
toast('Trip saved — ' + pDays.value + ' days at ' + fmt(+pBudget.value) + ' pp. Open the Trip Planner any time to refine it.');
});
/* ---------- FAQ ---------- */
document.querySelectorAll('.faq-q').forEach(function(btn){
btn.addEventListener('click', function(){
var item = btn.closest('.faq-item'), open = item.classList.toggle('open');
btn.setAttribute('aria-expanded', open);
});
});
/* ---------- newsletter ---------- */
document.getElementById('nlForm').addEventListener('submit', function(e){
e.preventDefault();
var note = document.getElementById('nlNote');
note.textContent = '✓ Welcome aboard — first Dispatch lands Sunday, 07:00 UTC.';
note.classList.add('ok');
this.reset();
toast('Subscribed. The Sunday Dispatch is on its way to your inbox.');
});
});
</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:48:59.752Z",
"url": "https://benchmark.aimac.invalid/75489d11b83cccfe62996cc91af75892ed67d9309d4b344adf4270a7b0695e0f.html",
"toolOptions": {
"runOnly": {
"type": "tag",
"values": [
"wcag2a",
"wcag2aa",
"wcag21a",
"wcag21aa",
"wcag22a",
"wcag22aa"
]
},
"resultTypes": [
"violations"
],
"reporter": "v1"
},
"inapplicable": [
{
"id": "area-alt",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag244",
"wcag412",
"section508",
"section508.22.a",
"TTv5",
"TT6.a",
"EN-301-549",
"EN-9.2.4.4",
"EN-9.4.1.2",
"ACT"
],
"description": "Ensure <area> elements of image maps have alternative text",
"help": "Active <area> elements must have alternative text",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/area-alt?application=axeAPI",
"nodes": []
},
{
"id": "aria-braille-equivalent",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure aria-braillelabel and aria-brailleroledescription have a non-braille equivalent",
"help": "aria-braille attributes must have a non-braille equivalent",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-braille-equivalent?application=axeAPI",
"nodes": []
},
{
"id": "aria-command-name",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"TTv5",
"TT6.a",
"EN-301-549",
"EN-9.4.1.2",
"ACT"
],
"description": "Ensure every ARIA button, link and menuitem has an accessible name",
"help": "ARIA commands must have an accessible name",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-command-name?application=axeAPI",
"nodes": []
},
{
"id": "aria-input-field-name",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"TTv5",
"TT5.c",
"EN-301-549",
"EN-9.4.1.2",
"ACT"
],
"description": "Ensure every ARIA input field has an accessible name",
"help": "ARIA input fields must have an accessible name",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-input-field-name?application=axeAPI",
"nodes": []
},
{
"id": "aria-meter-name",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag111",
"EN-301-549",
"EN-9.1.1.1"
],
"description": "Ensure every ARIA meter node has an accessible name",
"help": "ARIA meter nodes must have an accessible name",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-meter-name?application=axeAPI",
"nodes": []
},
{
"id": "aria-progressbar-name",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag111",
"EN-301-549",
"EN-9.1.1.1"
],
"description": "Ensure every ARIA progressbar node has an accessible name",
"help": "ARIA progressbar nodes must have an accessible name",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-progressbar-name?application=axeAPI",
"nodes": []
},
{
"id": "aria-required-children",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag131",
"EN-301-549",
"EN-9.1.3.1"
],
"description": "Ensure elements with an ARIA role that require child roles contain them",
"help": "Certain ARIA roles must contain particular children",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-required-children?application=axeAPI",
"nodes": []
},
{
"id": "aria-required-parent",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag131",
"EN-301-549",
"EN-9.1.3.1"
],
"description": "Ensure elements with an ARIA role that require parent roles are contained by them",
"help": "Certain ARIA roles must be contained by particular parents",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-required-parent?application=axeAPI",
"nodes": []
},
{
"id": "aria-toggle-field-name",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"TTv5",
"TT5.c",
"EN-301-549",
"EN-9.4.1.2",
"ACT"
],
"description": "Ensure every ARIA toggle field has an accessible name",
"help": "ARIA toggle fields must have an accessible name",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-toggle-field-name?application=axeAPI",
"nodes": []
},
{
"id": "aria-tooltip-name",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure every ARIA tooltip node has an accessible name",
"help": "ARIA tooltip nodes must have an accessible name",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-tooltip-name?application=axeAPI",
"nodes": []
},
{
"id": "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": "link-in-text-block",
"impact": null,
"tags": [
"cat.color",
"wcag2a",
"wcag141",
"TTv5",
"TT13.a",
"EN-301-549",
"EN-9.1.4.1"
],
"description": "Ensure links are distinguished from surrounding text in a way that does not rely on color",
"help": "Links must be distinguishable without relying on color",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/link-in-text-block?application=axeAPI",
"nodes": []
},
{
"id": "marquee",
"impact": null,
"tags": [
"cat.parsing",
"wcag2a",
"wcag222",
"TTv5",
"TT2.b",
"EN-301-549",
"EN-9.2.2.2"
],
"description": "Ensure <marquee> elements are not used",
"help": "<marquee> elements are deprecated and must not be used",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/marquee?application=axeAPI",
"nodes": []
},
{
"id": "meta-refresh",
"impact": null,
"tags": [
"cat.time-and-media",
"wcag2a",
"wcag221",
"TTv5",
"TT8.a",
"EN-301-549",
"EN-9.2.2.1"
],
"description": "Ensure <meta http-equiv=\"refresh\"> is not used for delayed refresh",
"help": "Delayed refresh under 20 hours must not be used",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/meta-refresh?application=axeAPI",
"nodes": []
},
{
"id": "object-alt",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag111",
"section508",
"section508.22.a",
"EN-301-549",
"EN-9.1.1.1"
],
"description": "Ensure <object> elements have alternative text",
"help": "<object> elements must have alternative text",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/object-alt?application=axeAPI",
"nodes": []
},
{
"id": "role-img-alt",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag111",
"section508",
"section508.22.a",
"TTv5",
"TT7.a",
"EN-301-549",
"EN-9.1.1.1",
"ACT"
],
"description": "Ensure [role=\"img\"] elements have alternative text",
"help": "[role=\"img\"] elements must have an alternative text",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/role-img-alt?application=axeAPI",
"nodes": []
},
{
"id": "scrollable-region-focusable",
"impact": null,
"tags": [
"cat.keyboard",
"wcag2a",
"wcag211",
"wcag213",
"TTv5",
"TT4.a",
"EN-301-549",
"EN-9.2.1.1",
"EN-9.2.1.3"
],
"description": "Ensure elements that have scrollable content are accessible by keyboard",
"help": "Scrollable region must have keyboard access",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/scrollable-region-focusable?application=axeAPI",
"nodes": []
},
{
"id": "server-side-image-map",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag211",
"section508",
"section508.22.f",
"TTv5",
"TT4.a",
"EN-301-549",
"EN-9.2.1.1"
],
"description": "Ensure that server-side image maps are not used",
"help": "Server-side image maps must not be used",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/server-side-image-map?application=axeAPI",
"nodes": []
},
{
"id": "summary-name",
"impact": null,
"tags": [
"cat.name-role-value",
"wcag2a",
"wcag412",
"section508",
"section508.22.a",
"TTv5",
"TT6.a",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure summary elements have discernible text",
"help": "Summary elements must have discernible text",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/summary-name?application=axeAPI",
"nodes": []
},
{
"id": "svg-img-alt",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag111",
"section508",
"section508.22.a",
"TTv5",
"TT7.a",
"EN-301-549",
"EN-9.1.1.1",
"ACT"
],
"description": "Ensure <svg> elements with an img, graphics-document or graphics-symbol role have an accessible text",
"help": "<svg> elements with an img role must have an alternative text",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/svg-img-alt?application=axeAPI",
"nodes": []
},
{
"id": "td-headers-attr",
"impact": null,
"tags": [
"cat.tables",
"wcag2a",
"wcag131",
"section508",
"section508.22.g",
"TTv5",
"TT14.b",
"EN-301-549",
"EN-9.1.3.1"
],
"description": "Ensure that each cell in a table that uses the headers attribute refers only to other cells in that table",
"help": "Table cells that use the headers attribute must only refer to cells in the same table",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/td-headers-attr?application=axeAPI",
"nodes": []
},
{
"id": "th-has-data-cells",
"impact": null,
"tags": [
"cat.tables",
"wcag2a",
"wcag131",
"section508",
"section508.22.g",
"TTv5",
"TT14.b",
"EN-301-549",
"EN-9.1.3.1"
],
"description": "Ensure that <th> elements and elements with role=columnheader/rowheader have data cells they describe",
"help": "Table headers in a data table must refer to data cells",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/th-has-data-cells?application=axeAPI",
"nodes": []
},
{
"id": "valid-lang",
"impact": null,
"tags": [
"cat.language",
"wcag2aa",
"wcag312",
"TTv5",
"TT11.b",
"EN-301-549",
"EN-9.3.1.2",
"ACT"
],
"description": "Ensure lang attributes have valid values",
"help": "lang attribute must have a valid value",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/valid-lang?application=axeAPI",
"nodes": []
},
{
"id": "video-caption",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag122",
"section508",
"section508.22.a",
"TTv5",
"TT17.a",
"EN-301-549",
"EN-9.1.2.2"
],
"description": "Ensure <video> elements have captions",
"help": "<video> elements must have captions",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/video-caption?application=axeAPI",
"nodes": []
},
{
"id": "no-autoplay-audio",
"impact": null,
"tags": [
"cat.time-and-media",
"wcag2a",
"wcag142",
"TTv5",
"TT2.a",
"EN-301-549",
"EN-9.1.4.2",
"ACT"
],
"description": "Ensure <video> or <audio> elements do not autoplay audio for more than 3 seconds without a control mechanism to stop or mute the audio",
"help": "<video> or <audio> elements must not play automatically",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/no-autoplay-audio?application=axeAPI",
"nodes": []
}
],
"passes": [
{
"id": "aria-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": "<div class=\"toasts\" id=\"toasts\" aria-live=\"polite\"></div>",
"target": [
"#toasts"
]
}
]
},
{
"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": "<div class=\"toasts\" id=\"toasts\" aria-live=\"polite\"></div>",
"target": [
"#toasts"
]
}
]
},
{
"id": "aria-deprecated-role",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure elements do not use deprecated roles",
"help": "Deprecated ARIA roles must not be used",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-deprecated-role?application=axeAPI",
"nodes": [
{
"any": [],
"all": [],
"none": [
{
"id": "deprecatedrole",
"data": null,
"relatedNodes": [],
"impact": "minor",
"message": "ARIA role is not deprecated"
}
],
"impact": null,
"html": "<div class=\"faq-a\" id=\"fa1\" role=\"region\">",
"target": [
"#fa1"
]
}
]
},
{
"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 class=\"loaded\">",
"target": [
"body"
]
}
]
},
{
"id": "aria-hidden-focus",
"impact": null,
"tags": [
"cat.name-role-value",
"wcag2a",
"wcag412",
"TTv5",
"TT6.a",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure aria-hidden elements are not focusable nor contain focusable elements",
"help": "ARIA hidden element must not be focusable or contain focusable elements",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-hidden-focus?application=axeAPI",
"nodes": [
{
"any": [],
"all": [
{
"id": "focusable-modal-open",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "No focusable elements while a modal is open"
},
{
"id": "focusable-disabled",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "No focusable elements contained within element"
},
{
"id": "focusable-not-tabbable",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "No focusable elements contained within element"
}
],
"none": [],
"impact": null,
"html": "<div class=\"grain\" aria-hidden=\"true\"></div>",
"target": [
".grain"
]
}
]
},
{
"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": "<div class=\"toasts\" id=\"toasts\" aria-live=\"polite\"></div>",
"target": [
"#toasts"
]
}
]
},
{
"id": "aria-required-attr",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure elements with ARIA roles have all required ARIA attributes",
"help": "Required ARIA attributes must be provided",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-required-attr?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "aria-required-attr",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "All required ARIA attributes are present"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<div class=\"faq-a\" id=\"fa1\" role=\"region\">",
"target": [
"#fa1"
]
}
]
},
{
"id": "aria-roles",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure all elements with a role attribute use a valid value",
"help": "ARIA roles used must conform to valid values",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-roles?application=axeAPI",
"nodes": [
{
"any": [],
"all": [],
"none": [
{
"id": "invalidrole",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "ARIA role is valid"
},
{
"id": "abstractrole",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "Abstract roles are not used"
},
{
"id": "unsupportedrole",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "ARIA role is supported"
}
],
"impact": null,
"html": "<div class=\"faq-a\" id=\"fa1\" role=\"region\">",
"target": [
"#fa1"
]
}
]
},
{
"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": "<div class=\"toasts\" id=\"toasts\" aria-live=\"polite\"></div>",
"target": [
"#toasts"
]
}
]
},
{
"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": "<div class=\"toasts\" id=\"toasts\" aria-live=\"polite\"></div>",
"target": [
"#toasts"
]
}
]
},
{
"id": "autocomplete-valid",
"impact": null,
"tags": [
"cat.forms",
"wcag21aa",
"wcag135",
"EN-301-549",
"EN-9.1.3.5",
"ACT"
],
"description": "Ensure the autocomplete attribute is correct and suitable for the form field",
"help": "autocomplete attribute must be used correctly",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/autocomplete-valid?application=axeAPI",
"nodes": [
{
"any": [],
"all": [
{
"id": "autocomplete-valid",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "the autocomplete attribute is correctly formatted"
}
],
"none": [],
"impact": null,
"html": "<input type=\"email\" id=\"nlEmail\" placeholder=\"you@somewhere.travel\" required=\"\" autocomplete=\"email\">",
"target": [
"#nlEmail"
]
}
]
},
{
"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": "<div class=\"head-in wrap\" style=\"padding-left:28px;padding-right:28px\">",
"target": [
".head-in"
]
}
]
},
{
"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\" id=\"heroSearch\" type=\"button\">Search this route \u2708</button>",
"target": [
"#heroSearch"
]
}
]
},
{
"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 class=\"hero-h\" id=\"heroTitle\">\n <span class=\"hline\"><span>The quiet coast</span></span>\n <span class=\"hline\"><span>has a <em>flight</em></span></span>\n <span class=\"hline\"><span>number.</span></span>\n </h1>",
"target": [
"#heroTitle"
]
},
{
"html": "<h2 class=\"sec-h\" id=\"destTitle\">Six routes worth a <em>fare alert</em> this month.</h2>",
"target": [
"#destTitle"
]
},
{
"html": "<h3>Kyoto, Japan</h3>",
"target": [
".d1 > .dc-body > .dc-top > h3"
]
},
{
"html": "<h3>Oaxaca, Mexico</h3>",
"target": [
".d2 > .dc-body > .dc-top > h3"
]
},
{
"html": "<h3>Faroe Islands</h3>",
"target": [
".d3 > .dc-body > .dc-top > h3"
]
},
{
"html": "<h3>Amalfi Coast</h3>",
"target": [
".d4 > .dc-body > .dc-top > h3"
]
},
{
"html": "<h3>Cusco & the Sacred Valley</h3>",
"target": [
".d5 > .dc-body > .dc-top > h3"
]
},
{
"html": "<h3>Hoi An, Vietnam</h3>",
"target": [
".d6 > .dc-body > .dc-top > h3"
]
},
{
"html": "<h3 class=\"side-h mono\">Trending this week</h3>",
"target": [
".side-box.reveal:nth-child(1) > .side-h"
]
},
{
"html": "<h3 class=\"side-h mono\">Deal alerts</h3>",
"target": [
".side-deal > .side-h"
]
},
{
"html": "<h3 class=\"side-h mono\">From the gallery</h3>",
"target": [
".side-box.reveal:nth-child(3) > .side-h"
]
},
{
"html": "<h2 class=\"sec-h\" id=\"guidesTitle\">Written after the trip, not for the press release.</h2>",
"target": [
"#guidesTitle"
]
},
{
"html": "<h3>Booking Flights: the 11-4-1 Window That Actually Works</h3>",
"target": [
".guide-item:nth-child(1) > a[href$=\"#faq\"] > .gi-body > h3"
]
},
{
"html": "<h3>All-Inclusive, Decoded: When the Package Pays</h3>",
"target": [
".guide-item:nth-child(2) > a[href$=\"#faq\"] > .gi-body > h3"
]
},
{
"html": "<h3>Eco-Tourism Without the Greenwashing</h3>",
"target": [
".guide-item:nth-child(3) > a[href$=\"#faq\"] > .gi-body > h3"
]
},
{
"html": "<h3>Shoulder Season: The Traveler's Cheat Code</h3>",
"target": [
".guide-item:nth-child(4) > a[href$=\"#faq\"] > .gi-body > h3"
]
},
{
"html": "<h3>The $150/Day Japan Itinerary</h3>",
"target": [
".guide-item:nth-child(5) > a[href$=\"#faq\"] > .gi-body > h3"
]
},
{
"html": "<h2 class=\"sec-h\" id=\"faresTitle\">Nightly fares. <em>No middleman margin.</em></h2>",
"target": [
"#faresTitle"
]
},
{
"html": "<h3>Lisbon \u2192 Oaxaca</h3>",
"target": [
".deal-card > h3"
]
},
{
"html": "<h2 class=\"sec-h\" id=\"hotelsTitle\">Reviews we'd stake a <em>passport</em> on.</h2>",
"target": [
"#hotelsTitle"
]
},
{
"html": "<h3>Casa Farol <span>\u2014 Set\u00fabal, PT</span></h3>",
"target": [
".hotel-card.stack-card:nth-child(1) > .hc-body > .hc-top > h3"
]
},
{
"html": "<h3>Hotel Tsuru <span>\u2014 Kyoto, JP</span></h3>",
"target": [
".hotel-card.stack-card:nth-child(2) > .hc-body > .hc-top > h3"
]
},
{
"html": "<h3>Panga Suites <span>\u2014 Oaxaca, MX</span></h3>",
"target": [
".hotel-card.stack-card:nth-child(3) > .hc-body > .hc-top > h3"
]
},
{
"html": "<h3>Tinde F\u00f8roya <span>\u2014 Faroe Islands, FO</span></h3>",
"target": [
".hotel-card.stack-card:nth-child(4) > .hc-body > .hc-top > h3"
]
},
{
"html": "<h2 class=\"sec-h\" id=\"plannerTitle\">Plan the trip before the <em>price</em> does it for you.</h2>",
"target": [
"#plannerTitle"
]
},
{
"html": "<h3 class=\"mono\">Trip budget splitter</h3>",
"target": [
".pl-head > h3"
]
},
{
"html": "<h2 class=\"sec-h\" id=\"mailTitle\">Postcards from readers.</h2>",
"target": [
"#mailTitle"
]
},
{
"html": "<h2 class=\"sec-h\" id=\"aboutTitle\">A small crew in Lisbon that <em>actually goes.</em></h2>",
"target": [
"#aboutTitle"
]
},
{
"html": "<h2 id=\"dispatchTitle\">The Sunday <em>Dispatch.</em></h2>",
"target": [
"#dispatchTitle"
]
},
{
"html": "<h2 class=\"sec-h\" id=\"faqTitle\">Before you ask the concierge.</h2>",
"target": [
"#faqTitle"
]
},
{
"html": "<h4>Explore</h4>",
"target": [
"nav[aria-label=\"Explore\"] > h4"
]
},
{
"html": "<h4>Tools</h4>",
"target": [
"nav[aria-label=\"Tools\"] > h4"
]
},
{
"html": "<h4>Company</h4>",
"target": [
"nav[aria-label=\"Company\"] > h4"
]
},
{
"html": "<h4>Write to us</h4>",
"target": [
".foot-contact > h4"
]
}
],
"impact": "serious",
"message": "Page has a heading"
},
{
"id": "landmark",
"data": null,
"relatedNodes": [
{
"html": "<main id=\"main\">",
"target": [
"#main"
]
}
],
"impact": "serious",
"message": "Page has a landmark region"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<html lang=\"en\">",
"target": [
"html"
]
}
]
},
{
"id": "color-contrast",
"impact": "serious",
"tags": [
"cat.color",
"wcag2aa",
"wcag143",
"TTv5",
"TT13.c",
"EN-301-549",
"EN-9.1.4.3",
"ACT"
],
"description": "Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds",
"help": "Elements must meet minimum color contrast ratio thresholds",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/color-contrast?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#d3d1c6",
"bgColor": "#1b2a23",
"contrastRatio": 9.77,
"fontSize": "7.4pt (9.92px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [],
"impact": "serious",
"message": "Element has sufficient color contrast of 9.77"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<span>Field Guide N\u00ba 148 \u00b7 Oct 2025</span>",
"target": [
".topbar-in > span: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": "mnav",
"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 id=\"mnav\" class=\"mnav\" hidden=\"\" aria-label=\"Mobile\">",
"target": [
"#mnav"
]
}
]
},
{
"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=\"fFrom\">From</label>",
"target": [
"label[for=\"fFrom\"]"
]
}
],
"impact": "moderate",
"message": "Form field does not have multiple label elements"
}
],
"impact": null,
"html": "<select id=\"fFrom\">",
"target": [
"#fFrom"
]
}
]
},
{
"id": "html-has-lang",
"impact": null,
"tags": [
"cat.language",
"wcag2a",
"wcag311",
"TTv5",
"TT11.a",
"EN-301-549",
"EN-9.3.1.1",
"ACT"
],
"description": "Ensure every HTML document has a lang attribute",
"help": "<html> element must have a lang attribute",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/html-has-lang?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "has-lang",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "The <html> element has a lang attribute"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<html lang=\"en\">",
"target": [
"html"
]
}
]
},
{
"id": "html-lang-valid",
"impact": null,
"tags": [
"cat.language",
"wcag2a",
"wcag311",
"TTv5",
"TT11.a",
"EN-301-549",
"EN-9.3.1.1",
"ACT"
],
"description": "Ensure the lang attribute of the <html> element has a valid value",
"help": "<html> element must have a valid value for the lang attribute",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/html-lang-valid?application=axeAPI",
"nodes": [
{
"any": [],
"all": [],
"none": [
{
"id": "valid-lang",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "Value of lang attribute is included in the list of valid languages"
}
],
"impact": null,
"html": "<html lang=\"en\">",
"target": [
"html"
]
}
]
},
{
"id": "image-alt",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag111",
"section508",
"section508.22.a",
"TTv5",
"TT7.a",
"TT7.b",
"EN-301-549",
"EN-9.1.1.1",
"ACT"
],
"description": "Ensure <img> elements have alternative text or a role of none or presentation",
"help": "Images must have alternative text",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/image-alt?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "has-alt",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "Element has an alt attribute"
}
],
"all": [],
"none": [
{
"id": "alt-space-value",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "Element has a valid alt attribute value"
}
],
"impact": null,
"html": "<img class=\"brand-mark\" src=\"https://placehold.co/72x72/1B2A23/F4EFE3?text=A%26T&font=playfair+display\" alt=\"Atlas & Tide monogram logo\">",
"target": [
".brand-mark"
]
}
]
},
{
"id": "label",
"impact": null,
"tags": [
"cat.forms",
"wcag2a",
"wcag412",
"section508",
"section508.22.n",
"TTv5",
"TT5.c",
"EN-301-549",
"EN-9.4.1.2",
"ACT"
],
"description": "Ensure every form element has a label",
"help": "Form elements must have labels",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/label?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "explicit-label",
"data": null,
"relatedNodes": [
{
"html": "<label for=\"pDays\">Trip length <output id=\"pDaysOut\" class=\"mono\">7 days</output></label>",
"target": [
"label[for=\"pDays\"]"
]
}
],
"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": "<input type=\"range\" id=\"pDays\" min=\"3\" max=\"21\" value=\"7\">",
"target": [
"#pDays"
]
}
]
},
{
"id": "link-name",
"impact": null,
"tags": [
"cat.name-role-value",
"wcag2a",
"wcag244",
"wcag412",
"section508",
"section508.22.a",
"TTv5",
"TT6.a",
"EN-301-549",
"EN-9.2.4.4",
"EN-9.4.1.2",
"ACT"
],
"description": "Ensure links have discernible text",
"help": "Links must have discernible text",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/link-name?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "has-visible-text",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "Element has text that is visible to screen readers"
}
],
"all": [],
"none": [
{
"id": "focusable-no-name",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "Element is not in tab order or has accessible text"
}
],
"impact": null,
"html": "<a class=\"skip\" href=\"#main\">Skip to content</a>",
"target": [
".skip"
]
}
]
},
{
"id": "list",
"impact": null,
"tags": [
"cat.structure",
"wcag2a",
"wcag131",
"EN-301-549",
"EN-9.1.3.1"
],
"description": "Ensure that lists are structured correctly",
"help": "<ul> and <ol> must only directly contain <li>, <script> or <template> elements",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/list?application=axeAPI",
"nodes": [
{
"any": [],
"all": [],
"none": [
{
"id": "only-listitems",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "List element only has direct children that are allowed inside <li> elements"
}
],
"impact": null,
"html": "<ol class=\"trend\">",
"target": [
".trend"
]
}
]
},
{
"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><span class=\"rk mono\">01</span><span class=\"nm\">Kyoto</span><b class=\"mono up\">\u25b2 12%</b></li>",
"target": [
".trend > li:nth-child(1)"
]
}
]
},
{
"id": "meta-viewport",
"impact": null,
"tags": [
"cat.sensory-and-visual-cues",
"wcag2aa",
"wcag144",
"EN-301-549",
"EN-9.1.4.4",
"ACT"
],
"description": "Ensure <meta name=\"viewport\"> does not disable text scaling and zooming",
"help": "Zooming and scaling must not be disabled",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/meta-viewport?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "meta-viewport",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "<meta> tag does not disable zooming on mobile devices"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">",
"target": [
"meta[name=\"viewport\"]"
]
}
]
},
{
"id": "nested-interactive",
"impact": null,
"tags": [
"cat.keyboard",
"wcag2a",
"wcag412",
"TTv5",
"TT6.a",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure interactive controls are not nested as they are not always announced by screen readers or can cause focus problems for assistive technologies",
"help": "Interactive controls must not be nested",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/nested-interactive?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "no-focusable-content",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "Element does not have focusable descendants"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<img class=\"brand-mark\" src=\"https://placehold.co/72x72/1B2A23/F4EFE3?text=A%26T&font=playfair+display\" alt=\"Atlas & Tide monogram logo\">",
"target": [
".brand-mark"
]
}
]
},
{
"id": "select-name",
"impact": null,
"tags": [
"cat.forms",
"wcag2a",
"wcag412",
"section508",
"section508.22.n",
"TTv5",
"TT5.c",
"EN-301-549",
"EN-9.4.1.2",
"ACT"
],
"description": "Ensure select element has an accessible name",
"help": "Select element must have an accessible name",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/select-name?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "explicit-label",
"data": null,
"relatedNodes": [
{
"html": "<label for=\"fFrom\">From</label>",
"target": [
"label[for=\"fFrom\"]"
]
}
],
"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=\"fFrom\">",
"target": [
"#fFrom"
]
}
]
},
{
"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": 140,
"height": 38.4
},
"relatedNodes": [],
"impact": "serious",
"message": "Control has sufficient size (140px by 38.4px, should be at least 24px by 24px)"
},
{
"id": "target-offset",
"data": {
"closestOffset": 24,
"minOffset": 24
},
"relatedNodes": [],
"impact": "serious",
"message": "Target has sufficient space from its closest neighbors. Safe clickable space has a diameter of 24px which is at least 24px."
}
],
"all": [],
"none": [],
"impact": null,
"html": "<a class=\"skip\" href=\"#main\">Skip to content</a>",
"target": [
".skip"
]
}
]
}
],
"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": "div",
"messageKey": "noRoleSingular",
"prohibited": [
"aria-label"
]
},
"relatedNodes": [],
"impact": "serious",
"message": "aria-label attribute is not well supported on a div with no valid role attribute."
}
],
"impact": "serious",
"html": "<div class=\"ticker\" aria-label=\"Live fare board\">",
"target": [
".ticker"
],
"failureSummary": "Fix all of the following:\n aria-label attribute is not well supported on a div with no valid role attribute."
}
]
},
{
"id": "color-contrast",
"impact": "serious",
"tags": [
"cat.color",
"wcag2aa",
"wcag143",
"TTv5",
"TT13.c",
"EN-301-549",
"EN-9.1.4.3",
"ACT"
],
"description": "Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds",
"help": "Elements must meet minimum color contrast ratio thresholds",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/color-contrast?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "color-contrast",
"data": {
"messageKey": "nonBmp"
},
"relatedNodes": [],
"impact": "serious",
"message": "Element content contains only non-text characters"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"stars\" aria-label=\"Rated 4.7 out of 5\">\u2605\u2605\u2605\u2605<i>\u2605</i><b>4.7</b></span>",
"target": [
"span[aria-label=\"Rated 4.7 out of 5\"]"
],
"failureSummary": "Fix any of the following:\n Element content contains only non-text characters"
}
]
}
],
"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": "#fff4ea",
"bgColor": "#c64b24",
"contrastRatio": 4.37,
"fontSize": "7.9pt (10.56px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<a href=\"#fares\" class=\"btn btn-primary btn-sm head-cta\">Start planning</a>",
"target": [
".head-cta"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.37 (foreground color: #fff4ea, background color: #c64b24, font size: 7.9pt (10.56px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#fares\" class=\"btn btn-primary btn-sm head-cta\">Start planning</a>",
"target": [
".head-cta"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.37 (foreground color: #fff4ea, background color: #c64b24, font size: 7.9pt (10.56px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#f4efe3",
"bgColor": "#c64b24",
"contrastRatio": 4.12,
"fontSize": "7.2pt (9.6px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<em class=\"st st-delay\">DELAYED</em>",
"target": [
"span:nth-child(4) > .st-delay.st"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.12 (foreground color: #f4efe3, background color: #c64b24, font size: 7.2pt (9.6px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<em class=\"st st-delay\">DELAYED</em>",
"target": [
"span:nth-child(4) > .st-delay.st"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.12 (foreground color: #f4efe3, background color: #c64b24, font size: 7.2pt (9.6px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#fff4ea",
"bgColor": "#c64b24",
"contrastRatio": 4.37,
"fontSize": "8.9pt (11.84px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<button class=\"btn btn-primary\" id=\"heroSearch\" type=\"button\">Search this route \u2708</button>",
"target": [
"#heroSearch"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.37 (foreground color: #fff4ea, background color: #c64b24, font size: 8.9pt (11.84px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<button class=\"btn btn-primary\" id=\"heroSearch\" type=\"button\">Search this route \u2708</button>",
"target": [
"#heroSearch"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.37 (foreground color: #fff4ea, background color: #c64b24, font size: 8.9pt (11.84px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c64b24",
"bgColor": "#fbf7ec",
"contrastRatio": 4.42,
"fontSize": "7.0pt (9.28px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<article class=\"dest-card d1 reveal in\">",
"target": [
".d1"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 7.0pt (9.28px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#guides\">Read guide \u2192</a>",
"target": [
".d1 > .dc-body > .dc-meta.mono > a[href$=\"#guides\"]"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 7.0pt (9.28px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c64b24",
"bgColor": "#fbf7ec",
"contrastRatio": 4.42,
"fontSize": "7.0pt (9.28px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<article class=\"dest-card d2 reveal in\" style=\"--d:.08s\">",
"target": [
".d2"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 7.0pt (9.28px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#guides\">Read guide \u2192</a>",
"target": [
".d2 > .dc-body > .dc-meta.mono > a[href$=\"#guides\"]"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 7.0pt (9.28px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c64b24",
"bgColor": "#fbf7ec",
"contrastRatio": 4.42,
"fontSize": "7.4pt (9.92px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"side-box reveal in\">",
"target": [
".side-box.in.reveal:nth-child(1)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 7.4pt (9.92px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<h3 class=\"side-h mono\">Trending this week</h3>",
"target": [
".side-box.in.reveal:nth-child(1) > .side-h"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 7.4pt (9.92px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c64b24",
"bgColor": "#fbf7ec",
"contrastRatio": 4.42,
"fontSize": "7.4pt (9.92px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"side-box reveal in\">",
"target": [
".side-box.in.reveal:nth-child(1)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"rk mono\">01</span>",
"target": [
"li:nth-child(1) > .rk.mono"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c64b24",
"bgColor": "#fbf7ec",
"contrastRatio": 4.42,
"fontSize": "10.8pt (14.4px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"side-box reveal in\">",
"target": [
".side-box.in.reveal:nth-child(1)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 10.8pt (14.4px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<b class=\"mono up\">\u25b2 12%</b>",
"target": [
"li:nth-child(1) > .up"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 10.8pt (14.4px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c64b24",
"bgColor": "#fbf7ec",
"contrastRatio": 4.42,
"fontSize": "7.4pt (9.92px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"side-box reveal in\">",
"target": [
".side-box.in.reveal:nth-child(1)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"rk mono\">02</span>",
"target": [
"li:nth-child(2) > .rk.mono"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c64b24",
"bgColor": "#fbf7ec",
"contrastRatio": 4.42,
"fontSize": "7.4pt (9.92px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"side-box reveal in\">",
"target": [
".side-box.in.reveal:nth-child(1)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"rk mono\">03</span>",
"target": [
"li:nth-child(3) > .rk.mono"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c64b24",
"bgColor": "#fbf7ec",
"contrastRatio": 4.42,
"fontSize": "10.8pt (14.4px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"side-box reveal in\">",
"target": [
".side-box.in.reveal:nth-child(1)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 10.8pt (14.4px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<b class=\"mono up\">\u25b2 4%</b>",
"target": [
"li:nth-child(3) > .up"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 10.8pt (14.4px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c64b24",
"bgColor": "#fbf7ec",
"contrastRatio": 4.42,
"fontSize": "7.4pt (9.92px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"side-box reveal in\">",
"target": [
".side-box.in.reveal:nth-child(1)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"rk mono\">04</span>",
"target": [
"li:nth-child(4) > .rk.mono"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c64b24",
"bgColor": "#fbf7ec",
"contrastRatio": 4.42,
"fontSize": "7.4pt (9.92px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"side-box reveal in\">",
"target": [
".side-box.in.reveal:nth-child(1)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"rk mono\">05</span>",
"target": [
"li:nth-child(5) > .rk.mono"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c64b24",
"bgColor": "#fbf7ec",
"contrastRatio": 4.42,
"fontSize": "10.8pt (14.4px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"side-box reveal in\">",
"target": [
".side-box.in.reveal:nth-child(1)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 10.8pt (14.4px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<b class=\"mono up\">\u25b2 22%</b>",
"target": [
"li:nth-child(5) > .up"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 10.8pt (14.4px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c64b24",
"bgColor": "#fbf7ec",
"contrastRatio": 4.42,
"fontSize": "7.4pt (9.92px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"side-box reveal in\" style=\"--d:.15s\">",
"target": [
".side-box.in.reveal:nth-child(3)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 7.4pt (9.92px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<h3 class=\"side-h mono\">From the gallery</h3>",
"target": [
".side-box.in.reveal:nth-child(3) > .side-h"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 7.4pt (9.92px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c64b24",
"bgColor": "#fbf7ec",
"contrastRatio": 4.42,
"fontSize": "7.0pt (9.28px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<article class=\"dest-card d6 wide reveal in\">",
"target": [
".d6"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 7.0pt (9.28px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#planner\">See the ledger \u2192</a>",
"target": [
".dc-meta.mono > a[href$=\"#planner\"]"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 7.0pt (9.28px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c64b24",
"bgColor": "#fbf7ec",
"contrastRatio": 4.42,
"fontSize": "8.4pt (11.2px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section id=\"guides\" class=\"section guides\" aria-labelledby=\"guidesTitle\">",
"target": [
"#guides"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 8.4pt (11.2px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"gi-num mono\">01</span>",
"target": [
".guide-item.in:nth-child(1) > a[href$=\"#faq\"] > .gi-num.mono"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 8.4pt (11.2px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c64b24",
"bgColor": "#fbf7ec",
"contrastRatio": 4.42,
"fontSize": "6.7pt (8.96px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section id=\"guides\" class=\"section guides\" aria-labelledby=\"guidesTitle\">",
"target": [
"#guides"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 6.7pt (8.96px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>12 min read</span>",
"target": [
".guide-item.in:nth-child(1) > a[href$=\"#faq\"] > .gi-body > .gi-meta.mono > span:nth-child(1)"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 6.7pt (8.96px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c64b24",
"bgColor": "#fbf7ec",
"contrastRatio": 4.42,
"fontSize": "8.4pt (11.2px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section id=\"guides\" class=\"section guides\" aria-labelledby=\"guidesTitle\">",
"target": [
"#guides"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 8.4pt (11.2px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"gi-num mono\">02</span>",
"target": [
".guide-item.in:nth-child(2) > a[href$=\"#faq\"] > .gi-num.mono"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 8.4pt (11.2px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c64b24",
"bgColor": "#fbf7ec",
"contrastRatio": 4.42,
"fontSize": "6.7pt (8.96px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section id=\"guides\" class=\"section guides\" aria-labelledby=\"guidesTitle\">",
"target": [
"#guides"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 6.7pt (8.96px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>9 min read</span>",
"target": [
".guide-item.in:nth-child(2) > a[href$=\"#faq\"] > .gi-body > .gi-meta.mono > span:nth-child(1)"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 6.7pt (8.96px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c64b24",
"bgColor": "#fbf7ec",
"contrastRatio": 4.42,
"fontSize": "8.4pt (11.2px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section id=\"guides\" class=\"section guides\" aria-labelledby=\"guidesTitle\">",
"target": [
"#guides"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 8.4pt (11.2px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"gi-num mono\">03</span>",
"target": [
".guide-item.in:nth-child(3) > a[href$=\"#faq\"] > .gi-num.mono"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 8.4pt (11.2px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c64b24",
"bgColor": "#fbf7ec",
"contrastRatio": 4.42,
"fontSize": "6.7pt (8.96px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section id=\"guides\" class=\"section guides\" aria-labelledby=\"guidesTitle\">",
"target": [
"#guides"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 6.7pt (8.96px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>14 min read</span>",
"target": [
".guide-item.in:nth-child(3) > a[href$=\"#faq\"] > .gi-body > .gi-meta.mono > span:nth-child(1)"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 6.7pt (8.96px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c64b24",
"bgColor": "#fbf7ec",
"contrastRatio": 4.42,
"fontSize": "8.4pt (11.2px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section id=\"guides\" class=\"section guides\" aria-labelledby=\"guidesTitle\">",
"target": [
"#guides"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 8.4pt (11.2px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"gi-num mono\">04</span>",
"target": [
".guide-item.in:nth-child(4) > a[href$=\"#faq\"] > .gi-num.mono"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 8.4pt (11.2px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c64b24",
"bgColor": "#fbf7ec",
"contrastRatio": 4.42,
"fontSize": "6.7pt (8.96px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section id=\"guides\" class=\"section guides\" aria-labelledby=\"guidesTitle\">",
"target": [
"#guides"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 6.7pt (8.96px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>8 min read</span>",
"target": [
".guide-item.in:nth-child(4) > a[href$=\"#faq\"] > .gi-body > .gi-meta.mono > span:nth-child(1)"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 6.7pt (8.96px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c64b24",
"bgColor": "#fbf7ec",
"contrastRatio": 4.42,
"fontSize": "8.4pt (11.2px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section id=\"guides\" class=\"section guides\" aria-labelledby=\"guidesTitle\">",
"target": [
"#guides"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 8.4pt (11.2px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"gi-num mono\">05</span>",
"target": [
".guide-item.in:nth-child(5) > a[href$=\"#faq\"] > .gi-num.mono"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 8.4pt (11.2px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c64b24",
"bgColor": "#fbf7ec",
"contrastRatio": 4.42,
"fontSize": "6.7pt (8.96px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section id=\"guides\" class=\"section guides\" aria-labelledby=\"guidesTitle\">",
"target": [
"#guides"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 6.7pt (8.96px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>16 min read</span>",
"target": [
".guide-item.in:nth-child(5) > a[href$=\"#faq\"] > .gi-body > .gi-meta.mono > span:nth-child(1)"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 6.7pt (8.96px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#fff4ea",
"bgColor": "#c64b24",
"contrastRatio": 4.37,
"fontSize": "8.9pt (11.84px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<button class=\"btn btn-primary\" type=\"submit\">Search fares</button>",
"target": [
"#fareForm > .btn-primary[type=\"submit\"]"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.37 (foreground color: #fff4ea, background color: #c64b24, font size: 8.9pt (11.84px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<button class=\"btn btn-primary\" type=\"submit\">Search fares</button>",
"target": [
"#fareForm > .btn-primary[type=\"submit\"]"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.37 (foreground color: #fff4ea, background color: #c64b24, font size: 8.9pt (11.84px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#74786c",
"bgColor": "#1f291d",
"contrastRatio": 3.33,
"fontSize": "10.2pt (13.6px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<aside class=\"deal-card reveal in\" style=\"--d:.1s\" aria-label=\"Deal of the week\">",
"target": [
".deal-card"
]
},
{
"html": "<section id=\"fares\" class=\"section fares\" aria-labelledby=\"faresTitle\">",
"target": [
"#fares"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.33 (foreground color: #74786c, background color: #1f291d, font size: 10.2pt (13.6px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<s>$611</s>",
"target": [
"s"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.33 (foreground color: #74786c, background color: #1f291d, font size: 10.2pt (13.6px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#868d83",
"bgColor": "#182b23",
"contrastRatio": 4.36,
"fontSize": "6.7pt (8.96px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"fare-result reveal in\" id=\"fareResult\" aria-live=\"polite\">",
"target": [
"#fareResult"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.36 (foreground color: #868d83, background color: #182b23, font size: 6.7pt (8.96px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"mono\">23 kg bag \u00b7 no changes</span>",
"target": [
".fr-row:nth-child(1) > .fr-r1 > .mono"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.36 (foreground color: #868d83, background color: #182b23, font size: 6.7pt (8.96px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#868d83",
"bgColor": "#182b23",
"contrastRatio": 4.36,
"fontSize": "6.6pt (8.8px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"fare-result reveal in\" id=\"fareResult\" aria-live=\"polite\">",
"target": [
"#fareResult"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.36 (foreground color: #868d83, background color: #182b23, font size: 6.6pt (8.8px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"mono fr-per\">/ person \u00b7 RT</span>",
"target": [
".fr-row:nth-child(1) > .fr-r2 > .fr-per.mono"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.36 (foreground color: #868d83, background color: #182b23, font size: 6.6pt (8.8px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#f4efe3",
"bgColor": "#c64b24",
"contrastRatio": 4.12,
"fontSize": "6.6pt (8.8px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<span class=\"fr-badge \">BEST VALUE</span>",
"target": [
".fr-row:nth-child(1) > .fr-badge"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.12 (foreground color: #f4efe3, background color: #c64b24, font size: 6.6pt (8.8px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"fr-badge \">BEST VALUE</span>",
"target": [
".fr-row:nth-child(1) > .fr-badge"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.12 (foreground color: #f4efe3, background color: #c64b24, font size: 6.6pt (8.8px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#868d83",
"bgColor": "#182b23",
"contrastRatio": 4.36,
"fontSize": "6.7pt (8.96px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"fare-result reveal in\" id=\"fareResult\" aria-live=\"polite\">",
"target": [
"#fareResult"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.36 (foreground color: #868d83, background color: #182b23, font size: 6.7pt (8.96px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"mono\">1 checked bag \u00b7 date locked</span>",
"target": [
".fr-row:nth-child(2) > .fr-r1 > .mono"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.36 (foreground color: #868d83, background color: #182b23, font size: 6.7pt (8.96px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#868d83",
"bgColor": "#182b23",
"contrastRatio": 4.36,
"fontSize": "6.6pt (8.8px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"fare-result reveal in\" id=\"fareResult\" aria-live=\"polite\">",
"target": [
"#fareResult"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.36 (foreground color: #868d83, background color: #182b23, font size: 6.6pt (8.8px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"mono fr-per\">/ person \u00b7 RT</span>",
"target": [
".fr-row:nth-child(2) > .fr-r2 > .fr-per.mono"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.36 (foreground color: #868d83, background color: #182b23, font size: 6.6pt (8.8px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#868d83",
"bgColor": "#182b23",
"contrastRatio": 4.36,
"fontSize": "6.7pt (8.96px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"fare-result reveal in\" id=\"fareResult\" aria-live=\"polite\">",
"target": [
"#fareResult"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.36 (foreground color: #868d83, background color: #182b23, font size: 6.7pt (8.96px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"mono\">free changes \u00b7 max mileage</span>",
"target": [
".fr-row:nth-child(3) > .fr-r1 > .mono"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.36 (foreground color: #868d83, background color: #182b23, font size: 6.7pt (8.96px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#868d83",
"bgColor": "#182b23",
"contrastRatio": 4.36,
"fontSize": "6.6pt (8.8px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"fare-result reveal in\" id=\"fareResult\" aria-live=\"polite\">",
"target": [
"#fareResult"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.36 (foreground color: #868d83, background color: #182b23, font size: 6.6pt (8.8px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"mono fr-per\">/ person \u00b7 RT</span>",
"target": [
".fr-row:nth-child(3) > .fr-r2 > .fr-per.mono"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.36 (foreground color: #868d83, background color: #182b23, font size: 6.6pt (8.8px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#fff4ea",
"bgColor": "#c64b24",
"contrastRatio": 4.37,
"fontSize": "8.9pt (11.84px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<button class=\"btn btn-primary\" type=\"button\" id=\"plSave\">Save to my trips</button>",
"target": [
"#plSave"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.37 (foreground color: #fff4ea, background color: #c64b24, font size: 8.9pt (11.84px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<button class=\"btn btn-primary\" type=\"button\" id=\"plSave\">Save to my trips</button>",
"target": [
"#plSave"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.37 (foreground color: #fff4ea, background color: #c64b24, font size: 8.9pt (11.84px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c64b24",
"bgColor": "#fbf7ec",
"contrastRatio": 4.42,
"fontSize": "8.4pt (11.2px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section id=\"guides\" class=\"section guides\" aria-labelledby=\"guidesTitle\">",
"target": [
"#guides"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 8.4pt (11.2px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"gi-num mono\">01</span>",
"target": [
".guide-item:nth-child(1) > a[href$=\"#faq\"] > .gi-num.mono"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 8.4pt (11.2px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c64b24",
"bgColor": "#fbf7ec",
"contrastRatio": 4.42,
"fontSize": "6.7pt (8.96px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section id=\"guides\" class=\"section guides\" aria-labelledby=\"guidesTitle\">",
"target": [
"#guides"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 6.7pt (8.96px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>12 min read</span>",
"target": [
".guide-item:nth-child(1) > a[href$=\"#faq\"] > .gi-body > .gi-meta.mono > span:nth-child(1)"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 6.7pt (8.96px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c64b24",
"bgColor": "#fbf7ec",
"contrastRatio": 4.42,
"fontSize": "8.4pt (11.2px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section id=\"guides\" class=\"section guides\" aria-labelledby=\"guidesTitle\">",
"target": [
"#guides"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 8.4pt (11.2px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"gi-num mono\">02</span>",
"target": [
".guide-item:nth-child(2) > a[href$=\"#faq\"] > .gi-num.mono"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 8.4pt (11.2px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c64b24",
"bgColor": "#fbf7ec",
"contrastRatio": 4.42,
"fontSize": "6.7pt (8.96px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section id=\"guides\" class=\"section guides\" aria-labelledby=\"guidesTitle\">",
"target": [
"#guides"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 6.7pt (8.96px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>9 min read</span>",
"target": [
".guide-item:nth-child(2) > a[href$=\"#faq\"] > .gi-body > .gi-meta.mono > span:nth-child(1)"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 6.7pt (8.96px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c64b24",
"bgColor": "#fbf7ec",
"contrastRatio": 4.42,
"fontSize": "8.4pt (11.2px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section id=\"guides\" class=\"section guides\" aria-labelledby=\"guidesTitle\">",
"target": [
"#guides"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 8.4pt (11.2px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"gi-num mono\">03</span>",
"target": [
".guide-item:nth-child(3) > a[href$=\"#faq\"] > .gi-num.mono"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 8.4pt (11.2px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c64b24",
"bgColor": "#fbf7ec",
"contrastRatio": 4.42,
"fontSize": "6.7pt (8.96px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section id=\"guides\" class=\"section guides\" aria-labelledby=\"guidesTitle\">",
"target": [
"#guides"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 6.7pt (8.96px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>14 min read</span>",
"target": [
".guide-item:nth-child(3) > a[href$=\"#faq\"] > .gi-body > .gi-meta.mono > span:nth-child(1)"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 6.7pt (8.96px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c64b24",
"bgColor": "#fbf7ec",
"contrastRatio": 4.42,
"fontSize": "8.4pt (11.2px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section id=\"guides\" class=\"section guides\" aria-labelledby=\"guidesTitle\">",
"target": [
"#guides"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 8.4pt (11.2px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"gi-num mono\">04</span>",
"target": [
".guide-item:nth-child(4) > a[href$=\"#faq\"] > .gi-num.mono"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 8.4pt (11.2px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c64b24",
"bgColor": "#fbf7ec",
"contrastRatio": 4.42,
"fontSize": "6.7pt (8.96px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section id=\"guides\" class=\"section guides\" aria-labelledby=\"guidesTitle\">",
"target": [
"#guides"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 6.7pt (8.96px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>8 min read</span>",
"target": [
".guide-item:nth-child(4) > a[href$=\"#faq\"] > .gi-body > .gi-meta.mono > span:nth-child(1)"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 6.7pt (8.96px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c64b24",
"bgColor": "#fbf7ec",
"contrastRatio": 4.42,
"fontSize": "8.4pt (11.2px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section id=\"guides\" class=\"section guides\" aria-labelledby=\"guidesTitle\">",
"target": [
"#guides"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 8.4pt (11.2px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"gi-num mono\">05</span>",
"target": [
".guide-item:nth-child(5) > a[href$=\"#faq\"] > .gi-num.mono"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 8.4pt (11.2px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c64b24",
"bgColor": "#fbf7ec",
"contrastRatio": 4.42,
"fontSize": "6.7pt (8.96px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section id=\"guides\" class=\"section guides\" aria-labelledby=\"guidesTitle\">",
"target": [
"#guides"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 6.7pt (8.96px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>16 min read</span>",
"target": [
".guide-item:nth-child(5) > a[href$=\"#faq\"] > .gi-body > .gi-meta.mono > span:nth-child(1)"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 6.7pt (8.96px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#fff4ea",
"bgColor": "#c64b24",
"contrastRatio": 4.37,
"fontSize": "8.9pt (11.84px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<button class=\"btn btn-primary\" type=\"submit\">Subscribe</button>",
"target": [
".nl-row > .btn-primary[type=\"submit\"]"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.37 (foreground color: #fff4ea, background color: #c64b24, font size: 8.9pt (11.84px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<button class=\"btn btn-primary\" type=\"submit\">Subscribe</button>",
"target": [
".nl-row > .btn-primary[type=\"submit\"]"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.37 (foreground color: #fff4ea, background color: #c64b24, font size: 8.9pt (11.84px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#787d74",
"bgColor": "#12201a",
"contrastRatio": 3.99,
"fontSize": "6.6pt (8.8px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section id=\"dispatch\" class=\"section dispatch\" aria-labelledby=\"dispatchTitle\">",
"target": [
"#dispatch"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.99 (foreground color: #787d74, background color: #12201a, font size: 6.6pt (8.8px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<p class=\"nl-note\" id=\"nlNote\">No spam \u00b7 no list-sharing \u00b7 unsubscribe anytime</p>",
"target": [
"#nlNote"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.99 (foreground color: #787d74, background color: #12201a, font size: 6.6pt (8.8px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c64b24",
"bgColor": "#fbf7ec",
"contrastRatio": 4.42,
"fontSize": "7.4pt (9.92px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"side-box reveal in\">",
"target": [
".side-box.reveal.in:nth-child(1)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 7.4pt (9.92px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<h3 class=\"side-h mono\">Trending this week</h3>",
"target": [
".side-box.reveal.in:nth-child(1) > .side-h"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 7.4pt (9.92px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c64b24",
"bgColor": "#fbf7ec",
"contrastRatio": 4.42,
"fontSize": "7.4pt (9.92px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"side-box reveal in\" style=\"--d:.15s\">",
"target": [
".side-box.reveal.in:nth-child(3)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 7.4pt (9.92px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<h3 class=\"side-h mono\">From the gallery</h3>",
"target": [
".side-box.reveal.in:nth-child(3) > .side-h"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.42 (foreground color: #c64b24, background color: #fbf7ec, font size: 7.4pt (9.92px), font weight: bold). Expected contrast ratio of 4.5:1"
}
]
},
{
"id": "target-size",
"impact": "serious",
"tags": [
"cat.sensory-and-visual-cues",
"wcag22aa",
"wcag258"
],
"description": "Ensure touch targets have sufficient size and space",
"help": "All touch targets must be 24px large, or leave sufficient space",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/target-size?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "target-size",
"data": {
"messageKey": "partiallyObscured",
"minSize": 24,
"width": 156.6,
"height": 11.4
},
"relatedNodes": [
{
"html": "<a href=\"#about\">About</a>",
"target": [
"#mnav > a[href$=\"#about\"]"
]
}
],
"impact": "serious",
"message": "Target has insufficient size because it is partially obscured (smallest space is 156.6px by 11.4px, should be at least 24px by 24px)"
},
{
"id": "target-offset",
"data": {
"closestOffset": 10.4,
"minOffset": 24
},
"relatedNodes": [
{
"html": "<a href=\"#about\">About</a>",
"target": [
"#mnav > a[href$=\"#about\"]"
]
},
{
"html": "<a href=\"#guides\">Guides</a>",
"target": [
"nav[aria-label=\"Explore\"] > a[href$=\"#guides\"]"
]
}
],
"impact": "serious",
"message": "Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 10.4px instead of at least 24px."
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#destinations\">Destinations</a>",
"target": [
"nav[aria-label=\"Explore\"] > a[href$=\"#destinations\"]"
],
"failureSummary": "Fix any of the following:\n Target has insufficient size because it is partially obscured (smallest space is 156.6px by 11.4px, should be at least 24px by 24px)\n Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 10.4px instead of at least 24px."
},
{
"any": [
{
"id": "target-size",
"data": {
"messageKey": "partiallyObscured",
"minSize": 24,
"width": 156.5,
"height": 11.4
},
"relatedNodes": [
{
"html": "<a href=\"#about\">About</a>",
"target": [
"#mnav > a[href$=\"#about\"]"
]
}
],
"impact": "serious",
"message": "Target has insufficient size because it is partially obscured (smallest space is 156.5px by 11.4px, should be at least 24px by 24px)"
},
{
"id": "target-offset",
"data": {
"closestOffset": 10.4,
"minOffset": 24
},
"relatedNodes": [
{
"html": "<a href=\"#about\">About</a>",
"target": [
"#mnav > a[href$=\"#about\"]"
]
},
{
"html": "<a href=\"#fares\">Fare Desk</a>",
"target": [
"nav[aria-label=\"Tools\"] > a[href$=\"#fares\"]"
]
}
],
"impact": "serious",
"message": "Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 10.4px instead of at least 24px."
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#planner\">Trip Planner</a>",
"target": [
"a[href$=\"#planner\"]:nth-child(2)"
],
"failureSummary": "Fix any of the following:\n Target has insufficient size because it is partially obscured (smallest space is 156.5px by 11.4px, should be at least 24px by 24px)\n Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 10.4px instead of at least 24px."
},
{
"any": [
{
"id": "target-size",
"data": {
"messageKey": "partiallyObscured",
"minSize": 24,
"width": 156.6,
"height": 11.4
},
"relatedNodes": [
{
"html": "<a href=\"#about\">About</a>",
"target": [
"#mnav > a[href$=\"#about\"]"
]
}
],
"impact": "serious",
"message": "Target has insufficient size because it is partially obscured (smallest space is 156.6px by 11.4px, should be at least 24px by 24px)"
},
{
"id": "target-offset",
"data": {
"closestOffset": 10.4,
"minOffset": 24
},
"relatedNodes": [
{
"html": "<a href=\"#about\">About</a>",
"target": [
"#mnav > a[href$=\"#about\"]"
]
},
{
"html": "<a href=\"#about\">Writers</a>",
"target": [
"a[href$=\"#about\"]:nth-child(3)"
]
}
],
"impact": "serious",
"message": "Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 10.4px instead of at least 24px."
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#about\">About the Desk</a>",
"target": [
"a[href$=\"#about\"]:nth-child(2)"
],
"failureSummary": "Fix any of the following:\n Target has insufficient size because it is partially obscured (smallest space is 156.6px by 11.4px, should be at least 24px by 24px)\n Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 10.4px instead of at least 24px."
}
]
}
],
"coverage": {
"contract": "main-document-vertical-scroll",
"complete": true,
"positions": [
{
"y": 0,
"height": 12677
},
{
"y": 576,
"height": 12677
},
{
"y": 1152,
"height": 12677
},
{
"y": 1728,
"height": 12677
},
{
"y": 2304,
"height": 12677
},
{
"y": 2880,
"height": 12677
},
{
"y": 3456,
"height": 12759
},
{
"y": 4032,
"height": 12923
},
{
"y": 4608,
"height": 13005
},
{
"y": 5184,
"height": 13005
},
{
"y": 5760,
"height": 13005
},
{
"y": 6336,
"height": 13005
},
{
"y": 6912,
"height": 13005
},
{
"y": 7488,
"height": 13026
},
{
"y": 8064,
"height": 13026
},
{
"y": 8640,
"height": 13026
},
{
"y": 9216,
"height": 13026
},
{
"y": 9792,
"height": 13026
},
{
"y": 10368,
"height": 13026
},
{
"y": 10944,
"height": 13026
},
{
"y": 11520,
"height": 13026
},
{
"y": 12096,
"height": 13026
},
{
"y": 12306,
"height": 13026
}
],
"scans": 24,
"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", "Trip Planner", "Guides".
- **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: "Hotel Reviews", "Flight Deals", "Budget Travel".
- **Content Depth:** Populate each section with **substantial, realistic text** (multiple sentences/paragraphs). Use authentic industry language and terminology like: "booking", "all-inclusive", "eco-tourism".
- **Visuals:** Integrate relevant placeholder images logically within the content sections.
- **Calls to Action:** Include clear and contextually relevant CTAs. Use strong verbs similar to: "Search Flights", "Find Deals", "Read Guide".
- **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: "flight tracker".
- **SIDEBAR (Optional):** If your design includes a sidebar, populate it with **useful, relevant content**. Ideas: "trending destinations", "inspiration gallery", "deal alerts".
- **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.