Qwen Qwen3.8 2.4T A95B – Education

via Modal · Generated

  • AIMAC Debt 8.51
  • Cost $0.28
  • Total Violations 42
  • HTML Size 83 KB
  • Em Dashes 35

Screenshot

View Qwen Qwen3.8 2.4T A95B Education page View Live Page

Accessibility Issues Found

42 Serious

  • color-contrast serious 40 instances

    Elements must meet minimum color contrast ratio thresholds

    Example HTML <em>Where inquiry becomes impact</em>
  • target-size serious 2 instances

    All touch targets must be 24px large, or leave sufficient space

    Example HTML <a href="#library">Book a study room <span>→</span></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>Calderwell University — Where Inquiry Becomes Impact | Prospectus 2026</title>
<meta name="description" content="Calderwell University, est. 1893. Ninety programmes across twelve schools, a never-sleeping library, honest financial aid and a course planner you can try before you apply.">
<script>document.documentElement.classList.add('js');</script>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fraunces: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=Public+Sans:wght@400;500;600;700&family=IBM+Plex+Mono:wght@400;500;600&display=swap" rel="stylesheet">
<style>
/* ============ TOKENS ============ */
:root{
  --pine:#0e2a1f; --pine-2:#14382a; --pine-3:#081a12;
  --parch:#f4eee0; --cream:#fbf7ec; --paper:#fffdf6;
  --ink:#20291f; --ink-soft:#535c4e;
  --brass:#b8862f; --brass-soft:#d8b46a;
  --rust:#a5432e;
  --line:rgba(32,41,31,.16); --line-dark:rgba(244,238,224,.16);
  --fd:"Fraunces",Georgia,serif;
  --fb:"Public Sans",system-ui,-apple-system,sans-serif;
  --fm:"IBM Plex Mono",ui-monospace,monospace;
  --sh:0 18px 40px -18px rgba(14,42,31,.35);
}
*{margin:0;padding:0;box-sizing:border-box}
html{scroll-padding-top:96px}
@media (prefers-reduced-motion:no-preference){html{scroll-behavior:smooth}}
body{
  font-family:var(--fb);font-size:16.5px;line-height:1.65;color:var(--ink);
  background:var(--parch);-webkit-font-smoothing:antialiased;overflow-x:hidden;
}
/* paper grain */
body::after{
  content:"";position:fixed;inset:0;z-index:2000;pointer-events:none;opacity:.05;
  background-image:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="160" height="160"><filter id="n"><feTurbulence type="fractalNoise" baseFrequency="0.85" numOctaves="2"/><feColorMatrix type="saturate" values="0"/></filter><rect width="160" height="160" filter="url(%23n)"/></svg>');
}
img{display:block;max-width:100%}
a{color:inherit}
h1,h2,h3,h4{font-family:var(--fd);font-weight:500;line-height:1.12;letter-spacing:-.01em;color:var(--ink)}
.mono{font-family:var(--fm);font-size:.72rem;letter-spacing:.16em;text-transform:uppercase;font-weight:500}
.wrap{max-width:1200px;margin-inline:auto;padding-inline:clamp(20px,4vw,48px)}
.skip{position:absolute;left:-999px;top:8px;background:var(--pine);color:var(--cream);padding:.7rem 1rem;z-index:5000;font-family:var(--fm);font-size:.75rem}
.skip:focus{left:8px}
:focus-visible{outline:2px dashed var(--brass);outline-offset:3px}
::selection{background:var(--brass);color:var(--pine-3)}
section{position:relative}

/* ============ BUTTONS ============ */
.btn{display:inline-flex;align-items:center;gap:.7rem;background:var(--pine);color:var(--cream);
  font-family:var(--fm);font-size:.74rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;
  padding:1.05rem 1.6rem;border:1px solid var(--pine);text-decoration:none;cursor:pointer;border-radius:2px;
  transition:background .25s,border-color .25s,transform .25s,box-shadow .25s}
.btn .ar{transition:transform .25s;font-family:var(--fb)}
.btn:hover{background:var(--brass);border-color:var(--brass);color:var(--pine-3);transform:translateY(-2px);box-shadow:var(--sh)}
.btn:hover .ar{transform:translateX(4px)}
.btn-ghost{background:transparent;color:var(--pine)}
.btn-ghost:hover{background:var(--pine);color:var(--cream)}
.btn-brass{background:var(--brass);border-color:var(--brass);color:var(--pine-3)}
.btn-brass:hover{background:var(--cream);border-color:var(--cream)}
.btn-sm{padding:.8rem 1.15rem;font-size:.68rem}
.link-btn{background:none;border:none;font-family:var(--fm);font-size:.72rem;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-soft);cursor:pointer;text-decoration:underline;text-underline-offset:4px}
.link-btn:hover{color:var(--rust)}

/* ============ REVEAL / MOTION ============ */
.js [data-reveal]{opacity:0;transform:translateY(26px);transition:opacity .9s ease,transform .9s cubic-bezier(.2,.65,.2,1);transition-delay:var(--d,0s)}
.js [data-reveal].in{opacity:1;transform:none}
.lm{display:block;overflow:hidden;padding-bottom:.06em;margin-bottom:-.06em}
.lm-i{display:block;transform:translateY(115%);transition:transform 1s cubic-bezier(.2,.65,.15,1) var(--d,0s)}
.in .lm-i{transform:none}
.kb{overflow:hidden}
.kb img{width:100%;height:100%;object-fit:cover;animation:kb 16s ease-in-out infinite alternate}
@keyframes kb{from{transform:scale(1)}to{transform:scale(1.09) translate(-1.5%,1.2%)}}
@keyframes spin{to{transform:rotate(360deg)}}
@keyframes mq{to{transform:translateX(-50%)}}

/* ============ UTILITY BAR + HEADER ============ */
.util{background:var(--pine-3);color:rgba(244,238,224,.75)}
.util-in{display:flex;justify-content:space-between;gap:1rem;padding-block:.5rem;font-family:var(--fm);font-size:.66rem;letter-spacing:.12em;text-transform:uppercase}
.util a{text-decoration:none;color:var(--brass-soft)}
.util a:hover{color:var(--cream)}
.site-head{position:sticky;top:0;z-index:1000;background:var(--parch);border-bottom:1px solid var(--line);transition:box-shadow .3s}
.site-head.scrolled{box-shadow:0 12px 30px -18px rgba(14,42,31,.4)}
.head-in{display:flex;align-items:center;gap:2rem;padding-block:.85rem}
.brand{display:flex;align-items:center;gap:.9rem;text-decoration:none;flex-shrink:0}
.crest{width:46px;height:46px;border-radius:50%;border:1px solid var(--brass);box-shadow:0 0 0 3px var(--parch),0 0 0 4px var(--brass)}
.brand-t{display:flex;flex-direction:column;line-height:1.15}
.brand-t strong{font-family:var(--fd);font-weight:600;font-size:1.18rem;letter-spacing:.01em}
.brand-t em{font-family:var(--fd);font-style:italic;font-size:.74rem;color:var(--brass)}
.nav{display:flex;gap:1.7rem;margin-left:auto}
.nav a{text-decoration:none;font-size:.82rem;font-weight:600;letter-spacing:.02em;color:var(--ink);position:relative;padding-block:.3rem}
.nav a::after{content:"";position:absolute;left:0;bottom:0;width:100%;height:2px;background:var(--brass);transform:scaleX(0);transform-origin:left;transition:transform .3s}
.nav a:hover::after{transform:scaleX(1)}
.head-cta{flex-shrink:0}
.nav-toggle{display:none;margin-left:auto;background:none;border:1px solid var(--line);width:44px;height:40px;cursor:pointer;border-radius:2px}
.nav-toggle span{display:block;width:20px;height:2px;background:var(--ink);margin:4px auto;transition:.3s}
.nav-panel{display:none;background:var(--cream);border-bottom:1px solid var(--line);padding:1rem clamp(20px,4vw,48px) 1.6rem;flex-direction:column;gap:.2rem}
.nav-panel a{text-decoration:none;font-weight:600;padding:.65rem 0;border-bottom:1px solid var(--line)}
body.nav-open .nav-panel{display:flex}
body.nav-open .nav-toggle span:nth-child(1){transform:translateY(6px) rotate(45deg)}
body.nav-open .nav-toggle span:nth-child(2){opacity:0}
body.nav-open .nav-toggle span:nth-child(3){transform:translateY(-6px) rotate(-45deg)}

/* ============ HERO ============ */
.hero{padding:clamp(56px,7vw,96px) 0 clamp(64px,7vw,100px);overflow:hidden}
.hero-rail{position:absolute;left:10px;top:52%;transform:translateY(-50%) rotate(180deg);writing-mode:vertical-rl;
  font-family:var(--fm);font-size:.64rem;letter-spacing:.34em;text-transform:uppercase;color:rgba(32,41,31,.42);display:none}
@media(min-width:1320px){.hero-rail{display:block}}
.hero-grid{display:grid;grid-template-columns:1.02fr .98fr;gap:clamp(2.5rem,5vw,4.5rem);align-items:center}
.kicker{display:flex;align-items:center;gap:1rem;color:var(--brass);margin-bottom:1.6rem}
.kicker::after{content:"";height:1px;flex:1;background:var(--line);max-width:180px}
.hero-title{font-size:clamp(2.7rem,6vw,4.9rem);font-weight:560;margin-bottom:1.6rem}
.hero-title .it{font-style:italic;color:var(--brass);font-weight:500}
.hero-lede{max-width:34rem;color:var(--ink-soft);font-size:1.06rem;margin-bottom:2.2rem}
.hero-ctas{display:flex;align-items:center;gap:1.6rem;flex-wrap:wrap;margin-bottom:.9rem}
.hero-sub{font-family:var(--fm);font-size:.7rem;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-soft)}
.hero-sub a{color:var(--rust);text-decoration:underline;text-underline-offset:3px}
.hero-meta{display:flex;flex-wrap:wrap;margin-top:2.6rem;border-top:1px solid var(--line)}
.hm{padding:1.1rem 2rem 0 0;margin-right:2rem;border-right:1px solid var(--line);padding-right:2rem}
.hm:last-child{border-right:none;margin-right:0}
.hm b{display:block;font-family:var(--fd);font-size:1.55rem;font-weight:600;line-height:1}
.hm span{font-family:var(--fm);font-size:.62rem;letter-spacing:.16em;text-transform:uppercase;color:var(--ink-soft)}
/* collage */
.collage{position:relative;min-height:560px}
.col-main{position:relative;width:76%;margin-left:auto;aspect-ratio:4/5;border:1px solid var(--line);padding:10px;background:var(--paper);box-shadow:var(--sh)}
.col-main .kb{height:100%}
.col-a,.col-b{position:absolute;background:var(--paper);border:1px solid var(--line);padding:8px;box-shadow:var(--sh)}
.col-a{width:44%;left:0;bottom:16%;transform:rotate(-3deg)}
.col-b{width:40%;left:6%;top:2%;transform:rotate(2.5deg)}
.col-a img,.col-b img{width:100%;height:auto}
.col-cap{font-family:var(--fm);font-size:.6rem;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-soft);padding-top:6px}
.openhouse{position:absolute;right:-8px;bottom:-26px;width:min(300px,78%);background:var(--cream);border:1px solid var(--brass);
  padding:1.2rem 1.3rem;transform:rotate(-1.6deg);box-shadow:var(--sh);z-index:3}
.openhouse .mono{color:var(--brass);display:block;margin-bottom:.5rem}
.openhouse h3{font-size:1.15rem;margin-bottom:.4rem}
.openhouse p{font-size:.83rem;color:var(--ink-soft);margin-bottom:.7rem}
.openhouse a{font-family:var(--fm);font-size:.68rem;letter-spacing:.14em;text-transform:uppercase;color:var(--rust);text-decoration:underline;text-underline-offset:3px}
.badge{position:absolute;top:-38px;right:8%;width:112px;height:112px;z-index:4;animation:spin 28s linear infinite}
.badge text{font-family:var(--fm);font-size:11.5px;letter-spacing:2.6px;fill:var(--pine)}
.badge .mid{font-family:var(--fd);font-size:26px;fill:var(--brass)}

/* ============ MARQUEE ============ */
.mq{background:var(--pine);color:var(--parch);border-block:1px solid var(--pine-3);overflow:hidden;padding-block:.95rem}
.mq-track{display:flex;width:max-content;animation:mq 38s linear infinite}
.mq:hover .mq-track{animation-play-state:paused}
.mq-g{display:flex;align-items:center;white-space:nowrap}
.mq-i{font-family:var(--fm);font-size:.72rem;letter-spacing:.18em;text-transform:uppercase;padding-inline:1.6rem}
.mq-s{color:var(--brass-soft)}

/* ============ SECTION HEADS ============ */
.s-head{margin-bottom:clamp(2.4rem,4vw,3.6rem)}
.s-kicker{color:var(--brass);margin-bottom:1rem;display:flex;align-items:center;gap:.9rem}
.s-kicker::before{content:"";width:34px;height:1px;background:var(--brass)}
.s-title{font-size:clamp(2rem,4.4vw,3.3rem);max-width:20ch}
.s-title .it{font-style:italic;color:var(--brass)}
.s-lede{max-width:44rem;color:var(--ink-soft);margin-top:1.1rem;font-size:1.02rem}
.dark{background:var(--pine);color:var(--parch)}
.dark h2,.dark h3,.dark h4{color:var(--cream)}
.dark .s-lede{color:rgba(244,238,224,.72)}
.ghost{position:absolute;font-family:var(--fd);font-weight:600;font-size:clamp(9rem,22vw,20rem);line-height:1;opacity:.05;pointer-events:none;user-select:none;color:currentColor}

/* ============ 01 PROGRAMS INDEX ============ */
.programs{padding-block:clamp(72px,9vw,120px)}
.prog-grid{display:grid;grid-template-columns:.9fr 1.4fr;gap:clamp(2.5rem,5vw,5rem);align-items:start}
.prog-sticky{position:sticky;top:110px}
.prog-note{margin-top:2rem;padding:1.1rem 1.2rem;border:1px dashed var(--brass);font-size:.85rem;color:var(--ink-soft);background:var(--cream)}
.prog-note a{color:var(--rust);font-weight:600}
.prog-list{border-top:1px solid var(--ink)}
.prog{position:relative;display:grid;grid-template-columns:96px 1fr 150px 100px 34px;gap:1.2rem;align-items:center;
  padding:1.5rem .8rem;border-bottom:1px solid var(--line);text-decoration:none;transition:background .3s,padding .3s}
.prog:hover{background:var(--paper);padding-left:1.4rem}
.prog-code{font-family:var(--fm);font-size:.7rem;letter-spacing:.1em;color:var(--brass);text-transform:uppercase}
.prog-name{font-family:var(--fd);font-size:1.28rem;font-weight:560;color:var(--ink)}
.prog-sub{font-size:.8rem;color:var(--ink-soft)}
.prog-meta{font-family:var(--fm);font-size:.66rem;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-soft)}
.prog-tag{display:inline-block;font-family:var(--fm);font-size:.6rem;letter-spacing:.12em;text-transform:uppercase;
  border:1px solid var(--line);padding:.3rem .55rem;border-radius:2px;color:var(--ink-soft)}
.prog-tag.new{border-color:var(--rust);color:var(--rust)}
.prog .ar{font-size:1.2rem;color:var(--brass);transition:transform .3s}
.prog:hover .ar{transform:translateX(6px)}
.prog-thumb{position:absolute;right:24%;top:50%;width:158px;border:1px solid var(--line);background:var(--paper);padding:5px;
  box-shadow:var(--sh);opacity:0;transform:translateY(-40%) rotate(-5deg) scale(.85);transition:opacity .35s,transform .35s;pointer-events:none;z-index:5}
.prog:hover .prog-thumb{opacity:1;transform:translateY(-50%) rotate(-3deg) scale(1)}

/* ============ 02 PLANNER ============ */
.planner{padding-block:clamp(72px,9vw,120px);background:
  radial-gradient(1100px 500px at 85% -10%,rgba(216,180,106,.09),transparent 60%),var(--pine)}
.plan-grid{display:grid;grid-template-columns:1.35fr .9fr;gap:clamp(2rem,4vw,3.5rem);align-items:start}
.filters{display:flex;flex-wrap:wrap;gap:.6rem;margin-bottom:1.8rem}
.chip{font-family:var(--fm);font-size:.66rem;letter-spacing:.14em;text-transform:uppercase;color:rgba(244,238,224,.75);
  background:transparent;border:1px solid var(--line-dark);padding:.6rem .95rem;cursor:pointer;border-radius:2px;transition:.25s}
.chip:hover{border-color:var(--brass-soft);color:var(--cream)}
.chip.is-on{background:var(--brass);border-color:var(--brass);color:var(--pine-3);font-weight:600}
.mod{display:grid;grid-template-columns:44px 1fr;gap:1rem;width:100%;text-align:left;background:var(--pine-2);
  border:1px solid var(--line-dark);padding:1.1rem 1.2rem;margin-bottom:.7rem;cursor:pointer;color:var(--parch);
  align-items:center;transition:border-color .25s,background .25s,transform .25s;border-radius:2px}
.mod:hover{border-color:var(--brass-soft);transform:translateX(4px)}
.mod.is-picked{border-color:var(--brass);background:rgba(184,134,47,.14)}
.mod-plus{width:34px;height:34px;border:1px solid var(--line-dark);display:grid;place-items:center;font-size:1.1rem;color:var(--brass-soft);transition:.25s;border-radius:50%}
.mod.is-picked .mod-plus{background:var(--brass);color:var(--pine-3);border-color:var(--brass);font-weight:700}
.mod-top{font-family:var(--fm);font-size:.64rem;letter-spacing:.12em;text-transform:uppercase;color:var(--brass-soft);display:flex;flex-wrap:wrap;gap:.3rem .9rem;margin-bottom:.3rem}
.mod-seats{color:rgba(244,238,224,.55)}
.mod-seats.low{color:#e08a6d}
.mod-title{font-family:var(--fd);font-size:1.14rem;font-weight:520;color:var(--cream)}
.mod-slots{font-family:var(--fm);font-size:.64rem;letter-spacing:.1em;color:rgba(244,238,224,.6);display:block;margin-top:.35rem}
/* summary panel */
.plan-panel{position:sticky;top:110px;background:var(--cream);color:var(--ink);border:1px solid var(--brass);padding:1.8rem;box-shadow:var(--sh);border-radius:2px}
.plan-panel h3{font-size:1.35rem;margin-bottom:.2rem}
.plan-panel .sub{font-family:var(--fm);font-size:.62rem;letter-spacing:.16em;text-transform:uppercase;color:var(--brass);margin-bottom:1.2rem;display:block}
.picks{min-height:70px;border-top:1px dashed var(--line);padding-top:.8rem;margin-bottom:1rem}
.picks .empty{font-size:.85rem;color:var(--ink-soft);font-style:italic}
.pick{display:flex;align-items:center;gap:.7rem;padding:.45rem 0;border-bottom:1px solid var(--line);font-size:.85rem;animation:pickIn .35s ease}
@keyframes pickIn{from{opacity:0;transform:translateX(-8px)}to{opacity:1;transform:none}}
.pick .pc{font-family:var(--fm);font-size:.62rem;letter-spacing:.08em;color:var(--brass);flex-shrink:0}
.pick .pt{flex:1}
.pick .pk em{font-style:normal;font-family:var(--fm);font-size:.62rem;color:var(--ink-soft)}
.rm{background:none;border:none;cursor:pointer;color:var(--rust);font-size:1rem;line-height:1;padding:.2rem .4rem}
.rm:hover{transform:scale(1.25)}
.cr-line{display:flex;align-items:baseline;gap:.4rem;margin:.4rem 0 .6rem}
.cr-line b{font-family:var(--fd);font-size:2.3rem;font-weight:600;line-height:1}
.cr-line span{font-family:var(--fm);font-size:.66rem;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-soft)}
.meter{position:relative;height:10px;background:rgba(32,41,31,.1);border-radius:20px;overflow:hidden;margin-bottom:.4rem}
.meter i{position:absolute;inset:0;width:0;background:var(--pine);transition:width .5s cubic-bezier(.2,.65,.2,1),background .3s;border-radius:20px}
.meter i.warn{background:var(--brass)}
.meter i.over{background:var(--rust)}
.meter .tick{position:absolute;top:-3px;bottom:-3px;width:2px;background:var(--brass);left:66.666%}
.meter-cap{font-family:var(--fm);font-size:.6rem;letter-spacing:.1em;color:var(--ink-soft);display:block;margin-bottom:.9rem}
.plan-status{font-size:.88rem;min-height:2.6em;color:var(--ink-soft)}
.plan-status.good{color:var(--pine)}
.plan-status.bad{color:var(--rust);font-weight:600}
.clash{background:#fbeae5;border:1px solid var(--rust);color:var(--rust);padding:.85rem 1rem;font-size:.8rem;margin-bottom:1rem;border-radius:2px}
.clash b{font-family:var(--fm);font-size:.62rem;letter-spacing:.14em;text-transform:uppercase;display:block;margin-bottom:.3rem}
.pack-form{display:flex;gap:.5rem;margin-top:1.1rem}
.pack-form input{flex:1;min-width:0;border:1px solid var(--line);background:var(--paper);padding:.85rem .9rem;font-family:var(--fb);font-size:.85rem;border-radius:2px}
.pack-form input:focus{border-color:var(--brass);outline:none}
.pack-msg{margin-top:.8rem;font-size:.85rem;color:var(--pine);background:#e9f0e4;border:1px solid var(--pine);padding:.8rem 1rem;display:none}
.pack-msg.err{color:var(--rust);background:#fbeae5;border-color:var(--rust)}
.plan-clear{margin-top:1.2rem}

/* ============ 03 CAMPUS LIFE ============ */
.campus{padding-block:clamp(72px,9vw,120px);background:var(--cream);border-block:1px solid var(--line)}
.campus-grid{display:grid;grid-template-columns:1fr 1.1fr;gap:clamp(2.5rem,5vw,5rem);align-items:start}
.campus-sticky{position:sticky;top:110px}
.facet{display:grid;grid-template-columns:64px 1fr;gap:1.2rem;padding:1.5rem 0;border-top:1px solid var(--line)}
.facet:last-child{border-bottom:1px solid var(--line)}
.facet .n{font-family:var(--fd);font-size:1.7rem;font-style:italic;color:var(--brass)}
.facet h3{font-size:1.2rem;margin-bottom:.4rem}
.facet p{font-size:.92rem;color:var(--ink-soft)}
.campus-imgs{display:grid;grid-template-columns:1fr 1fr;gap:1.4rem}
.ci{background:var(--paper);border:1px solid var(--line);padding:9px;box-shadow:var(--sh)}
.ci:nth-child(2){margin-top:3.4rem}
.ci:nth-child(3){margin-top:-3.4rem}
.ci .kb{aspect-ratio:4/5}
.ci:nth-child(2) .kb,.ci:nth-child(4) .kb{aspect-ratio:4/3}
.ci figcaption{font-family:var(--fm);font-size:.6rem;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-soft);padding-top:.6rem;display:flex;justify-content:space-between}
.ci figcaption b{color:var(--brass)}

/* ============ 04 AID ============ */
.aid{padding-block:clamp(72px,9vw,120px)}
.aid-grid{display:grid;grid-template-columns:1.1fr .95fr;gap:clamp(2.5rem,5vw,4.5rem);align-items:start}
.route{display:grid;grid-template-columns:52px 1fr;gap:1.1rem;padding:1.3rem 0;border-top:1px solid var(--line);align-items:start}
.route:last-of-type{border-bottom:1px solid var(--line)}
.route .ic{width:44px;height:44px;border:1px solid var(--brass);display:grid;place-items:center;color:var(--brass);font-size:1.2rem;border-radius:50%;font-family:var(--fd)}
.route h3{font-size:1.15rem;margin-bottom:.25rem}
.route p{font-size:.9rem;color:var(--ink-soft)}
.route .amt{font-family:var(--fm);font-size:.68rem;letter-spacing:.12em;text-transform:uppercase;color:var(--rust)}
.aid-deadline{margin-top:1.6rem;font-family:var(--fm);font-size:.68rem;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-soft)}
.calc{background:var(--pine);color:var(--parch);padding:2rem;border:1px solid var(--pine);box-shadow:var(--sh);position:sticky;top:110px;border-radius:2px}
.calc h3{color:var(--cream);font-size:1.4rem;margin-bottom:.2rem}
.calc .sub{font-family:var(--fm);font-size:.62rem;letter-spacing:.16em;text-transform:uppercase;color:var(--brass-soft);display:block;margin-bottom:1.5rem}
.calc label{display:block;font-size:.82rem;margin-bottom:.5rem;color:rgba(244,238,224,.85)}
.calc output{font-family:var(--fd);font-size:1.3rem;color:var(--brass-soft);margin-left:.5rem}
.calc input[type=range]{width:100%;accent-color:var(--brass);margin-bottom:1.4rem}
.fset{border:1px solid var(--line-dark);padding:.9rem 1rem;margin-bottom:1.2rem;display:flex;gap:1.4rem;flex-wrap:wrap}
.fset legend{font-family:var(--fm);font-size:.62rem;letter-spacing:.16em;text-transform:uppercase;color:var(--brass-soft);padding-inline:.5rem}
.radio,.chk{display:flex;align-items:center;gap:.5rem;font-size:.85rem;cursor:pointer}
.radio input,.chk input{accent-color:var(--brass);width:16px;height:16px;cursor:pointer}
.calc .btn{width:100%;justify-content:center;margin-top:.6rem}
.calc-out{margin-top:1.4rem;border-top:1px dashed var(--line-dark);padding-top:1.2rem}
.calc-amt{display:flex;align-items:baseline;gap:.5rem}
.calc-amt b{font-family:var(--fd);font-size:2.8rem;font-weight:600;color:var(--brass-soft);line-height:1}
.calc-amt span{font-family:var(--fm);font-size:.66rem;letter-spacing:.14em;text-transform:uppercase;color:rgba(244,238,224,.7)}
.calc-notes{list-style:none;margin-top:.9rem}
.calc-notes li{font-size:.82rem;color:rgba(244,238,224,.85);padding:.35rem 0 .35rem 1.2rem;position:relative}
.calc-notes li::before{content:"✦";position:absolute;left:0;color:var(--brass);font-size:.7rem}
.calc-disc{margin-top:1.1rem;font-size:.7rem;color:rgba(244,238,224,.5);font-style:italic}

/* ============ 05 LIBRARY + SIDEBAR ============ */
.library{padding-block:clamp(72px,9vw,120px);background:var(--parch);border-top:1px solid var(--line)}
.lib-grid{display:grid;grid-template-columns:1.5fr .8fr;gap:clamp(2.5rem,4vw,4rem);align-items:start}
.lib-feature{border:1px solid var(--line);background:var(--paper);box-shadow:var(--sh)}
.lib-feature .kb{aspect-ratio:16/8}
.lib-body{padding:2rem}
.lib-body h3{font-size:1.7rem;margin-bottom:.8rem}
.lib-body p{color:var(--ink-soft);font-size:.96rem}
.lib-stats{display:grid;grid-template-columns:repeat(4,1fr);border-top:1px solid var(--line);margin-top:1.8rem}
.ls{padding:1.2rem 1rem;border-right:1px solid var(--line);text-align:center}
.ls:last-child{border-right:none}
.ls b{font-family:var(--fd);font-size:1.7rem;font-weight:600;display:block;color:var(--pine)}
.ls span{font-family:var(--fm);font-size:.58rem;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-soft)}
.research{margin-top:3rem}
.research h3{font-size:1.5rem;margin-bottom:.4rem;display:flex;align-items:baseline;gap:1rem}
.research h3 a{margin-left:auto;font-family:var(--fm);font-size:.66rem;letter-spacing:.14em;text-transform:uppercase;color:var(--rust);text-decoration:underline;text-underline-offset:3px}
.art{display:grid;grid-template-columns:150px 1fr;gap:1.4rem;padding:1.4rem 0;border-top:1px solid var(--line);align-items:center}
.art .kb{aspect-ratio:4/3;border:1px solid var(--line)}
.art-meta{font-family:var(--fm);font-size:.62rem;letter-spacing:.14em;text-transform:uppercase;color:var(--brass);margin-bottom:.35rem;display:flex;gap:1rem}
.art-meta .dt{color:var(--ink-soft)}
.art h4{font-size:1.18rem;margin-bottom:.35rem}
.art h4 a{text-decoration:none;transition:color .2s}
.art h4 a:hover{color:var(--rust)}
.art p{font-size:.88rem;color:var(--ink-soft)}
/* sidebar */
.side{position:sticky;top:110px;display:flex;flex-direction:column;gap:1.6rem}
.side-box{background:var(--cream);border:1px solid var(--line);padding:1.5rem}
.side-box .mono{color:var(--brass);display:block;margin-bottom:1rem}
.event{display:grid;grid-template-columns:56px 1fr;gap:1rem;padding:.85rem 0;border-bottom:1px solid var(--line);align-items:center}
.event:last-child{border-bottom:none}
.ev-d{background:var(--pine);color:var(--cream);text-align:center;padding:.45rem .2rem;border-radius:2px}
.ev-d b{display:block;font-family:var(--fd);font-size:1.3rem;line-height:1}
.ev-d span{font-family:var(--fm);font-size:.56rem;letter-spacing:.2em;color:var(--brass-soft)}
.event h4{font-size:.95rem;line-height:1.25}
.event p{font-family:var(--fm);font-size:.62rem;letter-spacing:.08em;color:var(--ink-soft);text-transform:uppercase}
.story{display:flex;gap:.9rem;padding:.9rem 0;border-bottom:1px solid var(--line)}
.story:last-child{border-bottom:none}
.story img{width:44px;height:44px;border-radius:50%;object-fit:cover;flex-shrink:0;border:1px solid var(--brass)}
.story q{font-family:var(--fd);font-style:italic;font-size:.92rem;display:block;line-height:1.4}
.story cite{font-family:var(--fm);font-style:normal;font-size:.6rem;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-soft)}
.ql{list-style:none}
.ql a{display:flex;justify-content:space-between;padding:.6rem 0;border-bottom:1px solid var(--line);text-decoration:none;font-size:.86rem;font-weight:600;transition:.2s}
.ql a:hover{color:var(--rust);padding-left:.4rem}
.ql a span{color:var(--brass)}

/* ============ 06 ALUMNI ============ */
.alumni{padding-block:clamp(72px,9vw,120px);background:var(--cream);border-top:1px solid var(--line);overflow:hidden}
.alum-stats{display:grid;grid-template-columns:repeat(4,1fr);border:1px solid var(--ink);margin-bottom:clamp(3rem,5vw,4.5rem)}
.as{padding:1.8rem 1.4rem;border-right:1px solid var(--line);text-align:center}
.as:last-child{border-right:none}
.as b{font-family:var(--fd);font-size:clamp(1.9rem,3.5vw,2.8rem);font-weight:600;color:var(--pine);display:block;line-height:1}
.as span{font-family:var(--fm);font-size:.6rem;letter-spacing:.16em;text-transform:uppercase;color:var(--ink-soft)}
.postcards{display:grid;grid-template-columns:repeat(4,1fr);gap:1.8rem;padding:1rem .5rem 2rem}
.postcard{position:relative;background:var(--paper);border:1px solid var(--line);padding:1.6rem 1.4rem 1.4rem;box-shadow:var(--sh);transition:transform .4s cubic-bezier(.2,.65,.2,1),box-shadow .4s}
.postcard::before{content:"";position:absolute;top:-12px;left:50%;width:84px;height:24px;background:rgba(216,180,106,.55);transform:translateX(-50%) rotate(-2deg);border:1px solid rgba(184,134,47,.25)}
.postcard:nth-child(1){transform:rotate(-2.4deg)}
.postcard:nth-child(2){transform:rotate(1.6deg) translateY(18px)}
.postcard:nth-child(3){transform:rotate(-1.4deg) translateY(6px)}
.postcard:nth-child(4){transform:rotate(2.4deg) translateY(22px)}
.postcard:hover{transform:rotate(0) translateY(-8px);box-shadow:0 30px 50px -20px rgba(14,42,31,.45);z-index:4}
.stamp{position:absolute;top:12px;right:12px;width:38px;border:1px solid var(--line);padding:2px;background:#fff;transform:rotate(4deg)}
.postcard blockquote{font-family:var(--fd);font-style:italic;font-size:1.02rem;line-height:1.45;margin:.8rem 0 1.3rem;color:var(--ink)}
.pc-who{display:flex;gap:.8rem;align-items:center;border-top:1px dashed var(--line);padding-top:1rem}
.pc-who img{width:46px;height:46px;border-radius:50%;border:1px solid var(--brass)}
.pc-who b{display:block;font-size:.88rem}
.pc-who span{font-family:var(--fm);font-size:.6rem;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-soft)}
.alum-cta{text-align:center;margin-top:2.5rem}
.alum-cta p{font-size:.95rem;color:var(--ink-soft);margin-bottom:1.3rem}

/* ============ 07 FAQ ============ */
.faq{padding-block:clamp(72px,9vw,120px)}
.faq-grid{display:grid;grid-template-columns:.8fr 1.2fr;gap:clamp(2.5rem,5vw,5rem);align-items:start}
.faq-side{position:sticky;top:110px}
.faq-side .contact-mini{margin-top:2rem;border:1px solid var(--brass);background:var(--cream);padding:1.4rem}
.faq-side .contact-mini p{font-size:.85rem;color:var(--ink-soft);margin:.4rem 0 .9rem}
.acc{border:1px solid var(--ink);border-bottom:none;background:var(--paper);transition:background .3s}
.acc:last-child{border-bottom:1px solid var(--ink)}
.acc.open{background:var(--cream)}
.acc-btn{width:100%;display:flex;align-items:center;gap:1.2rem;background:none;border:none;cursor:pointer;padding:1.4rem 1.5rem;text-align:left}
.acc-q{flex:1;font-family:var(--fd);font-size:1.18rem;font-weight:520;color:var(--ink)}
.acc-ic{width:30px;height:30px;border:1px solid var(--brass);border-radius:50%;display:grid;place-items:center;color:var(--brass);font-size:1.2rem;transition:transform .4s,background .3s;flex-shrink:0;font-family:var(--fb)}
.acc.open .acc-ic{transform:rotate(45deg);background:var(--brass);color:var(--cream)}
.acc-body{max-height:0;overflow:hidden;transition:max-height .5s cubic-bezier(.2,.65,.2,1)}
.acc-inner{padding:0 1.5rem 1.6rem;color:var(--ink-soft);font-size:.93rem}
.acc-inner p+p{margin-top:.7rem}

/* ============ VISIT BAND ============ */
.visit{background:var(--pine-3);color:var(--parch);overflow:hidden}
.visit-bg{position:absolute;inset:0;opacity:.24}
.visit-bg img{width:100%;height:100%;object-fit:cover}
.visit-in{position:relative;padding-block:clamp(80px,10vw,140px);display:grid;grid-template-columns:1.2fr .8fr;gap:3rem;align-items:center}
.visit h2{color:var(--cream);font-size:clamp(2.2rem,4.8vw,3.6rem);margin-bottom:1.2rem}
.visit h2 .it{font-style:italic;color:var(--brass-soft)}
.visit p{color:rgba(244,238,224,.75);max-width:34rem}
.visit-dates{display:flex;flex-direction:column;gap:.9rem}
.vd{display:flex;gap:1.2rem;align-items:center;background:rgba(244,238,224,.06);border:1px solid var(--line-dark);padding:1rem 1.3rem;transition:.3s;border-radius:2px}
.vd:hover{border-color:var(--brass);transform:translateX(6px)}
.vd b{font-family:var(--fd);font-size:1.05rem;color:var(--cream);display:block}
.vd span{font-family:var(--fm);font-size:.62rem;letter-spacing:.14em;text-transform:uppercase;color:var(--brass-soft)}
.visit-ctas{margin-top:2.2rem;display:flex;gap:1.2rem;flex-wrap:wrap}

/* ============ FOOTER ============ */
footer{background:var(--pine-3);color:rgba(244,238,224,.72);border-top:1px solid var(--line-dark)}
.foot-grid{display:grid;grid-template-columns:1.4fr .8fr .8fr 1fr;gap:3rem;padding-block:4.5rem 3rem}
.foot-brand .brand-t strong{color:var(--cream);font-size:1.35rem}
.foot-brand p{font-size:.88rem;margin-top:1rem;max-width:26rem}
.socials{display:flex;gap:.8rem;margin-top:1.6rem}
.socials a{width:40px;height:40px;border:1px solid var(--line-dark);display:grid;place-items:center;color:var(--parch);transition:.25s;border-radius:50%;text-decoration:none}
.socials a:hover{background:var(--brass);border-color:var(--brass);color:var(--pine-3);transform:translateY(-3px)}
.socials svg{width:16px;height:16px;fill:currentColor}
footer h4{color:var(--cream);font-family:var(--fm);font-size:.68rem;letter-spacing:.18em;text-transform:uppercase;font-weight:600;margin-bottom:1.2rem}
.foot-links{list-style:none}
.foot-links a{display:inline-block;text-decoration:none;font-size:.9rem;padding:.32rem 0;transition:.2s;color:rgba(244,238,224,.72)}
.foot-links a:hover{color:var(--brass-soft);transform:translateX(4px)}
address{font-style:normal;font-size:.9rem;line-height:1.9}
address a{color:var(--brass-soft);text-decoration:none}
.foot-bottom{border-top:1px solid var(--line-dark);padding-block:1.4rem;display:flex;justify-content:space-between;gap:1rem;flex-wrap:wrap;font-family:var(--fm);font-size:.62rem;letter-spacing:.12em;text-transform:uppercase}
.foot-bottom a{color:rgba(244,238,224,.55);text-decoration:none;margin-left:1.4rem}
.foot-bottom a:hover{color:var(--brass-soft)}

/* ============ RESPONSIVE ============ */
@media(max-width:1080px){
  .prog-thumb{display:none}
  .postcards{grid-template-columns:repeat(2,1fr)}
}
@media(max-width:960px){
  .nav,.head-cta{display:none}
  .nav-toggle{display:block}
  .hero-grid,.prog-grid,.campus-grid,.aid-grid,.lib-grid,.faq-grid,.visit-in{grid-template-columns:1fr}
  .prog-sticky,.campus-sticky,.side,.calc,.plan-panel,.faq-side{position:static}
  .collage{min-height:0;margin-top:1rem}
  .prog{grid-template-columns:76px 1fr 30px;gap:.9rem}
  .prog-meta,.prog-tagw{display:none}
  .alum-stats{grid-template-columns:repeat(2,1fr)}
  .as:nth-child(2){border-right:none}
  .as{border-bottom:1px solid var(--line)}
  .as:nth-child(3),.as:nth-child(4){border-bottom:none}
  .lib-stats{grid-template-columns:repeat(2,1fr)}
  .ls:nth-child(2){border-right:none}
  .ls{border-bottom:1px solid var(--line)}
  .ls:nth-child(3),.ls:nth-child(4){border-bottom:none}
  .hm{padding-right:1.2rem;margin-right:1.2rem}
}
@media(max-width:640px){
  .postcards{grid-template-columns:1fr}
  .postcard{transform:none !important}
  .postcard:hover{transform:translateY(-6px) !important}
  .campus-imgs{grid-template-columns:1fr}
  .ci:nth-child(2){margin-top:0}.ci:nth-child(3){margin-top:0}
  .art{grid-template-columns:1fr}
  .art .kb{max-width:280px}
  .foot-grid{grid-template-columns:1fr;gap:2rem}
  .openhouse{right:0;bottom:-16px}
  .util-in span.hide-s{display:none}
}

/* ============ REDUCED MOTION ============ */
@media (prefers-reduced-motion: reduce){
  *,*::before,*::after{animation-duration:.001s !important;animation-iteration-count:1 !important;transition-duration:.001s !important}
  html{scroll-behavior:auto}
  .js [data-reveal]{opacity:1;transform:none}
  .lm-i{transform:none}
  .mq-track{animation:none;flex-wrap:wrap;width:auto}
  .mq{overflow-x:auto}
  .badge{animation:none}
  .kb img{animation:none}
}
</style>
</head>
<body>
<a class="skip" href="#main">Skip to content</a>

<!-- UTILITY BAR -->
<div class="util">
  <div class="wrap util-in">
    <span>Michaelmas Term · Applications for 2026 entry are open</span>
    <span class="hide-s"><a href="#top">myCalderwell Portal</a> &nbsp;·&nbsp; <a href="#visit">Give</a> &nbsp;·&nbsp; <a href="#library">Newsroom</a></span>
  </div>
</div>

<!-- HEADER -->
<header class="site-head" id="top">
  <div class="wrap head-in">
    <a class="brand" href="#top">
      <img class="crest" src="https://placehold.co/96x96/0E2A1F/F4EEE0?text=C&font=playfair+display" alt="Calderwell University crest — the letter C inside a brass ring" width="96" height="96">
      <span class="brand-t">
        <strong>Calderwell University</strong>
        <em>Where inquiry becomes impact</em>
      </span>
    </a>
    <nav class="nav" aria-label="Primary">
      <a href="#programs">Programs</a>
      <a href="#admissions">Admissions</a>
      <a href="#campus-life">Campus Life</a>
      <a href="#library">Library</a>
      <a href="#research">Research</a>
      <a href="#aid">Financial Aid</a>
      <a href="#alumni">Alumni</a>
    </nav>
    <a class="btn btn-sm head-cta" href="#visit">Apply 2026 <span class="ar">→</span></a>
    <button class="nav-toggle" aria-expanded="false" aria-controls="navPanel" aria-label="Toggle menu"><span></span><span></span><span></span></button>
  </div>
  <nav class="nav-panel" id="navPanel" aria-label="Mobile">
    <a href="#programs">Programs</a>
    <a href="#admissions">Admissions</a>
    <a href="#campus-life">Campus Life</a>
    <a href="#library">Library</a>
    <a href="#research">Research</a>
    <a href="#aid">Financial Aid</a>
    <a href="#alumni">Alumni</a>
    <a href="#visit" style="color:var(--rust)">Apply 2026 →</a>
  </nav>
</header>

<main id="main">

<!-- ================= HERO ================= -->
<section class="hero" aria-label="Welcome">
  <p class="hero-rail">Per Lumen Ad Veritatem — Prospectus MMXXVI</p>
  <div class="wrap hero-grid">
    <div data-reveal>
      <p class="kicker mono">Prospectus № 127 · Est. 1893 · Calderford</p>
      <h1 class="hero-title in">
        <span class="lm"><span class="lm-i" style="--d:.08s">Where inquiry</span></span>
        <span class="lm"><span class="lm-i" style="--d:.2s">becomes <span class="it">impact.</span></span></span>
      </h1>
      <p class="hero-lede">Founded on the banks of the River Calder, we are a civic research university of 14,200 students — and an open platform for anyone determined to learn. Twelve schools, four hundred modules, one promise: you will be taught by people who still get excited.</p>
      <div class="hero-ctas">
        <a class="btn" href="#programs">Explore Programs <span class="ar">→</span></a>
        <a class="btn btn-ghost" href="#visit">Visit Campus</a>
      </div>
      <p class="hero-sub">Not ready for a degree? 40+ free micro-courses on <a href="#planner">Calderwell Open</a></p>
      <div class="hero-meta">
        <div class="hm"><b data-count="14200">0</b><span>Students</span></div>
        <div class="hm"><b>1:11</b><span>Staff ratio</span></div>
        <div class="hm"><b data-count="94" data-suffix="%">0</b><span>Grad outcomes</span></div>
        <div class="hm"><b>Gold</b><span>Teaching excellence</span></div>
      </div>
    </div>
    <div class="collage" data-reveal style="--d:.15s">
      <div class="col-main">
        <div class="kb"><img src="https://picsum.photos/seed/calderwell-quad/900/1125" alt="Students crossing the main quad in autumn light" width="900" height="1125"></div>
      </div>
      <figure class="col-a">
        <img src="https://picsum.photos/seed/calderwell-arcade/560/420" alt="The limestone arcade beside Whitlock Library" width="560" height="420">
        <figcaption class="col-cap">Fig. 02 — The Arcade</figcaption>
      </figure>
      <figure class="col-b">
        <img src="https://picsum.photos/seed/calderwell-lab/560/420" alt="Undergraduates at work in the genome lab" width="560" height="420">
        <figcaption class="col-cap">Fig. 03 — Genome Lab</figcaption>
      </figure>
      <svg class="badge" viewBox="0 0 120 120" aria-hidden="true">
        <defs><path id="cir" d="M60,60 m-46,0 a46,46 0 1,1 92,0 a46,46 0 1,1 -92,0"/></defs>
        <circle cx="60" cy="60" r="58" fill="var(--cream)" stroke="var(--brass)"/>
        <text><textPath href="#cir">CALDERWELL UNIVERSITY · EST. 1893 · CALDERFORD ·</textPath></text>
        <text class="mid" x="60" y="70" text-anchor="middle">✳</text>
      </svg>
      <div class="openhouse">
        <span class="mono">Save the date</span>
        <h3>Undergraduate Open House</h3>
        <p>Saturday 21 February 2026 · 09:30–16:00, Main Quad. Sample lectures, tour halls, meet current students.</p>
        <a href="#visit">Reserve a place →</a>
      </div>
    </div>
  </div>
</section>

<!-- ================= MARQUEE ================= -->
<div class="mq" aria-label="Campus notices">
  <div class="mq-track" id="mqTrack">
    <div class="mq-g">
      <span class="mq-i">Spring enrolment opens 12 January</span><span class="mq-s">✦</span>
      <span class="mq-i">Whitlock Library launches the 24-hour study commons</span><span class="mq-s">✦</span>
      <span class="mq-i">Prof. Amara Okafor wins the Haldane Prize for climate research</span><span class="mq-s">✦</span>
      <span class="mq-i">The Kestrels take the regional debate cup</span><span class="mq-s">✦</span>
      <span class="mq-i">Calderwell Open: 40+ free short courses now live</span><span class="mq-s">✦</span>
      <span class="mq-i">Convocation 2026 — Sunday 14 June, Cathedral Green</span><span class="mq-s">✦</span>
    </div>
  </div>
</div>

<!-- ================= 01 PROGRAMS ================= -->
<section class="programs" id="programs" aria-labelledby="programs-h">
  <div class="wrap prog-grid">
    <div class="prog-sticky" data-reveal>
      <div class="s-head" style="margin-bottom:1.6rem">
        <p class="s-kicker mono">§ 01 · Programs</p>
        <h2 class="s-title" id="programs-h">The Course <span class="it">Index</span></h2>
      </div>
      <p class="s-lede" style="margin-top:0">Every degree at Calderwell is built module by module, and every syllabus is published in full before you commit to anything. Choose from ninety programmes across twelve schools — on the Calderford campus, in the clinic, or entirely online through Calderwell Open.</p>
      <div style="margin-top:2rem;display:flex;gap:1rem;flex-wrap:wrap">
        <a class="btn" href="#planner">Plan Your Semester <span class="ar">→</span></a>
        <a class="btn btn-ghost" href="#admissions">Request Prospectus</a>
      </div>
      <p class="prog-note">Studying part-time or alongside work? <a href="#planner">Calderwell Open</a> lets you bank credits from any online module and roll them into a full degree later — up to 25% of any award.</p>
    </div>
    <div class="prog-list" data-reveal style="--d:.12s">
      <a class="prog" href="#planner">
        <span class="prog-code">BA-ENG</span>
        <span><span class="prog-name">English Literature &amp; Creative Writing</span><span class="prog-sub">Workshop-led, ending in a supervised dissertation of original writing.</span></span>
        <span class="prog-meta">BA (Hons) · 3 yrs · 360 cr</span>
        <span class="prog-tagw"><span class="prog-tag">On campus</span></span>
        <span class="ar">→</span>
        <span class="prog-thumb"><img src="https://picsum.photos/seed/prog-literature/320/220" alt="" width="320" height="220"></span>
      </a>
      <a class="prog" href="#planner">
        <span class="prog-code">BSC-CPB</span>
        <span><span class="prog-name">Computational Biology</span><span class="prog-sub">Genomics meets machine learning; placement year with a partner lab.</span></span>
        <span class="prog-meta">BSc (Hons) · 3 yrs · 360 cr</span>
        <span class="prog-tagw"><span class="prog-tag new">New 2026</span></span>
        <span class="ar">→</span>
        <span class="prog-thumb"><img src="https://picsum.photos/seed/prog-biology/320/220" alt="" width="320" height="220"></span>
      </a>
      <a class="prog" href="#planner">
        <span class="prog-code">BARCH</span>
        <span><span class="prog-name">Architecture &amp; Urban Design</span><span class="prog-sub">Studio culture, a live-build term, and RIBA-validated exams.</span></span>
        <span class="prog-meta">BArch · 5 yrs · 600 cr</span>
        <span class="prog-tagw"><span class="prog-tag">On campus</span></span>
        <span class="ar">→</span>
        <span class="prog-thumb"><img src="https://picsum.photos/seed/prog-architecture/320/220" alt="" width="320" height="220"></span>
      </a>
      <a class="prog" href="#planner">
        <span class="prog-code">BA-PPE</span>
        <span><span class="prog-name">Philosophy, Politics &amp; Economics</span><span class="prog-sub">The classic tripos, taught through weekly cross-school seminars.</span></span>
        <span class="prog-meta">BA (Hons) · 3 yrs · 360 cr</span>
        <span class="prog-tagw"><span class="prog-tag">On campus</span></span>
        <span class="ar">→</span>
        <span class="prog-thumb"><img src="https://picsum.photos/seed/prog-ppe/320/220" alt="" width="320" height="220"></span>
      </a>
      <a class="prog" href="#planner">
        <span class="prog-code">MSC-DSE</span>
        <span><span class="prog-name">Data Science &amp; Ethics</span><span class="prog-sub">Capstone thesis with an industry sponsor; fully remote option.</span></span>
        <span class="prog-meta">MSc · 1 yr · 180 cr</span>
        <span class="prog-tagw"><span class="prog-tag">Hybrid / Online</span></span>
        <span class="ar">→</span>
        <span class="prog-thumb"><img src="https://picsum.photos/seed/prog-datascience/320/220" alt="" width="320" height="220"></span>
      </a>
      <a class="prog" href="#planner">
        <span class="prog-code">BSC-NUR</span>
        <span><span class="prog-name">Nursing &amp; Health Sciences</span><span class="prog-sub">2,300 placement hours across the Calder Valley NHS trusts.</span></span>
        <span class="prog-meta">BSc (Hons) · 3 yrs · 360 cr</span>
        <span class="prog-tagw"><span class="prog-tag">Clinical</span></span>
        <span class="ar">→</span>
        <span class="prog-thumb"><img src="https://picsum.photos/seed/prog-nursing/320/220" alt="" width="320" height="220"></span>
      </a>
      <a class="prog" href="#planner">
        <span class="prog-code">MA-HIS</span>
        <span><span class="prog-name">Global History: Empire &amp; After</span><span class="prog-sub">Archival training in Whitlock Special Collections, then a 20,000-word thesis.</span></span>
        <span class="prog-meta">MA · 1 yr · 180 cr</span>
        <span class="prog-tagw"><span class="prog-tag">On campus</span></span>
        <span class="ar">→</span>
        <span class="prog-thumb"><img src="https://picsum.photos/seed/prog-history/320/220" alt="" width="320" height="220"></span>
      </a>
    </div>
  </div>
</section>

<!-- ================= 02 COURSE PLANNER ================= -->
<section class="planner dark" id="planner" aria-labelledby="planner-h">
  <span class="ghost" style="top:0;right:2%">02</span>
  <div class="wrap">
    <div class="s-head" data-reveal>
      <p class="s-kicker mono">§ 02 · Interactive</p>
      <h2 class="s-title" id="planner-h">Draft your first semester <span class="it">before you apply.</span></h2>
      <p class="s-lede">Mix core modules with electives, watch your credit load, and we’ll flag timetable clashes in real time. When it looks right, request the syllabus pack — full module descriptors, reading lists and assessment maps, emailed the same day.</p>
    </div>
    <div class="plan-grid">
      <div data-reveal>
        <div class="filters" id="filters" role="group" aria-label="Filter modules by school">
          <button class="chip is-on" data-f="all">All modules</button>
          <button class="chip" data-f="core">Core</button>
          <button class="chip" data-f="hum">Humanities</button>
          <button class="chip" data-f="sci">Sciences</button>
          <button class="chip" data-f="soc">Society &amp; Interdisc.</button>
        </div>
        <div id="catalogList" aria-live="polite"></div>
      </div>
      <aside class="plan-panel" data-reveal style="--d:.15s" aria-label="Your semester summary">
        <h3>Your Semester</h3>
        <span class="sub">Michaelmas Term · 2026</span>
        <div class="picks" id="picksList"><p class="empty">Nothing here yet — tap a module to add it.</p></div>
        <div class="cr-line"><b id="crTotal">0</b><span>/ 18 credits max</span></div>
        <div class="meter"><i id="meterFill"></i><em class="tick" title="Full-time threshold: 12 credits"></em></div>
        <span class="meter-cap">▲ 12 credits = full-time status · recommended 15</span>
        <p class="plan-status" id="planStatus">Add modules from the catalogue to begin.</p>
        <div class="clash" id="clashBox" hidden><b>⚠ Timetable clash</b><span id="clashTxt"></span></div>
        <form class="pack-form" id="packForm" novalidate>
          <input type="email" id="packEmail" placeholder="you@school.edu" aria-label="Email address for syllabus pack">
          <button type="submit" class="btn btn-brass btn-sm">Send syllabus pack</button>
        </form>
        <p class="pack-msg" id="packMsg"></p>
        <div class="plan-clear"><button class="link-btn" id="clearBtn" type="button">Clear semester &amp; start over</button></div>
      </aside>
    </div>
  </div>
</section>

<!-- ================= 03 CAMPUS LIFE ================= -->
<section class="campus" id="campus-life" aria-labelledby="campus-h">
  <div class="wrap campus-grid">
    <div class="campus-sticky" data-reveal>
      <div class="s-head" style="margin-bottom:1rem">
        <p class="s-kicker mono">§ 03 · Campus Life</p>
        <h2 class="s-title" id="campus-h">Eighty acres between the river and the <span class="it">old town.</span></h2>
        <p class="s-lede">Limestone, lawns and a city that treats students like residents rather than visitors. Most first-years never need a bus; most finalists never want to leave.</p>
      </div>
      <div class="facet">
        <span class="n">01</span>
        <div><h3>Residence</h3><p>Nine halls, all within a ten-minute walk of the quad, all first-year guaranteed. Each hall runs its own common room, formal once a term, and — in the case of Riverbend — its own rowing crew.</p></div>
      </div>
      <div class="facet">
        <span class="n">02</span>
        <div><h3>Societies &amp; the Kestrel Union</h3><p>127 student societies, from the Chamberlain Debating Union to the Dark-Sky Astronomy Group. Freshers’ Fayre takes over the arcade every September, and union officers are paid to represent you, not to sell to you.</p></div>
      </div>
      <div class="facet">
        <span class="n">03</span>
        <div><h3>Sport &amp; the Boathouse</h3><p>Rowing on the Calder, a 25-metre pool, and floodlit pitches shared with the town club. BUCS teams in fourteen sports, and a free gym hour for every student, every week — no membership required.</p></div>
      </div>
      <div class="facet">
        <span class="n">04</span>
        <div><h3>Calderford, the city</h3><p>A cathedral city of 180,000 with a market older than the university itself. Students staff its theatres, run its food co-op, and have held seats on the youth council since 1962. Rent is roughly half the national capital’s.</p></div>
      </div>
      <div style="margin-top:1.8rem"><a class="btn" href="#visit">Visit Campus <span class="ar">→</span></a></div>
    </div>
    <div class="campus-imgs">
      <figure class="ci" data-reveal><div class="kb"><img src="https://picsum.photos/seed/campus-hall/760/950" alt="Brick residence hall at dusk" width="760" height="950"></div><figcaption><b>Plate I</b> Riverbend Hall</figcaption></figure>
      <figure class="ci" data-reveal style="--d:.1s"><div class="kb"><img src="https://picsum.photos/seed/campus-societies/760/570" alt="Society fair under the arcade" width="760" height="570"></div><figcaption><b>Plate II</b> Freshers’ Fayre</figcaption></figure>
      <figure class="ci" data-reveal style="--d:.15s"><div class="kb"><img src="https://picsum.photos/seed/campus-boathouse/760/950" alt="Rowers launching from the boathouse" width="760" height="950"></div><figcaption><b>Plate III</b> The Boathouse</figcaption></figure>
      <figure class="ci" data-reveal style="--d:.2s"><div class="kb"><img src="https://picsum.photos/seed/campus-city/760/570" alt="Calderford market square" width="760" height="570"></div><figcaption><b>Plate IV</b> Market Square</figcaption></figure>
    </div>
  </div>
</section>

<!-- ================= 04 FINANCIAL AID ================= -->
<section class="aid" id="aid" aria-labelledby="aid-h">
  <div class="wrap">
    <div class="s-head" data-reveal>
      <p class="s-kicker mono">§ 04 · Financial Aid</p>
      <h2 class="s-title" id="aid-h">Talent should never <span class="it">wait on circumstance.</span></h2>
      <p class="s-lede">Roughly one in three undergraduates holds a means-tested award, and no admitted student has ever been unrolled for inability to pay. The Aid Office on Provost’s Green will read any offer letter with you, line by line, before you decide.</p>
    </div>
    <div class="aid-grid">
      <div data-reveal>
        <div class="route">
          <span class="ic">£</span>
          <div><span class="amt">Up to £3,500 / year</span><h3>The Access Bursary</h3><p>Income-assessed, non-repayable, and renewed automatically each year your household income qualifies. Paid monthly, straight into your account, on top of standard government support.</p></div>
        </div>
        <div class="route">
          <span class="ic">✦</span>
          <div><span class="amt">Full fees + £2,000 stipend</span><h3>The Founders Scholarship</h3><p>Awarded each year to forty students who are first in their family to attend university. Includes a funded summer research or internship placement and priority hall accommodation.</p></div>
        </div>
        <div class="route">
          <span class="ic">⌂</span>
          <div><span class="amt">2,400 paid campus roles</span><h3>Work-Study</h3><p>From shelving in Whitlock to invigilating exams and running the print studio. Roles pay the real living wage, are scheduled around your syllabus, and never exceed twelve hours a week in term.</p></div>
        </div>
        <p class="aid-deadline">✳ Aid applications close 31 May for September entry · hardship funds remain open all year</p>
      </div>
      <div class="calc" data-reveal style="--d:.15s" id="calc">
        <h3>Calculate Aid</h3>
        <span class="sub">Estimate in twenty seconds</span>
        <label for="income">Annual household income <output id="incOut">£32,500</output></label>
        <input type="range" id="income" min="10000" max="90000" step="2500" value="32500">
        <fieldset class="fset">
          <legend>Fee status</legend>
          <label class="radio"><input type="radio" name="status" value="home" checked> Home student</label>
          <label class="radio"><input type="radio" name="status" value="intl"> International</label>
        </fieldset>
        <label class="chk"><input type="checkbox" id="firstgen"> First in my family to attend university</label>
        <button class="btn btn-brass" id="calcBtn" type="button">Calculate Aid <span class="ar">→</span></button>
        <div class="calc-out" id="calcOut" hidden>
          <p class="calc-amt"><b id="aidNum">£0</b><span id="aidPer">estimated / year</span></p>
          <ul class="calc-notes" id="aidNotes"></ul>
        </div>
        <p class="calc-disc">Indicative only. Final awards are confirmed in writing by the Aid Office after enrolment. Tuition for 2026 entry: £9,250 (Home undergraduates).</p>
      </div>
    </div>
  </div>
</section>

<!-- ================= 05 LIBRARY & RESEARCH + SIDEBAR ================= -->
<section class="library" id="library" aria-labelledby="lib-h">
  <div class="wrap">
    <div class="s-head" data-reveal>
      <p class="s-kicker mono">§ 05 · Library &amp; Research</p>
      <h2 class="s-title" id="lib-h">The Whitlock never <span class="it">really closes.</span></h2>
    </div>
    <div class="lib-grid">
      <div>
        <article class="lib-feature" data-reveal>
          <div class="kb"><img src="https://picsum.photos/seed/whitlock-library/1100/700" alt="Reading room of the Whitlock Library under brass lamps" width="1100" height="700"></div>
          <div class="lib-body">
            <h3>The Whitlock Library</h3>
            <p>Five floors of limestone and long tables: 2.3 million printed volumes, a study commons that stays open around the clock in term-time, and a Special Collections vault holding everything from a twelfth-century psalter to the pay-books of Calderford’s mill workers. Subject librarians run weekly <strong>thesis clinics</strong> for postgraduates, and every undergraduate is assigned one for their dissertation year. Inter-library loans arrive within 48 hours, and the citation desk has rescued more footnotes than it cares to admit.</p>
            <div class="lib-stats">
              <div class="ls"><b data-count="2.3" data-dec="1" data-suffix="M">0</b><span>Volumes</span></div>
              <div class="ls"><b data-count="1.4" data-dec="1" data-suffix="M">0</b><span>Digital records</span></div>
              <div class="ls"><b data-count="1100">0</b><span>Study seats</span></div>
              <div class="ls"><b>24/7</b><span>Term-time commons</span></div>
            </div>
          </div>
        </article>
        <div class="research" id="research" data-reveal>
          <h3>Research updates <a href="#alumni">All briefings →</a></h3>
          <article class="art">
            <div class="kb"><img src="https://picsum.photos/seed/research-peat/400/280" alt="Upland peat landscape under cloud" width="400" height="280"></div>
            <div>
              <p class="art-meta"><span>Environment</span><span class="dt">3 Feb 2026</span></p>
              <h4><a href="#research">Mapping 12,000 hectares of upland peat</a></h4>
              <p>Dr. Eleri Idris’s team is pairing LiDAR flights with Victorian surveyors’ ledgers to build the most detailed carbon map of the Calder catchment yet — with three research students as co-authors on the first paper.</p>
            </div>
          </article>
          <article class="art">
            <div class="kb"><img src="https://picsum.photos/seed/research-letters/400/280" alt="Handwritten wartime letters on a desk" width="400" height="280"></div>
            <div>
              <p class="art-meta"><span>History</span><span class="dt">21 Jan 2026</span></p>
              <h4><a href="#research">The archive of ordinary lives</a></h4>
              <p>A crowdsourced project has digitised 4,800 wartime letters from Calderford mill families. The open-access database ships with a ready-made school syllabus pack, already adopted by eleven local secondaries.</p>
            </div>
          </article>
          <article class="art">
            <div class="kb"><img src="https://picsum.photos/seed/research-ml/400/280" alt="Server racks and annotated visualisations" width="400" height="280"></div>
            <div>
              <p class="art-meta"><span>Data Science</span><span class="dt">9 Jan 2026</span></p>
              <h4><a href="#research">Machine learning that explains itself</a></h4>
              <p>The Institute’s interpretability toolkit is now in clinical use at two NHS trusts. MSc students join fortnightly release sprints, and the best thesis each year wins the Okafor Prize — and a job interview.</p>
            </div>
          </article>
        </div>
      </div>
      <aside class="side" data-reveal style="--d:.15s" aria-label="Events, stories and quick links">
        <div class="side-box">
          <span class="mono">Events calendar</span>
          <div class="event"><span class="ev-d"><span>JAN</span><b>12</b></span><div><h4>Spring enrolment opens</h4><p>Portal · 09:00</p></div></div>
          <div class="event"><span class="ev-d"><span>FEB</span><b>21</b></span><div><h4>Undergraduate Open House</h4><p>Main Quad · 09:30–16:00</p></div></div>
          <div class="event"><span class="ev-d"><span>MAR</span><b>4</b></span><div><h4>Haldane Lecture: The Future of Food</h4><p>Great Hall · 18:00</p></div></div>
          <div class="event"><span class="ev-d"><span>MAR</span><b>18</b></span><div><h4>Careers &amp; Placement Fair</h4><p>Whitlock Commons · 10:00</p></div></div>
          <div class="event"><span class="ev-d"><span>APR</span><b>2</b></span><div><h4>Whitlock After Dark: poems &amp; prints</h4><p>Special Collections · 19:30</p></div></div>
        </div>
        <div class="side-box">
          <span class="mono">Student success stories</span>
          <div class="story">
            <img src="https://i.pravatar.cc/88?u=sofia" alt="Portrait of Sofia Marek" width="44" height="44">
            <div><q>The Access Bursary covered my rent, so my hours went into the lab instead of a second job.</q><cite>Sofia Marek · Bursary scholar ’27</cite></div>
          </div>
          <div class="story">
            <img src="https://i.pravatar.cc/88?u=james" alt="Portrait of James O’Connell" width="44" height="44">
            <div><q>We brought the national debate cup home in March. Trials for new speakers open every October.</q><cite>James O’Connell · Kestrel Union chair</cite></div>
          </div>
        </div>
        <div class="side-box">
          <span class="mono">Quick links</span>
          <ul class="ql">
            <li><a href="#library">Library catalogue <span>↗</span></a></li>
            <li><a href="#library">Book a study room <span>→</span></a></li>
            <li><a href="#library">Inter-library loan <span>→</span></a></li>
            <li><a href="#planner">Academic skills toolkit <span>→</span></a></li>
            <li><a href="#top">Student portal <span>↗</span></a></li>
          </ul>
        </div>
      </aside>
    </div>
  </div>
</section>

<!-- ================= 06 ALUMNI ================= -->
<section class="alumni" id="alumni" aria-labelledby="alumni-h">
  <span class="ghost" style="bottom:-6%;left:2%">’93</span>
  <div class="wrap">
    <div class="s-head" data-reveal>
      <p class="s-kicker mono">§ 06 · Alumni Network</p>
      <h2 class="s-title" id="alumni-h">You graduate once. <span class="it">You belong for good.</span></h2>
      <p class="s-lede">Postcards keep arriving decades after convocation — from policy rooms, research vessels, classrooms and kitchen-table startups. A selection, pinned to the board.</p>
    </div>
    <div class="alum-stats" data-reveal>
      <div class="as"><b data-count="96000">0</b><span>Alumni worldwide</span></div>
      <div class="as"><b data-count="140">0</b><span>Countries</span></div>
      <div class="as"><b data-count="87" data-suffix="%">0</b><span>Mentoring opt-in</span></div>
      <div class="as"><b data-count="3200">0</b><span>Employer partners</span></div>
    </div>
    <div class="postcards">
      <article class="postcard" data-reveal>
        <img class="stamp" src="https://picsum.photos/seed/stamp-kestrel/60/72" alt="" width="60" height="72">
        <blockquote>“Seminars here were small enough that you couldn’t hide — which is exactly why I can hold my own in a policy room today.”</blockquote>
        <div class="pc-who"><img src="https://i.pravatar.cc/92?u=amara" alt="Portrait of Amara Adeyemi" width="46" height="46"><div><b>Amara Adeyemi, ’16</b><span>Policy Advisor, Dept. for Education</span></div></div>
      </article>
      <article class="postcard" data-reveal style="--d:.1s">
        <img class="stamp" src="https://picsum.photos/seed/stamp-river/60/72" alt="" width="60" height="72">
        <blockquote>“My thesis took me from a lab bench to a research boat off the Hebrides in the same year. Few programmes trust undergraduates with that.”</blockquote>
        <div class="pc-who"><img src="https://i.pravatar.cc/92?u=daniel" alt="Portrait of Daniel Kovač" width="46" height="46"><div><b>Daniel Kovač, ’19</b><span>Marine Scientist, Coastal Trust</span></div></div>
      </article>
      <article class="postcard" data-reveal style="--d:.2s">
        <img class="stamp" src="https://picsum.photos/seed/stamp-lamp/60/72" alt="" width="60" height="72">
        <blockquote>“Half my startup was sketched at 2 a.m. on Whitlock’s fourth floor. The librarians knew my name — and my coffee order.”</blockquote>
        <div class="pc-who"><img src="https://i.pravatar.cc/92?u=priya" alt="Portrait of Priya Raghavan" width="46" height="46"><div><b>Priya Raghavan, ’13</b><span>Founder, Lantern Learn</span></div></div>
      </article>
      <article class="postcard" data-reveal style="--d:.3s">
        <img class="stamp" src="https://picsum.photos/seed/stamp-chalk/60/72" alt="" width="60" height="72">
        <blockquote>“The alumni mentoring scheme didn’t stop at graduation. My 2021 mentor still red-pen marks my lesson plans — kindly.”</blockquote>
        <div class="pc-who"><img src="https://i.pravatar.cc/92?u=tom" alt="Portrait of Tom Ellery" width="46" height="46"><div><b>Tom Ellery, ’21</b><span>Head of Year 9, Calderford Academy</span></div></div>
      </article>
    </div>
    <div class="alum-cta" data-reveal>
      <p>Alumni get library access for life, a standing invitation to Convocation, and first refusal on public lectures.</p>
      <a class="btn" href="#top">Join the Alumni Network <span class="ar">→</span></a>
    </div>
  </div>
</section>

<!-- ================= 07 FAQ ================= -->
<section class="faq" id="admissions" aria-labelledby="faq-h">
  <div class="wrap faq-grid">
    <div class="faq-side" data-reveal>
      <div class="s-head" style="margin-bottom:1rem">
        <p class="s-kicker mono">§ 07 · Admissions</p>
        <h2 class="s-title" id="faq-h">Admissions, <span class="it">answered.</span></h2>
        <p class="s-lede">The six questions our admissions team hears most, answered without the brochure gloss.</p>
      </div>
      <div class="contact-mini">
        <p class="mono" style="color:var(--brass)">Still unsure?</p>
        <p>Book a fifteen-minute call with an admissions tutor — real humans, no scripts, term-time weekdays.</p>
        <a class="btn btn-sm" href="#visit">Talk to a human <span class="ar">→</span></a>
      </div>
    </div>
    <div data-reveal style="--d:.12s">
      <div class="acc">
        <button class="acc-btn" aria-expanded="false"><span class="acc-q">What grades do you typically ask for?</span><span class="acc-ic">+</span></button>
        <div class="acc-body"><div class="acc-inner"><p>Typical offers sit at AAB–ABB at A-level, or 34–36 points in the International Baccalaureate. We make contextual offers two grades lower to applicants from under-represented schools, and every offer letter spells out exactly how we arrived at it. Architecture and Nursing add a portfolio or interview stage; mature, part-time and access-course applicants are assessed individually.</p></div></div>
      </div>
      <div class="acc">
        <button class="acc-btn" aria-expanded="false"><span class="acc-q">How are individual modules structured?</span><span class="acc-ic">+</span></button>
        <div class="acc-body"><div class="acc-inner"><p>Each module ships with a complete syllabus in week one: a lecture, a seminar or lab of no more than sixteen students, an annotated reading list, and an assessment map showing what is due when. Most modules carry 10 or 15 credits, and a standard full-time semester is 60 credits across four modules — roughly twelve to sixteen contact hours, plus independent study.</p></div></div>
      </div>
      <div class="acc">
        <button class="acc-btn" aria-expanded="false"><span class="acc-q">Will I write a dissertation or thesis?</span><span class="acc-ic">+</span></button>
        <div class="acc-body"><div class="acc-inner"><p>Yes — it is the capstone of every honours degree. Final-year undergraduates research and write a 10,000–12,000 word dissertation under a one-to-one supervisor; taught master’s students complete a 15,000–20,000 word thesis over the summer. All projects pass ethics review, and the Whitlock thesis clinics support everything from research questions to final footnotes.</p></div></div>
      </div>
      <div class="acc">
        <button class="acc-btn" aria-expanded="false"><span class="acc-q">Can I mix on-campus study with Calderwell Online?</span><span class="acc-ic">+</span></button>
        <div class="acc-body"><div class="acc-inner"><p>You can count up to 25% of any degree’s credits through Calderwell Online. Many students take their first semester fully online through our January intake, then transfer to campus in September with credits intact. Online modules carry identical syllabi, assessments and examiners — only the room is different.</p></div></div>
      </div>
      <div class="acc">
        <button class="acc-btn" aria-expanded="false"><span class="acc-q">When are the deadlines, and how do I apply?</span><span class="acc-ic">+</span></button>
        <div class="acc-body"><div class="acc-inner"><p>The main undergraduate deadline is 31 January, with interviews through February and March; clearing opens in August. Taught postgraduate programmes recruit on rolling admissions from October until courses fill — popular ones fill by late spring. Applications run through the national scheme for undergraduates, and directly through our portal for postgraduate and Calderwell Open study.</p></div></div>
      </div>
      <div class="acc">
        <button class="acc-btn" aria-expanded="false"><span class="acc-q">What support exists for housing costs and living expenses?</span><span class="acc-ic">+</span></button>
        <div class="acc-body"><div class="acc-inner"><p>Accommodation is guaranteed for all first-years, capped below the city average, and the Access Bursary pays up to £3,500 a year on top of standard loans. The hardship fund stays open all year, the food co-op is student-run and subsidised, and the Aid Office will sanity-check any budget with you — use the estimator above as a starting point.</p></div></div>
      </div>
    </div>
  </div>
</section>

<!-- ================= VISIT ================= -->
<section class="visit" id="visit" aria-labelledby="visit-h">
  <div class="visit-bg kb"><img src="https://picsum.photos/seed/visit-campus/1600/760" alt="" width="1600" height="760"></div>
  <div class="wrap visit-in">
    <div data-reveal>
      <p class="s-kicker mono" style="color:var(--brass-soft)">§ 08 · See it for yourself</p>
      <h2 id="visit-h">Reading about a university is fine. <span class="it">Walking it is better.</span></h2>
      <p>Come stand in the arcade at changeover time, when a thousand conversations happen at once. Sit in on a seminar. Eat where we eat. Bring your questions — and your parents, if you must.</p>
      <div class="visit-ctas">
        <a class="btn btn-brass" href="#top">Visit Campus <span class="ar">→</span></a>
        <a class="btn btn-ghost" style="color:var(--cream);border-color:rgba(244,238,224,.4)" href="#top">Book a 360° virtual tour</a>
      </div>
    </div>
    <div class="visit-dates" data-reveal style="--d:.15s">
      <div class="vd"><span class="mono" style="color:var(--brass-soft)">21 FEB</span><div><b>Undergraduate Open House</b><span>Main Quad · 09:30–16:00</span></div></div>
      <div class="vd"><span class="mono" style="color:var(--brass-soft)">WED / SAT</span><div><b>Guided campus tours</b><span>Weekly · 10:30, from Provost’s Green</span></div></div>
      <div class="vd"><span class="mono" style="color:var(--brass-soft)">ANYTIME</span><div><b>Virtual tour &amp; open lectures</b><span>Calderwell Open · streamed monthly</span></div></div>
    </div>
  </div>
</section>

</main>

<!-- ================= FOOTER ================= -->
<footer>
  <div class="wrap foot-grid">
    <div class="foot-brand">
      <a class="brand" href="#top" style="text-decoration:none">
        <img class="crest" src="https://placehold.co/96x96/081A12/F4EEE0?text=C&font=playfair+display" alt="" width="96" height="96" style="box-shadow:0 0 0 3px var(--pine-3),0 0 0 4px var(--brass)">
        <span class="brand-t"><strong>Calderwell University</strong><em style="color:var(--brass-soft)">Where inquiry becomes impact</em></span>
      </a>
      <p>A civic research university on the banks of the River Calder, teaching in person and online since 1893. Per Lumen Ad Veritatem.</p>
      <div class="socials">
        <a href="#top" aria-label="X / Twitter"><svg viewBox="0 0 24 24"><path d="M18.9 2H22l-7.6 8.7L23.3 22h-6.9l-5.4-7-6.2 7H1.7l8.1-9.3L.9 2h7.1l4.9 6.4L18.9 2zm-1.2 18h1.9L6.9 3.9H4.9L17.7 20z"/></svg></a>
        <a href="#top" aria-label="Instagram"><svg viewBox="0 0 24 24"><path d="M12 2.2c3.2 0 3.6 0 4.9.1 3.3.1 4.8 1.7 4.9 4.9.1 1.3.1 1.6.1 4.8s0 3.6-.1 4.8c-.1 3.2-1.7 4.8-4.9 4.9-1.3.1-1.6.1-4.9.1s-3.6 0-4.8-.1c-3.3-.1-4.8-1.7-4.9-4.9-.1-1.3-.1-1.6-.1-4.8s0-3.6.1-4.8C2.4 4 4 2.4 7.2 2.3c1.2-.1 1.6-.1 4.8-.1zm0 3.6a6.2 6.2 0 100 12.4 6.2 6.2 0 000-12.4zm0 10.2a4 4 0 110-8 4 4 0 010 8zm6.4-10.5a1.4 1.4 0 11-2.9 0 1.4 1.4 0 012.9 0z"/></svg></a>
        <a href="#top" aria-label="LinkedIn"><svg viewBox="0 0 24 24"><path d="M20.4 20.4h-3.5v-5.6c0-1.3 0-3-1.9-3s-2.1 1.4-2.1 2.9v5.7H9.4V9h3.4v1.6h.1c.5-.9 1.6-1.9 3.4-1.9 3.6 0 4.2 2.4 4.2 5.4v6.3zM5.3 7.4a2 2 0 110-4.1 2 2 0 010 4.1zM7.1 20.4H3.6V9h3.5v11.4z"/></svg></a>
        <a href="#top" aria-label="YouTube"><svg viewBox="0 0 24 24"><path d="M23.5 6.2a3 3 0 00-2.1-2.1C19.5 3.5 12 3.5 12 3.5s-7.5 0-9.4.6A3 3 0 00.5 6.2 31 31 0 000 12a31 31 0 00.5 5.8 3 3 0 002.1 2.1c1.9.6 9.4.6 9.4.6s7.5 0 9.4-.6a3 3 0 002.1-2.1A31 31 0 0024 12a31 31 0 00-.5-5.8zM9.6 15.6V8.4L15.8 12l-6.2 3.6z"/></svg></a>
      </div>
    </div>
    <div>
      <h4>Study</h4>
      <ul class="foot-links">
        <li><a href="#programs">Undergraduate programs</a></li>
        <li><a href="#programs">Postgraduate &amp; research</a></li>
        <li><a href="#planner">Calderwell Open</a></li>
        <li><a href="#admissions">Admissions &amp; entry</a></li>
        <li><a href="#aid">Scholarships &amp; aid</a></li>
      </ul>
    </div>
    <div>
      <h4>Campus</h4>
      <ul class="foot-links">
        <li><a href="#campus-life">Campus life</a></li>
        <li><a href="#library">Whitlock Library</a></li>
        <li><a href="#research">Research news</a></li>
        <li><a href="#alumni">Alumni network</a></li>
        <li><a href="#visit">Visit &amp; open days</a></li>
      </ul>
    </div>
    <div>
      <h4>Contact</h4>
      <address>
        Calderwell University<br>
        1 Provost’s Green, Calderford CW1 2AU<br>
        <a href="tel:+441904555189">+44 (0)1904 555 189</a><br>
        <a href="mailto:admissions@calderwell.ac.uk">admissions@calderwell.ac.uk</a>
      </address>
      <p style="margin-top:1rem;font-size:.82rem">Prefer paper? <a href="#admissions" style="color:var(--brass-soft)">Request the printed Prospectus 2026 →</a></p>
    </div>
  </div>
  <div class="wrap foot-bottom">
    <span>© 2025 Calderwell University · Registered charity № 1001893</span>
    <span>
      <a href="#top">Privacy</a><a href="#top">Terms</a><a href="#top">Accessibility</a><a href="#top">Cookies</a>
    </span>
  </div>
</footer>

<script>
(function(){
"use strict";
var RM = window.matchMedia("(prefers-reduced-motion: reduce)").matches;

/* ---------- Header & mobile nav ---------- */
var head = document.querySelector(".site-head");
window.addEventListener("scroll", function(){ head.classList.toggle("scrolled", window.scrollY > 8); }, {passive:true});
var toggle = document.querySelector(".nav-toggle");
toggle.addEventListener("click", function(){
  var open = document.body.classList.toggle("nav-open");
  toggle.setAttribute("aria-expanded", open);
});
document.querySelectorAll(".nav-panel a").forEach(function(a){
  a.addEventListener("click", function(){ document.body.classList.remove("nav-open"); toggle.setAttribute("aria-expanded","false"); });
});

/* ---------- Marquee clone ---------- */
var track = document.getElementById("mqTrack");
track.innerHTML += track.innerHTML;

/* ---------- Reveal on scroll ---------- */
var io = new IntersectionObserver(function(es){
  es.forEach(function(e){ if(e.isIntersecting){ e.target.classList.add("in"); io.unobserve(e.target);} });
},{threshold:.12, rootMargin:"0px 0px -40px 0px"});
document.querySelectorAll("[data-reveal]").forEach(function(el){ io.observe(el); });

/* ---------- Counters ---------- */
function fmt(v, dec){ return dec ? v.toFixed(dec) : Math.round(v).toLocaleString("en-GB"); }
function runCount(el){
  var to = parseFloat(el.dataset.count), dec = parseInt(el.dataset.dec||"0",10), suf = el.dataset.suffix||"";
  if(RM){ el.textContent = fmt(to,dec)+suf; return; }
  var t0 = performance.now(), dur = 1500;
  (function step(t){
    var p = Math.min((t-t0)/dur,1), e = 1-Math.pow(1-p,3);
    el.textContent = fmt(to*e,dec)+suf;
    if(p<1) requestAnimationFrame(step);
  })(t0);
}
var cio = new IntersectionObserver(function(es){
  es.forEach(function(e){ if(e.isIntersecting){ runCount(e.target); cio.unobserve(e.target);} });
},{threshold:.4});
document.querySelectorAll("[data-count]").forEach(function(el){ cio.observe(el); });

/* ---------- Course Planner ---------- */
var MODULES = [
 {id:"cw101",code:"CW-101",title:"Academic Writing & Rhetoric",cr:15,dept:"core",slots:["Mon 09:00","Wed 09:00"],seats:14},
 {id:"cw102",code:"CW-102",title:"Foundations of Inquiry",cr:10,dept:"core",slots:["Tue 11:00"],seats:22},
 {id:"lit160",code:"LIT-160",title:"Modern Poetry Studio",cr:10,dept:"hum",slots:["Wed 13:00"],seats:9},
 {id:"phl110",code:"PHL-110",title:"Ethics for Everyday Life",cr:5,dept:"hum",slots:["Fri 10:00"],seats:18},
 {id:"his140",code:"HIS-140",title:"Empires & Archives",cr:10,dept:"hum",slots:["Tue 14:00","Thu 14:00"],seats:11},
 {id:"bio120",code:"BIO-120",title:"Cell & Genome",cr:15,dept:"sci",slots:["Mon 11:00","Thu 11:00"],seats:7},
 {id:"csc130",code:"CSC-130",title:"Thinking in Code",cr:15,dept:"sci",slots:["Tue 09:00","Fri 09:00"],seats:16},
 {id:"mth150",code:"MTH-150",title:"Calculus I",cr:15,dept:"sci",slots:["Mon 10:00","Wed 10:00","Fri 10:00"],seats:25},
 {id:"env170",code:"ENV-170",title:"Climate Systems Lab",cr:10,dept:"sci",slots:["Thu 15:00"],seats:12},
 {id:"eco125",code:"ECO-125",title:"Behavioural Economics",cr:10,dept:"soc",slots:["Wed 15:00"],seats:10},
 {id:"soc130",code:"SOC-130",title:"Urban Society",cr:10,dept:"soc",slots:["Mon 14:00"],seats:13},
 {id:"art115",code:"ART-115",title:"Drawing the City",cr:5,dept:"soc",slots:["Fri 13:00"],seats:8}
];
var picks = new Set();
var filter = "all";
var list = document.getElementById("catalogList");

function byId(id){ return MODULES.find(function(m){return m.id===id;}); }

function renderCatalog(){
  list.innerHTML = "";
  MODULES.filter(function(m){ return filter==="all" || m.dept===filter; }).forEach(function(m){
    var b = document.createElement("button");
    b.type = "button";
    b.className = "mod" + (picks.has(m.id) ? " is-picked" : "");
    b.setAttribute("aria-pressed", picks.has(m.id));
    b.innerHTML =
      '<span class="mod-plus">'+(picks.has(m.id)?"✓":"+")+'</span>'+
      '<span><span class="mod-top"><span>'+m.code+'</span><span>'+m.cr+' credits</span><span class="mod-seats'+(m.seats<10?" low":"")+'">'+m.seats+' seats left</span></span>'+
      '<span class="mod-title">'+m.title+'</span>'+
      '<span class="mod-slots">'+m.slots.join(" · ")+'</span></span>';
    b.addEventListener("click", function(){
      picks.has(m.id) ? picks.delete(m.id) : picks.add(m.id);
      renderCatalog(); updateSummary();
    });
    list.appendChild(b);
  });
}
document.getElementById("filters").addEventListener("click", function(e){
  var c = e.target.closest(".chip"); if(!c) return;
  document.querySelectorAll(".chip").forEach(function(x){x.classList.remove("is-on");});
  c.classList.add("is-on"); filter = c.dataset.f; renderCatalog();
});

function updateSummary(){
  var sel = Array.from(picks).map(byId);
  var total = sel.reduce(function(s,m){return s+m.cr;},0);
  var box = document.getElementById("picksList");
  if(!sel.length){
    box.innerHTML = '<p class="empty">Nothing here yet — tap a module to add it.</p>';
  } else {
    box.innerHTML = sel.map(function(m){
      return '<div class="pick"><span class="pc">'+m.code+'</span><span class="pt">'+m.title+'</span><em>'+m.cr+' cr</em><button class="rm" data-id="'+m.id+'" aria-label="Remove '+m.code+'">×</button></div>';
    }).join("");
    box.querySelectorAll(".rm").forEach(function(r){
      r.addEventListener("click", function(){ picks.delete(r.dataset.id); renderCatalog(); updateSummary(); });
    });
  }
  document.getElementById("crTotal").textContent = total;
  var fill = document.getElementById("meterFill");
  fill.style.width = Math.min(total/18,1)*100 + "%";
  fill.className = total>18 ? "over" : (total>12 ? "warn" : "");
  var st = document.getElementById("planStatus");
  if(total===0){ st.textContent="Add modules from the catalogue to begin."; st.className="plan-status"; }
  else if(total<12){ st.textContent="Part-time load — "+(12-total)+" credits short of full-time status. Fine for Open learners."; st.className="plan-status"; }
  else if(total<=15){ st.textContent="Full-time and nicely balanced. This is the load most first-years carry."; st.className="plan-status good"; }
  else if(total<=18){ st.textContent="Full-time, toward the top of the band — make sure your reading weeks can take it."; st.className="plan-status"; }
  else { st.textContent="Overload: above 18 credits needs written approval from your academic advisor."; st.className="plan-status bad"; }
  /* clash detection */
  var clashes = [];
  for(var i=0;i<sel.length;i++) for(var j=i+1;j<sel.length;j++){
    sel[i].slots.forEach(function(s){ if(sel[j].slots.indexOf(s)>-1) clashes.push(sel[i].code+" + "+sel[j].code+" — "+s); });
  }
  var cb = document.getElementById("clashBox");
  if(clashes.length){ cb.hidden=false; document.getElementById("clashTxt").textContent = clashes.join("  ·  "); }
  else cb.hidden=true;
}
document.getElementById("clearBtn").addEventListener("click", function(){ picks.clear(); renderCatalog(); updateSummary();
  document.getElementById("packMsg").style.display="none"; });

document.getElementById("packForm").addEventListener("submit", function(e){
  e.preventDefault();
  var em = document.getElementById("packEmail"), msg = document.getElementById("packMsg");
  var ok = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(em.value);
  msg.style.display = "block";
  if(!ok || picks.size===0){
    msg.className = "pack-msg err";
    msg.textContent = picks.size===0 ? "Add at least one module first — then we’ll know what to send." : "That email doesn’t look quite right. Check it and try again.";
    return;
  }
  msg.className = "pack-msg";
  msg.textContent = "✓ Syllabus pack on its way to " + em.value + " — full descriptors, reading lists and assessment maps for your " + picks.size + " selected modules.";
  em.value = "";
});
renderCatalog(); updateSummary();

/* ---------- Aid estimator ---------- */
var inc = document.getElementById("income");
var incOut = document.getElementById("incOut");
inc.addEventListener("input", function(){ incOut.textContent = "£" + (+inc.value).toLocaleString("en-GB"); });

function estimate(){
  var income = +inc.value;
  var intl = document.querySelector('input[name="status"]:checked').value === "intl";
  var fg = document.getElementById("firstgen").checked;
  var out = document.getElementById("calcOut"), num = document.getElementById("aidNum"),
      per = document.getElementById("aidPer"), notes = document.getElementById("aidNotes");
  out.hidden = false;
  var lis = [];
  if(intl){
    num.textContent = "£2–6k";
    per.textContent = "merit scholarship range";
    lis.push("Means-tested bursaries apply to Home students.");
    lis.push("Chancellor’s International Scholarship: £2,000–£6,000, assessed with your application.");
    if(fg) lis.push("First-generation applicants receive priority scoring for merit awards.");
    lis.push("All international students: automatic health cover and visa support.");
  } else {
    var amt = income<=25000?3500 : income<=35000?2750 : income<=45000?1750 : income<=60000?750 : 0;
    if(fg) amt += 500;
    if(RM){ num.textContent = "£"+amt.toLocaleString("en-GB"); }
    else {
      var from = parseInt(num.textContent.replace(/\D/g,""))||0, t0=performance.now();
      (function step(t){ var p=Math.min((t-t0)/700,1), e=1-Math.pow(1-p,3);
        num.textContent = "£"+Math.round(from+(amt-from)*e).toLocaleString("en-GB");
        if(p<1) requestAnimationFrame(step); })(t0);
    }
    per.textContent = "estimated Access Bursary / year";
    if(amt===0 || (!fg && income>60000)) lis.push("No means-tested award at this band — merit scholarships and work-study remain open to you.");
    else lis.push("Access Bursary — income-assessed, non-repayable, renewed annually.");
    if(fg) lis.push("First-generation top-up applied (+£500) and Founders Scholarship eligibility flagged.");
    lis.push("Plus: guaranteed first-year hall and 2,400 paid work-study roles.");
    lis.push("Standard government loans sit on top of this estimate.");
  }
  notes.innerHTML = lis.map(function(t){return "<li>"+t+"</li>";}).join("");
}
document.getElementById("calcBtn").addEventListener("click", estimate);
document.querySelectorAll('input[name="status"], #firstgen').forEach(function(el){ el.addEventListener("change", function(){ if(!document.getElementById("calcOut").hidden) estimate(); }); });

/* ---------- FAQ accordion ---------- */
document.querySelectorAll(".acc-btn").forEach(function(btn){
  btn.addEventListener("click", function(){
    var acc = btn.parentElement, wasOpen = acc.classList.contains("open");
    document.querySelectorAll(".acc.open").forEach(function(o){
      o.classList.remove("open");
      o.querySelector(".acc-btn").setAttribute("aria-expanded","false");
      o.querySelector(".acc-body").style.maxHeight = null;
    });
    if(!wasOpen){
      acc.classList.add("open");
      btn.setAttribute("aria-expanded","true");
      var body = acc.querySelector(".acc-body");
      body.style.maxHeight = body.scrollHeight + "px";
    }
  });
});
})();
</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:47:00.850Z",
  "url": "https://benchmark.aimac.invalid/35afd5563f722cf6803feeafa78f12daaaff286bbb29a65914a1d51892daf378.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": "autocomplete-valid",
      "impact": null,
      "tags": [
        "cat.forms",
        "wcag21aa",
        "wcag135",
        "EN-301-549",
        "EN-9.1.3.5",
        "ACT"
      ],
      "description": "Ensure the autocomplete attribute is correct and suitable for the form field",
      "help": "autocomplete attribute must be used correctly",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/autocomplete-valid?application=axeAPI",
      "nodes": []
    },
    {
      "id": "blink",
      "impact": null,
      "tags": [
        "cat.time-and-media",
        "wcag2a",
        "wcag222",
        "section508",
        "section508.22.j",
        "TTv5",
        "TT2.b",
        "EN-301-549",
        "EN-9.2.2.2"
      ],
      "description": "Ensure <blink> elements are not used",
      "help": "<blink> elements are deprecated and must not be used",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/blink?application=axeAPI",
      "nodes": []
    },
    {
      "id": "definition-list",
      "impact": null,
      "tags": [
        "cat.structure",
        "wcag2a",
        "wcag131",
        "EN-301-549",
        "EN-9.1.3.1"
      ],
      "description": "Ensure <dl> elements are structured correctly",
      "help": "<dl> elements must only directly contain properly-ordered <dt> and <dd> groups, <script>, <template> or <div> elements",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/definition-list?application=axeAPI",
      "nodes": []
    },
    {
      "id": "dlitem",
      "impact": null,
      "tags": [
        "cat.structure",
        "wcag2a",
        "wcag131",
        "EN-301-549",
        "EN-9.1.3.1"
      ],
      "description": "Ensure <dt> and <dd> elements are contained by a <dl>",
      "help": "<dt> and <dd> elements must be contained by a <dl>",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/dlitem?application=axeAPI",
      "nodes": []
    },
    {
      "id": "frame-focusable-content",
      "impact": null,
      "tags": [
        "cat.keyboard",
        "wcag2a",
        "wcag211",
        "TTv5",
        "TT4.a",
        "EN-301-549",
        "EN-9.2.1.1"
      ],
      "description": "Ensure <frame> and <iframe> elements with focusable content do not have tabindex=-1",
      "help": "Frames with focusable content must not have tabindex=-1",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/frame-focusable-content?application=axeAPI",
      "nodes": []
    },
    {
      "id": "frame-title-unique",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag412",
        "TTv5",
        "TT12.d",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure <iframe> and <frame> elements contain a unique title attribute",
      "help": "Frames must have a unique title attribute",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/frame-title-unique?application=axeAPI",
      "nodes": []
    },
    {
      "id": "frame-title",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag412",
        "section508",
        "section508.22.i",
        "TTv5",
        "TT12.d",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure <iframe> and <frame> elements have an accessible name",
      "help": "Frames must have an accessible name",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/frame-title?application=axeAPI",
      "nodes": []
    },
    {
      "id": "html-xml-lang-mismatch",
      "impact": null,
      "tags": [
        "cat.language",
        "wcag2a",
        "wcag311",
        "EN-301-549",
        "EN-9.3.1.1",
        "ACT"
      ],
      "description": "Ensure that HTML elements with both valid lang and xml:lang attributes agree on the base language of the page",
      "help": "HTML elements with lang and xml:lang must have the same base language",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/html-xml-lang-mismatch?application=axeAPI",
      "nodes": []
    },
    {
      "id": "input-button-name",
      "impact": null,
      "tags": [
        "cat.name-role-value",
        "wcag2a",
        "wcag412",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT5.c",
        "EN-301-549",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure input buttons have discernible text",
      "help": "Input buttons must have discernible text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/input-button-name?application=axeAPI",
      "nodes": []
    },
    {
      "id": "input-image-alt",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag111",
        "wcag412",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT7.a",
        "EN-301-549",
        "EN-9.1.1.1",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure <input type=\"image\"> elements have alternative text",
      "help": "Image buttons must have alternative text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/input-image-alt?application=axeAPI",
      "nodes": []
    },
    {
      "id": "marquee",
      "impact": null,
      "tags": [
        "cat.parsing",
        "wcag2a",
        "wcag222",
        "TTv5",
        "TT2.b",
        "EN-301-549",
        "EN-9.2.2.2"
      ],
      "description": "Ensure <marquee> elements are not used",
      "help": "<marquee> elements are deprecated and must not be used",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/marquee?application=axeAPI",
      "nodes": []
    },
    {
      "id": "meta-refresh",
      "impact": null,
      "tags": [
        "cat.time-and-media",
        "wcag2a",
        "wcag221",
        "TTv5",
        "TT8.a",
        "EN-301-549",
        "EN-9.2.2.1"
      ],
      "description": "Ensure <meta http-equiv=\"refresh\"> is not used for delayed refresh",
      "help": "Delayed refresh under 20 hours must not be used",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/meta-refresh?application=axeAPI",
      "nodes": []
    },
    {
      "id": "object-alt",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag111",
        "section508",
        "section508.22.a",
        "EN-301-549",
        "EN-9.1.1.1"
      ],
      "description": "Ensure <object> elements have alternative text",
      "help": "<object> elements must have alternative text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/object-alt?application=axeAPI",
      "nodes": []
    },
    {
      "id": "role-img-alt",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag111",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT7.a",
        "EN-301-549",
        "EN-9.1.1.1",
        "ACT"
      ],
      "description": "Ensure [role=\"img\"] elements have alternative text",
      "help": "[role=\"img\"] elements must have an alternative text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/role-img-alt?application=axeAPI",
      "nodes": []
    },
    {
      "id": "scrollable-region-focusable",
      "impact": null,
      "tags": [
        "cat.keyboard",
        "wcag2a",
        "wcag211",
        "wcag213",
        "TTv5",
        "TT4.a",
        "EN-301-549",
        "EN-9.2.1.1",
        "EN-9.2.1.3"
      ],
      "description": "Ensure elements that have scrollable content are accessible by keyboard",
      "help": "Scrollable region must have keyboard access",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/scrollable-region-focusable?application=axeAPI",
      "nodes": []
    },
    {
      "id": "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": []
    },
    {
      "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": "<nav class=\"nav\" aria-label=\"Primary\">",
          "target": [
            ".nav"
          ]
        }
      ]
    },
    {
      "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": "<nav class=\"nav\" aria-label=\"Primary\">",
          "target": [
            ".nav"
          ]
        }
      ]
    },
    {
      "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=\"filters\" id=\"filters\" role=\"group\" aria-label=\"Filter modules by school\">",
          "target": [
            "#filters"
          ]
        }
      ]
    },
    {
      "id": "aria-hidden-body",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag131",
        "wcag412",
        "EN-301-549",
        "EN-9.1.3.1",
        "EN-9.4.1.2"
      ],
      "description": "Ensure aria-hidden=\"true\" is not present on the document body.",
      "help": "aria-hidden=\"true\" must not be present on the document body",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-hidden-body?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "aria-hidden-body",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "No aria-hidden attribute is present on document body"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<body>",
          "target": [
            "body"
          ]
        }
      ]
    },
    {
      "id": "aria-hidden-focus",
      "impact": null,
      "tags": [
        "cat.name-role-value",
        "wcag2a",
        "wcag412",
        "TTv5",
        "TT6.a",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure aria-hidden elements are not focusable nor contain focusable elements",
      "help": "ARIA hidden element must not be focusable or contain focusable elements",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-hidden-focus?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [
            {
              "id": "focusable-modal-open",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "No focusable elements while a modal is open"
            },
            {
              "id": "focusable-disabled",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "No focusable elements contained within element"
            },
            {
              "id": "focusable-not-tabbable",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "No focusable elements contained within element"
            }
          ],
          "none": [],
          "impact": null,
          "html": "<svg class=\"badge\" viewBox=\"0 0 120 120\" aria-hidden=\"true\">",
          "target": [
            ".badge"
          ]
        }
      ]
    },
    {
      "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": "<nav class=\"nav\" aria-label=\"Primary\">",
          "target": [
            ".nav"
          ]
        }
      ]
    },
    {
      "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=\"filters\" id=\"filters\" role=\"group\" aria-label=\"Filter modules by school\">",
          "target": [
            "#filters"
          ]
        }
      ]
    },
    {
      "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=\"filters\" id=\"filters\" role=\"group\" aria-label=\"Filter modules by school\">",
          "target": [
            "#filters"
          ]
        }
      ]
    },
    {
      "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": "<nav class=\"nav\" aria-label=\"Primary\">",
          "target": [
            ".nav"
          ]
        }
      ]
    },
    {
      "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": "<nav class=\"nav\" aria-label=\"Primary\">",
          "target": [
            ".nav"
          ]
        }
      ]
    },
    {
      "id": "avoid-inline-spacing",
      "impact": null,
      "tags": [
        "cat.structure",
        "wcag21aa",
        "wcag1412",
        "EN-301-549",
        "EN-9.1.4.12",
        "ACT"
      ],
      "description": "Ensure that text spacing set through style attributes can be adjusted with custom stylesheets",
      "help": "Inline text spacing must be adjustable with custom stylesheets",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/avoid-inline-spacing?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [
            {
              "id": "important-letter-spacing",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "Letter-spacing in the style attribute is not set to !important, or meets the minimum"
            },
            {
              "id": "important-word-spacing",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "word-spacing in the style attribute is not set to !important, or meets the minimum"
            },
            {
              "id": "important-line-height",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "line-height in the style attribute is not set to !important, or meets the minimum"
            }
          ],
          "none": [],
          "impact": null,
          "html": "<span class=\"lm-i\" style=\"--d:.08s\">Where inquiry</span>",
          "target": [
            ".lm:nth-child(1) > .lm-i"
          ]
        }
      ]
    },
    {
      "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=\"chip is-on\" data-f=\"all\">All modules</button>",
          "target": [
            ".is-on"
          ]
        }
      ]
    },
    {
      "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-title in\">\n        <span class=\"lm\"><span class=\"lm-i\" style=\"--d:.08s\">Where inquiry</span></span>\n        <span class=\"lm\"><span class=\"lm-i\" style=\"--d:.2s\">becomes <span class=\"it\">impact.</span></span></span>\n      </h1>",
                  "target": [
                    "h1"
                  ]
                },
                {
                  "html": "<h3>Undergraduate Open House</h3>",
                  "target": [
                    ".openhouse > h3"
                  ]
                },
                {
                  "html": "<h2 class=\"s-title\" id=\"programs-h\">The Course <span class=\"it\">Index</span></h2>",
                  "target": [
                    "#programs-h"
                  ]
                },
                {
                  "html": "<h2 class=\"s-title\" id=\"planner-h\">Draft your first semester <span class=\"it\">before you apply.</span></h2>",
                  "target": [
                    "#planner-h"
                  ]
                },
                {
                  "html": "<h3>Your Semester</h3>",
                  "target": [
                    ".plan-panel > h3"
                  ]
                },
                {
                  "html": "<h2 class=\"s-title\" id=\"campus-h\">Eighty acres between the river and the <span class=\"it\">old town.</span></h2>",
                  "target": [
                    "#campus-h"
                  ]
                },
                {
                  "html": "<h3>Residence</h3>",
                  "target": [
                    ".facet:nth-child(2) > div > h3"
                  ]
                },
                {
                  "html": "<h3>Societies &amp; the Kestrel Union</h3>",
                  "target": [
                    ".facet:nth-child(3) > div > h3"
                  ]
                },
                {
                  "html": "<h3>Sport &amp; the Boathouse</h3>",
                  "target": [
                    ".facet:nth-child(4) > div > h3"
                  ]
                },
                {
                  "html": "<h3>Calderford, the city</h3>",
                  "target": [
                    ".facet:nth-child(5) > div > h3"
                  ]
                },
                {
                  "html": "<h2 class=\"s-title\" id=\"aid-h\">Talent should never <span class=\"it\">wait on circumstance.</span></h2>",
                  "target": [
                    "#aid-h"
                  ]
                },
                {
                  "html": "<h3>The Access Bursary</h3>",
                  "target": [
                    ".route:nth-child(1) > div > h3"
                  ]
                },
                {
                  "html": "<h3>The Founders Scholarship</h3>",
                  "target": [
                    ".route:nth-child(2) > div > h3"
                  ]
                },
                {
                  "html": "<h3>Work-Study</h3>",
                  "target": [
                    ".route:nth-child(3) > div > h3"
                  ]
                },
                {
                  "html": "<h3>Calculate Aid</h3>",
                  "target": [
                    "#calc > h3"
                  ]
                },
                {
                  "html": "<h2 class=\"s-title\" id=\"lib-h\">The Whitlock never <span class=\"it\">really closes.</span></h2>",
                  "target": [
                    "#lib-h"
                  ]
                },
                {
                  "html": "<h3>The Whitlock Library</h3>",
                  "target": [
                    ".lib-body > h3"
                  ]
                },
                {
                  "html": "<h3>Research updates <a href=\"#alumni\">All briefings \u2192</a></h3>",
                  "target": [
                    "#research > h3"
                  ]
                },
                {
                  "html": "<h4><a href=\"#research\">Mapping 12,000 hectares of upland peat</a></h4>",
                  "target": [
                    ".art:nth-child(2) > div:nth-child(2) > h4"
                  ]
                },
                {
                  "html": "<h4><a href=\"#research\">The archive of ordinary lives</a></h4>",
                  "target": [
                    ".art:nth-child(3) > div:nth-child(2) > h4"
                  ]
                },
                {
                  "html": "<h4><a href=\"#research\">Machine learning that explains itself</a></h4>",
                  "target": [
                    ".art:nth-child(4) > div:nth-child(2) > h4"
                  ]
                },
                {
                  "html": "<h4>Spring enrolment opens</h4>",
                  "target": [
                    ".event:nth-child(2) > div > h4"
                  ]
                },
                {
                  "html": "<h4>Undergraduate Open House</h4>",
                  "target": [
                    ".event:nth-child(3) > div > h4"
                  ]
                },
                {
                  "html": "<h4>Haldane Lecture: The Future of Food</h4>",
                  "target": [
                    ".event:nth-child(4) > div > h4"
                  ]
                },
                {
                  "html": "<h4>Careers &amp; Placement Fair</h4>",
                  "target": [
                    ".event:nth-child(5) > div > h4"
                  ]
                },
                {
                  "html": "<h4>Whitlock After Dark: poems &amp; prints</h4>",
                  "target": [
                    ".event:nth-child(6) > div > h4"
                  ]
                },
                {
                  "html": "<h2 class=\"s-title\" id=\"alumni-h\">You graduate once. <span class=\"it\">You belong for good.</span></h2>",
                  "target": [
                    "#alumni-h"
                  ]
                },
                {
                  "html": "<h2 class=\"s-title\" id=\"faq-h\">Admissions, <span class=\"it\">answered.</span></h2>",
                  "target": [
                    "#faq-h"
                  ]
                },
                {
                  "html": "<h2 id=\"visit-h\">Reading about a university is fine. <span class=\"it\">Walking it is better.</span></h2>",
                  "target": [
                    "#visit-h"
                  ]
                },
                {
                  "html": "<h4>Study</h4>",
                  "target": [
                    ".foot-grid > div:nth-child(2) > h4"
                  ]
                },
                {
                  "html": "<h4>Campus</h4>",
                  "target": [
                    "div:nth-child(3) > h4"
                  ]
                },
                {
                  "html": "<h4>Contact</h4>",
                  "target": [
                    "div:nth-child(4) > h4"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Page has a heading"
            },
            {
              "id": "landmark",
              "data": null,
              "relatedNodes": [
                {
                  "html": "<main id=\"main\">",
                  "target": [
                    "#main"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Page has a landmark region"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<html lang=\"en\" class=\"js\">",
          "target": [
            "html"
          ]
        }
      ]
    },
    {
      "id": "color-contrast",
      "impact": "serious",
      "tags": [
        "cat.color",
        "wcag2aa",
        "wcag143",
        "TTv5",
        "TT13.c",
        "EN-301-549",
        "EN-9.1.4.3",
        "ACT"
      ],
      "description": "Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds",
      "help": "Elements must meet minimum color contrast ratio thresholds",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/color-contrast?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b9b9ad",
                "bgColor": "#081a12",
                "contrastRatio": 9.08,
                "fontSize": "7.9pt (10.56px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [],
              "impact": "serious",
              "message": "Element has sufficient color contrast of 9.08"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<span>Michaelmas Term \u00b7 Applications for 2026 entry are open</span>",
          "target": [
            ".util-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\" class=\"js\">",
          "target": [
            "html"
          ]
        }
      ]
    },
    {
      "id": "duplicate-id-aria",
      "impact": null,
      "tags": [
        "cat.parsing",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure every id attribute value used in ARIA and in labels is unique",
      "help": "IDs used in ARIA and labels must be unique",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/duplicate-id-aria?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "duplicate-id-aria",
              "data": "navPanel",
              "relatedNodes": [],
              "impact": "critical",
              "message": "Document has no elements referenced with ARIA or labels that share the same id attribute"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<nav class=\"nav-panel\" id=\"navPanel\" aria-label=\"Mobile\">",
          "target": [
            "#navPanel"
          ]
        }
      ]
    },
    {
      "id": "form-field-multiple-labels",
      "impact": null,
      "tags": [
        "cat.forms",
        "wcag2a",
        "wcag332",
        "TTv5",
        "TT5.c",
        "EN-301-549",
        "EN-9.3.3.2"
      ],
      "description": "Ensure form field does not have multiple label elements",
      "help": "Form field must not have multiple label elements",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/form-field-multiple-labels?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [],
          "none": [
            {
              "id": "multiple-label",
              "data": null,
              "relatedNodes": [],
              "impact": "moderate",
              "message": "Form field does not have multiple label elements"
            }
          ],
          "impact": null,
          "html": "<input type=\"email\" id=\"packEmail\" placeholder=\"you@school.edu\" aria-label=\"Email address for syllabus pack\">",
          "target": [
            "#packEmail"
          ]
        }
      ]
    },
    {
      "id": "html-has-lang",
      "impact": null,
      "tags": [
        "cat.language",
        "wcag2a",
        "wcag311",
        "TTv5",
        "TT11.a",
        "EN-301-549",
        "EN-9.3.1.1",
        "ACT"
      ],
      "description": "Ensure every HTML document has a lang attribute",
      "help": "<html> element must have a lang attribute",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/html-has-lang?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "has-lang",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "The <html> element has a lang attribute"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<html lang=\"en\" class=\"js\">",
          "target": [
            "html"
          ]
        }
      ]
    },
    {
      "id": "html-lang-valid",
      "impact": null,
      "tags": [
        "cat.language",
        "wcag2a",
        "wcag311",
        "TTv5",
        "TT11.a",
        "EN-301-549",
        "EN-9.3.1.1",
        "ACT"
      ],
      "description": "Ensure the lang attribute of the <html> element has a valid value",
      "help": "<html> element must have a valid value for the lang attribute",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/html-lang-valid?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [],
          "none": [
            {
              "id": "valid-lang",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "Value of lang attribute is included in the list of valid languages"
            }
          ],
          "impact": null,
          "html": "<html lang=\"en\" class=\"js\">",
          "target": [
            "html"
          ]
        }
      ]
    },
    {
      "id": "image-alt",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag111",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT7.a",
        "TT7.b",
        "EN-301-549",
        "EN-9.1.1.1",
        "ACT"
      ],
      "description": "Ensure <img> elements have alternative text or a role of none or presentation",
      "help": "Images must have alternative text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/image-alt?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "has-alt",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "Element has an alt attribute"
            }
          ],
          "all": [],
          "none": [
            {
              "id": "alt-space-value",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "Element has a valid alt attribute value"
            }
          ],
          "impact": null,
          "html": "<img class=\"crest\" src=\"https://placehold.co/96x96/0E2A1F/F4EEE0?text=C&amp;font=playfair+display\" alt=\"Calderwell University crest \u2014 the letter C inside a brass ring\" width=\"96\" height=\"96\">",
          "target": [
            ".head-in > .brand[href$=\"#top\"] > .crest[width=\"96\"][height=\"96\"]"
          ]
        }
      ]
    },
    {
      "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": "aria-label",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "aria-label attribute exists and is not empty"
            },
            {
              "id": "non-empty-placeholder",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "Element has a placeholder attribute"
            }
          ],
          "all": [],
          "none": [
            {
              "id": "hidden-explicit-label",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "Form element has a visible explicit <label>"
            }
          ],
          "impact": null,
          "html": "<input type=\"email\" id=\"packEmail\" placeholder=\"you@school.edu\" aria-label=\"Email address for syllabus pack\">",
          "target": [
            "#packEmail"
          ]
        }
      ]
    },
    {
      "id": "link-in-text-block",
      "impact": null,
      "tags": [
        "cat.color",
        "wcag2a",
        "wcag141",
        "TTv5",
        "TT13.a",
        "EN-301-549",
        "EN-9.1.4.1"
      ],
      "description": "Ensure links are distinguished from surrounding text in a way that does not rely on color",
      "help": "Links must be distinguishable without relying on color",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/link-in-text-block?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "link-in-text-block-style",
              "data": null,
              "relatedNodes": [
                {
                  "html": "<p class=\"hero-sub\">Not ready for a degree? 40+ free micro-courses on <a href=\"#planner\">Calderwell Open</a></p>",
                  "target": [
                    ".hero-sub"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Links can be distinguished from surrounding text by visual styling"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<a href=\"#planner\">Calderwell Open</a>",
          "target": [
            ".hero-sub > a[href$=\"#planner\"]"
          ]
        }
      ]
    },
    {
      "id": "link-name",
      "impact": null,
      "tags": [
        "cat.name-role-value",
        "wcag2a",
        "wcag244",
        "wcag412",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT6.a",
        "EN-301-549",
        "EN-9.2.4.4",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure links have discernible text",
      "help": "Links must have discernible text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/link-name?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "has-visible-text",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "Element has text that is visible to screen readers"
            }
          ],
          "all": [],
          "none": [
            {
              "id": "focusable-no-name",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "Element is not in tab order or has accessible text"
            }
          ],
          "impact": null,
          "html": "<a class=\"skip\" href=\"#main\">Skip to content</a>",
          "target": [
            ".skip"
          ]
        }
      ]
    },
    {
      "id": "list",
      "impact": null,
      "tags": [
        "cat.structure",
        "wcag2a",
        "wcag131",
        "EN-301-549",
        "EN-9.1.3.1"
      ],
      "description": "Ensure that lists are structured correctly",
      "help": "<ul> and <ol> must only directly contain <li>, <script> or <template> elements",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/list?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [],
          "none": [
            {
              "id": "only-listitems",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "List element only has direct children that are allowed inside <li> elements"
            }
          ],
          "impact": null,
          "html": "<ul class=\"ql\">",
          "target": [
            ".ql"
          ]
        }
      ]
    },
    {
      "id": "listitem",
      "impact": null,
      "tags": [
        "cat.structure",
        "wcag2a",
        "wcag131",
        "EN-301-549",
        "EN-9.1.3.1"
      ],
      "description": "Ensure <li> elements are used semantically",
      "help": "<li> elements must be contained in a <ul> or <ol>",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/listitem?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "listitem",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "List item has a <ul>, <ol> or role=\"list\" parent element"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<li><a href=\"#library\">Library catalogue <span>\u2197</span></a></li>",
          "target": [
            ".ql > 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=\"crest\" src=\"https://placehold.co/96x96/0E2A1F/F4EEE0?text=C&amp;font=playfair+display\" alt=\"Calderwell University crest \u2014 the letter C inside a brass ring\" width=\"96\" height=\"96\">",
          "target": [
            ".head-in > .brand[href$=\"#top\"] > .crest[width=\"96\"][height=\"96\"]"
          ]
        }
      ]
    },
    {
      "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": 42.2
              },
              "relatedNodes": [],
              "impact": "serious",
              "message": "Control has sufficient size (140px by 42.2px, 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=\"mq\" aria-label=\"Campus notices\">",
          "target": [
            ".mq"
          ],
          "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=\"ar\">\u2192</span>",
          "target": [
            ".head-cta > .ar"
          ],
          "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": "#b8862f",
                "bgColor": "#f4eee0",
                "contrastRatio": 2.79,
                "fontSize": "8.9pt (11.84px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<header class=\"site-head\" id=\"top\">",
                  "target": [
                    "#top"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 2.79 (foreground color: #b8862f, background color: #f4eee0, font size: 8.9pt (11.84px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<em>Where inquiry becomes impact</em>",
          "target": [
            ".head-in > .brand[href$=\"#top\"] > .brand-t > em"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 2.79 (foreground color: #b8862f, background color: #f4eee0, font size: 8.9pt (11.84px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b8862f",
                "bgColor": "#f4eee0",
                "contrastRatio": 2.79,
                "fontSize": "8.6pt (11.52px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<body>",
                  "target": [
                    "body"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 2.79 (foreground color: #b8862f, background color: #f4eee0, font size: 8.6pt (11.52px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<p class=\"kicker mono\">Prospectus \u2116 127 \u00b7 Est. 1893 \u00b7 Calderford</p>",
          "target": [
            ".kicker"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 2.79 (foreground color: #b8862f, background color: #f4eee0, font size: 8.6pt (11.52px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b8862f",
                "bgColor": "#f4eee0",
                "contrastRatio": 2.79,
                "fontSize": "57.6pt (76.8px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "3:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<body>",
                  "target": [
                    "body"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 2.79 (foreground color: #b8862f, background color: #f4eee0, font size: 57.6pt (76.8px), font weight: normal). Expected contrast ratio of 3:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"it\">impact.</span>",
          "target": [
            ".lm-i > .it"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 2.79 (foreground color: #b8862f, background color: #f4eee0, font size: 57.6pt (76.8px), font weight: normal). Expected contrast ratio of 3:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b8862f",
                "bgColor": "#fbf7ec",
                "contrastRatio": 3.02,
                "fontSize": "8.6pt (11.52px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<div class=\"openhouse\">\n        <span class=\"mono\">Save the date</span>\n        <h3>Undergraduate Open House</h3>\n        <p>Saturday 21 February 2026 \u00b7 09:30\u201316:00, Main Quad. Sample lectures, tour halls, meet current students.</p>\n        <a href=\"#visit\">Reserve a place \u2192</a>\n      </div>",
                  "target": [
                    ".openhouse"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.02 (foreground color: #b8862f, background color: #fbf7ec, font size: 8.6pt (11.52px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"mono\">Save the date</span>",
          "target": [
            ".openhouse > .mono"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.02 (foreground color: #b8862f, background color: #fbf7ec, font size: 8.6pt (11.52px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#f0ede2",
                "bgColor": "#fbf7ec",
                "contrastRatio": 1.09,
                "fontSize": "211.2pt (281.6px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "3:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<section class=\"alumni\" id=\"alumni\" aria-labelledby=\"alumni-h\">",
                  "target": [
                    "#alumni"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 1.09 (foreground color: #f0ede2, background color: #fbf7ec, font size: 211.2pt (281.6px), font weight: normal). Expected contrast ratio of 3:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"ghost\" style=\"bottom:-6%;left:2%\">\u201993</span>",
          "target": [
            "#alumni > .ghost"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 1.09 (foreground color: #f0ede2, background color: #fbf7ec, font size: 211.2pt (281.6px), font weight: normal). Expected contrast ratio of 3:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b8862f",
                "bgColor": "#f4eee0",
                "contrastRatio": 2.79,
                "fontSize": "8.6pt (11.52px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<body>",
                  "target": [
                    "body"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 2.79 (foreground color: #b8862f, background color: #f4eee0, font size: 8.6pt (11.52px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<p class=\"s-kicker mono\">\u00a7 01 \u00b7 Programs</p>",
          "target": [
            ".prog-sticky > .s-head > .s-kicker.mono"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 2.79 (foreground color: #b8862f, background color: #f4eee0, font size: 8.6pt (11.52px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b8862f",
                "bgColor": "#f4eee0",
                "contrastRatio": 2.79,
                "fontSize": "39.6pt (52.8px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "3:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<body>",
                  "target": [
                    "body"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 2.79 (foreground color: #b8862f, background color: #f4eee0, font size: 39.6pt (52.8px), font weight: normal). Expected contrast ratio of 3:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"it\">Index</span>",
          "target": [
            "#programs-h > .it"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 2.79 (foreground color: #b8862f, background color: #f4eee0, font size: 39.6pt (52.8px), font weight: normal). Expected contrast ratio of 3:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b8862f",
                "bgColor": "#f4eee0",
                "contrastRatio": 2.79,
                "fontSize": "8.4pt (11.2px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<body>",
                  "target": [
                    "body"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 2.79 (foreground color: #b8862f, background color: #f4eee0, font size: 8.4pt (11.2px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"prog-code\">BA-ENG</span>",
          "target": [
            ".prog[href$=\"#planner\"]:nth-child(1) > .prog-code"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 2.79 (foreground color: #b8862f, background color: #f4eee0, font size: 8.4pt (11.2px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b8862f",
                "bgColor": "#f4eee0",
                "contrastRatio": 2.79,
                "fontSize": "8.4pt (11.2px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<body>",
                  "target": [
                    "body"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 2.79 (foreground color: #b8862f, background color: #f4eee0, font size: 8.4pt (11.2px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"prog-code\">BSC-CPB</span>",
          "target": [
            ".prog[href$=\"#planner\"]:nth-child(2) > .prog-code"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 2.79 (foreground color: #b8862f, background color: #f4eee0, font size: 8.4pt (11.2px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b8862f",
                "bgColor": "#f4eee0",
                "contrastRatio": 2.79,
                "fontSize": "8.4pt (11.2px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<body>",
                  "target": [
                    "body"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 2.79 (foreground color: #b8862f, background color: #f4eee0, font size: 8.4pt (11.2px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"prog-code\">BARCH</span>",
          "target": [
            ".prog[href$=\"#planner\"]:nth-child(3) > .prog-code"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 2.79 (foreground color: #b8862f, background color: #f4eee0, font size: 8.4pt (11.2px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b8862f",
                "bgColor": "#f4eee0",
                "contrastRatio": 2.79,
                "fontSize": "8.4pt (11.2px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<body>",
                  "target": [
                    "body"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 2.79 (foreground color: #b8862f, background color: #f4eee0, font size: 8.4pt (11.2px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"prog-code\">BA-PPE</span>",
          "target": [
            ".prog[href$=\"#planner\"]:nth-child(4) > .prog-code"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 2.79 (foreground color: #b8862f, background color: #f4eee0, font size: 8.4pt (11.2px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b8862f",
                "bgColor": "#f4eee0",
                "contrastRatio": 2.79,
                "fontSize": "8.4pt (11.2px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<body>",
                  "target": [
                    "body"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 2.79 (foreground color: #b8862f, background color: #f4eee0, font size: 8.4pt (11.2px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"prog-code\">MSC-DSE</span>",
          "target": [
            ".prog[href$=\"#planner\"]:nth-child(5) > .prog-code"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 2.79 (foreground color: #b8862f, background color: #f4eee0, font size: 8.4pt (11.2px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b8862f",
                "bgColor": "#f4eee0",
                "contrastRatio": 2.79,
                "fontSize": "8.4pt (11.2px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<body>",
                  "target": [
                    "body"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 2.79 (foreground color: #b8862f, background color: #f4eee0, font size: 8.4pt (11.2px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"prog-code\">BSC-NUR</span>",
          "target": [
            ".prog[href$=\"#planner\"]:nth-child(6) > .prog-code"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 2.79 (foreground color: #b8862f, background color: #f4eee0, font size: 8.4pt (11.2px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b8862f",
                "bgColor": "#f4eee0",
                "contrastRatio": 2.79,
                "fontSize": "8.4pt (11.2px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<body>",
                  "target": [
                    "body"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 2.79 (foreground color: #b8862f, background color: #f4eee0, font size: 8.4pt (11.2px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"prog-code\">MA-HIS</span>",
          "target": [
            ".prog[href$=\"#planner\"]:nth-child(7) > .prog-code"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 2.79 (foreground color: #b8862f, background color: #f4eee0, font size: 8.4pt (11.2px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#8f9c8e",
                "bgColor": "#14382a",
                "contrastRatio": 4.49,
                "fontSize": "7.7pt (10.24px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<button type=\"button\" class=\"mod\" aria-pressed=\"false\">",
                  "target": [
                    ".mod[type=\"button\"]:nth-child(1)"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 4.49 (foreground color: #8f9c8e, background color: #14382a, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"mod-seats\">14 seats left</span>",
          "target": [
            ".mod[type=\"button\"]:nth-child(1) > span:nth-child(2) > .mod-top > .mod-seats"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 4.49 (foreground color: #8f9c8e, background color: #14382a, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#8f9c8e",
                "bgColor": "#14382a",
                "contrastRatio": 4.49,
                "fontSize": "7.7pt (10.24px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<button type=\"button\" class=\"mod\" aria-pressed=\"false\">",
                  "target": [
                    ".mod[type=\"button\"]:nth-child(2)"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 4.49 (foreground color: #8f9c8e, background color: #14382a, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"mod-seats\">22 seats left</span>",
          "target": [
            ".mod[type=\"button\"]:nth-child(2) > span:nth-child(2) > .mod-top > .mod-seats"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 4.49 (foreground color: #8f9c8e, background color: #14382a, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#8f9c8e",
                "bgColor": "#14382a",
                "contrastRatio": 4.49,
                "fontSize": "7.7pt (10.24px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<button type=\"button\" class=\"mod\" aria-pressed=\"false\">",
                  "target": [
                    ".mod[type=\"button\"]:nth-child(4)"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 4.49 (foreground color: #8f9c8e, background color: #14382a, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"mod-seats\">18 seats left</span>",
          "target": [
            ".mod[type=\"button\"]:nth-child(4) > span:nth-child(2) > .mod-top > .mod-seats"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 4.49 (foreground color: #8f9c8e, background color: #14382a, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#8f9c8e",
                "bgColor": "#14382a",
                "contrastRatio": 4.49,
                "fontSize": "7.7pt (10.24px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<button type=\"button\" class=\"mod\" aria-pressed=\"false\">",
                  "target": [
                    ".mod[type=\"button\"]:nth-child(5)"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 4.49 (foreground color: #8f9c8e, background color: #14382a, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"mod-seats\">11 seats left</span>",
          "target": [
            ".mod[type=\"button\"]:nth-child(5) > span:nth-child(2) > .mod-top > .mod-seats"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 4.49 (foreground color: #8f9c8e, background color: #14382a, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#8f9c8e",
                "bgColor": "#14382a",
                "contrastRatio": 4.49,
                "fontSize": "7.7pt (10.24px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<button type=\"button\" class=\"mod\" aria-pressed=\"false\">",
                  "target": [
                    ".mod[type=\"button\"]:nth-child(7)"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 4.49 (foreground color: #8f9c8e, background color: #14382a, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"mod-seats\">16 seats left</span>",
          "target": [
            ".mod[type=\"button\"]:nth-child(7) > span:nth-child(2) > .mod-top > .mod-seats"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 4.49 (foreground color: #8f9c8e, background color: #14382a, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#8f9c8e",
                "bgColor": "#14382a",
                "contrastRatio": 4.49,
                "fontSize": "7.7pt (10.24px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<button type=\"button\" class=\"mod\" aria-pressed=\"false\">",
                  "target": [
                    ".mod[type=\"button\"]:nth-child(8)"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 4.49 (foreground color: #8f9c8e, background color: #14382a, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"mod-seats\">25 seats left</span>",
          "target": [
            ".mod[type=\"button\"]:nth-child(8) > span:nth-child(2) > .mod-top > .mod-seats"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 4.49 (foreground color: #8f9c8e, background color: #14382a, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#8f9c8e",
                "bgColor": "#14382a",
                "contrastRatio": 4.49,
                "fontSize": "7.7pt (10.24px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<button type=\"button\" class=\"mod\" aria-pressed=\"false\">",
                  "target": [
                    ".mod[type=\"button\"]:nth-child(9)"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 4.49 (foreground color: #8f9c8e, background color: #14382a, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"mod-seats\">12 seats left</span>",
          "target": [
            ".mod[type=\"button\"]:nth-child(9) > span:nth-child(2) > .mod-top > .mod-seats"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 4.49 (foreground color: #8f9c8e, background color: #14382a, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#8f9c8e",
                "bgColor": "#14382a",
                "contrastRatio": 4.49,
                "fontSize": "7.7pt (10.24px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<button type=\"button\" class=\"mod\" aria-pressed=\"false\">",
                  "target": [
                    ".mod[type=\"button\"]:nth-child(10)"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 4.49 (foreground color: #8f9c8e, background color: #14382a, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"mod-seats\">10 seats left</span>",
          "target": [
            ".mod[type=\"button\"]:nth-child(10) > span:nth-child(2) > .mod-top > .mod-seats"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 4.49 (foreground color: #8f9c8e, background color: #14382a, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#8f9c8e",
                "bgColor": "#14382a",
                "contrastRatio": 4.49,
                "fontSize": "7.7pt (10.24px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<button type=\"button\" class=\"mod\" aria-pressed=\"false\">",
                  "target": [
                    ".mod[type=\"button\"]:nth-child(11)"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 4.49 (foreground color: #8f9c8e, background color: #14382a, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"mod-seats\">13 seats left</span>",
          "target": [
            ".mod[type=\"button\"]:nth-child(11) > span:nth-child(2) > .mod-top > .mod-seats"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 4.49 (foreground color: #8f9c8e, background color: #14382a, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b8862f",
                "bgColor": "#fbf7ec",
                "contrastRatio": 3.02,
                "fontSize": "7.4pt (9.92px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<aside class=\"plan-panel in\" data-reveal=\"\" style=\"--d:.15s\" aria-label=\"Your semester summary\">",
                  "target": [
                    ".plan-panel"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.02 (foreground color: #b8862f, 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=\"sub\">Michaelmas Term \u00b7 2026</span>",
          "target": [
            ".plan-panel > .sub"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.02 (foreground color: #b8862f, 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": "#b8862f",
                "bgColor": "#fbf7ec",
                "contrastRatio": 3.02,
                "fontSize": "8.6pt (11.52px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<section class=\"campus\" id=\"campus-life\" aria-labelledby=\"campus-h\">",
                  "target": [
                    "#campus-life"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.02 (foreground color: #b8862f, background color: #fbf7ec, font size: 8.6pt (11.52px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<p class=\"s-kicker mono\">\u00a7 03 \u00b7 Campus Life</p>",
          "target": [
            ".campus-sticky > .s-head > .s-kicker.mono"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.02 (foreground color: #b8862f, background color: #fbf7ec, font size: 8.6pt (11.52px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b8862f",
                "bgColor": "#fffdf6",
                "contrastRatio": 3.17,
                "fontSize": "7.2pt (9.6px)",
                "fontWeight": "bold",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<figure class=\"ci in\" data-reveal=\"\" style=\"--d:.1s\"><div class=\"kb\"><img src=\"https://picsum.photos/seed/campus-societies/760/570\" alt=\"Society fair under the arcade\" width=\"760\" height=\"570\"></div><figcaption><b>Plate II</b> Freshers\u2019 Fayre</figcaption></figure>",
                  "target": [
                    ".ci:nth-child(2)"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.17 (foreground color: #b8862f, background color: #fffdf6, font size: 7.2pt (9.6px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<b>Plate II</b>",
          "target": [
            ".ci:nth-child(2) > figcaption > b"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.17 (foreground color: #b8862f, background color: #fffdf6, font size: 7.2pt (9.6px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b8862f",
                "bgColor": "#fffdf6",
                "contrastRatio": 3.17,
                "fontSize": "7.2pt (9.6px)",
                "fontWeight": "bold",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<figure class=\"ci in\" data-reveal=\"\" style=\"--d:.15s\"><div class=\"kb\"><img src=\"https://picsum.photos/seed/campus-boathouse/760/950\" alt=\"Rowers launching from the boathouse\" width=\"760\" height=\"950\"></div><figcaption><b>Plate III</b> The Boathouse</figcaption></figure>",
                  "target": [
                    ".ci:nth-child(3)"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.17 (foreground color: #b8862f, background color: #fffdf6, font size: 7.2pt (9.6px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<b>Plate III</b>",
          "target": [
            ".ci:nth-child(3) > figcaption > b"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.17 (foreground color: #b8862f, background color: #fffdf6, font size: 7.2pt (9.6px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b8862f",
                "bgColor": "#fffdf6",
                "contrastRatio": 3.17,
                "fontSize": "7.2pt (9.6px)",
                "fontWeight": "bold",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<figure class=\"ci in\" data-reveal=\"\" style=\"--d:.2s\"><div class=\"kb\"><img src=\"https://picsum.photos/seed/campus-city/760/570\" alt=\"Calderford market square\" width=\"760\" height=\"570\"></div><figcaption><b>Plate IV</b> Market Square</figcaption></figure>",
                  "target": [
                    ".ci:nth-child(4)"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.17 (foreground color: #b8862f, background color: #fffdf6, font size: 7.2pt (9.6px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<b>Plate IV</b>",
          "target": [
            ".ci:nth-child(4) > figcaption > b"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.17 (foreground color: #b8862f, background color: #fffdf6, font size: 7.2pt (9.6px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b8862f",
                "bgColor": "#f4eee0",
                "contrastRatio": 2.79,
                "fontSize": "8.6pt (11.52px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<body>",
                  "target": [
                    "body"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 2.79 (foreground color: #b8862f, background color: #f4eee0, font size: 8.6pt (11.52px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<p class=\"s-kicker mono\">\u00a7 04 \u00b7 Financial Aid</p>",
          "target": [
            "#aid > .wrap > .s-head.in[data-reveal=\"\"] > .s-kicker.mono"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 2.79 (foreground color: #b8862f, background color: #f4eee0, font size: 8.6pt (11.52px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b8862f",
                "bgColor": "#f4eee0",
                "contrastRatio": 2.79,
                "fontSize": "39.6pt (52.8px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "3:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<body>",
                  "target": [
                    "body"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 2.79 (foreground color: #b8862f, background color: #f4eee0, font size: 39.6pt (52.8px), font weight: normal). Expected contrast ratio of 3:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"it\">wait on circumstance.</span>",
          "target": [
            "#aid-h > .it"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 2.79 (foreground color: #b8862f, background color: #f4eee0, font size: 39.6pt (52.8px), font weight: normal). Expected contrast ratio of 3:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#818c80",
                "bgColor": "#0e2a1f",
                "contrastRatio": 4.37,
                "fontSize": "8.4pt (11.2px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<div class=\"calc in\" data-reveal=\"\" style=\"--d:.15s\" id=\"calc\">",
                  "target": [
                    "#calc"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 4.37 (foreground color: #818c80, background color: #0e2a1f, font size: 8.4pt (11.2px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<p class=\"calc-disc\">Indicative only. Final awards are confirmed in writing by the Aid Office after enrolment. Tuition for 2026 entry: \u00a39,250 (Home undergraduates).</p>",
          "target": [
            ".calc-disc"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 4.37 (foreground color: #818c80, background color: #0e2a1f, font size: 8.4pt (11.2px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b8862f",
                "bgColor": "#f4eee0",
                "contrastRatio": 2.79,
                "fontSize": "8.6pt (11.52px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<section class=\"library\" id=\"library\" aria-labelledby=\"lib-h\">",
                  "target": [
                    "#library"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 2.79 (foreground color: #b8862f, background color: #f4eee0, font size: 8.6pt (11.52px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<p class=\"s-kicker mono\">\u00a7 05 \u00b7 Library &amp; Research</p>",
          "target": [
            "#library > .wrap > .s-head.in[data-reveal=\"\"] > .s-kicker.mono"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 2.79 (foreground color: #b8862f, background color: #f4eee0, font size: 8.6pt (11.52px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b8862f",
                "bgColor": "#f4eee0",
                "contrastRatio": 2.79,
                "fontSize": "39.6pt (52.8px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "3:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<section class=\"library\" id=\"library\" aria-labelledby=\"lib-h\">",
                  "target": [
                    "#library"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 2.79 (foreground color: #b8862f, background color: #f4eee0, font size: 39.6pt (52.8px), font weight: normal). Expected contrast ratio of 3:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"it\">really closes.</span>",
          "target": [
            "#lib-h > .it"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 2.79 (foreground color: #b8862f, background color: #f4eee0, font size: 39.6pt (52.8px), font weight: normal). Expected contrast ratio of 3:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b8862f",
                "bgColor": "#fbf7ec",
                "contrastRatio": 3.02,
                "fontSize": "8.6pt (11.52px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<div class=\"side-box\">",
                  "target": [
                    ".side-box:nth-child(1)"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.02 (foreground color: #b8862f, background color: #fbf7ec, font size: 8.6pt (11.52px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"mono\">Events calendar</span>",
          "target": [
            ".side-box:nth-child(1) > .mono"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.02 (foreground color: #b8862f, background color: #fbf7ec, font size: 8.6pt (11.52px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b8862f",
                "bgColor": "#fbf7ec",
                "contrastRatio": 3.02,
                "fontSize": "8.6pt (11.52px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<div class=\"side-box\">",
                  "target": [
                    ".side-box:nth-child(2)"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.02 (foreground color: #b8862f, background color: #fbf7ec, font size: 8.6pt (11.52px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"mono\">Student success stories</span>",
          "target": [
            ".side-box:nth-child(2) > .mono"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.02 (foreground color: #b8862f, background color: #fbf7ec, font size: 8.6pt (11.52px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b8862f",
                "bgColor": "#fbf7ec",
                "contrastRatio": 3.02,
                "fontSize": "8.6pt (11.52px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<div class=\"side-box\">",
                  "target": [
                    ".side-box:nth-child(3)"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.02 (foreground color: #b8862f, background color: #fbf7ec, font size: 8.6pt (11.52px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"mono\">Quick links</span>",
          "target": [
            ".side-box:nth-child(3) > .mono"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.02 (foreground color: #b8862f, background color: #fbf7ec, font size: 8.6pt (11.52px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b8862f",
                "bgColor": "#fbf7ec",
                "contrastRatio": 3.02,
                "fontSize": "8.6pt (11.52px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<section class=\"alumni\" id=\"alumni\" aria-labelledby=\"alumni-h\">",
                  "target": [
                    "#alumni"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.02 (foreground color: #b8862f, background color: #fbf7ec, font size: 8.6pt (11.52px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<p class=\"s-kicker mono\">\u00a7 06 \u00b7 Alumni Network</p>",
          "target": [
            "#alumni > .wrap > .s-head.in[data-reveal=\"\"] > .s-kicker.mono"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.02 (foreground color: #b8862f, background color: #fbf7ec, font size: 8.6pt (11.52px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b8862f",
                "bgColor": "#f4eee0",
                "contrastRatio": 2.79,
                "fontSize": "8.6pt (11.52px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<body>",
                  "target": [
                    "body"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 2.79 (foreground color: #b8862f, background color: #f4eee0, font size: 8.6pt (11.52px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<p class=\"s-kicker mono\">\u00a7 07 \u00b7 Admissions</p>",
          "target": [
            ".faq-side > .s-head > .s-kicker.mono"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 2.79 (foreground color: #b8862f, background color: #f4eee0, font size: 8.6pt (11.52px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b8862f",
                "bgColor": "#f4eee0",
                "contrastRatio": 2.79,
                "fontSize": "39.6pt (52.8px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "3:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<body>",
                  "target": [
                    "body"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 2.79 (foreground color: #b8862f, background color: #f4eee0, font size: 39.6pt (52.8px), font weight: normal). Expected contrast ratio of 3:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"it\">answered.</span>",
          "target": [
            "#faq-h > .it"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 2.79 (foreground color: #b8862f, background color: #f4eee0, font size: 39.6pt (52.8px), font weight: normal). Expected contrast ratio of 3:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#b8862f",
                "bgColor": "#fbf7ec",
                "contrastRatio": 3.02,
                "fontSize": "10.2pt (13.6px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<div class=\"contact-mini\">",
                  "target": [
                    ".contact-mini"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.02 (foreground color: #b8862f, background color: #fbf7ec, font size: 10.2pt (13.6px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<p class=\"mono\" style=\"color:var(--brass)\">Still unsure?</p>",
          "target": [
            ".contact-mini > .mono"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.02 (foreground color: #b8862f, background color: #fbf7ec, font size: 10.2pt (13.6px), font weight: normal). Expected contrast ratio of 4.5:1"
        }
      ]
    },
    {
      "id": "target-size",
      "impact": "serious",
      "tags": [
        "cat.sensory-and-visual-cues",
        "wcag22aa",
        "wcag258"
      ],
      "description": "Ensure touch targets have sufficient size and space",
      "help": "All touch targets must be 24px large, or leave sufficient space",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/target-size?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "target-size",
              "data": {
                "messageKey": "partiallyObscured",
                "minSize": 24,
                "width": 316.2,
                "height": 17
              },
              "relatedNodes": [
                {
                  "html": "<a href=\"#aid\">Financial Aid</a>",
                  "target": [
                    ".nav > a[href$=\"#aid\"]"
                  ]
                },
                {
                  "html": "<a href=\"#alumni\">Alumni</a>",
                  "target": [
                    ".nav > a[href$=\"#alumni\"]"
                  ]
                },
                {
                  "html": "<a class=\"btn btn-sm head-cta\" href=\"#visit\">Apply 2026 <span class=\"ar\">\u2192</span></a>",
                  "target": [
                    ".head-cta"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Target has insufficient size because it is partially obscured (smallest space is 316.2px by 17px, should be at least 24px by 24px)"
            },
            {
              "id": "target-offset",
              "data": {
                "closestOffset": 3.2,
                "minOffset": 24
              },
              "relatedNodes": [
                {
                  "html": "<a href=\"#library\">Library catalogue <span>\u2197</span></a>",
                  "target": [
                    "li:nth-child(1) > a[href$=\"#library\"]"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 3.2px instead of at least 24px."
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<a href=\"#library\">Book a study room <span>\u2192</span></a>",
          "target": [
            ".ql > li:nth-child(2) > a[href$=\"#library\"]"
          ],
          "failureSummary": "Fix any of the following:\n  Target has insufficient size because it is partially obscured (smallest space is 316.2px by 17px, should be at least 24px by 24px)\n  Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 3.2px instead of at least 24px."
        },
        {
          "any": [
            {
              "id": "target-size",
              "data": {
                "messageKey": "partiallyObscured",
                "minSize": 24,
                "width": 316.2,
                "height": 23.2
              },
              "relatedNodes": [
                {
                  "html": "<a href=\"#aid\">Financial Aid</a>",
                  "target": [
                    ".nav > a[href$=\"#aid\"]"
                  ]
                },
                {
                  "html": "<a href=\"#alumni\">Alumni</a>",
                  "target": [
                    ".nav > a[href$=\"#alumni\"]"
                  ]
                },
                {
                  "html": "<a class=\"btn btn-sm head-cta\" href=\"#visit\">Apply 2026 <span class=\"ar\">\u2192</span></a>",
                  "target": [
                    ".head-cta"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Target has insufficient size because it is partially obscured (smallest space is 316.2px by 23.2px, should be at least 24px by 24px)"
            },
            {
              "id": "target-offset",
              "data": {
                "closestOffset": 8.4,
                "minOffset": 24
              },
              "relatedNodes": [
                {
                  "html": "<a href=\"#planner\">Academic skills toolkit <span>\u2192</span></a>",
                  "target": [
                    "li:nth-child(4) > a[href$=\"#planner\"]"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 8.4px instead of at least 24px."
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<a href=\"#library\">Inter-library loan <span>\u2192</span></a>",
          "target": [
            "li:nth-child(3) > a[href$=\"#library\"]"
          ],
          "failureSummary": "Fix any of the following:\n  Target has insufficient size because it is partially obscured (smallest space is 316.2px by 23.2px, should be at least 24px by 24px)\n  Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 8.4px instead of at least 24px."
        }
      ]
    }
  ],
  "coverage": {
    "contract": "main-document-vertical-scroll",
    "complete": true,
    "positions": [
      {
        "y": 0,
        "height": 11925
      },
      {
        "y": 576,
        "height": 11925
      },
      {
        "y": 1152,
        "height": 11925
      },
      {
        "y": 1728,
        "height": 11925
      },
      {
        "y": 2304,
        "height": 11925
      },
      {
        "y": 2880,
        "height": 11925
      },
      {
        "y": 3456,
        "height": 11925
      },
      {
        "y": 4032,
        "height": 11925
      },
      {
        "y": 4608,
        "height": 11925
      },
      {
        "y": 5184,
        "height": 11925
      },
      {
        "y": 5760,
        "height": 11925
      },
      {
        "y": 6336,
        "height": 11925
      },
      {
        "y": 6912,
        "height": 11925
      },
      {
        "y": 7488,
        "height": 11925
      },
      {
        "y": 8064,
        "height": 11925
      },
      {
        "y": 8640,
        "height": 11925
      },
      {
        "y": 9216,
        "height": 11925
      },
      {
        "y": 9792,
        "height": 11925
      },
      {
        "y": 10368,
        "height": 11925
      },
      {
        "y": 10944,
        "height": 11925
      },
      {
        "y": 11205,
        "height": 11925
      }
    ],
    "scans": 22,
    "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 "Education" 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: "Education"
- Description: Educational resources, school and university information, and online learning platforms.

**Your Creative Task:**
1.  **Invent:** Create a unique, professional-sounding site name and a strong tagline fitting the "Education" 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: "Campus Life", "Programs", "Library".
-   **MAIN CONTENT:** Structure this area with **at least 3-4 distinct, well-developed sections**.
    -   Address key topics relevant to the "Education" category. Consider themes similar to: "Alumni Network", "Campus Life", "Financial Aid".
    -   **Content Depth:** Populate each section with **substantial, realistic text** (multiple sentences/paragraphs). Use authentic industry language and terminology like: "syllabus", "dissertation", "thesis".
    -   **Visuals:** Integrate relevant placeholder images logically within the content sections.
    -   **Calls to Action:** Include clear and contextually relevant CTAs. Use strong verbs similar to: "Explore Programs", "Calculate Aid", "Visit Campus".
-   **ENGAGEMENT (Recommended):** Strongly consider incorporating **one meaningful interactive element** that would genuinely benefit a user in the "Education" sector. Ideas similar but not limited to: "course planner".
-   **SIDEBAR (Optional):** If your design includes a sidebar, populate it with **useful, relevant content**. Ideas: "research updates", "student success stories", "events calendar".
-   **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.