Qwen Qwen3.8 Omni Flash – Non Profit Charity
via Alibaba · Generated
- AIMAC Debt 13.28
- Cost $0.026
- Total Violations 94
- HTML Size 137 KB
- Em Dashes 53
Screenshot
View Live Page
Accessibility Issues Found
94 Serious
-
aria-progressbar-name serious 1 instance
ARIA progressbar nodes must have an accessible name
Example HTML
<div class="tank" role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="70.6" id="th-bar"> <i class="water" id="th-... -
color-contrast serious 90 instances
Elements must meet minimum color contrast ratio thresholds
Example HTML
<p class="mono" style="font-size:.62rem;letter-spacing:.11em;text-transform:uppercase;color:rgba(246,241,231,.42);margin-top:1rem">Audited by Rukwa... -
scrollable-region-focusable serious 1 instance
Scrollable region must have keyboard access
Example HTML
<ul class="feed" id="feed"> -
target-size serious 2 instances
All touch targets must be 24px large, or leave sufficient space
Example HTML
<a href="tel:+16515550147">+1 (651) 555-0147</a>
Artifacts
View Generated HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Keepwell Foundation — Rural water that keeps running</title>
<meta name="description" content="Keepwell Foundation funds the unglamorous half of rural water: spare parts, trained mechanics, quarterly lab tests and the public ledger that proves the pump is still pumping ten years on.">
<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..900;1,9..144,300..900&family=Karla:ital,wght@0,300..800;1,300..600&family=IBM+Plex+Mono:wght@400;500;600&display=swap" rel="stylesheet">
<style>
/* ============================================================
KEEPWELL FOUNDATION — design system
Palette: silt ink, paper, borehole teal, ochre, clay, moss
Display: Fraunces · Body: Karla · Data: IBM Plex Mono
============================================================ */
:root{
--ink:#0F1D1A;
--ink-2:#152B26;
--ink-3:#1D3A33;
--paper:#F6F1E7;
--paper-2:#EDE5D6;
--sand:#DFD3BC;
--teal:#1E6A6E;
--teal-bright:#2E9A9E;
--teal-pale:#9FCBCB;
--ochre:#C8752A;
--ochre-lt:#E4A24B;
--clay:#A2412C;
--moss:#7A8F53;
--line:rgba(15,29,26,.14);
--line-d:rgba(246,241,231,.14);
--hh:76px;
--shadow-1:0 1px 0 rgba(15,29,26,.06), 0 10px 30px -18px rgba(15,29,26,.5);
--shadow-2:0 24px 60px -30px rgba(15,29,26,.55);
--serif:'Fraunces',Georgia,'Times New Roman',serif;
--sans:'Karla',system-ui,-apple-system,'Segoe UI',sans-serif;
--mono:'IBM Plex Mono',ui-monospace,'SF Mono',Menlo,monospace;
--maxw:1320px;
}
*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
@media (prefers-reduced-motion:no-preference){html{scroll-behavior:smooth}}
body{
margin:0;background:var(--paper);color:var(--ink);
font-family:var(--sans);font-size:17px;line-height:1.62;font-weight:400;
-webkit-font-smoothing:antialiased;overflow-x:hidden;
}
/* film-grain overlay */
body::after{
content:"";position:fixed;inset:0;z-index:9998;pointer-events:none;opacity:.055;
mix-blend-mode:multiply;
background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
}
img{max-width:100%;display:block}
a{color:inherit}
button,input,select{font:inherit;color:inherit}
h1,h2,h3,h4{font-family:var(--serif);font-weight:600;margin:0;line-height:1.04;letter-spacing:-.015em;
font-variation-settings:'SOFT' 20,'WONK' 1,'opsz' 60}
p{margin:0 0 1.05em}
p:last-child{margin-bottom:0}
::selection{background:var(--ochre);color:var(--paper)}
.wrap{width:min(100% - 2.5rem,var(--maxw));margin-inline:auto}
.wrap-n{width:min(100% - 2.5rem,1080px);margin-inline:auto}
.mono{font-family:var(--mono);font-variant-numeric:tabular-nums}
.eyebrow{
font-family:var(--mono);font-size:.68rem;letter-spacing:.22em;text-transform:uppercase;
font-weight:500;display:inline-flex;align-items:center;gap:.6rem;color:var(--teal);
}
.eyebrow::before{content:"";width:26px;height:1px;background:currentColor;opacity:.6}
.dark .eyebrow{color:var(--teal-pale)}
.lede{font-size:1.16rem;line-height:1.68;color:rgba(15,29,26,.82)}
.dark .lede{color:rgba(246,241,231,.78)}
.skip{position:absolute;left:-9999px;top:0;background:var(--ink);color:var(--paper);padding:.8rem 1.2rem;z-index:999}
.skip:focus{left:1rem;top:1rem}
:focus-visible{outline:2px solid var(--ochre);outline-offset:3px;border-radius:2px}
/* ---------- buttons ---------- */
.btn{
--bg:var(--ink);--fg:var(--paper);
display:inline-flex;align-items:center;gap:.6rem;justify-content:center;
background:var(--bg);color:var(--fg);border:1px solid transparent;
padding:.82rem 1.4rem;font-weight:700;font-size:.9rem;letter-spacing:.02em;
text-decoration:none;cursor:pointer;position:relative;overflow:hidden;
border-radius:2px;transition:transform .25s cubic-bezier(.2,.8,.3,1),box-shadow .25s,background .25s;
}
.btn span{position:relative;z-index:2}
.btn::before{content:"";position:absolute;inset:0;background:var(--ochre);transform:translateY(101%);transition:transform .38s cubic-bezier(.2,.8,.3,1);z-index:1}
.btn:hover::before{transform:translateY(0)}
.btn:hover{transform:translateY(-2px);box-shadow:0 14px 26px -16px rgba(15,29,26,.8)}
.btn:active{transform:translateY(0)}
.btn-ochre{--bg:var(--ochre);--fg:#1A0E03}
.btn-ochre::before{background:var(--ink);}
.btn-ochre:hover span{color:var(--paper)}
.btn-ghost{--bg:transparent;--fg:var(--ink);border-color:rgba(15,29,26,.3)}
.btn-ghost:hover span{color:var(--paper)}
.dark .btn-ghost{--fg:var(--paper);border-color:rgba(246,241,231,.32)}
.dark .btn-ghost::before{background:var(--paper)}
.dark .btn-ghost:hover span{color:var(--ink)}
.btn-lg{padding:1.05rem 1.9rem;font-size:1rem}
.arrow{transition:transform .3s}
.btn:hover .arrow{transform:translateX(4px)}
/* ---------- header ---------- */
.site-head{
position:sticky;top:0;z-index:100;background:var(--paper);
border-bottom:1px solid var(--line);transition:box-shadow .3s,background .3s;
}
.site-head.stuck{box-shadow:0 10px 30px -24px rgba(15,29,26,.9)}
.head-inner{display:flex;align-items:center;gap:1.4rem;height:var(--hh)}
.brand{display:flex;align-items:center;gap:.75rem;text-decoration:none;flex:0 0 auto}
.brand-mark{width:44px;height:44px;border-radius:50% 50% 50% 4px;object-fit:cover;
box-shadow:0 0 0 1px rgba(15,29,26,.18), 0 6px 14px -8px rgba(15,29,26,.8);flex:0 0 auto}
.brand-text strong{display:block;font-family:var(--serif);font-size:1.18rem;letter-spacing:-.02em;line-height:1.05}
.brand-text em{display:block;font-style:normal;font-family:var(--mono);font-size:.6rem;
letter-spacing:.18em;text-transform:uppercase;color:var(--teal);margin-top:.24rem}
.main-nav{display:flex;align-items:center;gap:.15rem;margin-left:auto}
.main-nav a{
text-decoration:none;font-size:.86rem;font-weight:600;letter-spacing:.01em;padding:.5rem .62rem;
position:relative;color:rgba(15,29,26,.72);transition:color .2s;
}
.main-nav a::after{content:"";position:absolute;left:.62rem;right:.62rem;bottom:.15rem;height:1.5px;
background:var(--ochre);transform:scaleX(0);transform-origin:left;transition:transform .32s cubic-bezier(.2,.8,.3,1)}
.main-nav a:hover{color:var(--ink)}
.main-nav a:hover::after,.main-nav a.active::after{transform:scaleX(1)}
.main-nav a.active{color:var(--ink)}
.head-cta{display:flex;align-items:center;gap:.6rem;flex:0 0 auto}
.nav-toggle{display:none;background:none;border:1px solid var(--line);width:44px;height:40px;border-radius:2px;cursor:pointer;position:relative}
.nav-toggle i{position:absolute;left:11px;right:11px;height:1.6px;background:var(--ink);transition:transform .3s,opacity .3s}
.nav-toggle i:nth-child(1){top:13px}.nav-toggle i:nth-child(2){top:19px}.nav-toggle i:nth-child(3){top:25px}
body.menu-open .nav-toggle i:nth-child(1){transform:translateY(6px) rotate(45deg)}
body.menu-open .nav-toggle i:nth-child(2){opacity:0}
body.menu-open .nav-toggle i:nth-child(3){transform:translateY(-6px) rotate(-45deg)}
.progress-rail{position:absolute;left:0;right:0;bottom:-1px;height:2px;background:transparent}
.progress-rail i{display:block;height:100%;width:0;background:linear-gradient(90deg,var(--teal),var(--ochre))}
/* ---------- hero / water-point register ---------- */
.hero{position:relative;background:
radial-gradient(110% 90% at 88% -10%,rgba(46,154,158,.22),transparent 58%),
radial-gradient(80% 60% at 0% 100%,rgba(200,117,42,.16),transparent 62%),
repeating-linear-gradient(0deg,transparent 0 43px,rgba(246,241,231,.045) 43px 44px),
repeating-linear-gradient(90deg,transparent 0 43px,rgba(246,241,231,.045) 43px 44px),
var(--ink);
color:var(--paper);padding:clamp(2.6rem,6vw,4.6rem) 0 0;overflow:hidden}
.hero-grid{display:grid;grid-template-columns:minmax(0,.92fr) minmax(0,1.08fr);gap:clamp(2rem,4vw,3.6rem);align-items:start}
h1.hero-title{font-size:clamp(2.6rem,5.4vw,4.5rem);line-height:.98;letter-spacing:-.03em;margin:1.4rem 0 1.5rem;font-weight:600}
h1.hero-title em{font-style:italic;color:var(--ochre-lt);font-variation-settings:'SOFT' 60,'WONK' 1}
.ln{display:block;overflow:hidden;padding-bottom:.06em}
.ln>i{display:block;font-style:inherit;transform:translateY(115%);transition:transform 1s cubic-bezier(.16,.9,.24,1)}
.revealed .ln>i{transform:translateY(0)}
.ln:nth-child(2)>i{transition-delay:.09s}
.ln:nth-child(3)>i{transition-delay:.18s}
.hero-copy p{max-width:52ch}
.hero-actions{display:flex;flex-wrap:wrap;gap:.8rem;margin:1.9rem 0 2.2rem}
.trust-row{display:flex;flex-wrap:wrap;gap:1.6rem;padding-top:1.5rem;border-top:1px solid var(--line-d)}
.trust-item{min-width:112px}
.trust-item b{display:block;font-family:var(--mono);font-size:1.32rem;letter-spacing:-.02em;color:var(--paper);font-weight:500}
.trust-item span{display:block;font-size:.72rem;letter-spacing:.13em;text-transform:uppercase;color:rgba(246,241,231,.5);margin-top:.2rem}
.stars{color:var(--ochre-lt);letter-spacing:.14em;font-size:.8rem}
/* board */
.board{
background:linear-gradient(180deg,rgba(246,241,231,.07),rgba(246,241,231,.02));
border:1px solid var(--line-d);border-radius:4px;box-shadow:var(--shadow-2);overflow:hidden;
}
.board-head{display:flex;align-items:center;gap:.8rem;padding:.85rem 1.1rem;border-bottom:1px solid var(--line-d);
background:rgba(15,29,26,.35)}
.live-dot{width:8px;height:8px;border-radius:50%;background:var(--teal-bright);box-shadow:0 0 0 0 rgba(46,154,158,.7);animation:pulse 2.4s infinite}
@keyframes pulse{0%{box-shadow:0 0 0 0 rgba(46,154,158,.65)}70%{box-shadow:0 0 0 11px rgba(46,154,158,0)}100%{box-shadow:0 0 0 0 rgba(46,154,158,0)}}
.board-head .lbl{font-family:var(--mono);font-size:.68rem;letter-spacing:.2em;text-transform:uppercase;color:rgba(246,241,231,.72)}
.board-head .sync{margin-left:auto;font-family:var(--mono);font-size:.66rem;color:rgba(246,241,231,.45);letter-spacing:.08em}
.board-stats{display:grid;grid-template-columns:repeat(4,1fr);border-bottom:1px solid var(--line-d)}
.bstat{padding:.9rem 1.05rem;border-right:1px solid var(--line-d)}
.bstat:last-child{border-right:0}
.bstat b{display:block;font-family:var(--mono);font-size:clamp(1.1rem,2vw,1.5rem);font-weight:500;letter-spacing:-.02em;line-height:1}
.bstat span{display:block;font-size:.6rem;letter-spacing:.14em;text-transform:uppercase;color:rgba(246,241,231,.48);margin-top:.42rem}
.bstat.ok b{color:var(--teal-pale)}
.bstat.warn b{color:var(--ochre-lt)}
.bstat.bad b{color:#E58873}
.tiles{display:grid;grid-template-columns:repeat(auto-fill,minmax(58px,1fr));gap:6px;padding:1rem}
.tile{
position:relative;aspect-ratio:1.35/1;border:1px solid rgba(246,241,231,.13);border-radius:2px;
background:rgba(246,241,231,.04);cursor:pointer;padding:5px 6px;text-align:left;
display:flex;flex-direction:column;justify-content:space-between;
transition:transform .2s,border-color .2s,background .2s;font-family:var(--mono);
}
.tile:hover{transform:translateY(-3px) scale(1.03);border-color:rgba(246,241,231,.4);background:rgba(246,241,231,.09);z-index:3}
.tile[aria-pressed="true"]{border-color:var(--ochre);background:rgba(200,117,42,.16)}
.tile .tid{font-size:.56rem;letter-spacing:.02em;color:rgba(246,241,231,.62)}
.tile .tdot{width:9px;height:9px;border-radius:50%}
.s-ok .tdot{background:var(--teal-bright);box-shadow:0 0 8px rgba(46,154,158,.8)}
.s-svc .tdot{background:var(--ochre-lt);box-shadow:0 0 8px rgba(228,162,75,.6)}
.s-part .tdot{background:#E58873;box-shadow:0 0 8px rgba(229,136,115,.6)}
.s-off .tdot{background:#6E6259}
.tile.flash{animation:flash .9s ease}
@keyframes flash{0%{background:rgba(46,154,158,.5)}100%{background:rgba(246,241,231,.04)}}
.board-legend{display:flex;flex-wrap:wrap;gap:1rem;padding:.8rem 1.1rem;border-top:1px solid var(--line-d);
font-family:var(--mono);font-size:.62rem;letter-spacing:.1em;text-transform:uppercase;color:rgba(246,241,231,.55)}
.board-legend i{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:.4rem}
.detail{border-top:1px solid var(--line-d);background:rgba(15,29,26,.4);padding:1.05rem 1.15rem;min-height:172px}
.detail-top{display:flex;align-items:baseline;gap:.7rem;flex-wrap:wrap;margin-bottom:.8rem}
.detail-top h3{font-size:1.15rem;color:var(--paper)}
.chip{font-family:var(--mono);font-size:.6rem;letter-spacing:.14em;text-transform:uppercase;
padding:.24rem .5rem;border-radius:2px;border:1px solid currentColor}
.chip.ok{color:var(--teal-pale)}.chip.warn{color:var(--ochre-lt)}.chip.bad{color:#E58873}
.dl{display:grid;grid-template-columns:repeat(auto-fit,minmax(128px,1fr));gap:.75rem 1.2rem}
.dl div span{display:block;font-family:var(--mono);font-size:.58rem;letter-spacing:.13em;text-transform:uppercase;color:rgba(246,241,231,.42)}
.dl div b{display:block;font-size:.9rem;font-weight:600;color:var(--paper);margin-top:.1rem;letter-spacing:-.01em}
.detail p.note{font-size:.82rem;color:rgba(246,241,231,.55);margin:.85rem 0 0;font-style:italic}
/* ticker */
.ticker{margin-top:clamp(2rem,4vw,3.4rem);border-top:1px solid var(--line-d);border-bottom:1px solid var(--line-d);
background:rgba(15,29,26,.5);overflow:hidden;position:relative}
.ticker::before,.ticker::after{content:"";position:absolute;top:0;bottom:0;width:90px;z-index:2;pointer-events:none}
.ticker::before{left:0;background:linear-gradient(90deg,var(--ink),transparent)}
.ticker::after{right:0;background:linear-gradient(270deg,var(--ink),transparent)}
.ticker-track{display:flex;width:max-content;animation:marq 46s linear infinite}
.ticker:hover .ticker-track{animation-play-state:paused}
@keyframes marq{to{transform:translateX(-50%)}}
.ticker-track>span{display:inline-flex;align-items:center;gap:.55rem;padding:.72rem 1.5rem;
font-family:var(--mono);font-size:.72rem;letter-spacing:.04em;color:rgba(246,241,231,.62);white-space:nowrap}
.ticker-track>span b{color:var(--teal-pale);font-weight:500}
.ticker-track>span::after{content:"";width:5px;height:5px;background:var(--ochre);border-radius:50%;margin-left:1.2rem;opacity:.8}
/* ---------- generic section ---------- */
section{position:relative}
.pad{padding:clamp(3.6rem,8vw,7rem) 0}
.dark{background:var(--ink);color:var(--paper)}
.sec-head{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,.85fr);gap:2rem 3rem;align-items:end;margin-bottom:clamp(2.2rem,4vw,3.4rem)}
.sec-head h2{font-size:clamp(2rem,4.1vw,3.3rem);letter-spacing:-.028em;margin-top:1rem}
.sec-head h2 em{font-style:italic;color:var(--clay)}
.dark .sec-head h2 em{color:var(--ochre-lt)}
.rule{height:1px;background:var(--line);margin:0 0 clamp(2.4rem,4vw,3.4rem)}
.dark .rule{background:var(--line-d)}
/* reveal */
[data-reveal]{opacity:0;transform:translateY(26px);transition:opacity .85s cubic-bezier(.2,.7,.2,1),transform .85s cubic-bezier(.2,.7,.2,1)}
[data-reveal].revealed{opacity:1;transform:none}
/* ---------- impact / gap (sticky two-col) ---------- */
.two-sticky{display:grid;grid-template-columns:minmax(0,.82fr) minmax(0,1.18fr);gap:clamp(2rem,5vw,4.5rem);align-items:start}
.sticky-col{position:sticky;top:calc(var(--hh) + 2.2rem)}
.bigfig{font-family:var(--serif);font-size:clamp(4.4rem,11vw,8.2rem);line-height:.82;letter-spacing:-.05em;
font-weight:600;color:var(--clay);font-variation-settings:'SOFT' 40,'WONK' 1}
.bigfig sup{font-size:.28em;vertical-align:super;letter-spacing:0;font-family:var(--mono);font-weight:500}
.bigfig-cap{font-family:var(--mono);font-size:.72rem;letter-spacing:.16em;text-transform:uppercase;color:var(--teal);margin-top:1rem;display:block;max-width:24ch}
.stat-pair{display:flex;gap:1.6rem;margin-top:2.4rem;padding-top:1.6rem;border-top:1px solid var(--line)}
.stat-pair div b{display:block;font-family:var(--mono);font-size:1.6rem;letter-spacing:-.03em;line-height:1}
.stat-pair div span{font-size:.74rem;letter-spacing:.1em;text-transform:uppercase;color:rgba(15,29,26,.55);display:block;margin-top:.35rem}
.stat-pair .ours b{color:var(--teal)}
.flow>p{max-width:62ch}
.flow h3{font-size:1.42rem;margin:2.4rem 0 .8rem;letter-spacing:-.02em}
.figure{margin:2.4rem 0;position:relative;overflow:hidden;border-radius:3px;box-shadow:var(--shadow-1)}
.figure img{width:100%;height:clamp(260px,42vw,430px);object-fit:cover;transform-origin:60% 40%}
.kb img{animation:kenburns 22s ease-in-out infinite alternate}
@keyframes kenburns{0%{transform:scale(1.02) translate3d(0,0,0)}100%{transform:scale(1.13) translate3d(-1.5%,-2%,0)}}
.figcap{position:absolute;left:0;right:0;bottom:0;padding:1.6rem 1.1rem .85rem;
background:linear-gradient(transparent,rgba(15,29,26,.86));color:var(--paper);
font-family:var(--mono);font-size:.66rem;letter-spacing:.1em;text-transform:uppercase;display:flex;justify-content:space-between;gap:1rem}
.pullquote{border-left:3px solid var(--ochre);padding:.2rem 0 .2rem 1.5rem;margin:2.4rem 0;
font-family:var(--serif);font-size:clamp(1.3rem,2.4vw,1.75rem);line-height:1.32;font-style:italic;letter-spacing:-.02em}
.pullquote cite{display:block;font:500 .7rem/1 var(--mono);letter-spacing:.16em;text-transform:uppercase;
font-style:normal;color:var(--teal);margin-top:1rem}
.causes{list-style:none;margin:2rem 0 0;padding:0;counter-reset:c}
.causes li{counter-increment:c;display:grid;grid-template-columns:34px 1fr;gap:1rem;padding:1.05rem 0;border-top:1px solid var(--line)}
.causes li::before{content:"0" counter(c);font-family:var(--mono);font-size:.78rem;color:var(--ochre);padding-top:.22rem}
.causes b{display:block;font-family:var(--serif);font-size:1.06rem;letter-spacing:-.01em}
.causes p{font-size:.92rem;color:rgba(15,29,26,.7);margin:.3rem 0 0}
/* bar compare */
.bars{margin-top:2.4rem;border:1px solid var(--line);border-radius:3px;padding:1.4rem;background:var(--paper-2)}
.bar-row{display:grid;grid-template-columns:150px 1fr 62px;align-items:center;gap:1rem;margin-bottom:.85rem;font-size:.84rem}
.bar-row:last-child{margin-bottom:0}
.bar-track{height:12px;background:rgba(15,29,26,.1);border-radius:20px;overflow:hidden}
.bar-fill{height:100%;width:0;border-radius:20px;transition:width 1.5s cubic-bezier(.2,.8,.2,1)}
.bar-row .val{font-family:var(--mono);text-align:right;font-size:.82rem}
/* ---------- model (stacked sticky cards) ---------- */
.stack{position:relative}
.stack-card{
position:sticky;top:calc(var(--hh) + 1.6rem + var(--i)*.85rem);
background:var(--paper);border:1px solid var(--line);border-radius:4px;
box-shadow:0 -1px 0 rgba(15,29,26,.04),0 30px 60px -40px rgba(15,29,26,.6);
padding:clamp(1.6rem,3vw,2.6rem);margin-bottom:2.2rem;overflow:hidden;
}
.stack-card:nth-child(even){background:var(--paper-2)}
.stack-card::after{content:attr(data-step);position:absolute;right:-.06em;bottom:-.36em;
font-family:var(--serif);font-size:clamp(7rem,17vw,13rem);line-height:.7;color:rgba(15,29,26,.05);pointer-events:none;font-weight:700}
.sc-grid{display:grid;grid-template-columns:minmax(0,.36fr) minmax(0,1fr);gap:clamp(1.4rem,3vw,3rem);position:relative;z-index:2}
.sc-grid h3{font-size:clamp(1.5rem,2.8vw,2.15rem);letter-spacing:-.025em;margin-bottom:.9rem}
.sc-kicker{font-family:var(--mono);font-size:.66rem;letter-spacing:.2em;text-transform:uppercase;color:var(--ochre);display:block;margin-bottom:1rem}
.sc-body p{max-width:60ch}
.sc-meta{display:flex;flex-wrap:wrap;gap:.5rem;margin-top:1.3rem}
.tag{font-family:var(--mono);font-size:.63rem;letter-spacing:.11em;text-transform:uppercase;
padding:.34rem .6rem;border:1px solid var(--line);border-radius:2px;background:rgba(255,255,255,.5);color:rgba(15,29,26,.72)}
.tag.t{border-color:rgba(30,106,110,.4);color:var(--teal)}
/* ---------- programs asymmetric grid ---------- */
.prog-grid{display:grid;grid-template-columns:repeat(6,1fr);gap:1.2rem}
.prog{
position:relative;border:1px solid var(--line-d);border-radius:4px;padding:1.6rem;
background:linear-gradient(180deg,rgba(246,241,231,.06),rgba(246,241,231,.015));
display:flex;flex-direction:column;min-height:230px;overflow:hidden;
transition:transform .35s cubic-bezier(.2,.8,.3,1),border-color .35s,background .35s;
}
.prog:hover{transform:translateY(-5px);border-color:rgba(246,241,231,.36);background:rgba(246,241,231,.08)}
.prog .num{font-family:var(--mono);font-size:.66rem;letter-spacing:.18em;color:var(--ochre-lt);display:block;margin-bottom:auto}
.prog h3{font-size:1.42rem;margin:1.6rem 0 .7rem;letter-spacing:-.02em}
.prog p{font-size:.92rem;color:rgba(246,241,231,.68);margin-bottom:1rem}
.prog .kpi{display:flex;gap:1.4rem;padding-top:.9rem;border-top:1px solid var(--line-d);flex-wrap:wrap}
.prog .kpi div span{display:block;font-family:var(--mono);font-size:.56rem;letter-spacing:.14em;text-transform:uppercase;color:rgba(246,241,231,.4)}
.prog .kpi div b{font-family:var(--mono);font-size:.98rem;font-weight:500;color:var(--teal-pale)}
.prog.flag{grid-column:span 4;flex-direction:row;gap:1.8rem;align-items:stretch;min-height:330px;padding:0}
.prog.flag .fpad{padding:1.7rem;display:flex;flex-direction:column;flex:1.05}
.prog.flag .fimg{flex:.95;overflow:hidden;position:relative;border-left:1px solid var(--line-d)}
.prog.flag .fimg img{width:100%;height:100%;object-fit:cover;filter:saturate(.75) contrast(1.05)}
.prog.flag h3{font-size:1.9rem}
.prog.a{grid-column:span 2}
.prog.b{grid-column:span 2}
.prog.c{grid-column:span 2}
.prog.d{grid-column:span 2}
.prog .ribbon{position:absolute;top:0;right:0;background:var(--ochre);color:#1A0E03;
font-family:var(--mono);font-size:.58rem;letter-spacing:.16em;text-transform:uppercase;padding:.3rem .6rem}
/* ---------- give / tracker ---------- */
#give{background:
radial-gradient(90% 70% at 12% 0%,rgba(200,117,42,.13),transparent 60%),
linear-gradient(180deg,var(--paper-2),var(--paper));border-top:1px solid var(--line);border-bottom:1px solid var(--line)}
.give-grid{display:grid;grid-template-columns:minmax(0,1.02fr) minmax(0,.98fr);gap:clamp(1.6rem,3vw,2.6rem);align-items:start}
.panel{background:var(--paper);border:1px solid var(--line);border-radius:4px;box-shadow:var(--shadow-1)}
.panel-h{padding:1.15rem 1.4rem;border-bottom:1px solid var(--line);display:flex;align-items:center;gap:.7rem}
.panel-h h3{font-size:1.12rem;letter-spacing:-.01em}
.panel-h .badge{margin-left:auto;font-family:var(--mono);font-size:.6rem;letter-spacing:.14em;text-transform:uppercase;color:var(--teal)}
.panel-b{padding:1.4rem}
.freq{display:inline-flex;padding:3px;border:1px solid var(--line);border-radius:3px;background:var(--paper-2);margin-bottom:1.5rem}
.freq button{border:0;background:none;padding:.52rem 1.1rem;font-size:.83rem;font-weight:700;cursor:pointer;border-radius:2px;
color:rgba(15,29,26,.6);transition:background .28s,color .28s;font-family:var(--mono);letter-spacing:.06em}
.freq button[aria-pressed="true"]{background:var(--ink);color:var(--paper)}
.field-lbl{display:block;font-family:var(--mono);font-size:.63rem;letter-spacing:.17em;text-transform:uppercase;color:rgba(15,29,26,.55);margin-bottom:.7rem}
.chips{display:flex;flex-wrap:wrap;gap:.55rem;margin-bottom:1.2rem}
.chip-amt{border:1px solid var(--line);background:var(--paper);padding:.6rem .9rem;border-radius:2px;cursor:pointer;
font-family:var(--mono);font-size:.92rem;font-weight:500;transition:all .22s;position:relative;min-width:78px}
.chip-amt small{display:block;font-family:var(--sans);font-size:.6rem;letter-spacing:.06em;color:rgba(15,29,26,.5);margin-top:.2rem;text-transform:uppercase}
.chip-amt:hover{border-color:var(--teal);transform:translateY(-2px)}
.chip-amt[aria-pressed="true"]{background:var(--ink);color:var(--paper);border-color:var(--ink)}
.chip-amt[aria-pressed="true"] small{color:rgba(246,241,231,.6)}
.amt-row{display:flex;gap:.7rem;align-items:stretch;margin-bottom:1rem}
.money{position:relative;flex:0 0 190px}
.money span{position:absolute;left:.95rem;top:50%;transform:translateY(-50%);font-family:var(--mono);color:rgba(15,29,26,.45);font-size:1.05rem}
.money input{width:100%;height:52px;padding:.5rem .95rem .5rem 1.9rem;border:1px solid var(--line);border-radius:2px;
font-family:var(--mono);font-size:1.28rem;font-weight:500;background:var(--paper);transition:border-color .2s,box-shadow .2s}
.money input:focus{outline:none;border-color:var(--teal);box-shadow:0 0 0 3px rgba(30,106,110,.14)}
input[type=range]{-webkit-appearance:none;appearance:none;width:100%;height:26px;background:transparent;cursor:pointer}
input[type=range]::-webkit-slider-runnable-track{height:5px;border-radius:5px;
background:linear-gradient(90deg,var(--teal) var(--pct,20%),rgba(15,29,26,.14) var(--pct,20%))}
input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:22px;height:22px;border-radius:50%;background:var(--paper);
border:2px solid var(--ink);margin-top:-8.5px;box-shadow:0 4px 10px -4px rgba(15,29,26,.8);transition:transform .18s}
input[type=range]::-webkit-slider-thumb:hover{transform:scale(1.14)}
input[type=range]::-moz-range-track{height:5px;border-radius:5px;background:rgba(15,29,26,.14)}
input[type=range]::-moz-range-progress{height:5px;border-radius:5px;background:var(--teal)}
input[type=range]::-moz-range-thumb{width:20px;height:20px;border-radius:50%;background:var(--paper);border:2px solid var(--ink)}
.funds{display:grid;grid-template-columns:1fr 1fr;gap:.65rem;margin-top:.4rem}
.fund{position:relative;text-align:left;border:1px solid var(--line);background:var(--paper);border-radius:3px;padding:.9rem .95rem;cursor:pointer;transition:all .24s}
.fund:hover{border-color:var(--teal);transform:translateY(-2px)}
.fund[aria-pressed="true"]{border-color:var(--ink);background:var(--ink);color:var(--paper)}
.fund b{display:block;font-family:var(--serif);font-size:1rem;letter-spacing:-.01em;margin-bottom:.25rem}
.fund i{font-style:normal;font-family:var(--mono);font-size:.63rem;letter-spacing:.08em;opacity:.62;display:block}
.fund em{font-style:normal;display:block;font-size:.74rem;margin-top:.5rem;color:var(--ochre);font-weight:700}
.fund[aria-pressed="true"] em{color:var(--ochre-lt)}
/* readout */
.readout .big{font-family:var(--serif);font-size:clamp(3rem,7.4vw,5.2rem);line-height:.86;letter-spacing:-.045em;
color:var(--teal);font-weight:600;font-variation-settings:'SOFT' 40,'WONK' 1;display:block}
.readout .big-cap{display:block;font-family:var(--mono);font-size:.7rem;letter-spacing:.16em;text-transform:uppercase;
color:rgba(15,29,26,.6);margin-top:.9rem;max-width:26ch;line-height:1.6}
.mini-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:.7rem;margin-top:1.7rem}
.mini{border:1px solid var(--line);border-radius:3px;padding:.85rem;background:var(--paper);transition:transform .3s,border-color .3s}
.mini:hover{transform:translateY(-3px);border-color:var(--teal)}
.mini b{display:block;font-family:var(--mono);font-size:1.22rem;font-weight:500;letter-spacing:-.02em;line-height:1}
.mini span{display:block;font-size:.66rem;letter-spacing:.1em;text-transform:uppercase;color:rgba(15,29,26,.55);margin-top:.45rem;line-height:1.4}
.split{margin-top:1.7rem}
.split-bar{display:flex;height:10px;border-radius:20px;overflow:hidden;background:rgba(15,29,26,.08)}
.split-bar i{display:block;height:100%;transition:width .8s cubic-bezier(.2,.8,.2,1)}
.split-key{display:flex;flex-wrap:wrap;gap:1.1rem;margin-top:.75rem;font-family:var(--mono);font-size:.66rem;letter-spacing:.06em}
.split-key span{display:inline-flex;align-items:center;gap:.4rem;color:rgba(15,29,26,.66)}
.split-key em{width:8px;height:8px;border-radius:2px;font-style:normal}
/* thermometer */
.therm{padding:1.4rem}
.therm-top{display:flex;justify-content:space-between;align-items:baseline;gap:1rem;margin-bottom:.9rem}
.therm-top b{font-family:var(--mono);font-size:1.05rem;font-weight:500}
.therm-top span{font-family:var(--mono);font-size:.66rem;letter-spacing:.13em;text-transform:uppercase;color:rgba(15,29,26,.55)}
.tank{position:relative;height:34px;border:1px solid var(--line);border-radius:3px;overflow:hidden;background:var(--paper-2)}
.water{position:absolute;left:0;top:0;bottom:0;width:0;background:linear-gradient(180deg,var(--teal-bright),var(--teal));
transition:width 1.1s cubic-bezier(.2,.8,.2,1)}
.water::after{content:"";position:absolute;right:-40px;top:0;bottom:0;width:80px;
background:radial-gradient(circle at 30% 50%,rgba(246,241,231,.35),transparent 60%);animation:shimmer 3.4s ease-in-out infinite}
@keyframes shimmer{0%,100%{opacity:.25}50%{opacity:.7}}
.tank-pct{position:absolute;right:.7rem;top:50%;transform:translateY(-50%);font-family:var(--mono);font-size:.78rem;font-weight:600;
mix-blend-mode:difference;color:#fff;z-index:3}
.therm-meta{display:flex;justify-content:space-between;margin-top:.6rem;font-family:var(--mono);font-size:.66rem;color:rgba(15,29,26,.55);letter-spacing:.08em}
/* donor feed */
.feed{list-style:none;margin:0;padding:0;max-height:236px;overflow:auto}
.feed li{display:grid;grid-template-columns:34px 1fr auto;gap:.8rem;align-items:center;padding:.72rem 0;border-bottom:1px dashed var(--line);font-size:.86rem}
.feed li:last-child{border-bottom:0}
.feed .av{width:34px;height:34px;border-radius:50%;object-fit:cover;filter:saturate(.7)}
.feed b{font-weight:700;font-size:.86rem;display:block}
.feed small{font-family:var(--mono);font-size:.6rem;letter-spacing:.09em;text-transform:uppercase;color:rgba(15,29,26,.5)}
.feed .amt{font-family:var(--mono);font-weight:500;color:var(--teal);font-size:.9rem;white-space:nowrap}
.feed li.you{background:rgba(200,117,42,.1);animation:slidein .6s cubic-bezier(.2,.8,.3,1)}
@keyframes slidein{from{opacity:0;transform:translateX(-14px)}to{opacity:1;transform:none}}
.give-note{font-size:.78rem;color:rgba(15,29,26,.6);margin-top:1rem;display:flex;gap:.5rem;align-items:flex-start;line-height:1.5}
.lock{flex:0 0 auto;margin-top:.15rem}
.receipt{margin-top:1.1rem;border-top:1px solid var(--line);padding-top:1rem;font-family:var(--mono);font-size:.64rem;
letter-spacing:.1em;text-transform:uppercase;color:rgba(15,29,26,.55);display:flex;flex-wrap:wrap;gap:.4rem 1.1rem}
/* ---------- stories / postcards ---------- */
.postcards{display:grid;grid-template-columns:repeat(4,1fr);gap:1.4rem;margin-top:1rem}
.pc{background:var(--paper);border:1px solid var(--line);border-radius:3px;padding:.7rem .7rem 1.15rem;
box-shadow:var(--shadow-1);transition:transform .45s cubic-bezier(.2,.8,.3,1),box-shadow .45s}
.pc:nth-child(1){transform:rotate(-1.6deg) translateY(10px)}
.pc:nth-child(2){transform:rotate(1.1deg)}
.pc:nth-child(3){transform:rotate(-.7deg) translateY(18px)}
.pc:nth-child(4){transform:rotate(1.9deg) translateY(4px)}
.pc:hover{transform:rotate(0) translateY(-6px);box-shadow:var(--shadow-2);z-index:4}
.pc-img{overflow:hidden;border-radius:2px;margin-bottom:.95rem;position:relative}
.pc-img img{width:100%;height:190px;object-fit:cover;transition:transform 1.1s cubic-bezier(.2,.8,.3,1)}
.pc:hover .pc-img img{transform:scale(1.07)}
.pc-stamp{position:absolute;top:8px;right:8px;background:rgba(15,29,26,.78);color:var(--paper);
font-family:var(--mono);font-size:.54rem;letter-spacing:.14em;text-transform:uppercase;padding:.28rem .5rem;border-radius:2px}
.pc blockquote{margin:0 .35rem;font-family:var(--serif);font-size:1.02rem;line-height:1.42;font-style:italic;letter-spacing:-.01em}
.pc .who{display:flex;align-items:center;gap:.6rem;margin-top:1rem;padding:0 .35rem}
.pc .who img{width:34px;height:34px;border-radius:50%;object-fit:cover;filter:saturate(.65)}
.pc .who b{display:block;font-size:.82rem}
.pc .who span{display:block;font-family:var(--mono);font-size:.58rem;letter-spacing:.1em;text-transform:uppercase;color:rgba(15,29,26,.55)}
.feature{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:clamp(1.6rem,4vw,3.4rem);align-items:center;margin-top:clamp(2.6rem,5vw,4.4rem);
border-top:1px solid var(--line);padding-top:clamp(2.2rem,4vw,3.4rem)}
.feature-img{position:relative;overflow:hidden;border-radius:3px}
.feature-img img{width:100%;height:clamp(300px,44vw,520px);object-fit:cover}
.badge-float{position:absolute;left:1rem;bottom:1rem;background:var(--paper);border-radius:3px;padding:.8rem 1rem;box-shadow:var(--shadow-2);max-width:210px}
.badge-float b{font-family:var(--mono);font-size:1.5rem;letter-spacing:-.03em;display:block;color:var(--teal);line-height:1}
.badge-float span{font-family:var(--mono);font-size:.58rem;letter-spacing:.13em;text-transform:uppercase;color:rgba(15,29,26,.6);display:block;margin-top:.35rem;line-height:1.5}
.feature h3{font-size:clamp(1.6rem,3vw,2.35rem);letter-spacing:-.028em;margin:.9rem 0 1.1rem}
.feature .meta{display:flex;gap:1rem;align-items:center;font-family:var(--mono);font-size:.63rem;letter-spacing:.12em;text-transform:uppercase;color:rgba(15,29,26,.55);margin-bottom:.4rem}
.feature .meta img{width:26px;height:26px;border-radius:50%}
.readmore{display:inline-flex;align-items:center;gap:.5rem;margin-top:1.4rem;font-weight:700;font-size:.9rem;text-decoration:none;
border-bottom:2px solid var(--ochre);padding-bottom:.15rem;transition:gap .25s}
.readmore:hover{gap:.9rem}
/* ---------- accountability + sidebar ---------- */
.acct-grid{display:grid;grid-template-columns:minmax(0,1.55fr) minmax(0,.85fr);gap:clamp(2rem,4vw,3.6rem);align-items:start}
.journal{list-style:none;margin:0;padding:0}
.journal li{border-top:1px solid var(--line-d)}
.journal a{display:grid;grid-template-columns:96px 1fr 130px;gap:1.4rem;align-items:center;padding:1.4rem 0;text-decoration:none;transition:padding .3s}
.journal li:hover a{padding-left:.7rem}
.journal .jthumb{overflow:hidden;border-radius:2px}
.journal .jthumb img{width:100%;height:72px;object-fit:cover;filter:grayscale(1) contrast(1.05);transition:filter .5s,transform .8s}
.journal li:hover .jthumb img{filter:none;transform:scale(1.06)}
.journal h4{font-family:var(--serif);font-size:1.2rem;letter-spacing:-.015em;margin:.35rem 0 .45rem;transition:color .25s}
.journal li:hover h4{color:var(--ochre-lt)}
.journal p{font-size:.88rem;color:rgba(246,241,231,.6);margin:0;max-width:58ch}
.jdate{font-family:var(--mono);font-size:.62rem;letter-spacing:.12em;text-transform:uppercase;color:rgba(246,241,231,.42);text-align:right;line-height:1.7}
.jcat{display:inline-block;font-family:var(--mono);font-size:.56rem;letter-spacing:.14em;text-transform:uppercase;
border:1px solid var(--line-d);padding:.18rem .45rem;border-radius:2px;color:var(--teal-pale)}
/* financial table */
.fin{width:100%;border-collapse:collapse;margin-top:2.2rem;font-size:.9rem}
.fin caption{text-align:left;font-family:var(--mono);font-size:.64rem;letter-spacing:.16em;text-transform:uppercase;
color:rgba(246,241,231,.5);padding-bottom:.9rem}
.fin th,.fin td{text-align:right;padding:.72rem .6rem;border-bottom:1px solid var(--line-d)}
.fin th:first-child,.fin td:first-child{text-align:left}
.fin thead th{font-family:var(--mono);font-size:.6rem;letter-spacing:.13em;text-transform:uppercase;color:var(--teal-pale);font-weight:500;border-bottom-color:var(--line-d)}
.fin tbody tr{transition:background .25s}
.fin tbody tr:hover{background:rgba(246,241,231,.05)}
.fin td.num{font-family:var(--mono);font-variant-numeric:tabular-nums}
.fin tfoot td{font-family:var(--mono);font-weight:600;border-bottom:0;color:var(--ochre-lt)}
/* sidebar */
.side{display:flex;flex-direction:column;gap:1.2rem;position:sticky;top:calc(var(--hh) + 1.6rem)}
.scard{border:1px solid var(--line-d);border-radius:4px;padding:1.25rem;background:rgba(246,241,231,.045)}
.scard h4{font-family:var(--serif);font-size:1.08rem;letter-spacing:-.015em;margin-bottom:1rem;display:flex;align-items:center;gap:.55rem}
.scard h4::before{content:"";width:6px;height:6px;background:var(--ochre);border-radius:50%}
.dl-list{list-style:none;margin:0;padding:0}
.dl-list li{border-top:1px dashed var(--line-d)}
.dl-list a{display:flex;align-items:center;gap:.7rem;padding:.72rem 0;text-decoration:none;font-size:.86rem;transition:color .2s,gap .25s}
.dl-list a:hover{color:var(--ochre-lt);gap:1rem}
.dl-list .ext{margin-left:auto;font-family:var(--mono);font-size:.58rem;letter-spacing:.1em;color:rgba(246,241,231,.4);white-space:nowrap}
.dl-list svg{flex:0 0 auto;opacity:.6}
.partner-hi{background:linear-gradient(150deg,rgba(30,106,110,.35),rgba(15,29,26,.1));border-color:rgba(46,154,158,.35)}
.partner-hi p{font-size:.86rem;color:rgba(246,241,231,.72)}
.ask{background:var(--ochre);color:#1A0E03;border:0}
.ask h4{color:#1A0E03}.ask h4::before{background:var(--ink)}
.ask p{font-size:.88rem;color:rgba(26,14,3,.82)}
.ask .btn{--bg:#1A0E03;--fg:var(--ochre-lt);width:100%;margin-top:.4rem}
.ask .btn::before{background:var(--ink);opacity:0}
.press{display:flex;flex-wrap:wrap;gap:.5rem}
.press span{font-family:var(--mono);font-size:.6rem;letter-spacing:.1em;text-transform:uppercase;color:rgba(246,241,231,.55);
border:1px solid var(--line-d);padding:.3rem .55rem;border-radius:2px}
/* ---------- partners ---------- */
.tier{margin-bottom:2.6rem}
.tier-h{display:flex;align-items:baseline;gap:1rem;margin-bottom:1.1rem;border-bottom:1px solid var(--line);padding-bottom:.6rem}
.tier-h h3{font-size:1.05rem;letter-spacing:-.01em}
.tier-h span{font-family:var(--mono);font-size:.62rem;letter-spacing:.15em;text-transform:uppercase;color:rgba(15,29,26,.5);margin-left:auto}
.logos{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:.9rem}
.logo-cell{border:1px solid var(--line);border-radius:3px;background:var(--paper);padding:1rem;display:grid;place-items:center;
transition:transform .3s,box-shadow .3s,border-color .3s;position:relative;overflow:hidden}
.logo-cell:hover{transform:translateY(-4px);box-shadow:var(--shadow-1);border-color:var(--teal)}
.logo-cell img{height:44px;width:auto;object-fit:contain;filter:grayscale(1) opacity(.72);transition:filter .35s}
.logo-cell:hover img{filter:none}
.logo-cell small{position:absolute;left:.6rem;bottom:.4rem;font-family:var(--mono);font-size:.52rem;letter-spacing:.1em;
text-transform:uppercase;color:rgba(15,29,26,.35);opacity:0;transition:opacity .3s}
.logo-cell:hover small{opacity:1}
.match{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:2rem;align-items:center;
background:var(--ink);color:var(--paper);border-radius:4px;padding:clamp(1.6rem,3vw,2.4rem);margin-top:.5rem}
.match h3{font-size:clamp(1.4rem,2.6vw,1.95rem);letter-spacing:-.02em;margin-bottom:.7rem}
.match p{color:rgba(246,241,231,.7);max-width:62ch;font-size:.95rem}
.match img{border-radius:3px;height:100%;width:100%;min-height:190px;object-fit:cover}
.match-media{width:230px}
/* ---------- involved ---------- */
.involved{display:grid;grid-template-columns:repeat(12,1fr);gap:1.2rem}
.icard{border:1px solid var(--line);border-radius:4px;padding:1.5rem;background:var(--paper);display:flex;flex-direction:column;
transition:transform .35s cubic-bezier(.2,.8,.3,1),box-shadow .35s;position:relative;overflow:hidden}
.icard::before{content:"";position:absolute;inset:0 auto 0 0;width:3px;background:var(--ochre);transform:scaleY(0);transform-origin:top;transition:transform .4s}
.icard:hover{transform:translateY(-5px);box-shadow:var(--shadow-2)}
.icard:hover::before{transform:scaleY(1)}
.icard h3{font-size:1.3rem;margin:1rem 0 .6rem}
.icard p{font-size:.92rem;color:rgba(15,29,26,.72)}
.icard .k{font-family:var(--mono);font-size:.6rem;letter-spacing:.16em;text-transform:uppercase;color:var(--teal)}
.icard ul{list-style:none;margin:1rem 0 1.3rem;padding:0;font-size:.86rem}
.icard li{padding:.42rem 0;border-top:1px dashed var(--line);display:flex;gap:.55rem;align-items:baseline}
.icard li::before{content:"›";color:var(--ochre);font-weight:700}
.icard .btn{margin-top:auto;align-self:flex-start}
.i1{grid-column:span 4}.i2{grid-column:span 4}.i3{grid-column:span 4}
.events{grid-column:span 12;background:var(--paper-2)}
.ev-list{list-style:none;margin:1.1rem 0 0;padding:0}
.ev-list li{display:grid;grid-template-columns:88px 1fr auto auto;gap:1.4rem;align-items:center;padding:1rem 0;border-top:1px solid var(--line)}
.ev-list li:first-child{border-top:0}
.ev-date{font-family:var(--mono);font-size:.72rem;letter-spacing:.08em;color:var(--clay);text-transform:uppercase;line-height:1.4}
.ev-date b{display:block;font-size:1.5rem;letter-spacing:-.03em;color:var(--ink);font-weight:500}
.ev-title{font-family:var(--serif);font-size:1.1rem;letter-spacing:-.01em}
.ev-title span{display:block;font-family:var(--sans);font-size:.84rem;color:rgba(15,29,26,.6);margin-top:.2rem;letter-spacing:0}
.ev-place{font-family:var(--mono);font-size:.63rem;letter-spacing:.11em;text-transform:uppercase;color:rgba(15,29,26,.5)}
.ev-list li:hover .ev-title{color:var(--teal)}
/* ---------- faq ---------- */
.faq-grid{display:grid;grid-template-columns:minmax(0,.62fr) minmax(0,1.38fr);gap:clamp(1.6rem,4vw,3.4rem);align-items:start}
.acc{border-top:1px solid var(--line)}
.acc-item{border-bottom:1px solid var(--line)}
.acc-btn{width:100%;background:none;border:0;text-align:left;padding:1.3rem 3rem 1.3rem 0;cursor:pointer;position:relative;
font-family:var(--serif);font-size:clamp(1.05rem,1.7vw,1.25rem);letter-spacing:-.015em;font-weight:600;transition:color .25s}
.acc-btn:hover{color:var(--teal)}
.acc-btn::after{content:"";position:absolute;right:.55rem;top:50%;width:13px;height:13px;transform:translateY(-50%);
background:
linear-gradient(currentColor,currentColor) center/100% 1.6px no-repeat,
linear-gradient(currentColor,currentColor) center/1.6px 100% no-repeat;
transition:transform .35s cubic-bezier(.2,.8,.3,1)}
.acc-item.open .acc-btn::after{transform:translateY(-50%) rotate(135deg)}
.acc-panel{overflow:hidden;height:0;transition:height .42s cubic-bezier(.2,.8,.3,1)}
.acc-panel .inner{padding:0 2.6rem 1.5rem 0;color:rgba(15,29,26,.76);font-size:.96rem;max-width:70ch}
.acc-panel .inner p{margin-bottom:.8rem}
.acc-panel .inner p:last-child{margin-bottom:0}
.help-card{background:var(--ink);color:var(--paper);border-radius:4px;padding:1.6rem;position:sticky;top:calc(var(--hh) + 1.6rem)}
.help-card h3{font-size:1.35rem;margin-bottom:.7rem}
.help-card p{font-size:.9rem;color:rgba(246,241,231,.7)}
.help-card dl{margin:1.2rem 0 0;font-size:.86rem}
.help-card dt{font-family:var(--mono);font-size:.58rem;letter-spacing:.14em;text-transform:uppercase;color:var(--teal-pale);margin-top:.9rem}
.help-card dd{margin:.15rem 0 0}
.help-card a{color:var(--ochre-lt)}
/* ---------- newsletter band ---------- */
.band{background:linear-gradient(120deg,var(--teal) 0%,#17565A 55%,var(--ink) 100%);color:var(--paper);padding:clamp(2.6rem,5vw,4rem) 0;position:relative;overflow:hidden}
.band::before{content:"";position:absolute;inset:0;
background:repeating-linear-gradient(115deg,transparent 0 26px,rgba(246,241,231,.045) 26px 27px);pointer-events:none}
.band-grid{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,.85fr);gap:2.4rem;align-items:center;position:relative}
.band h2{font-size:clamp(1.7rem,3.4vw,2.6rem);letter-spacing:-.028em;margin-bottom:.6rem}
.band p{color:rgba(246,241,231,.78);max-width:52ch;font-size:.98rem}
.sub-form{display:flex;gap:.6rem;flex-wrap:wrap}
.sub-form input{flex:1 1 240px;height:54px;padding:0 1rem;border:1px solid rgba(246,241,231,.3);background:rgba(15,29,26,.28);
color:var(--paper);border-radius:2px;font-size:.95rem;transition:border-color .2s,background .2s}
.sub-form input::placeholder{color:rgba(246,241,231,.45)}
.sub-form input:focus{outline:none;border-color:var(--ochre-lt);background:rgba(15,29,26,.45)}
.sub-form .btn{--bg:var(--ochre);--fg:#1A0E03;height:54px}
.sub-form .btn::before{background:var(--paper)}
.sub-note{font-family:var(--mono);font-size:.6rem;letter-spacing:.12em;text-transform:uppercase;color:rgba(246,241,231,.5);margin-top:.8rem}
.sub-msg{margin-top:.7rem;font-size:.85rem;color:var(--teal-pale);min-height:1.2em}
/* ---------- footer ---------- */
.site-foot{background:var(--ink);color:rgba(246,241,231,.72);padding:clamp(3rem,6vw,4.6rem) 0 2rem;font-size:.9rem}
.foot-top{display:grid;grid-template-columns:1.5fr 1fr 1fr 1fr 1.2fr;gap:2.2rem}
.foot-brand{display:flex;gap:.85rem;align-items:flex-start;margin-bottom:1.2rem}
.foot-brand img{width:48px;height:48px;border-radius:50% 50% 50% 4px}
.foot-brand strong{font-family:var(--serif);font-size:1.25rem;color:var(--paper);display:block;letter-spacing:-.02em}
.foot-brand em{font-style:normal;font-family:var(--mono);font-size:.58rem;letter-spacing:.16em;text-transform:uppercase;color:var(--teal-pale)}
.site-foot h5{font-family:var(--mono);font-size:.62rem;letter-spacing:.18em;text-transform:uppercase;color:var(--paper);margin:0 0 1rem;font-weight:500}
.site-foot ul{list-style:none;margin:0;padding:0}
.site-foot li{margin-bottom:.55rem}
.site-foot a{text-decoration:none;transition:color .2s,padding-left .25s;display:inline-block}
.site-foot a:hover{color:var(--ochre-lt);padding-left:4px}
.socials{display:flex;gap:.5rem;margin-top:1.2rem}
.socials a{width:38px;height:38px;border:1px solid var(--line-d);border-radius:2px;display:grid;place-items:center;transition:all .25s}
.socials a:hover{background:var(--ochre);border-color:var(--ochre);color:#1A0E03;transform:translateY(-3px);padding-left:0}
.contact p{margin-bottom:.7rem;font-size:.87rem;line-height:1.6}
.contact b{color:var(--paper);font-weight:600}
.foot-bottom{margin-top:2.8rem;padding-top:1.4rem;border-top:1px solid var(--line-d);display:flex;flex-wrap:wrap;gap:1rem 2rem;
align-items:center;font-family:var(--mono);font-size:.63rem;letter-spacing:.1em;text-transform:uppercase;color:rgba(246,241,231,.45)}
.foot-bottom nav{display:flex;flex-wrap:wrap;gap:1.4rem;margin-left:auto}
.totop{position:fixed;right:1.2rem;bottom:1.2rem;z-index:90;width:46px;height:46px;border-radius:50%;border:1px solid var(--line);
background:var(--ink);color:var(--paper);cursor:pointer;display:grid;place-items:center;opacity:0;transform:translateY(14px);
transition:opacity .35s,transform .35s,background .25s;box-shadow:var(--shadow-2)}
.totop.show{opacity:1;transform:none}
.totop:hover{background:var(--ochre);color:#1A0E03}
.toast{position:fixed;left:50%;bottom:1.6rem;transform:translate(-50%,140%);z-index:200;background:var(--ink);color:var(--paper);
border-left:3px solid var(--teal-bright);padding:.95rem 1.3rem;border-radius:3px;box-shadow:var(--shadow-2);
font-size:.9rem;max-width:min(92vw,460px);transition:transform .5s cubic-bezier(.2,.9,.25,1)}
.toast.show{transform:translate(-50%,0)}
.toast b{color:var(--ochre-lt)}
/* ---------- responsive ---------- */
@media (max-width:1180px){
.main-nav a{font-size:.79rem;padding:.5rem .42rem}
.hero-grid{grid-template-columns:1fr 1fr}
.prog.flag{grid-column:span 6}
.prog.a,.prog.b,.prog.c,.prog.d{grid-column:span 3}
.foot-top{grid-template-columns:1.4fr 1fr 1fr;row-gap:2.4rem}
}
@media (max-width:980px){
.main-nav{position:fixed;inset:var(--hh) 0 auto 0;background:var(--paper);flex-direction:column;align-items:stretch;
gap:0;padding:1rem 1.25rem 1.6rem;border-bottom:1px solid var(--line);box-shadow:var(--shadow-2);
transform:translateY(-115%);transition:transform .45s cubic-bezier(.2,.8,.3,1);max-height:calc(100vh - var(--hh));overflow:auto}
body.menu-open .main-nav{transform:none}
.main-nav a{font-size:1.05rem;padding:.85rem .2rem;border-bottom:1px solid var(--line);font-family:var(--serif)}
.main-nav a::after{display:none}
.nav-toggle{display:block}
.head-cta .btn{display:none}
.hero-grid,.two-sticky,.give-grid,.acct-grid,.faq-grid,.feature,.band-grid,.match{grid-template-columns:1fr}
.sticky-col,.side,.help-card{position:static}
.match-media{width:100%}
.postcards{grid-template-columns:1fr 1fr}
.pc{transform:none!important}
.prog-grid{grid-template-columns:1fr 1fr}
.prog,.prog.flag,.prog.a,.prog.b,.prog.c,.prog.d{grid-column:span 2;flex-direction:column}
.prog.flag .fimg{border-left:0;border-top:1px solid var(--line-d);min-height:200px}
.involved>.icard{grid-column:span 6!important}
.stack-card{position:static;top:auto}
.journal a{grid-template-columns:74px 1fr}
.jdate{grid-column:2;text-align:left}
.board-stats{grid-template-columns:1fr 1fr}
.bstat{border-bottom:1px solid var(--line-d)}
.bstat:nth-child(2){border-right:0}
}
@media (max-width:640px){
body{font-size:16px}
.wrap,.wrap-n{width:min(100% - 1.6rem,var(--maxw))}
.postcards,.prog-grid,.involved,.funds,.mini-grid{grid-template-columns:1fr}
.prog,.prog.flag,.prog.a,.prog.b,.prog.c,.prog.d,.involved>.icard{grid-column:span 1!important}
.sec-head{grid-template-columns:1fr}
.bar-row{grid-template-columns:1fr;gap:.4rem}
.bar-row .val{text-align:left}
.money{flex:1 1 100%}
.ev-list li{grid-template-columns:74px 1fr;gap:.9rem 1.1rem}
.ev-place,.ev-list .btn{grid-column:2}
.feed li{grid-template-columns:28px 1fr auto}
.feed .av{width:28px;height:28px}
.tiles{grid-template-columns:repeat(auto-fill,minmax(50px,1fr))}
.stat-pair{flex-direction:column;gap:1.2rem}
}
@media (prefers-reduced-motion:reduce){
*,*::before,*::after{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important}
[data-reveal]{opacity:1!important;transform:none!important}
.ln>i{transform:none!important}
.ticker-track{animation:none}
}
</style>
</head>
<body>
<a class="skip" href="#main">Skip to main content</a>
<!-- ══════════════ HEADER ══════════════ -->
<header class="site-head" id="top">
<div class="wrap head-inner">
<a class="brand" href="#top" aria-label="Keepwell Foundation — home">
<img class="brand-mark" src="https://placehold.co/96x96/0F1D1A/C8752A?text=KW&font=lora" alt="Keepwell Foundation monogram logo" width="96" height="96">
<span class="brand-text">
<strong>Keepwell Foundation</strong>
<em>Rural water that keeps running</em>
</span>
</a>
<nav class="main-nav" id="primary-nav" aria-label="Primary">
<a href="#impact">Impact</a>
<a href="#model">Model</a>
<a href="#programs">Programs</a>
<a href="#stories">Stories</a>
<a href="#partners">Partners</a>
<a href="#journal">Journal</a>
<a href="#faq">FAQ</a>
</nav>
<div class="head-cta">
<a class="btn btn-ochre" href="#give"><span>Donate</span></a>
<button class="nav-toggle" aria-expanded="false" aria-controls="primary-nav" aria-label="Toggle navigation menu">
<i></i><i></i><i></i>
</button>
</div>
</div>
<div class="progress-rail" aria-hidden="true"><i id="scrollbar"></i></div>
</header>
<main id="main">
<!-- ══════════════ 1. LIVE WATER-POINT REGISTER ══════════════ -->
<section class="hero dark" aria-labelledby="hero-title">
<div class="wrap hero-grid">
<div class="hero-copy" data-reveal>
<span class="eyebrow" data-scramble>Field telemetry · register v14.2</span>
<h1 class="hero-title" id="hero-title">
<span class="ln"><i>Anyone can dig</i></span>
<span class="ln"><i>a well. Few stay</i></span>
<span class="ln"><i><em>to fix it.</em></i></span>
</h1>
<p class="lede">Keepwell funds the unglamorous half of rural water: the spare-parts contract, the certified mechanic down the road, the quarterly nitrate sample, and the public ledger that proves the pump is still pumping a decade after the ribbon was cut.</p>
<p style="font-size:.95rem;color:rgba(246,241,231,.6);margin-top:1rem">We sign ten-year operation & maintenance agreements with 1,284 community water points across four districts, endow each asset with a maintenance trust, and publish every uptime reading — including the ones that embarrass us.</p>
<div class="hero-actions">
<a class="btn btn-ochre btn-lg" href="#give"><span>Start giving</span> <span class="arrow" aria-hidden="true">→</span></a>
<a class="btn btn-ghost btn-lg" href="#impact"><span>See the impact data</span></a>
</div>
<div class="trust-row">
<div class="trust-item"><b>87¢</b><span>of every $1 to programs</span></div>
<div class="trust-item"><b>$6.10</b><span>cost per person-served-year</span></div>
<div class="trust-item"><b class="stars">★★★★</b><span>Charity Navigator</span></div>
<div class="trust-item"><b>1,284</b><span>assets under contract</span></div>
</div>
</div>
<!-- the board -->
<div class="board" data-reveal>
<div class="board-head">
<span class="live-dot" aria-hidden="true"></span>
<span class="lbl">Water-point register — live</span>
<span class="sync mono" id="sync-clock">sync 00:00:00 UTC</span>
</div>
<div class="board-stats">
<div class="bstat ok"><b data-count="1284" data-suffix="">0</b><span>Points monitored</span></div>
<div class="bstat ok"><b data-count="96.3" data-decimals="1" data-suffix="%">0</b><span>Functional today</span></div>
<div class="bstat warn"><b id="stat-svc">44</b><span>In scheduled service</span></div>
<div class="bstat bad"><b id="stat-part">9</b><span>Awaiting parts</span></div>
</div>
<div class="tiles" id="tiles" role="group" aria-label="Water-point status grid — select a point for details"></div>
<div class="board-legend">
<span><i style="background:var(--teal-bright)"></i>Flowing</span>
<span><i style="background:var(--ochre-lt)"></i>Scheduled service</span>
<span><i style="background:#E58873"></i>Awaiting part</span>
<span><i style="background:#6E6259"></i>Offline / dry season</span>
<span style="margin-left:auto">Tap a marker</span>
</div>
<div class="detail" id="point-detail" aria-live="polite"><!-- js --></div>
</div>
</div>
<div class="ticker" aria-hidden="true">
<div class="ticker-track" id="ticker-track"></div>
</div>
</section>
<!-- ══════════════ 2. THE MAINTENANCE GAP ══════════════ -->
<section class="pad" id="impact" aria-labelledby="gap-title">
<div class="wrap">
<div class="sec-head" data-reveal>
<div>
<span class="eyebrow" data-scramble>Impact measurement — the honest arithmetic</span>
<h2 id="gap-title">Capital builds wells.<br>Endowments keep <em>water flowing.</em></h2>
</div>
<p class="lede">Between 2016 and 2023 the four districts we serve received 3,900 new water points and lost 1,120 of them to preventable failure. Nobody photographs a missing riser main. That silence is our operating thesis.</p>
</div>
<div class="two-sticky">
<aside class="sticky-col" data-reveal>
<div class="bigfig"><span data-count="26" data-suffix="%">0</span><sup>±4</sup></div>
<span class="bigfig-cap">of improved rural water points in sub-Saharan Africa are out of service on any given day</span>
<div class="stat-pair">
<div class="ours"><b>96.3%</b><span>Keepwell network uptime, rolling 12 mo.</span></div>
<div><b>3.7%</b><span>Mean time to repair: <b class="mono" style="font-size:1rem">2.4 days</b></span></div>
</div>
<p style="font-size:.78rem;color:rgba(15,29,26,.5);margin-top:1.6rem;line-height:1.55">Baseline comparator drawn from the district WASH data pool (DPHP, 2023 round) and cross-checked against our own register. Full methodology and indicator definitions are downloadable in the accountability section below.</p>
</aside>
<div class="flow" data-reveal>
<p>When a donor funds a borehole, the cheque covers drilling, a pump, a ceremony and a photo. It almost never covers year four — the year the walking beam bearing seizes, the cross-rod snaps, or the plastic cylinder head finally cracks under UV load. The committee that owns the asset has no bank account, the district authority has no vehicle fuel budget, and the nearest dealer with a genuine spare is 140 kilometres away.</p>
<p>The result is a predictable funding cliff. Water points perform beautifully for 26 months, then fail; households revert to a shallow well or a river 45 minutes downstream. Diarrhoeal disease incidence in the ward returns to baseline within two seasons, and the child who was counting litres for her school now counts the hours until the next choloera scare. From the funder's spreadsheet, however, the project was a success: the asset exists, and it was handed over.</p>
<div class="figure kb" data-reveal>
<img src="https://picsum.photos/1200/720" alt="A community member drawing water from a handpump at dawn" loading="lazy" width="1200" height="720">
<div class="figcap"><span>KP-1147 · Chibata Wells ward · 05:42</span><span>Photo: field team</span></div>
</div>
<blockquote class="pullquote">“The ribbon-cutting is the least informative day of a water point's life. Day 1,461 is the interesting one.”
<cite>— Dr. Imani Sero, Director of Impact Measurement</cite></blockquote>
<h3>Why pumps die: five failure modes we engineer against</h3>
<ol class="causes">
<li><div><b>No budget line for O&M</b><p>Tariff collection collapses when the committee has no trained treasurer; median sinking-fund balance across comparator assets was $38 against a $210 repair.</p></div></li>
<li><div><b>Spare-parts supply chains</b><p>Generic pumps installed without a locked dealer agreement mean a $14 seal becomes a nine-month outage while a technician sources it in the capital.</p></div></li>
<li><div><b>Committee turnover</b><p>Forty-one percent of water committees hold no valid constitution two years past handover. Institutional memory leaves with the chair.</p></div></li>
<li><div><b>Untrained repair attempts</b><p>Well-meaning “community champions” without mechanical certification turn a $30 gasket job into a crushed pump stack.</p></div></li>
<li><div><b>Unmeasured water quality</b><p>An abstraction that tests clean in year one can carry nitrate or arsenic by year five. Without quarterly sampling, safety fails silently, long before the pump does.</p></div></li>
</ol>
<div class="bars" data-reveal>
<div class="bar-row">
<span>District comparator (2023)</span>
<span class="bar-track"><i class="bar-fill" data-w="26" style="background:var(--clay)"></i></span>
<span class="val">26.0%</span>
</div>
<div class="bar-row">
<span>National rural average</span>
<span class="bar-track"><i class="bar-fill" data-w="19" style="background:var(--ochre)"></i></span>
<span class="val">19.0%</span>
</div>
<div class="bar-row">
<span>Keepwell contracted assets</span>
<span class="bar-track"><i class="bar-fill" data-w="3.7" style="background:var(--teal)"></i></span>
<span class="val">3.7%</span>
</div>
<p class="mono" style="font-size:.63rem;letter-spacing:.13em;text-transform:uppercase;color:rgba(15,29,26,.5);margin:.9rem 0 0">Share of water points non-functional at time of survey · lower is better · n=3,900 vs n=1,284</p>
</div>
</div>
</div>
</div>
</section>
<!-- ══════════════ 3. THE MODEL — stacked cards ══════════════ -->
<section class="pad" id="model" style="background:var(--paper-2);border-top:1px solid var(--line);border-bottom:1px solid var(--line)">
<div class="wrap">
<div class="sec-head" data-reveal>
<div>
<span class="eyebrow" data-scramble>The Keepwell model · ten years per asset</span>
<h2 id="model-title">Four moves, repeated<br>until the <em>district owns it.</em></h2>
</div>
<p class="lede">Our exit criterion is not “built”. It is a water committee that invoices a dealer, holds a bank balance, files a quarterly return and no longer needs us. Every stage below has an indicator, a budget code and a public failure rate.</p>
</div>
<div class="stack">
<article class="stack-card" style="--i:0" data-step="01" data-reveal>
<div class="sc-grid">
<div>
<span class="sc-kicker">Stage 01 · Months 1–4</span>
<h3>Diagnose before you drill</h3>
<p class="mono" style="font-size:.72rem;letter-spacing:.1em;text-transform:uppercase;color:var(--teal)">Hydrogeology · demand · governance</p>
</div>
<div class="sc-body">
<p>We start with an electrical resistivity survey and a seasonal aquifer test, because a maintenance endowment on a dry borehole is a well-funded disappointment. Alongside the physical assessment, our social performance team maps water demand, existing sources, open-defecation baselines and the gendered reality of who walks for water in that ward.</p>
<p>Nothing proceeds without an elected, trained water committee holding a signed constitution, a bank mandate and a tariff resolution. In 2023 we declined to advance 31 of 214 candidate sites at this stage. Those rejections are published in the register with reasons.</p>
<div class="sc-meta"><span class="tag t">214 candidates screened</span><span class="tag t">31 declined & published</span><span class="tag">Avg. survey cost $1,840</span><span class="tag">Indicator: aquifer yield ≥ 0.6 l/s</span></div>
</div>
</div>
</article>
<article class="stack-card" style="--i:1" data-step="02" data-reveal>
<div class="sc-grid">
<div>
<span class="sc-kicker">Stage 02 · Months 5–8</span>
<h3>Build once, hand over properly</h3>
<p class="mono" style="font-size:.72rem;letter-spacing:.1em;text-transform:uppercase;color:var(--teal)">Construction · asset title · safeguarding</p>
</div>
<div class="sc-body">
<p>Drilling, development, sanitary sealing, apron and drainage, and installation of a standardized pump platform — we run one technology family per district so that a single mechanic can service every asset in the ward. Each water point is assigned a permanent registration number, GPS coordinate and QR asset plate bolted to the apron.</p>
<p>Handover is a legal act, not a ceremony. The deed of trust transfers title to the committee, is countersigned by the district council, and is scanned into the public register. The committee receives a maintenance manual in the local language, a spares identification kit, and three days of accompanied operation.</p>
<div class="sc-meta"><span class="tag t">1 technology family / district</span><span class="tag t">QR asset plate</span><span class="tag">Median build cost $7,420</span><span class="tag">Defects liability: 12 months</span></div>
</div>
</div>
</article>
<article class="stack-card" style="--i:2" data-step="03" data-reveal>
<div class="sc-grid">
<div>
<span class="sc-kicker">Stage 03 · Years 1–10</span>
<h3>Endow the upkeep</h3>
<p class="mono" style="font-size:.72rem;letter-spacing:.1em;text-transform:uppercase;color:var(--teal)">Trust fund · dealer contracts · Mechanic Corps</p>
</div>
<div class="sc-body">
<p>This is the heart of the model and the reason your monthly gift matters more than a one-off capital donation. Each asset receives a ten-year maintenance endowment — $120 per water point per year — held in a district trust and drawn against a pre-agreed schedule of planned servicing, unscheduled repair, and parts replacement.</p>
<p>We contract local hardware dealers to stock genuine components at capped prices, and we certify community pump mechanics on full scholarships so that a repair is a two-day job, not a two-season one. Committee tariff income is blended with trust draws and progressively replaces the subsidy; by year seven, 68% of our cohorts cover their own O&M.</p>
<div class="sc-meta"><span class="tag t">$120 / point / year</span><span class="tag t">68% tariff self-sufficiency by yr 7</span><span class="tag">9 dealer contracts</span><span class="tag">117 certified mechanics</span></div>
</div>
</div>
</article>
<article class="stack-card" style="--i:3" data-step="04" data-reveal>
<div class="sc-grid">
<div>
<span class="sc-kicker">Stage 04 · Continuous</span>
<h3>Measure, publish, be embarrassed</h3>
<p class="mono" style="font-size:.72rem;letter-spacing:.1em;text-transform:uppercase;color:var(--teal)">Telemetry · lab assays · open data</p>
</div>
<div class="sc-body">
<p>Flow sensors and draw-cycle loggers report over GSM every 72 hours; where there is no coverage, mechanics submit via a USSD shortcode with photographic evidence. Independent enumerators run quarterly water-quality assays for E. coli, nitrate, arsenic and fluoride, and re-verify functionality by unannounced site visit twice a year.</p>
<p>All of it lands in the register you can see at the top of this page — including downtime, budget overruns and the assets we lost. Our logframe, indicator definitions, sampling frame and raw anonymised dataset are released under an open licence each quarter. Charitable giving deserves the same evidentiary standard as a clinical trial.</p>
<div class="sc-meta"><span class="tag t">72-hour telemetry interval</span><span class="tag t">Open data, CC BY 4.0</span><span class="tag">40 samples / lab batch</span><span class="tag">2 unannounced visits / yr</span></div>
</div>
</div>
</article>
</div>
</div>
</section>
<!-- ══════════════ 4. PROGRAMS ══════════════ -->
<section class="pad dark" id="programs" aria-labelledby="prog-title">
<div class="wrap">
<div class="sec-head" data-reveal>
<div>
<span class="eyebrow" data-scramble>Programmes & funding lines</span>
<h2 id="prog-title">Five ways money becomes<br><em>water that stays on.</em></h2>
</div>
<p class="lede">Each programme carries its own restricted fund code, its own cost-per-outcome denominator and its own independent evaluation. Choose the one that matches your intent — or leave it unrestricted and let the field team deploy it where the register is reddest.</p>
</div>
<div class="prog-grid">
<article class="prog flag" data-reveal>
<div class="fpad">
<span class="num">Programme 01 — flagship</span>
<h3>Continuous Flow Contract</h3>
<p>A ten-year operation & maintenance agreement per water point, funded as an endowment and drawn against a published schedule. Covers planned servicing, unscheduled repair, parts, technician labour, transport and committee bookkeeping support. When a contracted asset fails, the dealer is dispatched within 48 hours and the committee pays nothing.</p>
<p style="color:rgba(246,241,231,.55);font-size:.86rem">This is the line that keeps 1,284 pumps turning. It is also the line that institutional funders most often decline to support — because it cannot be photographed. Your unrestricted gifts land here first.</p>
<div class="kpi">
<div><span>Cost / point / yr</span><b>$120</b></div>
<div><span>Assets covered</span><b>1,284</b></div>
<div><span>MTTR</span><b>2.4 d</b></div>
<div><span>Uptime</span><b>96.3%</b></div>
</div>
</div>
<div class="fimg kb">
<img src="https://picsum.photos/900/900" alt="Technician replacing a pump rising main at a borehole" loading="lazy" width="900" height="900">
</div>
</article>
<article class="prog a" data-reveal>
<span class="ribbon">Cohort 15 open</span>
<span class="num">Programme 02</span>
<h3>Mechanic Corps</h3>
<p>Eleven-week residential certification for young men and women from the wards we serve: pump dismantling, metallurgy, PVC and uPVC jointing, sanitary sealing, bookkeeping, and customer-facing tariff negotiation. Graduates receive a tool kit, a dealer credit line and a service territory of roughly 18 water points.</p>
<ul style="list-style:none;padding:0;margin:0 0 1.2rem;font-size:.86rem;color:rgba(246,241,231,.62)">
<li class="mono" style="letter-spacing:.06em">▸ 117 certified · 74% women</li>
<li class="mono" style="letter-spacing:.06em">▸ Median income uplift: +$214/mo</li>
</ul>
<div class="kpi"><div><span>Scholarship</span><b>$450</b></div><div><span>Points / mechanic</span><b>18</b></div></div>
</article>
<article class="prog b" data-reveal>
<span class="num">Programme 03</span>
<h3>Nitrate & Arsenic Lab</h3>
<p>Our district laboratory processes 40-sample batches for microbiological and geochemical contamination, with 48-hour turnaround and same-week SMS results to the committee. Sources that fail are re-classified, flagged in the register and — where treatment is impossible — the population is transitioned to an alternative abstraction under our emergency protocol.</p>
<div class="kpi"><div><span>Batch of 40</span><b>$60</b></div><div><span>Samples FY24</span><b>18,240</b></div><div><span>Flagged</span><b>3.1%</b></div></div>
</article>
<article class="prog c" data-reveal>
<span class="num">Programme 04</span>
<h3>Women's Water Governance</h3>
<p>Statutory quotas mean little without capability. We train committee treasurers and chairs in fiduciary control, tariff setting, minute-keeping and conflict mediation, and we sponsor the district-level water users' association where chairs compare notes on what broke and what worked.</p>
<div class="kpi"><div><span>Committees</span><b>412</b></div><div><span>Women in office</span><b>61%</b></div></div>
</article>
<article class="prog d" data-reveal>
<span class="num">Programme 05</span>
<h3>Rapid Response Repair</h3>
<p>Surge capacity for the days when the register turns red: drought drawdown, cyclone damage, contamination events and conflict displacement. A pre-positioned parts cache in two regional hubs plus an on-call roster gets a crew, a component and a water truck to a failed point inside 72 hours.</p>
<div class="kpi"><div><span>Response</span><b>$250</b></div><div><span>Deployments FY24</span><b>96</b></div><div><span>Activation</span><b><72 h</b></div></div>
</article>
</div>
</div>
</section>
<!-- ══════════════ 5. DONATION TRACKER (core interaction) ══════════════ -->
<section class="pad" id="give" aria-labelledby="give-title">
<div class="wrap">
<div class="sec-head" data-reveal>
<div>
<span class="eyebrow" data-scramble>Gift simulator · live allocation engine</span>
<h2 id="give-title">Move the slider.<br>Watch the <em>register respond.</em></h2>
</div>
<p class="lede">Every figure below is computed from our actual FY2024 unit costs — $120 per water point per year, $450 per mechanic, $60 per 40-sample lab batch, $250 per rapid repair response. No rounding up, no aspirational arithmetic.</p>
</div>
<div class="give-grid">
<!-- controls -->
<div class="panel" data-reveal>
<div class="panel-h">
<h3>1 · Design your gift</h3>
<span class="badge">Step 1 of 2</span>
</div>
<div class="panel-b">
<div class="freq" role="group" aria-label="Giving frequency">
<button type="button" data-freq="once" aria-pressed="true">One-time</button>
<button type="button" data-freq="monthly" aria-pressed="false">Monthly</button>
</div>
<label class="field-lbl" for="amt-input">Amount (USD)</label>
<div class="amt-row">
<div class="money">
<span aria-hidden="true">$</span>
<input id="amt-input" type="number" min="5" max="250000" step="5" value="85" inputmode="numeric" aria-describedby="amt-help">
</div>
<div style="flex:1;display:flex;align-items:center">
<input id="amt-range" type="range" min="5" max="5000" step="5" value="85" aria-label="Adjust gift amount with slider">
</div>
</div>
<p id="amt-help" class="mono" style="font-size:.63rem;letter-spacing:.11em;text-transform:uppercase;color:rgba(15,29,26,.5);margin:0 0 1.3rem">Drag or type · minimum $5 · maximum shown to $5,000</p>
<div class="chips" role="group" aria-label="Suggested amounts">
<button class="chip-amt" type="button" data-amt="40" aria-pressed="false">$40<small>1 quarter of servicing</small></button>
<button class="chip-amt" type="button" data-amt="85" aria-pressed="true">$85<small>2 quarters, 1 point</small></button>
<button class="chip-amt" type="button" data-amt="150" aria-pressed="false">$150<small>1 full year, 1 point</small></button>
<button class="chip-amt" type="button" data-amt="360" aria-pressed="false">$360<small>3 points, 1 year</small></button>
<button class="chip-amt" type="button" data-amt="1200" aria-pressed="false">$1,200<small>10 points, 1 year</small></button>
</div>
<label class="field-lbl" style="margin-top:1.6rem">Direct my gift to</label>
<div class="funds" role="group" aria-label="Restricted fund">
<button class="fund" type="button" data-fund="endowment" aria-pressed="true">
<b>Well Maintenance Endowment</b><i>Fund code WME-10</i><em>$120 = 1 point / year</em>
</button>
<button class="fund" type="button" data-fund="corps" aria-pressed="false">
<b>Mechanic Corps Scholarship</b><i>Fund code MCS-11</i><em>$450 = 1 mechanic</em>
</button>
<button class="fund" type="button" data-fund="lab" aria-pressed="false">
<b>Water Quality Lab</b><i>Fund code WQL-04</i><em>$60 = 40 samples</em>
</button>
<button class="fund" type="button" data-fund="rapid" aria-pressed="false">
<b>Rapid Response Repair</b><i>Fund code RRR-99</i><em>$250 = 1 response</em>
</button>
</div>
<p class="mono" style="font-size:.63rem;letter-spacing:.1em;text-transform:uppercase;color:rgba(15,29,26,.45);margin-top:1.1rem">Or leave it unrestricted — 61% of our individual giving is deployed where downtime is highest.</p>
</div>
</div>
<!-- readout -->
<div class="panel readout" data-reveal>
<div class="panel-h">
<h3>2 · What it funds</h3>
<span class="badge" id="annual-tag">one-time gift</span>
</div>
<div class="panel-b">
<span class="big" id="ro-primary">226</span>
<span class="big-cap" id="ro-cap">people projected to hold continuous safe water access from your <b id="ro-fund-name">endowment</b> gift</span>
<div class="mini-grid">
<div class="mini"><b id="ro-points">0.71</b><span>Water points under 10-yr contract</span></div>
<div class="mini"><b id="ro-tech">1.7</b><span>Technician-days deployed</span></div>
<div class="mini"><b id="ro-samples">2.8</b><span>Lab samples assayed</span></div>
</div>
<div class="split">
<label class="field-lbl">Where the money goes</label>
<div class="split-bar" role="img" aria-label="Allocation: 87 percent programmes, 9 percent operations, 4 percent fundraising">
<i id="sp-1" style="background:var(--teal);width:87%"></i>
<i id="sp-2" style="background:var(--ochre);width:9%"></i>
<i id="sp-3" style="background:var(--clay);width:4%"></i>
</div>
<div class="split-key">
<span><em style="background:var(--teal)"></em>Programme services <b class="mono" id="sp-1v">$73.95</b></span>
<span><em style="background:var(--ochre)"></em>Operations & M&E <b class="mono" id="sp-2v">$7.65</b></span>
<span><em style="background:var(--clay)"></em>Fundraising <b class="mono" id="sp-3v">$3.40</b></span>
</div>
<p class="mono" style="font-size:.66rem;letter-spacing:.1em;margin-top:.9rem;color:rgba(15,29,26,.6)">Effective cost per person-served-year: <b id="ro-cppy" style="color:var(--teal)">$0.38</b> · ten-year horizon reach: <b id="ro-tenyr" style="color:var(--teal)">2,260</b></p>
</div>
<div class="therm" style="border:1px solid var(--line);border-radius:3px;margin-top:1.5rem;background:var(--paper-2);padding:1.1rem 1.2rem">
<div class="therm-top">
<b>The 2,000-Well Commitment</b>
<span id="th-raised">$1,412,640 of $2,000,000</span>
</div>
<div class="tank" role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="70.6" id="th-bar">
<i class="water" id="th-water"></i>
<span class="tank-pct" id="th-pct">70.6%</span>
</div>
<div class="therm-meta"><span id="th-donors">3,908 donors</span><span>Closes 31 December · match expires with it</span></div>
</div>
<button class="btn btn-ochre btn-lg" id="give-submit" style="width:100%;margin-top:1.4rem">
<span id="submit-label">Give $85 now — keep 226 people flowing</span> <span class="arrow" aria-hidden="true">→</span>
</button>
<p class="give-note">
<svg class="lock" width="13" height="16" viewBox="0 0 13 16" fill="none" aria-hidden="true"><rect x="1" y="7" width="11" height="8" rx="1.4" stroke="currentColor" stroke-width="1.3"/><path d="M3.6 7V4.6a2.9 2.9 0 0 1 5.8 0V7" stroke="currentColor" stroke-width="1.3"/></svg>
<span>Processed on a PCI-DSS Level 1 checkout. Keepwell Foundation is a registered 501(c)(3); gifts are tax-deductible in the United States. EIN 47-2891034. You will receive an itemised receipt and your asset's register number within 48 hours.</span>
</p>
<div class="receipt">
<span>Visa · Mastercard · Amex</span><span>ACH / wire</span><span>DAF & crypto</span><span>Stock transfer</span><span>Payroll giving</span>
</div>
</div>
</div>
</div>
<!-- donor feed -->
<div class="give-grid" style="margin-top:1.4rem">
<div class="panel" data-reveal style="grid-column:1/-1">
<div class="panel-h">
<h3>Ledger of recent charitable giving</h3>
<span class="badge">updated live · last 24 hours</span>
</div>
<div class="panel-b" style="padding-top:.4rem">
<ul class="feed" id="feed"></ul>
<p class="mono" style="font-size:.62rem;letter-spacing:.11em;text-transform:uppercase;color:rgba(15,29,26,.45);margin-top:1rem">Names published with donor consent. 39% of givers choose anonymity — we honour that in the ledger and in the register.</p>
</div>
</div>
</div>
</div>
</section>
<!-- ══════════════ 6. STORIES ══════════════ -->
<section class="pad" id="stories" aria-labelledby="stories-title">
<div class="wrap">
<div class="sec-head" data-reveal>
<div>
<span class="eyebrow" data-scramble>Beneficiary voices & field dispatches</span>
<h2 id="stories-title">The people who own<br>the <em>asset register.</em></h2>
</div>
<p class="lede">Impact measurement gets us to the truth; stories get us to the reason. Both belong in the same report. These are committee chairs, mechanics, mothers and health officers speaking about water in the specific — about bearings, ledgers and the hour saved.</p>
</div>
<div class="postcards">
<figure class="pc" data-reveal>
<div class="pc-img">
<img src="https://picsum.photos/600/420" alt="Grace Mwamba standing beside a borehole apron" loading="lazy" width="600" height="420">
<span class="pc-stamp">KP-0912 · Karenga</span>
</div>
<blockquote>“We had eleven meetings before anyone taught us what a sinking fund was. Now we have $640 in the bank and a signed dealer. Last month the bearing went and nobody walked to the river.”</blockquote>
<figcaption class="who">
<img src="https://i.pravatar.cc/120?u=grace-mwamba" alt="" loading="lazy" width="120" height="120">
<span><b>Grace Mwamba</b><span>Chair, Karenga water committee</span></span>
</figcaption>
</figure>
<figure class="pc" data-reveal>
<div class="pc-img">
<img src="https://picsum.photos/600/420?grayscale" alt="Pump mechanic Alphas Khumalo with his tool kit" loading="lazy" width="600" height="420">
<span class="pc-stamp">Cohort 09 · Mufumbwe</span>
</div>
<blockquote>“Eighteen pumps, one motorbike, a phone that works in four of the six wards. I am the only person within 40 kilometres who can rebuild an Afridev stack without sending it to town. My father used to carry water for a living.”</blockquote>
<figcaption class="who">
<img src="https://i.pravatar.cc/120?u=alphas-khumalo" alt="" loading="lazy" width="120" height="120">
<span><b>Alphas Khumalo</b><span>Certified pump mechanic</span></span>
</figcaption>
</figure>
<figure class="pc" data-reveal>
<div class="pc-img">
<img src="https://picsum.photos/600/420" alt="Laboratory technician pipoting a water sample" loading="lazy" width="600" height="420">
<span class="pc-stamp">Lab batch #412</span>
</div>
<blockquote>“Two samples flagged for nitrate at 11.4 mg/L — under the guideline value, but climbing on a shallow sand abstraction. We moved the classification to ‘watch’ and re-sampled in six weeks instead of six months. That is the whole job.”</blockquote>
<figcaption class="who">
<img src="https://i.pravatar.cc/120?u=nasrin-haq" alt="" loading="lazy" width="120" height="120">
<span><b>Dr. Nasrin Haq</b><span>District environmental health officer</span></span>
</figcaption>
</figure>
<figure class="pc" data-reveal>
<div class="pc-img">
<img src="https://picsum.photos/600/420" alt="Children filling jerrycans at a school water point" loading="lazy" width="600" height="420">
<span class="pc-stamp">Chibata Primary</span>
</div>
<blockquote>“Enrolment rose by 19% the year the pump stayed up. Not because of a building. Because girls stopped leaving at noon to fetch water and the latrine could actually be flushed.”</blockquote>
<figcaption class="who">
<img src="https://i.pravatar.cc/120?u=peter-otieno" alt="" loading="lazy" width="120" height="120">
<span><b>Peter Otieno</b><span>Head teacher, Chibata Primary</span></span>
</figcaption>
</figure>
</div>
<div class="feature" data-reveal>
<div class="feature-img kb">
<img src="https://picsum.photos/1000/1100" alt="Women of the Chibata Wells committee gathered around a borehole" loading="lazy" width="1000" height="1100">
<div class="badge-float"><b>1,096</b><span>days with zero unplanned outage at KP-1147</span></div>
</div>
<div>
<div class="meta">
<img src="https://i.pravatar.cc/80?u=imani-sero" alt="" loading="lazy" width="80" height="80">
<span>Field study 07 · reported by Dr. Imani Sero · 14 min read</span>
</div>
<h3>“The year we almost lost Chibata Wells”</h3>
<p>In March 2022 the rising main at KP-1147 corroded through — a failure nobody's inspection schedule anticipated, eleven months after handover. Within 72 hours the committee had logged a ticket, the district dealer had quoted a uPVC replacement, and the trust fund had authorised a $310 draw. Total downtime: two days and six hours. Household water sourcing that week averaged 22 minutes per trip against a pre-project 84.</p>
<p>What followed was more interesting than the repair. Our engineers found the abstraction sat inside a seasonally flooded depression, and the sanitary seal had been undermined by termite activity. We re-sealed, raised the apron by 180mm, added the site to the quarterly gecko-camera roster, and — importantly — published the incident as a design lesson in the open dataset rather than burying it in an appendix. Two other districts changed their standard detail as a result.</p>
<p>Three years on, the 612 residents of Chibata Wells have had no unplanned outage, the committee holds $1,140 in its own account, and the tariff now covers 74% of annualised maintenance. That is what self-sufficiency looks like on a ledger: not a ribbon, but a bearing changed before anyone noticed the squeak.</p>
<a class="readmore" href="#journal">Read the full case study <span class="arrow" aria-hidden="true">→</span></a>
</div>
</div>
</div>
</section>
<!-- ══════════════ 7. ACCOUNTABILITY: JOURNAL + SIDEBAR ══════════════ -->
<section class="pad dark" id="journal" aria-labelledby="acct-title">
<div class="wrap">
<div class="sec-head" data-reveal>
<div>
<span class="eyebrow" data-scramble>Accountability · journal · open data</span>
<h2 id="acct-title">Read the books.<br>Then <em>decide for yourself.</em></h2>
</div>
<p class="lede">Audited financial statements, quarterly indicator returns, evaluation designs and the occasional post-mortem. If a number in this report contradicts a number on our live register, the register is right and we will tell you why.</p>
</div>
<div class="acct-grid">
<div>
<ul class="journal" data-reveal>
<li><a href="#journal">
<span class="jthumb"><img src="https://picsum.photos/300/220?grayscale" alt="" loading="lazy" width="300" height="220"></span>
<span>
<span class="jcat">Impact data</span>
<h4>Q3 register return: 41 new assets, and the three we couldn't save</h4>
<p>Network functional uptime held at 96.1% despite a 14% expansion. Three assets in the Mufumbwe flood plain were reclassified as abandoned after scour undermined the aprons — full incident notes, cost write-offs and lessons appended.</p>
</span>
<span class="jdate">18 Oct 2025<br>7 min</span>
</a></li>
<li><a href="#journal">
<span class="jthumb"><img src="https://picsum.photos/300/220?grayscale" alt="" loading="lazy" width="300" height="220"></span>
<span>
<span class="jcat">Field notes</span>
<h4>What a gasket costs at 06:00 on a Monday</h4>
<p>Our procurement lead followed a single spare part from a warehouse in the regional capital to a cracked cylinder head in Chindia. A short argument for why dealer credit lines matter more than goodwill.</p>
</span>
<span class="jdate">02 Oct 2025<br>5 min</span>
</a></li>
<li><a href="#journal">
<span class="jthumb"><img src="https://picsum.photos/300/220?grayscale" alt="" loading="lazy" width="300" height="220"></span>
<span>
<span class="jcat">Evaluation</span>
<h4>Our independent evaluator changed our headline metric. Here's the before and after.</h4>
<p>Rukwara & Fields argued that “person-served-years” flattered us by weighting small populations. We now report litres-of-safely-managed-water-delivered as the primary indicator, with a restated five-year series.</p>
</span>
<span class="jdate">21 Sep 2025<br>11 min</span>
</a></li>
<li><a href="#journal">
<span class="jthumb"><img src="https://picsum.photos/300/220?grayscale" alt="" loading="lazy" width="300" height="220"></span>
<span>
<span class="jcat">Governance</span>
<h4>Board refresh: two new trustees, one term-limit departure</h4>
<p>Minority-controlled, district-resident majority now stands at 4 of 9 board seats. Full conflict-of-interest register and trustee remuneration policy remain published on the governance page.</p>
</span>
<span class="jdate">04 Sep 2025<br>4 min</span>
</a></li>
<li><a href="#journal">
<span class="jthumb"><img src="https://picsum.photos/300/220?grayscale" alt="" loading="lazy" width="300" height="220"></span>
<span>
<span class="jcat">Programme</span>
<h4>Cohort 14 graduates: 11 mechanics, 9 of them women</h4>
<p>Placement within 30 days for all eleven. Territory mapping, dealer credit terms and the first-year retention rate from cohorts 9–13, which we expected to be worse than it was.</p>
</span>
<span class="jdate">27 Aug 2025<br>6 min</span>
</a></li>
</ul>
<table class="fin" data-reveal>
<caption>Financial summary — fiscal years 2022–2024 (USD, audited)</caption>
<thead>
<tr><th scope="col">Line</th><th scope="col">FY2022</th><th scope="col">FY2023</th><th scope="col">FY2024</th></tr>
</thead>
<tbody>
<tr><td>Contributions, grants & bequests</td><td class="num">11,240,900</td><td class="num">14,806,300</td><td class="num">18,412,750</td></tr>
<tr><td>Programme services</td><td class="num">9,512,400</td><td class="num">12,601,900</td><td class="num">15,918,200</td></tr>
<tr><td>Operations, M&E and open data</td><td class="num">1,041,300</td><td class="num">1,352,600</td><td class="num">1,710,900</td></tr>
<tr><td>Fundraising & donor servicing</td><td class="num">438,200</td><td class="num">592,200</td><td class="num">736,500</td></tr>
<tr><td>Maintenance trusts held in escrow</td><td class="num">2,110,000</td><td class="num">3,940,000</td><td class="num">6,204,000</td></tr>
<tr><td>Person-served-years delivered</td><td class="num">1,206,400</td><td class="num">1,742,900</td><td class="num">2,318,600</td></tr>
</tbody>
<tfoot>
<tr><td>Cost per person-served-year</td><td class="num">$7.88</td><td class="num">$7.23</td><td class="num">$6.10</td></tr>
</tfoot>
</table>
<p class="mono" style="font-size:.62rem;letter-spacing:.11em;text-transform:uppercase;color:rgba(246,241,231,.42);margin-top:1rem">Audited by Rukwara & Fields LLP · unqualified opinion, FY2022–FY2024 · Form 990 available for the six most recent years</p>
</div>
<!-- SIDEBAR -->
<aside class="side" aria-label="Reports, partners and press">
<div class="scard" data-reveal>
<h4>Impact reports & raw data</h4>
<ul class="dl-list">
<li><a href="#journal"><svg width="13" height="15" viewBox="0 0 13 15" fill="none" aria-hidden="true"><path d="M6.5 1v9m0 0 3-3m-3 3-3-3M1 13h11" stroke="currentColor" stroke-width="1.3"/></svg>Annual Impact Report 2024<span class="ext">PDF · 8.4 MB</span></a></li>
<li><a href="#journal"><svg width="13" height="15" viewBox="0 0 13 15" fill="none" aria-hidden="true"><path d="M6.5 1v9m0 0 3-3m-3 3-3-3M1 13h11" stroke="currentColor" stroke-width="1.3"/></svg>Audited financials FY2024<span class="ext">PDF · 1.2 MB</span></a></li>
<li><a href="#journal"><svg width="13" height="15" viewBox="0 0 13 15" fill="none" aria-hidden="true"><path d="M6.5 1v9m0 0 3-3m-3 3-3-3M1 13h11" stroke="currentColor" stroke-width="1.3"/></svg>Form 990 (FY2023)<span class="ext">PDF · 3.1 MB</span></a></li>
<li><a href="#journal"><svg width="13" height="15" viewBox="0 0 13 15" fill="none" aria-hidden="true"><path d="M6.5 1v9m0 0 3-3m-3 3-3-3M1 13h11" stroke="currentColor" stroke-width="1.3"/></svg>Logframe & indicator definitions<span class="ext">DOCX · 240 KB</span></a></li>
<li><a href="#journal"><svg width="13" height="15" viewBox="0 0 13 15" fill="none" aria-hidden="true"><path d="M6.5 1v9m0 0 3-3m-3 3-3-3M1 13h11" stroke="currentColor" stroke-width="1.3"/></svg>Register export — 1,284 assets<span class="ext">CSV · 612 KB</span></a></li>
<li><a href="#journal"><svg width="13" height="15" viewBox="0 0 13 15" fill="none" aria-hidden="true"><path d="M6.5 1v9m0 0 3-3m-3 3-3-3M1 13h11" stroke="currentColor" stroke-width="1.3"/></svg>Safeguarding & PSEA policy<span class="ext">PDF · 480 KB</span></a></li>
</ul>
</div>
<div class="scard partner-hi" data-reveal>
<h4>Partner highlight</h4>
<p><b style="color:var(--paper)">Northwind Bottling Co.</b> has underwritten the Rapid Response fund since 2021, matching every public gift to RRR-99 up to $250,000 a year. Their logistics arm moves our parts cache on return freight at cost — an arrangement worth an estimated $86,000 annually that appears as in-kind revenue in the audit.</p>
<a class="readmore" href="#partners" style="border-color:var(--teal-pale);color:var(--teal-pale);font-size:.82rem">All 46 partners <span class="arrow" aria-hidden="true">→</span></a>
</div>
<div class="scard ask" data-reveal>
<h4>Ask our director anything</h4>
<p>Dr. Imani Sero and the M&E team host an open town hall on 21 November — agenda: our year-three failure data, unredacted. Submit a question in advance or attend live.</p>
<a class="btn" href="#involved"><span>Reserve a seat</span></a>
</div>
<div class="scard" data-reveal>
<h4>Press & recognition</h4>
<div class="press">
<span>Global Water Prize · finalist 2024</span>
<span>The Ledger · “Best-in-class disclosure”</span>
<span>Stanford Social Innovation Review</span>
<span>Charity Navigator · 4 stars, 6 yrs</span>
<span>IRS Guidestar · Platinum</span>
</div>
</div>
<div class="scard" data-reveal>
<h4>Register snapshot</h4>
<div class="dl" style="grid-template-columns:1fr 1fr">
<div><span>Districts served</span><b>4 of 26</b></div>
<div><span>Population reached</span><b>410,900</b></div>
<div><span>Mechanics certified</span><b>117</b></div>
<div><span>Committees trained</span><b>412</b></div>
<div><span>Samples FY2024</span><b>18,240</b></div>
<div><span>Assets abandoned</span><b>3 (0.23%)</b></div>
</div>
</div>
</aside>
</div>
</div>
</section>
<!-- ══════════════ 8. PARTNERS ══════════════ -->
<section class="pad" id="partners" aria-labelledby="partners-title">
<div class="wrap">
<div class="sec-head" data-reveal>
<div>
<span class="eyebrow" data-scramble>Partners · 46 institutional, corporate & civic</span>
<h2 id="partners-title">Nobody endows a<br>district <em>alone.</em></h2>
</div>
<p class="lede">Our partners buy due diligence, not sympathy: co-designed logframes, shared indicators, quarterly data rooms and the right to audit any asset line in the register. Below is who is on the board of the current phase, and what each tier commits to.</p>
</div>
<div class="tier" data-reveal>
<div class="tier-h"><h3>Founding partners</h3><span>Ten-year commitments · unrestricted core</span></div>
<div class="logos">
<div class="logo-cell"><img src="https://placehold.co/240x88/EDE5D6/0F1D1A?text=Harrow+Trust&font=playfair+display" alt="Harrow Trust logo" width="240" height="88"><small>Since 2016</small></div>
<div class="logo-cell"><img src="https://placehold.co/240x88/EDE5D6/0F1D1A?text=Vantage+Foundation&font=montserrat" alt="Vantage Foundation logo" width="240" height="88"><small>Since 2017</small></div>
<div class="logo-cell"><img src="https://placehold.co/240x88/EDE5D6/0F1D1A?text=DGW+Resilience&font=source+sans" alt="Directorate-General for Water Resilience logo" width="240" height="88"><small>Since 2019</small></div>
</div>
</div>
<div class="tier" data-reveal>
<div class="tier-h"><h3>Institutional & technical</h3><span>Restricted grants · joint evaluation</span></div>
<div class="logos">
<div class="logo-cell"><img src="https://placehold.co/200x76/EDE5D6/0F1D1A?text=Chikubu+Institute&font=lora" alt="Chikubu Institute logo" width="200" height="76"><small>Research</small></div>
<div class="logo-cell"><img src="https://placehold.co/200x76/EDE5D6/0F1D1A?text=Meridian+Hydrology&font=oswald" alt="Meridian Hydrology logo" width="200" height="76"><small>Survey partner</small></div>
<div class="logo-cell"><img src="https://placehold.co/200x76/EDE5D6/0F1D1A?text=Sundial+Energy&font=poppins" alt="Sundial Energy logo" width="200" height="76"><small>Solar pumping</small></div>
<div class="logo-cell"><img src="https://placehold.co/200x76/EDE5D6/0F1D1A?text=Rukwara+%26+Fields&font=source+sans+pro" alt="Rukwara and Fields auditors logo" width="200" height="76"><small>Independent audit</small></div>
<div class="logo-cell"><img src="https://placehold.co/200x76/EDE5D6/0F1D1A?text=District+Health+Office&font=noto+sans" alt="District Health Office logo" width="200" height="76"><small>Co-signatory</small></div>
</div>
</div>
<div class="tier" data-reveal>
<div class="tier-h"><h3>Corporate & civic</h3><span>Matching gifts · in-kind logistics · employee volunteering</span></div>
<div class="logos">
<div class="logo-cell"><img src="https://placehold.co/180x68/EDE5D6/0F1D1A?text=Northwind&font=raleway" alt="Northwind Bottling Co logo" width="180" height="68"><small>Rapid Response</small></div>
<div class="logo-cell"><img src="https://placehold.co/180x68/EDE5D6/0F1D1A?text=Copperline&font=roboto" alt="Copperline Engineering logo" width="180" height="68"><small>Pump casting</small></div>
<div class="logo-cell"><img src="https://placehold.co/180x68/EDE5D6/0F1D1A?text=Aldergrove&font=open+sans" alt="Aldergrove Bank logo" width="180" height="68"><small>Trust escrow</small></div>
<div class="logo-cell"><img src="https://placehold.co/180x68/EDE5D6/0F1D1A?text=Fenwick+Law&font=lora" alt="Fenwick Law logo" width="180" height="68"><small>Pro bono</small></div>
<div class="logo-cell"><img src="https://placehold.co/180x68/EDE5D6/0F1D1A?text=Sandgate+Local&font=montserrat" alt="Sandgate Local Union logo" width="180" height="68"><small>1% of dues</small></div>
<div class="logo-cell"><img src="https://placehold.co/180x68/EDE5D6/0F1D1A?text=Kestrel+Air&font=oswald" alt="Kestrel Air Cargo logo" width="180" height="68"><small>Freight at cost</small></div>
</div>
</div>
<div class="match" data-reveal>
<div>
<span class="eyebrow" style="color:var(--teal-pale)">Matched giving, tracked to the asset</span>
<h3 style="margin-top:.9rem">If your employer matches, we record the match against the same water point.</h3>
<p>Twenty-eight of our corporate partners operate gift-matching schemes, and Northwind Bottling matches every public gift to the Rapid Response fund up to $250,000 annually. Submit your match through our donor portal and it appears in the register against the same asset number as your original gift — so the ten-year ledger tells the truth about who paid for the bearing.</p>
<p style="color:rgba(246,241,231,.55);font-size:.86rem">We also accept gifts from donor-advised funds, appreciated securities, charitable remainder trusts and qualified distributions from IRAs over 70½. Speak to our planned-giving officer for a giving illustration.</p>
<div style="display:flex;gap:.7rem;flex-wrap:wrap;margin-top:1.4rem">
<a class="btn btn-ochre" href="#involved"><span>Partner with us</span> <span class="arrow" aria-hidden="true">→</span></a>
<a class="btn btn-ghost" href="#faq"><span>Download the partnership prospectus</span></a>
</div>
</div>
<div class="match-media kb" style="overflow:hidden;border-radius:3px">
<img src="https://picsum.photos/500/620" alt="Corporate volunteers assisting with a pump installation" loading="lazy" width="500" height="620">
</div>
</div>
</div>
</section>
<!-- ══════════════ 9. GET INVOLVED + EVENTS ══════════════ -->
<section class="pad" id="involved" style="background:var(--paper-2);border-top:1px solid var(--line)">
<div class="wrap">
<div class="sec-head" data-reveal>
<div>
<span class="eyebrow" data-scramble>Volunteering · fundraising · planned giving</span>
<h2 id="involved-title">Give money. Or give<br>a <em>Tuesday.</em></h2>
</div>
<p class="lede">We are candid about which forms of help we need: skilled, supervised, and usually behind a desk or a spreadsheet. We will never send a volunteer to lay pipe who has not laid pipe. Our safeguarding policy and vetting process apply to every role below.</p>
</div>
<div class="involved">
<article class="icard i1" data-reveal>
<span class="k">01 · Skills-based volunteering</span>
<h3>Serve on the technical bench</h3>
<p>We maintain a roster of 62 practitioners who review designs, translate manuals, audit trust accounts and interrogate our statistics — usually remotely, in three-to-four-hour blocks twice a term.</p>
<ul>
<li>Hydrogeologists & drillers (design review)</li>
<li>Chartered accountants (trust audits)</li>
<li>Swahili / Bemba / Nyanja translators</li>
<li>Statisticians for the open dataset</li>
<li>WASH-in-emergencies specialists</li>
</ul>
<a class="btn btn-ghost" href="#faq"><span>Join the roster</span></a>
</article>
<article class="icard i2" data-reveal>
<span class="k">02 · Community fundraising</span>
<h3>Host something for water</h3>
<p>Our smallest recurring fundraiser — a church collection plate in Ohio — pays for the quarterly servicing of two water points in Karenga. Set a target, take 92% of the proceeds to the register line you choose, and we'll supply the toolkit, the story and the receipt.</p>
<ul>
<li>Fundraiser toolkit & consent-free imagery</li>
<li>A named water point to sponsor end-to-end</li>
<li>Uptime reports emailed for ten years</li>
<li>Ticket-price guidance from $18 a head</li>
</ul>
<a class="btn btn-ghost" href="#give"><span>Start fundraising</span></a>
</article>
<article class="icard i3" data-reveal>
<span class="k">03 · Legacy & major gifts</span>
<h3>Outlive the problem</h3>
<p>A bequest of $42,000 endows 350 water point-years — three full decades of flowing water for a village that does not yet know your name. Our planned-giving officer will work with your adviser on bequests, CRATs, GRATs, donor-advised funds and asset gifts.</p>
<ul>
<li>Bequest & beneficiary nomination template</li>
<li>Restricted endowment naming (library, ward, gate)</li>
<li>Appreciated securities & crypto accepted</li>
<li>Qualified charitable distributions (age 70½+)</li>
</ul>
<a class="btn btn-ghost" href="#faq"><span>Request the guide</span></a>
</article>
<article class="icard events" data-reveal>
<span class="k">04 · Calendar</span>
<h3 style="margin-bottom:.2rem">Join an event</h3>
<ul class="ev-list">
<li>
<span class="ev-date"><b>08</b>Nov 2025</span>
<span class="ev-title">Pipeline Dinner · Saint Paul<span>A working dinner on the O&M funding cliff. 90 seats, three speakers, one very long table.</span></span>
<span class="ev-place">Sandgate Row · 18:30 CT</span>
<a class="btn btn-ghost" href="#give"><span>Join event</span></a>
</li>
<li>
<span class="ev-date"><b>21</b>Nov 2025</span>
<span class="ev-title">Town hall: our year-three failure data<span>Dr. Imani Sero presents the unredacted cohort-9 to cohort-11 attrition analysis. Questions taken in advance.</span></span>
<span class="ev-place">Online · 12:00 CT</span>
<a class="btn btn-ghost" href="#give"><span>Reserve seat</span></a>
</li>
<li>
<span class="ev-date"><b>02</b>Dec 2025</span>
<span class="ev-title">Giving Tuesday match · 3× on WME-10<span>Northwind Bottling triples every gift to the Well Maintenance Endowment for 24 hours, capped at $180,000.</span></span>
<span class="ev-place">Online · 00:01 CT</span>
<a class="btn btn-ochre" href="#give"><span>Give now</span></a>
</li>
<li>
<span class="ev-date"><b>15</b>Jan 2026</span>
<span class="ev-title">Mechanic Cohort 15 graduation · Mufumbwe<span>Eleven certifications issued. Families, dealers, district office and our board are all in the room.</span></span>
<span class="ev-place">Mufumbwe TC · 09:00 CAT</span>
<a class="btn btn-ghost" href="#stories"><span>Watch live</span></a>
</li>
</ul>
</article>
</div>
</div>
</section>
<!-- ══════════════ 10. FAQ ══════════════ -->
<section class="pad" id="faq" aria-labelledby="faq-title">
<div class="wrap">
<div class="faq-grid">
<div data-reveal>
<span class="eyebrow" data-scramble>Donor questions, answered plainly</span>
<h2 id="faq-title" style="font-size:clamp(1.9rem,3.6vw,2.9rem);margin-top:1rem;letter-spacing:-.03em">Before you<br>give, you'll<br>probably<br>want to<br>know <em style="font-style:italic;color:var(--clay)">this.</em></h2>
<div class="help-card" style="margin-top:2rem">
<h3>Still not answered?</h3>
<p>Our donor care team replies within one business day — a human, not a chatbot, and they can see the register exactly as you can.</p>
<dl>
<dt>Donor care</dt><dd><a href="mailto:donors@keepwell.org">donors@keepwell.org</a></dd>
<dt>Telephone</dt><dd><a href="tel:+16515550147">+1 (651) 555-0147</a> · Mon–Fri 08:00–17:30 CT</dd>
<dt>Partnerships</dt><dd><a href="mailto:partners@keepwell.org">partners@keepwell.org</a></dd>
<dt>Safeguarding report</dt><dd><a href="mailto:integrity@keepwell.org">integrity@keepwell.org</a> (confidential)</dd>
</dl>
</div>
</div>
<div class="acc" id="acc" data-reveal>
<div class="acc-item">
<button class="acc-btn" aria-expanded="false">Can I restrict my gift to a specific fund — or a specific water point?</button>
<div class="acc-panel"><div class="inner">
<p>Yes to both. Restricted giving is available at the fund level (WME-10 endowment, MCS-11 scholarships, WQL-04 laboratory, RRR-99 rapid response) and, for gifts of $1,200 or more, at the asset level — you will be assigned a registration number such as KP-1147 and receive its quarterly telemetry and lab returns for ten years.</p>
<p>We do ask for a small concession: if your named asset is retired, destroyed or found to be unsafe to rehabilitate, we will move your remaining restriction to the nearest equivalent asset in the same ward and write to you first. That clause protects the water point from being abandoned for accounting reasons.</p>
</div></div>
</div>
<div class="acc-item">
<button class="acc-btn" aria-expanded="false">What happens if a well runs dry or the aquifer is contaminated?</button>
<div class="acc-panel"><div class="inner">
<p>It happens, and we plan for it financially. Roughly 2.1% of our assets are classified “non-reclaimable” — mostly saline intrusion or arsenic above 50 µg/L where no affordable treatment exists. In those cases the committee's endowment is transferred to an alternative abstraction in the same ward, the register records the reclassification publicly, and donors to that asset are notified within 30 days with the new number.</p>
<p>We would rather lose an asset than lose a ward's water supply quietly.</p>
</div></div>
</div>
<div class="acc-item">
<button class="acc-btn" aria-expanded="false">How do you actually measure impact — and who checks it?</button>
<div class="acc-panel"><div class="inner">
<p>Our primary indicator is litres of safely managed water delivered per year, triangulated from three sources: GSM telemetry on draw cycles and static head (72-hour interval), mechanic job cards signed by the committee, and unannounced enumerator visits twice a year per asset. Water safety is measured by laboratory assay for E. coli, nitrate, arsenic and fluoride each quarter.</p>
<p>Verification is independent. Rukwara & Fields LLP audits the financials; the Chikubu Institute runs a separate process evaluation on a rotating five-year sample. Our logframe, indicator definitions, sampling frame and raw anonymised dataset are published quarterly under CC BY 4.0. Where an indicator is weak, we say so in the return — the Q3 2025 report flags that self-reported downtime is likely understated by 6–9% in non-telemetry wards.</p>
</div></div>
</div>
<div class="acc-item">
<button class="acc-btn" aria-expanded="false">Is my donation tax-deductible, and how quickly do I get a receipt?</button>
<div class="acc-panel"><div class="inner">
<p>Keepwell Foundation is a registered 501(c)(3) public charity (EIN 47-2891034) and a US-dollar-denominated organisation; gifts from US taxpayers are deductible to the extent permitted by law. We issue an itemised written acknowledgment by email within 48 hours, and a consolidated annual statement in January.</p>
<p>For non-US donors we can provide a donation letter suitable for your local regime, and we hold a UK Gift Aid declaration route for UK taxpayers. Gifts of securities, crypto and DAF grants are handled by our finance office — email <a href="mailto:giving@keepwell.org">giving@keepwell.org</a> for instructions and a valuation template.</p>
</div></div>
</div>
<div class="acc-item">
<button class="acc-btn" aria-expanded="false">Do you work outside the four districts, and will you come to my country?</button>
<div class="acc-panel"><div class="inner">
<p>Deliberately not. We operate in four districts because a maintenance model degrades with distance: a mechanic, a dealer and a laboratory technician need to be within a day's ride of every asset they serve. Scaling geographically without scaling that density is how the sector produced 26% failure rates in the first place.</p>
<p>We do share the model. Our toolkit, contracts, trust deeds and training curricula are open-licensed, and eleven organisations across three continents now run adaptations of the Continuous Flow Contract. We mentor two of them each year at no cost, and we will happily tell you why our numbers will not be yours.</p>
</div></div>
</div>
<div class="acc-item">
<button class="acc-btn" aria-expanded="false">How much of my gift goes to overheads, and is 87% really the right number?</button>
<div class="acc-panel"><div class="inner">
<p>87¢ to programme services, 9¢ to operations (which includes monitoring, evaluation, learning and the open-data infrastructure), 4¢ to fundraising. We think overhead ratios are a blunt instrument, and we publish cost-per-person-served-year alongside them: $6.10 in FY2024, down from $7.88 in FY2022.</p>
<p>Note also that our maintenance trusts sit in escrow and are not counted as expenditure until drawn. That depresses reported programme spend in a growth year and inflates it later. Anyone quoting a single overhead number for Keepwell without that caveat is not reading the footnotes.</p>
</div></div>
</div>
<div class="acc-item">
<button class="acc-btn" aria-expanded="false">Can I cancel or change a monthly gift, and what about refunds?</button>
<div class="acc-panel"><div class="inner">
<p>Monthly donors can pause, reduce, increase or cancel at any time from the donor portal or with a single email — no retention phone call, no guilt. Recurring gifts are charged on the anniversary date of the first payment and we send an advance notice 5 days before each charge above $100.</p>
<p>If a gift was processed in error, tell us within 60 days and we will refund it in full, including the payment-processing loss. Beyond that, we treat it as a completed charitable contribution and will instead redirect it at your instruction to whichever fund best matches your intent.</p>
</div></div>
</div>
</div>
</div>
</div>
</section>
<!-- ══════════════ NEWSLETTER BAND ══════════════ -->
<section class="band" aria-labelledby="band-title">
<div class="wrap band-grid">
<div data-reveal>
<h2 id="band-title">The register, in your inbox, quarterly.</h2>
<p>One email every three months: uptime figures, the assets we lost, what the laboratory found, and a single beneficiary story told in the specific. No appeals embedded, no “urgent crisis” subject lines, and an unsubscribe link that works on the first click.</p>
</div>
<div data-reveal>
<form class="sub-form" id="sub-form" novalidate>
<label for="sub-email" class="mono" style="flex:1 1 100%;font-size:.6rem;letter-spacing:.15em;text-transform:uppercase;color:rgba(246,241,231,.6)">Email address</label>
<input id="sub-email" type="email" name="email" placeholder="you@example.org" autocomplete="email" required>
<button class="btn" type="submit"><span>Subscribe</span></button>
</form>
<p class="sub-note">27,412 readers · we never sell or share donor data · privacy policy applies</p>
<p class="sub-msg" id="sub-msg" role="status" aria-live="polite"></p>
</div>
</div>
</section>
</main>
<!-- ══════════════ FOOTER ══════════════ -->
<footer class="site-foot">
<div class="wrap">
<div class="foot-top">
<div>
<div class="foot-brand">
<img src="https://placehold.co/96x96/0F1D1A/C8752A?text=KW&font=lora" alt="" loading="lazy" width="96" height="96">
<span><strong>Keepwell Foundation</strong><em>Rural water that keeps running</em></span>
</div>
<p style="font-size:.86rem;max-width:34ch">We endow, repair, test and publish the maintenance of rural water points — because a pump that stops is a promise that broke.</p>
<div class="socials" aria-label="Social media">
<a href="#top" aria-label="Keepwell on Bluesky"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="M8 1.5 10.4 6h4.1l-3.3 2.9 1.3 5.1L8 11l-4.5 3 1.3-5.1L1.5 6h4.1L8 1.5Z" stroke="currentColor" stroke-width="1.2" stroke-linejoin="round"/></svg></a>
<a href="#top" aria-label="Keepwell on Instagram"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><rect x="1.8" y="1.8" width="12.4" height="12.4" rx="3.6" stroke="currentColor" stroke-width="1.2"/><circle cx="8" cy="8" r="3" stroke="currentColor" stroke-width="1.2"/><circle cx="12" cy="4" r=".9" fill="currentColor"/></svg></a>
<a href="#top" aria-label="Keepwell on LinkedIn"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><rect x="1.8" y="1.8" width="12.4" height="12.4" rx="2" stroke="currentColor" stroke-width="1.2"/><path d="M5 6.6v4.2M5 4.9v.1M8.4 10.8V6.6m0 1.2c.4-.9 2.6-1.1 2.6.7v2.3" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/></svg></a>
<a href="#top" aria-label="Keepwell on YouTube"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><rect x="1.4" y="3.2" width="13.2" height="9.6" rx="2.6" stroke="currentColor" stroke-width="1.2"/><path d="M6.8 6.1 10 8l-3.2 1.9V6.1Z" fill="currentColor"/></svg></a>
<a href="#top" aria-label="Keepwell on X"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="M2.6 2.6l10.8 10.8M13.4 2.6 2.6 13.4" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/></svg></a>
</div>
</div>
<div>
<h5>Programmes</h5>
<ul>
<li><a href="#programs">Continuous Flow Contract</a></li>
<li><a href="#programs">Mechanic Corps</a></li>
<li><a href="#programs">Nitrate & Arsenic Lab</a></li>
<li><a href="#programs">Women's Water Governance</a></li>
<li><a href="#programs">Rapid Response Repair</a></li>
<li><a href="#model">The ten-year model</a></li>
</ul>
</div>
<div>
<h5>Give</h5>
<ul>
<li><a href="#give">Make a gift</a></li>
<li><a href="#give">Become a monthly sustainer</a></li>
<li><a href="#give">Sponsor a water point</a></li>
<li><a href="#partners">Matched giving</a></li>
<li><a href="#involved">Legacy & planned gifts</a></li>
<li><a href="#involved">Fundraise for us</a></li>
</ul>
</div>
<div>
<h5>Evidence</h5>
<ul>
<li><a href="#impact">Impact measurement</a></li>
<li><a href="#journal">Annual report 2024</a></li>
<li><a href="#journal">Audited financials</a></li>
<li><a href="#journal">Open register (CSV)</a></li>
<li><a href="#journal">Logframe & indicators</a></li>
<li><a href="#faq">Safeguarding policy</a></li>
</ul>
</div>
<div class="contact">
<h5>Contact</h5>
<p><b>Keepwell Foundation</b><br>1400 Sandgate Row, Suite 320<br>Saint Paul, Minnesota 55102<br>United States</p>
<p><b>Donor care</b><br><a href="tel:+16515550147">+1 (651) 555-0147</a><br><a href="mailto:donors@keepwell.org">donors@keepwell.org</a></p>
<p><b>Field office</b><br>Mufumbwe District Council Road<br>Mufumbwe, Copperbelt<br><a href="mailto:field@keepwell.org">field@keepwell.org</a></p>
</div>
</div>
<div class="foot-bottom">
<span>© 2025 Keepwell Foundation · EIN 47-2891034 · Registered 501(c)(3)</span>
<nav aria-label="Legal">
<a href="#faq">Privacy</a>
<a href="#faq">Terms</a>
<a href="#faq">Donor Bill of Rights</a>
<a href="#faq">Accessibility (WCAG 2.2 AA)</a>
<a href="#faq">Modern slavery statement</a>
<a href="#top">Back to top ↑</a>
</nav>
</div>
</div>
</footer>
<button class="totop" id="totop" aria-label="Back to top">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" aria-hidden="true"><path d="M7 12V2m0 0L2.6 6.4M7 2l4.4 4.4" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>
</button>
<div class="toast" id="toast" role="status" aria-live="polite"></div>
<script>
(function(){
'use strict';
const RM = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
const $ = (s,c)=> (c||document).querySelector(s);
const $$ = (s,c)=> Array.from((c||document).querySelectorAll(s));
const nf = (n,d)=> n.toLocaleString('en-US',{minimumFractionDigits:d||0,maximumFractionDigits:d||0});
/* ─────────── header behaviour ─────────── */
const head = $('.site-head'), bar = $('#scrollbar'), totop = $('#totop');
function onScroll(){
const y = window.scrollY;
head.classList.toggle('stuck', y > 8);
totop.classList.toggle('show', y > 900);
const h = document.documentElement.scrollHeight - window.innerHeight;
bar.style.width = (h > 0 ? (y/h)*100 : 0) + '%';
}
window.addEventListener('scroll', onScroll, {passive:true}); onScroll();
totop.addEventListener('click', ()=> window.scrollTo({top:0, behavior: RM?'auto':'smooth'}));
const tog = $('.nav-toggle');
tog.addEventListener('click', ()=>{
const open = document.body.classList.toggle('menu-open');
tog.setAttribute('aria-expanded', String(open));
});
$$('.main-nav a').forEach(a=> a.addEventListener('click', ()=>{
document.body.classList.remove('menu-open'); tog.setAttribute('aria-expanded','false');
}));
/* active nav link */
const navLinks = $$('.main-nav a');
const secs = navLinks.map(a=> document.querySelector(a.getAttribute('href'))).filter(Boolean);
const navObs = new IntersectionObserver(es=>{
es.forEach(e=>{
if(e.isIntersecting){
navLinks.forEach(a=> a.classList.toggle('active', a.getAttribute('href') === '#'+e.target.id));
}
});
},{rootMargin:'-45% 0px -50% 0px'});
secs.forEach(s=> navObs.observe(s));
/* ─────────── reveal on scroll ─────────── */
const revObs = new IntersectionObserver((es,o)=>{
es.forEach(e=>{ if(e.isIntersecting){ e.target.classList.add('revealed'); o.unobserve(e.target);} });
},{threshold:.12, rootMargin:'0px 0px -8% 0px'});
$$('[data-reveal]').forEach((el,i)=>{ el.style.transitionDelay = Math.min(i%6,5)*70 + 'ms'; revObs.observe(el); });
$$('.hero-title').forEach(h=> setTimeout(()=> h.classList.add('revealed'), 180));
/* ─────────── count-up ─────────── */
function countUp(el){
const target = parseFloat(el.dataset.count);
const dec = parseInt(el.dataset.decimals||'0',10);
const suf = el.dataset.suffix||'';
if(RM){ el.textContent = nf(target,dec)+suf; return; }
const dur = 1500, t0 = performance.now();
(function step(t){
const p = Math.min(1,(t-t0)/dur), e = 1-Math.pow(1-p,3);
el.textContent = nf(target*e, dec)+suf;
if(p<1) requestAnimationFrame(step);
})(t0);
}
const cObs = new IntersectionObserver((es,o)=>{
es.forEach(e=>{ if(e.isIntersecting){ countUp(e.target); o.unobserve(e.target);} });
},{threshold:.6});
$$('[data-count]').forEach(el=> cObs.observe(el));
/* bar fills */
const bObs = new IntersectionObserver((es,o)=>{
es.forEach(e=>{ if(e.isIntersecting){ e.target.style.width = e.target.dataset.w+'%'; o.unobserve(e.target);} });
},{threshold:.5});
$$('.bar-fill').forEach(b=> bObs.observe(b));
/* ─────────── scramble decode ─────────── */
const GLYPH = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789·/#';
function scramble(el){
const final = el.textContent;
if(RM) return;
let frame = 0;
const queue = final.split('').map((c,i)=> ({c, start: Math.floor(i*1.4), end: Math.floor(i*1.4)+10}));
const id = setInterval(()=>{
let out = '', done = 0;
queue.forEach(q=>{
if(frame >= q.end){ out += q.c; done++; }
else if(frame >= q.start){ out += (q.c===' '?' ':GLYPH[Math.floor(Math.random()*GLYPH.length)]); }
else out += ' ';
});
el.textContent = out;
if(done === queue.length) clearInterval(id);
frame++;
}, 34);
}
const sObs = new IntersectionObserver((es,o)=>{
es.forEach(e=>{ if(e.isIntersecting){ scramble(e.target); o.unobserve(e.target);} });
},{threshold:.9});
$$('[data-scramble]').forEach(el=> sObs.observe(el));
/* ═══════════════════════════════════════════
LIVE WATER-POINT REGISTER
═══════════════════════════════════════════ */
function mulberry32(a){return function(){a|=0;a=a+0x6D2B79F5|0;let t=Math.imul(a^a>>>15,1|a);t=t+Math.imul(t^t>>>7,61|t)^t;return((t^t>>>14)>>>0)/4294967296}}
const rnd = mulberry32(20251107);
const pick = arr => arr[Math.floor(rnd()*arr.length)];
const WARDS = ['Chibata Wells','Karenga','Mufumbwe','Chindia','Musaka','Nyambweu','Kasenshi','Bulungu','Ndola East','Serenje Flats','Lufupa','Chisamba','Mpika Ridge','Kabwe Valley','Lilongwe North','Zomba Terrace','Mchinji Bend','Nkhotakota','Balaka West','Thokoza Hill','Gwandu','Makonde Plain','Songo Phase II','Iringa Step','Tunduru','Kigoma Wharf','Mbarara Rise','Kabale Flats','Busia Corridor','Tororo North'];
const DISTRICTS = ['Mufumbwe','Karenga','Chindia','Bulungu'];
const TECH = ['Borehole · Afridev II handpump','Borehole · India Mark II','Shallow well · parapet + handpump','Protected spring · gravity box','Borehole · solar pump + standpipe'];
const DEALERS = ['Copperline Spares (Mufumbwe)','Khumalo Hardware & Pump Services','Ndola Hydro Parts Ltd','Serenje Tools Depot','Thokoza Water Supply'];
const STATUS = [
{k:'ok', cls:'s-ok', chip:'ok', label:'Flowing', w:.80},
{k:'svc', cls:'s-svc', chip:'warn', label:'Scheduled service', w:.11},
{k:'part',cls:'s-part', chip:'bad', label:'Awaiting part', w:.06},
{k:'off', cls:'s-off', chip:'warn', label:'Dry-season offline', w:.03}
];
function rollStatus(){ const r=rnd(); let acc=0; for(const s of STATUS){ acc+=s.w; if(r<=acc) return s; } return STATUS[0]; }
const POINTS = [];
for(let i=0;i<36;i++){
const st = rollStatus();
const pop = 180 + Math.floor(rnd()*740);
const yr = 2016 + Math.floor(rnd()*9);
POINTS.push({
id:'KP-'+(412+i*23),
ward: WARDS[i%WARDS.length],
district: DISTRICTS[i%DISTRICTS.length],
tech: pick(TECH),
status: st,
pop: pop,
commissioned: yr+'-'+String(1+Math.floor(rnd()*12)).padStart(2,'0'),
lastCheck: (1+Math.floor(rnd()*26))+' days ago',
nextVisit: (2+Math.floor(rnd()*70))+' days',
downtime: st.k==='ok' ? (Math.floor(rnd()*9)) : (st.k==='svc'? 1+Math.floor(rnd()*4) : 3+Math.floor(rnd()*22)),
ecoli: rnd()>.94 ? 'Present (re-chlorinated)' : 'Absent /100ml',
nitrate: (0.8+rnd()*9.4).toFixed(1)+' mg/L',
arsenic: (rnd()*34).toFixed(1)+' µg/L',
draw: 60+Math.floor(rnd()*340),
head: (4+rnd()*38).toFixed(1)+' m',
dealer: pick(DEALERS),
chair: pick(['Grace Mwamba','Alphas Khumalo','Josephine Banda','Peter Otieno','Mary Phiri','Sandile Ndlovu','Annet Kabele','Thomas Chipo']),
cppy: (4.9+rnd()*3.4).toFixed(2)
});
}
const tilesEl = $('#tiles');
POINTS.forEach((p,idx)=>{
const b = document.createElement('button');
b.type='button';
b.className = 'tile '+p.status.cls;
b.setAttribute('aria-pressed','false');
b.setAttribute('aria-label', p.id+' '+p.ward+' — '+p.status.label);
b.innerHTML = '<span class="tid">'+p.id.replace('KP-','')+'</span><span class="tdot"></span>';
b.addEventListener('click', ()=> selectPoint(idx,b));
tilesEl.appendChild(b);
});
function renderDetail(p){
return '<div class="detail-top"><h3>'+p.id+' · '+p.ward+'</h3>'+
'<span class="chip '+p.status.chip+'">'+p.status.label+'</span>'+
'<span class="mono" style="font-size:.6rem;letter-spacing:.12em;color:rgba(246,241,231,.45);margin-left:auto">'+p.district+' district</span></div>'+
'<div class="dl">'+
'<div><span>Technology</span><b>'+p.tech+'</b></div>'+
'<div><span>Beneficiaries</span><b>'+nf(p.pop)+' people</b></div>'+
'<div><span>Commissioned</span><b>'+p.commissioned+'</b></div>'+
'<div><span>Last inspection</span><b>'+p.lastCheck+'</b></div>'+
'<div><span>Next scheduled visit</span><b>'+p.nextVisit+'</b></div>'+
'<div><span>Downtime, 12 mo.</span><b>'+p.downtime+' days</b></div>'+
'<div><span>E. coli</span><b>'+p.ecoli+'</b></div>'+
'<div><span>Nitrate / arsenic</span><b>'+p.nitrate+' · '+p.arsenic+'</b></div>'+
'<div><span>Draw cycles / day</span><b>'+nf(p.draw)+'</b></div>'+
'<div><span>Static head</span><b>'+p.head+'</b></div>'+
'<div><span>Parts dealer</span><b>'+p.dealer+'</b></div>'+
'<div><span>Cost / person-year</span><b>$'+p.cppy+'</b></div>'+
'</div>'+
'<p class="note">Asset title held by the '+p.ward+' water committee (chair: '+p.chair+'). Ten-year maintenance endowment WME-10 active. Readings submitted via telemetry; verified by unannounced enumerator visit.</p>';
}
const detailEl = $('#point-detail');
function selectPoint(i, node){
$$('.tile').forEach(t=> t.setAttribute('aria-pressed','false'));
node.setAttribute('aria-pressed','true');
detailEl.innerHTML = renderDetail(POINTS[i]);
}
selectPoint(0, tilesEl.firstChild);
/* clock + live status churn */
function tickClock(){
const d = new Date();
const pad = n=> String(n).padStart(2,'0');
$('#sync-clock').textContent = 'sync '+pad(d.getUTCHours())+':'+pad(d.getUTCMinutes())+':'+pad(d.getUTCSeconds())+' UTC';
}
tickClock(); setInterval(tickClock, 1000);
function recount(){
const c = {ok:0,svc:0,part:0,off:0};
POINTS.forEach(p=> c[p.status.k]++);
const total = POINTS.length;
const pct = (c.ok/total*100);
$('.bstat.ok b:last-of-type') ;
const els = $$('.bstat b');
els[1].textContent = pct.toFixed(1)+'%';
$('#stat-svc').textContent = Math.round(44 * (c.svc/Math.max(1,STATUS[1].w*total)) );
$('#stat-part').textContent = Math.round(9 * (c.part/Math.max(1,STATUS[2].w*total)) );
}
recount();
setInterval(()=>{
const i = Math.floor(Math.random()*POINTS.length);
const p = POINTS[i];
const next = Math.random()<.55 ? STATUS[0] : rollStatus();
if(next.k === p.status.k) return;
p.status = next;
p.downtime = next.k==='ok' ? p.downtime : p.downtime + Math.floor(Math.random()*3);
const node = tilesEl.children[i];
node.className = 'tile '+next.cls + (RM?'':' flash');
node.setAttribute('aria-label', p.id+' '+p.ward+' — '+next.label);
if(node.getAttribute('aria-pressed')==='true') detailEl.innerHTML = renderDetail(p);
recount();
}, 5200);
/* ticker dispatches */
const DISPATCH = [
['KP-2207','Chibata Wells — rising main replaced, flow restored 14:20'],
['LAB #412','40 samples assayed · 2 flagged for nitrate · results SMS’d'],
['COHORT 14','11 mechanics certified in Mufumbwe · 9 of them women'],
['KP-0912','Karenga — quarterly gecko-camera inspection passed, seal intact'],
['RRR-99','Crew dispatched to Chindia, ETA 6 h · dealer credit authorised'],
['TRUST','Escrow draw $310 approved by Bulungu committee treasurer'],
['KP-1147','1,096 days, zero unplanned outage'],
['DATASET','Q3 register export published · 1,284 rows · CC BY 4.0'],
['KP-0455','Reclassified non-reclaimable (arsenic 61 µg/L) · donors notified'],
['MATCH','Northwind Bottling released $42,000 against RRR-99']
];
const tt = $('#ticker-track');
function buildTicker(){
let html='';
for(let pass=0; pass<2; pass++){
DISPATCH.forEach(([tag,msg])=>{ html += '<span><b>'+tag+'</b> '+msg+'</span>'; });
}
tt.innerHTML = html;
}
buildTicker();
/* ═══════════════════════════════════════════
DONATION TRACKER / GIFT SIMULATOR
═══════════════════════════════════════════ */
const UNIT = {
endowment:{name:'Well Maintenance Endowment', short:'endowment', cost:120},
corps:{name:'Mechanic Corps Scholarship', short:'scholarship', cost:450},
lab:{name:'Water Quality Lab', short:'lab gift', cost:60},
rapid:{name:'Rapid Response Repair', short:'repair gift', cost:250}
};
const POP_PER_POINT = 320;
let state = {amount:85, freq:'once', fund:'endowment'};
let campaign = {raised:1412640, goal:2000000, donors:3908};
function impacts(a, fund){
const pts = a/UNIT[fund].cost;
switch(fund){
case 'endowment': return {points:pts, people:pts*POP_PER_POINT, techDays:pts*2.4, samples:pts*4};
case 'corps': return {points:pts*18, people:pts*18*POP_PER_POINT, techDays:pts*120, samples:pts*40};
case 'lab': return {points:pts/4, people:(pts*40)*52, techDays:pts*1.5, samples:pts*40};
case 'rapid': return {points:pts, people:pts*POP_PER_POINT, techDays:pts*2, samples:pts*1};
}
}
function smart(n){
if(n>=1000) return nf(Math.round(n));
if(n>=100) return nf(Math.round(n));
if(n>=10) return n.toFixed(1).replace(/\.0$/,'');
return n.toFixed(2).replace(/\.?0+$/,'') || '0';
}
const el = id => document.getElementById(id);
function render(){
const a = state.amount;
const annual = state.freq==='monthly' ? a*12 : a;
const im = impacts(annual, state.fund);
el('annual-tag').textContent = state.freq==='monthly' ? 'monthly · $'+nf(a)+' × 12' : 'one-time gift';
el('ro-primary').textContent = smart(im.people);
el('ro-fund-name').textContent = UNIT[state.fund].short;
el('ro-cap').innerHTML = 'people projected to hold continuous safe water access from your <b>'+UNIT[state.fund].short+'</b> gift'+
(state.freq==='monthly'?' <span style="opacity:.6">(annualised, first year)</span>':'');
el('ro-points').textContent = smart(im.points);
el('ro-tech').textContent = smart(im.techDays);
el('ro-samples').textContent = smart(im.samples);
const cppy = im.people>0 ? annual/im.people : 0;
el('ro-cppy').textContent = '$'+ (cppy<1 ? cppy.toFixed(2) : cppy.toFixed(2));
el('ro-tenyr').textContent = smart(im.people*10);
el('sp-1v').textContent = '$'+ (a*.87).toFixed(2);
el('sp-2v').textContent = '$'+ (a*.09).toFixed(2);
el('sp-3v').textContent = '$'+ (a*.04).toFixed(2);
el('submit-label').textContent = 'Give $'+nf(a)+(state.freq==='monthly'?'/mo':'')+' now — reach '+smart(im.people)+' people';
// slider fill
const pct = Math.max(0, Math.min(100, ((a-5)/(5000-5))*100));
el('amt-range').style.setProperty('--pct', pct+'%');
}
function setAmount(v, from){
v = Math.max(5, Math.min(250000, Math.round(v||0)));
state.amount = v;
if(from!=='input') el('amt-input').value = v;
if(from!=='range') el('amt-range').value = Math.min(5000, v);
$$('.chip-amt').forEach(c=> c.setAttribute('aria-pressed', String(Number(c.dataset.amt)===v)));
render();
}
el('amt-input').addEventListener('input', e=> setAmount(parseFloat(e.target.value)||0,'input'));
el('amt-input').addEventListener('blur', e=> setAmount(parseFloat(e.target.value)||5,'input'));
el('amt-range').addEventListener('input', e=> setAmount(parseFloat(e.target.value),'range'));
$$('.chip-amt').forEach(c=> c.addEventListener('click', ()=> setAmount(Number(c.dataset.amt),'chip')));
$$('.freq button').forEach(b=> b.addEventListener('click', ()=>{
state.freq = b.dataset.freq;
$$('.freq button').forEach(x=> x.setAttribute('aria-pressed', String(x===b)));
render();
}));
$$('.fund').forEach(f=> f.addEventListener('click', ()=>{
state.fund = f.dataset.fund;
$$('.fund').forEach(x=> x.setAttribute('aria-pressed', String(x===f)));
render();
}));
setAmount(85);
/* thermometer */
function renderTherm(){
const pct = Math.min(100, campaign.raised/campaign.goal*100);
el('th-water').style.width = pct+'%';
el('th-pct').textContent = pct.toFixed(1)+'%';
el('th-bar').setAttribute('aria-valuenow', pct.toFixed(1));
el('th-raised').textContent = '$'+nf(Math.round(campaign.raised))+' of $'+nf(campaign.goal);
el('th-donors').textContent = nf(campaign.donors)+' donors';
}
setTimeout(renderTherm, 400);
/* donor feed */
const FEED = [
['A. Okonkwo','rapid',250,'2 min ago', 'okonkwo'],
['R. Feld (monthly)','endowment',40,'11 min ago','feld'],
['The Harrow Trust','endowment',25000,'34 min ago','harrow'],
['Anonymous','corps',85,'1 hr ago','anon1'],
['M. Diallo','lab',120,'2 hrs ago','diallo'],
['Northwind Bottling (matched)','rapid',6000,'3 hrs ago','northwind'],
['J. & P. Aldridge, DAF','corps',4500,'4 hrs ago','aldridge'],
['L. Nakamura','endowment',150,'5 hrs ago','nakamura']
];
function feedRow([name,fund,amt,when,uid], you){
const li = document.createElement('li');
if(you) li.className='you';
li.innerHTML = '<img class="av" src="https://i.pravatar.cc/80?u='+uid+'" alt="" loading="lazy" width="80" height="80">'+
'<span><b>'+name+'</b><small>'+UNIT[fund].name+'</small></span>'+
'<span class="amt">$'+nf(amt)+' <small style="display:block;text-align:right">'+when+'</small></span>';
return li;
}
const feedEl = $('#feed');
FEED.forEach(r=> feedEl.appendChild(feedRow(r)));
/* submit */
const toast = $('#toast');
let toastTimer;
function showToast(html){
toast.innerHTML = html; toast.classList.add('show');
clearTimeout(toastTimer);
toastTimer = setTimeout(()=> toast.classList.remove('show'), 6200);
}
$('#give-submit').addEventListener('click', ()=>{
const a = state.amount;
const im = impacts(state.freq==='monthly'?a*12:a, state.fund);
const add = state.freq==='monthly' ? a*12 : a;
campaign.raised = Math.min(campaign.goal, campaign.raised + add);
campaign.donors += 1;
renderTherm();
feedEl.prepend(feedRow(['You', state.fund, a, 'just now','you-donor'], true));
if(feedEl.children.length > 12) feedEl.removeChild(feedEl.lastChild);
showToast('<b>Thank you.</b> Your '+(state.freq==='monthly'? '$'+nf(a)+' monthly gift' : '$'+nf(a)+' gift')+' is provisionally allocated to '+UNIT[state.fund].name+
', reaching ≈'+smart(im.people)+' people. In the live checkout you would now be handed to our PCI-DSS payment provider.');
});
/* ═══════════════════════════════════════════
ACCORDION
═══════════════════════════════════════════ */
$$('.acc-item').forEach(item=>{
const btn = $('.acc-btn', item), panel = $('.acc-panel', item);
btn.addEventListener('click', ()=>{
const open = item.classList.contains('open');
$$('.acc-item.open').forEach(o=>{
o.classList.remove('open');
$('.acc-panel',o).style.height = '0px';
$('.acc-btn',o).setAttribute('aria-expanded','false');
});
if(!open){
item.classList.add('open');
panel.style.height = panel.firstElementChild.offsetHeight + 'px';
btn.setAttribute('aria-expanded','true');
}
});
});
window.addEventListener('resize', ()=>{
const o = $('.acc-item.open'); if(o) $('.acc-panel',o).style.height = o.querySelector('.acc-panel').firstElementChild.offsetHeight+'px';
});
/* ═══════════════════════════════════════════
NEWSLETTER
═══════════════════════════════════════════ */
$('#sub-form').addEventListener('submit', e=>{
e.preventDefault();
const v = $('#sub-email').value.trim();
const ok = /^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/.test(v);
$('#sub-msg').textContent = ok
? '✓ Confirmed — the Q4 register digest arrives on 12 December. Nothing in between, we promise.'
: '✗ That email doesn’t look right. Try again, or write to donors@keepwell.org.';
$('#sub-msg').style.color = ok ? 'var(--teal-pale)' : '#F0B78E';
if(ok) $('#sub-email').value = '';
});
})();
</script>
</body>
</html>
View Axe Report (JSON)
{
"testEngine": {
"name": "axe-core",
"version": "4.10.2"
},
"testRunner": {
"name": "axe"
},
"testEnvironment": {
"userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/156.0.8078.4 Safari/537.36",
"windowWidth": 1280,
"windowHeight": 720,
"orientationAngle": 0,
"orientationType": "landscape-primary"
},
"timestamp": "2026-11-12T10:02:33.411Z",
"url": "https://benchmark.aimac.invalid/926f6130faa137dee2449f670f7f1d3c6e5442b95cc68dd78be718b2e6151a31.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-required-children",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag131",
"EN-301-549",
"EN-9.1.3.1"
],
"description": "Ensure elements with an ARIA role that require child roles contain them",
"help": "Certain ARIA roles must contain particular children",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-required-children?application=axeAPI",
"nodes": []
},
{
"id": "aria-required-parent",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag131",
"EN-301-549",
"EN-9.1.3.1"
],
"description": "Ensure elements with an ARIA role that require parent roles are contained by them",
"help": "Certain ARIA roles must be contained by particular parents",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-required-parent?application=axeAPI",
"nodes": []
},
{
"id": "aria-toggle-field-name",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"TTv5",
"TT5.c",
"EN-301-549",
"EN-9.4.1.2",
"ACT"
],
"description": "Ensure every ARIA toggle field has an accessible name",
"help": "ARIA toggle fields must have an accessible name",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-toggle-field-name?application=axeAPI",
"nodes": []
},
{
"id": "aria-tooltip-name",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure every ARIA tooltip node has an accessible name",
"help": "ARIA tooltip nodes must have an accessible name",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-tooltip-name?application=axeAPI",
"nodes": []
},
{
"id": "blink",
"impact": null,
"tags": [
"cat.time-and-media",
"wcag2a",
"wcag222",
"section508",
"section508.22.j",
"TTv5",
"TT2.b",
"EN-301-549",
"EN-9.2.2.2"
],
"description": "Ensure <blink> elements are not used",
"help": "<blink> elements are deprecated and must not be used",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/blink?application=axeAPI",
"nodes": []
},
{
"id": "frame-focusable-content",
"impact": null,
"tags": [
"cat.keyboard",
"wcag2a",
"wcag211",
"TTv5",
"TT4.a",
"EN-301-549",
"EN-9.2.1.1"
],
"description": "Ensure <frame> and <iframe> elements with focusable content do not have tabindex=-1",
"help": "Frames with focusable content must not have tabindex=-1",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/frame-focusable-content?application=axeAPI",
"nodes": []
},
{
"id": "frame-title-unique",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag412",
"TTv5",
"TT12.d",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure <iframe> and <frame> elements contain a unique title attribute",
"help": "Frames must have a unique title attribute",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/frame-title-unique?application=axeAPI",
"nodes": []
},
{
"id": "frame-title",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag412",
"section508",
"section508.22.i",
"TTv5",
"TT12.d",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure <iframe> and <frame> elements have an accessible name",
"help": "Frames must have an accessible name",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/frame-title?application=axeAPI",
"nodes": []
},
{
"id": "html-xml-lang-mismatch",
"impact": null,
"tags": [
"cat.language",
"wcag2a",
"wcag311",
"EN-301-549",
"EN-9.3.1.1",
"ACT"
],
"description": "Ensure that HTML elements with both valid lang and xml:lang attributes agree on the base language of the page",
"help": "HTML elements with lang and xml:lang must have the same base language",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/html-xml-lang-mismatch?application=axeAPI",
"nodes": []
},
{
"id": "input-button-name",
"impact": null,
"tags": [
"cat.name-role-value",
"wcag2a",
"wcag412",
"section508",
"section508.22.a",
"TTv5",
"TT5.c",
"EN-301-549",
"EN-9.4.1.2",
"ACT"
],
"description": "Ensure input buttons have discernible text",
"help": "Input buttons must have discernible text",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/input-button-name?application=axeAPI",
"nodes": []
},
{
"id": "input-image-alt",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag111",
"wcag412",
"section508",
"section508.22.a",
"TTv5",
"TT7.a",
"EN-301-549",
"EN-9.1.1.1",
"EN-9.4.1.2",
"ACT"
],
"description": "Ensure <input type=\"image\"> elements have alternative text",
"help": "Image buttons must have alternative text",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/input-image-alt?application=axeAPI",
"nodes": []
},
{
"id": "link-in-text-block",
"impact": null,
"tags": [
"cat.color",
"wcag2a",
"wcag141",
"TTv5",
"TT13.a",
"EN-301-549",
"EN-9.1.4.1"
],
"description": "Ensure links are distinguished from surrounding text in a way that does not rely on color",
"help": "Links must be distinguishable without relying on color",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/link-in-text-block?application=axeAPI",
"nodes": []
},
{
"id": "marquee",
"impact": null,
"tags": [
"cat.parsing",
"wcag2a",
"wcag222",
"TTv5",
"TT2.b",
"EN-301-549",
"EN-9.2.2.2"
],
"description": "Ensure <marquee> elements are not used",
"help": "<marquee> elements are deprecated and must not be used",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/marquee?application=axeAPI",
"nodes": []
},
{
"id": "meta-refresh",
"impact": null,
"tags": [
"cat.time-and-media",
"wcag2a",
"wcag221",
"TTv5",
"TT8.a",
"EN-301-549",
"EN-9.2.2.1"
],
"description": "Ensure <meta http-equiv=\"refresh\"> is not used for delayed refresh",
"help": "Delayed refresh under 20 hours must not be used",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/meta-refresh?application=axeAPI",
"nodes": []
},
{
"id": "object-alt",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag111",
"section508",
"section508.22.a",
"EN-301-549",
"EN-9.1.1.1"
],
"description": "Ensure <object> elements have alternative text",
"help": "<object> elements must have alternative text",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/object-alt?application=axeAPI",
"nodes": []
},
{
"id": "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": "valid-lang",
"impact": null,
"tags": [
"cat.language",
"wcag2aa",
"wcag312",
"TTv5",
"TT11.b",
"EN-301-549",
"EN-9.3.1.2",
"ACT"
],
"description": "Ensure lang attributes have valid values",
"help": "lang attribute must have a valid value",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/valid-lang?application=axeAPI",
"nodes": []
},
{
"id": "video-caption",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag122",
"section508",
"section508.22.a",
"TTv5",
"TT17.a",
"EN-301-549",
"EN-9.1.2.2"
],
"description": "Ensure <video> elements have captions",
"help": "<video> elements must have captions",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/video-caption?application=axeAPI",
"nodes": []
},
{
"id": "no-autoplay-audio",
"impact": null,
"tags": [
"cat.time-and-media",
"wcag2a",
"wcag142",
"TTv5",
"TT2.a",
"EN-301-549",
"EN-9.1.4.2",
"ACT"
],
"description": "Ensure <video> or <audio> elements do not autoplay audio for more than 3 seconds without a control mechanism to stop or mute the audio",
"help": "<video> or <audio> elements must not play automatically",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/no-autoplay-audio?application=axeAPI",
"nodes": []
}
],
"passes": [
{
"id": "aria-allowed-attr",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure an element's role supports its ARIA attributes",
"help": "Elements must only use supported ARIA attributes",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-allowed-attr?application=axeAPI",
"nodes": [
{
"any": [],
"all": [
{
"id": "aria-allowed-attr",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "ARIA attributes are used correctly for the defined role"
}
],
"none": [
{
"id": "aria-unsupported-attr",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "ARIA attribute is supported"
}
],
"impact": null,
"html": "<a class=\"brand\" href=\"#top\" aria-label=\"Keepwell Foundation \u2014 home\">",
"target": [
".brand"
]
}
]
},
{
"id": "aria-conditional-attr",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure ARIA attributes are used as described in the specification of the element's role",
"help": "ARIA attributes must be used as specified for the element's role",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-conditional-attr?application=axeAPI",
"nodes": [
{
"any": [],
"all": [
{
"id": "aria-conditional-attr",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "ARIA attribute is allowed"
}
],
"none": [],
"impact": null,
"html": "<a class=\"brand\" href=\"#top\" aria-label=\"Keepwell Foundation \u2014 home\">",
"target": [
".brand"
]
}
]
},
{
"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=\"tiles\" id=\"tiles\" role=\"group\" aria-label=\"Water-point status grid \u2014 select a point for details\">",
"target": [
"#tiles"
]
}
]
},
{
"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": "<div class=\"progress-rail\" aria-hidden=\"true\"><i id=\"scrollbar\" style=\"width: 0%;\"></i></div>",
"target": [
".progress-rail"
]
}
]
},
{
"id": "aria-prohibited-attr",
"impact": "serious",
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure ARIA attributes are not prohibited for an element's role",
"help": "Elements must only use permitted ARIA attributes",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-prohibited-attr?application=axeAPI",
"nodes": [
{
"any": [],
"all": [],
"none": [
{
"id": "aria-prohibited-attr",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "ARIA attribute is allowed"
}
],
"impact": null,
"html": "<a class=\"brand\" href=\"#top\" aria-label=\"Keepwell Foundation \u2014 home\">",
"target": [
".brand"
]
}
]
},
{
"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=\"tiles\" id=\"tiles\" role=\"group\" aria-label=\"Water-point status grid \u2014 select a point for details\">",
"target": [
"#tiles"
]
}
]
},
{
"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=\"tiles\" id=\"tiles\" role=\"group\" aria-label=\"Water-point status grid \u2014 select a point for details\">",
"target": [
"#tiles"
]
}
]
},
{
"id": "aria-valid-attr-value",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure all ARIA attributes have valid values",
"help": "ARIA attributes must conform to valid values",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-valid-attr-value?application=axeAPI",
"nodes": [
{
"any": [],
"all": [
{
"id": "aria-valid-attr-value",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "ARIA attribute values are valid"
},
{
"id": "aria-errormessage",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "aria-errormessage exists and references elements visible to screen readers that use a supported aria-errormessage technique"
},
{
"id": "aria-level",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "aria-level values are valid"
}
],
"none": [],
"impact": null,
"html": "<a class=\"brand\" href=\"#top\" aria-label=\"Keepwell Foundation \u2014 home\">",
"target": [
".brand"
]
}
]
},
{
"id": "aria-valid-attr",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure attributes that begin with aria- are valid ARIA attributes",
"help": "ARIA attributes must conform to valid names",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-valid-attr?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "aria-valid-attr",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "ARIA attribute name is valid"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<a class=\"brand\" href=\"#top\" aria-label=\"Keepwell Foundation \u2014 home\">",
"target": [
".brand"
]
}
]
},
{
"id": "autocomplete-valid",
"impact": null,
"tags": [
"cat.forms",
"wcag21aa",
"wcag135",
"EN-301-549",
"EN-9.1.3.5",
"ACT"
],
"description": "Ensure the autocomplete attribute is correct and suitable for the form field",
"help": "autocomplete attribute must be used correctly",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/autocomplete-valid?application=axeAPI",
"nodes": [
{
"any": [],
"all": [
{
"id": "autocomplete-valid",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "the autocomplete attribute is correctly formatted"
}
],
"none": [],
"impact": null,
"html": "<input id=\"sub-email\" type=\"email\" name=\"email\" placeholder=\"you@example.org\" autocomplete=\"email\" required=\"\">",
"target": [
"#sub-email"
]
}
]
},
{
"id": "avoid-inline-spacing",
"impact": null,
"tags": [
"cat.structure",
"wcag21aa",
"wcag1412",
"EN-301-549",
"EN-9.1.4.12",
"ACT"
],
"description": "Ensure that text spacing set through style attributes can be adjusted with custom stylesheets",
"help": "Inline text spacing must be adjustable with custom stylesheets",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/avoid-inline-spacing?application=axeAPI",
"nodes": [
{
"any": [],
"all": [
{
"id": "important-letter-spacing",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "Letter-spacing in the style attribute is not set to !important, or meets the minimum"
},
{
"id": "important-word-spacing",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "word-spacing in the style attribute is not set to !important, or meets the minimum"
},
{
"id": "important-line-height",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "line-height in the style attribute is not set to !important, or meets the minimum"
}
],
"none": [],
"impact": null,
"html": "<div class=\"hero-copy revealed\" data-reveal=\"\" style=\"transition-delay: 0ms;\">",
"target": [
".hero-copy"
]
}
]
},
{
"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"
},
{
"id": "aria-label",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "aria-label attribute exists and is not empty"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<button type=\"button\" class=\"tile s-off\" aria-pressed=\"true\" aria-label=\"KP-412 Chibata Wells \u2014 Dry-season offline\"><span class=\"tid\">412</span><span class=\"tdot\"></span></button>",
"target": [
".s-off.tile[type=\"button\"]:nth-child(1)"
]
}
]
},
{
"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 revealed\" id=\"hero-title\">\n <span class=\"ln\"><i>Anyone can dig</i></span>\n <span class=\"ln\"><i>a well. Few stay</i></span>\n <span class=\"ln\"><i><em>to fix it.</em></i></span>\n </h1>",
"target": [
"#hero-title"
]
},
{
"html": "<h3>KP-412 \u00b7 Chibata Wells</h3>",
"target": [
".detail-top > h3"
]
},
{
"html": "<h2 id=\"gap-title\">Capital builds wells.<br>Endowments keep <em>water flowing.</em></h2>",
"target": [
"#gap-title"
]
},
{
"html": "<h3>Why pumps die: five failure modes we engineer against</h3>",
"target": [
".flow > h3"
]
},
{
"html": "<h2 id=\"model-title\">Four moves, repeated<br>until the <em>district owns it.</em></h2>",
"target": [
"#model-title"
]
},
{
"html": "<h3>Diagnose before you drill</h3>",
"target": [
"article[data-step=\"01\"] > .sc-grid > div:nth-child(1) > h3"
]
},
{
"html": "<h3>Build once, hand over properly</h3>",
"target": [
"article[data-step=\"02\"] > .sc-grid > div:nth-child(1) > h3"
]
},
{
"html": "<h3>Endow the upkeep</h3>",
"target": [
"article[data-step=\"03\"] > .sc-grid > div:nth-child(1) > h3"
]
},
{
"html": "<h3>Measure, publish, be embarrassed</h3>",
"target": [
"article[data-step=\"04\"] > .sc-grid > div:nth-child(1) > h3"
]
},
{
"html": "<h2 id=\"prog-title\">Five ways money becomes<br><em>water that stays on.</em></h2>",
"target": [
"#prog-title"
]
},
{
"html": "<h3>Continuous Flow Contract</h3>",
"target": [
".fpad > h3"
]
},
{
"html": "<h3>Mechanic Corps</h3>",
"target": [
".a > h3"
]
},
{
"html": "<h3>Nitrate & Arsenic Lab</h3>",
"target": [
".b > h3"
]
},
{
"html": "<h3>Women's Water Governance</h3>",
"target": [
".c > h3"
]
},
{
"html": "<h3>Rapid Response Repair</h3>",
"target": [
".d > h3"
]
},
{
"html": "<h2 id=\"give-title\">Move the slider.<br>Watch the <em>register respond.</em></h2>",
"target": [
"#give-title"
]
},
{
"html": "<h3>1 \u00b7 Design your gift</h3>",
"target": [
".give-grid:nth-child(2) > .panel[data-reveal=\"\"]:nth-child(1) > .panel-h > h3"
]
},
{
"html": "<h3>2 \u00b7 What it funds</h3>",
"target": [
".readout > .panel-h > h3"
]
},
{
"html": "<h3>Ledger of recent charitable giving</h3>",
"target": [
".give-grid:nth-child(3) > .panel[data-reveal=\"\"] > .panel-h > h3"
]
},
{
"html": "<h2 id=\"stories-title\">The people who own<br>the <em>asset register.</em></h2>",
"target": [
"#stories-title"
]
},
{
"html": "<h3>\u201cThe year we almost lost Chibata Wells\u201d</h3>",
"target": [
".feature > div:nth-child(2) > h3"
]
},
{
"html": "<h2 id=\"acct-title\">Read the books.<br>Then <em>decide for yourself.</em></h2>",
"target": [
"#acct-title"
]
},
{
"html": "<h4>Q3 register return: 41 new assets, and the three we couldn't save</h4>",
"target": [
"li:nth-child(1) > a[href$=\"#journal\"] > span:nth-child(2) > h4"
]
},
{
"html": "<h4>What a gasket costs at 06:00 on a Monday</h4>",
"target": [
"li:nth-child(2) > a[href$=\"#journal\"] > span:nth-child(2) > h4"
]
},
{
"html": "<h4>Our independent evaluator changed our headline metric. Here's the before and after.</h4>",
"target": [
"li:nth-child(3) > a[href$=\"#journal\"] > span:nth-child(2) > h4"
]
},
{
"html": "<h4>Board refresh: two new trustees, one term-limit departure</h4>",
"target": [
"li:nth-child(4) > a[href$=\"#journal\"] > span:nth-child(2) > h4"
]
},
{
"html": "<h4>Cohort 14 graduates: 11 mechanics, 9 of them women</h4>",
"target": [
"li:nth-child(5) > a[href$=\"#journal\"] > span:nth-child(2) > h4"
]
},
{
"html": "<h4>Impact reports & raw data</h4>",
"target": [
".scard[data-reveal=\"\"]:nth-child(1) > h4"
]
},
{
"html": "<h4>Partner highlight</h4>",
"target": [
".partner-hi > h4"
]
},
{
"html": "<h4>Ask our director anything</h4>",
"target": [
".ask > h4"
]
},
{
"html": "<h4>Press & recognition</h4>",
"target": [
".scard[data-reveal=\"\"]:nth-child(4) > h4"
]
},
{
"html": "<h4>Register snapshot</h4>",
"target": [
".scard[data-reveal=\"\"]:nth-child(5) > h4"
]
},
{
"html": "<h2 id=\"partners-title\">Nobody endows a<br>district <em>alone.</em></h2>",
"target": [
"#partners-title"
]
},
{
"html": "<h3>Founding partners</h3>",
"target": [
".tier[data-reveal=\"\"]:nth-child(2) > .tier-h > h3"
]
},
{
"html": "<h3>Institutional & technical</h3>",
"target": [
".tier[data-reveal=\"\"]:nth-child(3) > .tier-h > h3"
]
},
{
"html": "<h3>Corporate & civic</h3>",
"target": [
".tier[data-reveal=\"\"]:nth-child(4) > .tier-h > h3"
]
},
{
"html": "<h3 style=\"margin-top:.9rem\">If your employer matches, we record the match against the same water point.</h3>",
"target": [
".match > div:nth-child(1) > h3"
]
},
{
"html": "<h2 id=\"involved-title\">Give money. Or give<br>a <em>Tuesday.</em></h2>",
"target": [
"#involved-title"
]
},
{
"html": "<h3>Serve on the technical bench</h3>",
"target": [
".i1 > h3"
]
},
{
"html": "<h3>Host something for water</h3>",
"target": [
".i2 > h3"
]
},
{
"html": "<h3>Outlive the problem</h3>",
"target": [
".i3 > h3"
]
},
{
"html": "<h3 style=\"margin-bottom:.2rem\">Join an event</h3>",
"target": [
".events > h3"
]
},
{
"html": "<h2 id=\"faq-title\" style=\"font-size:clamp(1.9rem,3.6vw,2.9rem);margin-top:1rem;letter-spacing:-.03em\">Before you<br>give, you'll<br>probably<br>want to<br>know <em style=\"font-style:italic;color:var(--clay)\">this.</em></h2>",
"target": [
"#faq-title"
]
},
{
"html": "<h3>Still not answered?</h3>",
"target": [
".help-card > h3"
]
},
{
"html": "<h2 id=\"band-title\">The register, in your inbox, quarterly.</h2>",
"target": [
"#band-title"
]
},
{
"html": "<h5>Programmes</h5>",
"target": [
"div:nth-child(2) > h5"
]
},
{
"html": "<h5>Give</h5>",
"target": [
"div:nth-child(3) > h5"
]
},
{
"html": "<h5>Evidence</h5>",
"target": [
"div:nth-child(4) > h5"
]
},
{
"html": "<h5>Contact</h5>",
"target": [
".contact > h5"
]
}
],
"impact": "serious",
"message": "Page has a heading"
},
{
"id": "landmark",
"data": null,
"relatedNodes": [
{
"html": "<main id=\"main\">",
"target": [
"#main"
]
}
],
"impact": "serious",
"message": "Page has a landmark region"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<html lang=\"en\">",
"target": [
"html"
]
}
]
},
{
"id": "color-contrast",
"impact": "serious",
"tags": [
"cat.color",
"wcag2aa",
"wcag143",
"TTv5",
"TT13.c",
"EN-301-549",
"EN-9.1.4.3",
"ACT"
],
"description": "Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds",
"help": "Elements must meet minimum color contrast ratio thresholds",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/color-contrast?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#0f1d1a",
"bgColor": "#f6f1e7",
"contrastRatio": 15.4,
"fontSize": "14.2pt (18.88px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "3:1",
"shadowColor": null
},
"relatedNodes": [],
"impact": "serious",
"message": "Element has sufficient color contrast of 15.4"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<strong>Keepwell Foundation</strong>",
"target": [
".brand-text > strong"
]
}
]
},
{
"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": [
{
"any": [],
"all": [],
"none": [
{
"id": "structured-dlitems",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "When not empty, element has both <dt> and <dd> elements"
},
{
"id": "only-dlitems",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "dl element only has direct children that are allowed inside; <dt>, <dd>, or <div> elements"
}
],
"impact": null,
"html": "<dl>",
"target": [
"dl"
]
}
]
},
{
"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": [
{
"any": [
{
"id": "dlitem",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "Description list item has a <dl> parent element"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<dt>Donor care</dt>",
"target": [
"dt:nth-child(1)"
]
}
]
},
{
"id": "document-title",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag242",
"TTv5",
"TT12.a",
"EN-301-549",
"EN-9.2.4.2",
"ACT"
],
"description": "Ensure each HTML document contains a non-empty <title> element",
"help": "Documents must have <title> element to aid in navigation",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/document-title?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "doc-has-title",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "Document has a non-empty <title> element"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<html lang=\"en\">",
"target": [
"html"
]
}
]
},
{
"id": "duplicate-id-aria",
"impact": null,
"tags": [
"cat.parsing",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure every id attribute value used in ARIA and in labels is unique",
"help": "IDs used in ARIA and labels must be unique",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/duplicate-id-aria?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "duplicate-id-aria",
"data": "primary-nav",
"relatedNodes": [],
"impact": "critical",
"message": "Document has no elements referenced with ARIA or labels that share the same id attribute"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<nav class=\"main-nav\" id=\"primary-nav\" aria-label=\"Primary\">",
"target": [
"#primary-nav"
]
}
]
},
{
"id": "form-field-multiple-labels",
"impact": null,
"tags": [
"cat.forms",
"wcag2a",
"wcag332",
"TTv5",
"TT5.c",
"EN-301-549",
"EN-9.3.3.2"
],
"description": "Ensure form field does not have multiple label elements",
"help": "Form field must not have multiple label elements",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/form-field-multiple-labels?application=axeAPI",
"nodes": [
{
"any": [],
"all": [],
"none": [
{
"id": "multiple-label",
"data": null,
"relatedNodes": [
{
"html": "<label class=\"field-lbl\" for=\"amt-input\">Amount (USD)</label>",
"target": [
"label[for=\"amt-input\"]"
]
}
],
"impact": "moderate",
"message": "Form field does not have multiple label elements"
}
],
"impact": null,
"html": "<input id=\"amt-input\" type=\"number\" min=\"5\" max=\"250000\" step=\"5\" value=\"85\" inputmode=\"numeric\" aria-describedby=\"amt-help\">",
"target": [
"#amt-input"
]
}
]
},
{
"id": "html-has-lang",
"impact": null,
"tags": [
"cat.language",
"wcag2a",
"wcag311",
"TTv5",
"TT11.a",
"EN-301-549",
"EN-9.3.1.1",
"ACT"
],
"description": "Ensure every HTML document has a lang attribute",
"help": "<html> element must have a lang attribute",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/html-has-lang?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "has-lang",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "The <html> element has a lang attribute"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<html lang=\"en\">",
"target": [
"html"
]
}
]
},
{
"id": "html-lang-valid",
"impact": null,
"tags": [
"cat.language",
"wcag2a",
"wcag311",
"TTv5",
"TT11.a",
"EN-301-549",
"EN-9.3.1.1",
"ACT"
],
"description": "Ensure the lang attribute of the <html> element has a valid value",
"help": "<html> element must have a valid value for the lang attribute",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/html-lang-valid?application=axeAPI",
"nodes": [
{
"any": [],
"all": [],
"none": [
{
"id": "valid-lang",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "Value of lang attribute is included in the list of valid languages"
}
],
"impact": null,
"html": "<html lang=\"en\">",
"target": [
"html"
]
}
]
},
{
"id": "image-alt",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag111",
"section508",
"section508.22.a",
"TTv5",
"TT7.a",
"TT7.b",
"EN-301-549",
"EN-9.1.1.1",
"ACT"
],
"description": "Ensure <img> elements have alternative text or a role of none or presentation",
"help": "Images must have alternative text",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/image-alt?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "has-alt",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "Element has an alt attribute"
}
],
"all": [],
"none": [
{
"id": "alt-space-value",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "Element has a valid alt attribute value"
}
],
"impact": null,
"html": "<img class=\"brand-mark\" src=\"https://placehold.co/96x96/0F1D1A/C8752A?text=KW&font=lora\" alt=\"Keepwell Foundation monogram logo\" width=\"96\" height=\"96\">",
"target": [
".brand-mark"
]
}
]
},
{
"id": "label",
"impact": null,
"tags": [
"cat.forms",
"wcag2a",
"wcag412",
"section508",
"section508.22.n",
"TTv5",
"TT5.c",
"EN-301-549",
"EN-9.4.1.2",
"ACT"
],
"description": "Ensure every form element has a label",
"help": "Form elements must have labels",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/label?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "explicit-label",
"data": null,
"relatedNodes": [
{
"html": "<label class=\"field-lbl\" for=\"amt-input\">Amount (USD)</label>",
"target": [
"label[for=\"amt-input\"]"
]
}
],
"impact": "critical",
"message": "Element has an explicit <label>"
}
],
"all": [],
"none": [
{
"id": "hidden-explicit-label",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "Form element has a visible explicit <label>"
}
],
"impact": null,
"html": "<input id=\"amt-input\" type=\"number\" min=\"5\" max=\"250000\" step=\"5\" value=\"85\" inputmode=\"numeric\" aria-describedby=\"amt-help\">",
"target": [
"#amt-input"
]
}
]
},
{
"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 main content</a>",
"target": [
".skip"
]
}
]
},
{
"id": "list",
"impact": null,
"tags": [
"cat.structure",
"wcag2a",
"wcag131",
"EN-301-549",
"EN-9.1.3.1"
],
"description": "Ensure that lists are structured correctly",
"help": "<ul> and <ol> must only directly contain <li>, <script> or <template> elements",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/list?application=axeAPI",
"nodes": [
{
"any": [],
"all": [],
"none": [
{
"id": "only-listitems",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "List element only has direct children that are allowed inside <li> elements"
}
],
"impact": null,
"html": "<ol class=\"causes\">",
"target": [
"ol"
]
}
]
},
{
"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><div><b>No budget line for O&M</b><p>Tariff collection collapses when the committee has no trained treasurer; median sinking-fund balance across comparator assets was $38 against a $210 repair.</p></div></li>",
"target": [
"ol > li:nth-child(1)"
]
}
]
},
{
"id": "meta-viewport",
"impact": null,
"tags": [
"cat.sensory-and-visual-cues",
"wcag2aa",
"wcag144",
"EN-301-549",
"EN-9.1.4.4",
"ACT"
],
"description": "Ensure <meta name=\"viewport\"> does not disable text scaling and zooming",
"help": "Zooming and scaling must not be disabled",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/meta-viewport?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "meta-viewport",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "<meta> tag does not disable zooming on mobile devices"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">",
"target": [
"meta[name=\"viewport\"]"
]
}
]
},
{
"id": "nested-interactive",
"impact": null,
"tags": [
"cat.keyboard",
"wcag2a",
"wcag412",
"TTv5",
"TT6.a",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure interactive controls are not nested as they are not always announced by screen readers or can cause focus problems for assistive technologies",
"help": "Interactive controls must not be nested",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/nested-interactive?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "no-focusable-content",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "Element does not have focusable descendants"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<img class=\"brand-mark\" src=\"https://placehold.co/96x96/0F1D1A/C8752A?text=KW&font=lora\" alt=\"Keepwell Foundation monogram logo\" width=\"96\" height=\"96\">",
"target": [
".brand-mark"
]
}
]
},
{
"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": [
{
"any": [
{
"id": "aria-label",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "aria-label attribute exists and is not empty"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<div class=\"split-bar\" role=\"img\" aria-label=\"Allocation: 87 percent programmes, 9 percent operations, 4 percent fundraising\">",
"target": [
".split-bar"
]
}
]
},
{
"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": {
"minSize": 24,
"width": 201.7,
"height": 53.1
},
"relatedNodes": [],
"impact": "serious",
"message": "Control has sufficient size (201.7px by 53.1px, 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 main content</a>",
"target": [
".skip"
]
}
]
},
{
"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": [
{
"any": [],
"all": [
{
"id": "td-headers-attr",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "The headers attribute is exclusively used to refer to other cells in the table"
}
],
"none": [],
"impact": null,
"html": "<table class=\"fin\" data-reveal=\"\" style=\"transition-delay: 0ms;\">",
"target": [
"table"
]
}
]
},
{
"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": [
{
"any": [],
"all": [
{
"id": "th-has-data-cells",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "All table header cells refer to data cells"
}
],
"none": [],
"impact": null,
"html": "<table class=\"fin\" data-reveal=\"\" style=\"transition-delay: 0ms;\">",
"target": [
"table"
]
}
]
}
],
"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=\"socials\" aria-label=\"Social media\">",
"target": [
".socials"
],
"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": {
"fontSize": "10.8pt (14.4px)",
"fontWeight": "bold",
"messageKey": "pseudoContent",
"expectedContrastRatio": "4.5:1"
},
"relatedNodes": [
{
"html": "<a class=\"btn btn-ochre\" href=\"#give\"><span>Donate</span></a>",
"target": [
".head-cta > .btn-ochre.btn[href$=\"#give\"]"
]
}
],
"impact": "serious",
"message": "Element's background color could not be determined due to a pseudo element"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>Donate</span>",
"target": [
".head-cta > .btn-ochre.btn[href$=\"#give\"] > span"
],
"failureSummary": "Fix any of the following:\n Element's background color could not be determined due to a pseudo element"
}
]
}
],
"violations": [
{
"id": "aria-progressbar-name",
"impact": "serious",
"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": [
{
"any": [
{
"id": "aria-label",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "aria-label attribute does not exist or is empty"
},
{
"id": "aria-labelledby",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty"
},
{
"id": "non-empty-title",
"data": {
"messageKey": "noAttr"
},
"relatedNodes": [],
"impact": "serious",
"message": "Element has no title attribute"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<div class=\"tank\" role=\"progressbar\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"70.6\" id=\"th-bar\">\n <i class=\"water\" id=\"th-water\" style=\"width: 70.632%;\"></i>\n <span class=\"tank-pct\" id=\"th-pct\">70.6%</span>\n </div>",
"target": [
"#th-bar"
],
"failureSummary": "Fix any of the following:\n aria-label attribute does not exist or is empty\n aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty\n Element has no title attribute"
}
]
},
{
"id": "color-contrast",
"impact": "serious",
"tags": [
"cat.color",
"wcag2aa",
"wcag143",
"TTv5",
"TT13.c",
"EN-301-549",
"EN-9.1.4.3",
"ACT"
],
"description": "Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds",
"help": "Elements must meet minimum color contrast ratio thresholds",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/color-contrast?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#707670",
"bgColor": "#0f1d1a",
"contrastRatio": 3.72,
"fontSize": "7.4pt (9.92px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section class=\"pad dark\" id=\"journal\" aria-labelledby=\"acct-title\">",
"target": [
"#journal"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.72 (foreground color: #707670, background color: #0f1d1a, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<p class=\"mono\" style=\"font-size:.62rem;letter-spacing:.11em;text-transform:uppercase;color:rgba(246,241,231,.42);margin-top:1rem\">Audited by Rukwara & Fields LLP \u00b7 unqualified opinion, FY2022\u2013FY2024 \u00b7 Form 990 available for the six most recent years</p>",
"target": [
".acct-grid > div > .mono"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.72 (foreground color: #707670, background color: #0f1d1a, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#777c76",
"bgColor": "#0f1d1a",
"contrastRatio": 4.07,
"fontSize": "7.6pt (10.08px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<footer class=\"site-foot\">",
"target": [
"footer"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.07 (foreground color: #777c76, background color: #0f1d1a, font size: 7.6pt (10.08px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>\u00a9 2025 Keepwell Foundation \u00b7 EIN 47-2891034 \u00b7 Registered 501(c)(3)</span>",
"target": [
".foot-bottom > span"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.07 (foreground color: #777c76, background color: #0f1d1a, font size: 7.6pt (10.08px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#777c76",
"bgColor": "#0f1d1a",
"contrastRatio": 4.07,
"fontSize": "7.6pt (10.08px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<footer class=\"site-foot\">",
"target": [
"footer"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.07 (foreground color: #777c76, background color: #0f1d1a, font size: 7.6pt (10.08px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#faq\">Privacy</a>",
"target": [
"nav[aria-label=\"Legal\"] > a[href$=\"#faq\"]:nth-child(1)"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.07 (foreground color: #777c76, background color: #0f1d1a, font size: 7.6pt (10.08px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#777c76",
"bgColor": "#0f1d1a",
"contrastRatio": 4.07,
"fontSize": "7.6pt (10.08px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<footer class=\"site-foot\">",
"target": [
"footer"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.07 (foreground color: #777c76, background color: #0f1d1a, font size: 7.6pt (10.08px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#faq\">Terms</a>",
"target": [
"nav[aria-label=\"Legal\"] > a[href$=\"#faq\"]:nth-child(2)"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.07 (foreground color: #777c76, background color: #0f1d1a, font size: 7.6pt (10.08px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#777c76",
"bgColor": "#0f1d1a",
"contrastRatio": 4.07,
"fontSize": "7.6pt (10.08px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<footer class=\"site-foot\">",
"target": [
"footer"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.07 (foreground color: #777c76, background color: #0f1d1a, font size: 7.6pt (10.08px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#faq\">Donor Bill of Rights</a>",
"target": [
"a[href$=\"#faq\"]:nth-child(3)"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.07 (foreground color: #777c76, background color: #0f1d1a, font size: 7.6pt (10.08px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#777c76",
"bgColor": "#0f1d1a",
"contrastRatio": 4.07,
"fontSize": "7.6pt (10.08px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<footer class=\"site-foot\">",
"target": [
"footer"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.07 (foreground color: #777c76, background color: #0f1d1a, font size: 7.6pt (10.08px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#faq\">Accessibility (WCAG 2.2 AA)</a>",
"target": [
"a[href$=\"#faq\"]:nth-child(4)"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.07 (foreground color: #777c76, background color: #0f1d1a, font size: 7.6pt (10.08px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#777c76",
"bgColor": "#0f1d1a",
"contrastRatio": 4.07,
"fontSize": "7.6pt (10.08px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<footer class=\"site-foot\">",
"target": [
"footer"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.07 (foreground color: #777c76, background color: #0f1d1a, font size: 7.6pt (10.08px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#faq\">Modern slavery statement</a>",
"target": [
"nav[aria-label=\"Legal\"] > a[href$=\"#faq\"]:nth-child(5)"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.07 (foreground color: #777c76, background color: #0f1d1a, font size: 7.6pt (10.08px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#777c76",
"bgColor": "#0f1d1a",
"contrastRatio": 4.07,
"fontSize": "7.6pt (10.08px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<footer class=\"site-foot\">",
"target": [
"footer"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.07 (foreground color: #777c76, background color: #0f1d1a, font size: 7.6pt (10.08px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"#top\">Back to top \u2191</a>",
"target": [
"nav[aria-label=\"Legal\"] > a[href$=\"#top\"]"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.07 (foreground color: #777c76, background color: #0f1d1a, font size: 7.6pt (10.08px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#777c76",
"bgColor": "#f6f1e7",
"contrastRatio": 3.78,
"fontSize": "8.9pt (11.84px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<body>",
"target": [
"body"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 8.9pt (11.84px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>Keepwell network uptime, rolling 12 mo.</span>",
"target": [
".ours > span"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 8.9pt (11.84px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#777c76",
"bgColor": "#f6f1e7",
"contrastRatio": 3.78,
"fontSize": "8.9pt (11.84px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<body>",
"target": [
"body"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 8.9pt (11.84px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>Mean time to repair: <b class=\"mono\" style=\"font-size:1rem\">2.4 days</b></span>",
"target": [
".stat-pair > div:nth-child(2) > span"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 8.9pt (11.84px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#777c76",
"bgColor": "#f6f1e7",
"contrastRatio": 3.78,
"fontSize": "12.0pt (16px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<body>",
"target": [
"body"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 12.0pt (16px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<b class=\"mono\" style=\"font-size:1rem\">2.4 days</b>",
"target": [
"div:nth-child(2) > span > .mono"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 12.0pt (16px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#838781",
"bgColor": "#f6f1e7",
"contrastRatio": 3.24,
"fontSize": "9.4pt (12.48px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<body>",
"target": [
"body"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.24 (foreground color: #838781, background color: #f6f1e7, font size: 9.4pt (12.48px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<p style=\"font-size:.78rem;color:rgba(15,29,26,.5);margin-top:1.6rem;line-height:1.55\">",
"target": [
".sticky-col > p"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.24 (foreground color: #838781, background color: #f6f1e7, font size: 9.4pt (12.48px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#7e8178",
"bgColor": "#ede5d6",
"contrastRatio": 3.16,
"fontSize": "7.6pt (10.08px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"bars revealed\" data-reveal=\"\" style=\"transition-delay: 0ms;\">",
"target": [
".bars"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.16 (foreground color: #7e8178, background color: #ede5d6, font size: 7.6pt (10.08px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<p class=\"mono\" style=\"font-size:.63rem;letter-spacing:.13em;text-transform:uppercase;color:rgba(15,29,26,.5);margin:.9rem 0 0\">Share of water points non-functional at time of survey \u00b7 lower is better \u00b7 n=3,900 vs n=1,284</p>",
"target": [
".bars > .mono"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.16 (foreground color: #7e8178, background color: #ede5d6, font size: 7.6pt (10.08px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c8752a",
"bgColor": "#f6f1e7",
"contrastRatio": 3.09,
"fontSize": "7.9pt (10.56px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<article class=\"stack-card revealed\" style=\"--i: 0; transition-delay: 140ms;\" data-step=\"01\" data-reveal=\"\">",
"target": [
"article[data-step=\"01\"]"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.09 (foreground color: #c8752a, background color: #f6f1e7, font size: 7.9pt (10.56px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"sc-kicker\">Stage 01 \u00b7 Months 1\u20134</span>",
"target": [
"article[data-step=\"01\"] > .sc-grid > div:nth-child(1) > .sc-kicker"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.09 (foreground color: #c8752a, background color: #f6f1e7, font size: 7.9pt (10.56px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c8752a",
"bgColor": "#ede5d6",
"contrastRatio": 2.78,
"fontSize": "7.9pt (10.56px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<article class=\"stack-card revealed\" style=\"--i: 1; transition-delay: 210ms;\" data-step=\"02\" data-reveal=\"\">",
"target": [
"article[data-step=\"02\"]"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 2.78 (foreground color: #c8752a, background color: #ede5d6, font size: 7.9pt (10.56px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"sc-kicker\">Stage 02 \u00b7 Months 5\u20138</span>",
"target": [
"article[data-step=\"02\"] > .sc-grid > div:nth-child(1) > .sc-kicker"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 2.78 (foreground color: #c8752a, background color: #ede5d6, font size: 7.9pt (10.56px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c8752a",
"bgColor": "#f6f1e7",
"contrastRatio": 3.09,
"fontSize": "7.9pt (10.56px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<article class=\"stack-card revealed\" style=\"--i: 2; transition-delay: 280ms;\" data-step=\"03\" data-reveal=\"\">",
"target": [
"article[data-step=\"03\"]"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.09 (foreground color: #c8752a, background color: #f6f1e7, font size: 7.9pt (10.56px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"sc-kicker\">Stage 03 \u00b7 Years 1\u201310</span>",
"target": [
"article[data-step=\"03\"] > .sc-grid > div:nth-child(1) > .sc-kicker"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.09 (foreground color: #c8752a, background color: #f6f1e7, font size: 7.9pt (10.56px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c8752a",
"bgColor": "#ede5d6",
"contrastRatio": 2.78,
"fontSize": "7.9pt (10.56px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<article class=\"stack-card revealed\" style=\"--i: 3; transition-delay: 350ms;\" data-step=\"04\" data-reveal=\"\">",
"target": [
"article[data-step=\"04\"]"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 2.78 (foreground color: #c8752a, background color: #ede5d6, font size: 7.9pt (10.56px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"sc-kicker\">Stage 04 \u00b7 Continuous</span>",
"target": [
"article[data-step=\"04\"] > .sc-grid > div:nth-child(1) > .sc-kicker"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 2.78 (foreground color: #c8752a, background color: #ede5d6, font size: 7.9pt (10.56px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#686d65",
"bgColor": "#ede5d6",
"contrastRatio": 4.23,
"fontSize": "10.0pt (13.28px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"freq\" role=\"group\" aria-label=\"Giving frequency\">\n <button type=\"button\" data-freq=\"once\" aria-pressed=\"true\">One-time</button>\n <button type=\"button\" data-freq=\"monthly\" aria-pressed=\"false\">Monthly</button>\n </div>",
"target": [
".freq"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.23 (foreground color: #686d65, background color: #ede5d6, font size: 10.0pt (13.28px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<button type=\"button\" data-freq=\"monthly\" aria-pressed=\"false\">Monthly</button>",
"target": [
"button[data-freq=\"monthly\"]"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.23 (foreground color: #686d65, background color: #ede5d6, font size: 10.0pt (13.28px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#777c76",
"bgColor": "#f6f1e7",
"contrastRatio": 3.78,
"fontSize": "7.6pt (10.08px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"panel revealed\" data-reveal=\"\" style=\"transition-delay: 70ms;\">",
"target": [
".panel.revealed[data-reveal=\"\"]:nth-child(1)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 7.6pt (10.08px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<label class=\"field-lbl\" for=\"amt-input\">Amount (USD)</label>",
"target": [
"label[for=\"amt-input\"]"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 7.6pt (10.08px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#838781",
"bgColor": "#f6f1e7",
"contrastRatio": 3.24,
"fontSize": "7.6pt (10.08px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"panel revealed\" data-reveal=\"\" style=\"transition-delay: 70ms;\">",
"target": [
".panel.revealed[data-reveal=\"\"]:nth-child(1)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.24 (foreground color: #838781, background color: #f6f1e7, font size: 7.6pt (10.08px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<p id=\"amt-help\" class=\"mono\" style=\"font-size:.63rem;letter-spacing:.11em;text-transform:uppercase;color:rgba(15,29,26,.5);margin:0 0 1.3rem\">Drag or type \u00b7 minimum $5 \u00b7 maximum shown to $5,000</p>",
"target": [
"#amt-help"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.24 (foreground color: #838781, background color: #f6f1e7, font size: 7.6pt (10.08px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#838781",
"bgColor": "#f6f1e7",
"contrastRatio": 3.24,
"fontSize": "7.2pt (9.6px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<button class=\"chip-amt\" type=\"button\" data-amt=\"40\" aria-pressed=\"false\">$40<small>1 quarter of servicing</small></button>",
"target": [
"button[data-amt=\"40\"]"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.24 (foreground color: #838781, background color: #f6f1e7, font size: 7.2pt (9.6px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<small>1 quarter of servicing</small>",
"target": [
"button[data-amt=\"40\"] > small"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.24 (foreground color: #838781, background color: #f6f1e7, font size: 7.2pt (9.6px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#838781",
"bgColor": "#f6f1e7",
"contrastRatio": 3.24,
"fontSize": "7.2pt (9.6px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<button class=\"chip-amt\" type=\"button\" data-amt=\"150\" aria-pressed=\"false\">$150<small>1 full year, 1 point</small></button>",
"target": [
"button[data-amt=\"150\"]"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.24 (foreground color: #838781, background color: #f6f1e7, font size: 7.2pt (9.6px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<small>1 full year, 1 point</small>",
"target": [
"button[data-amt=\"150\"] > small"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.24 (foreground color: #838781, background color: #f6f1e7, font size: 7.2pt (9.6px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#838781",
"bgColor": "#f6f1e7",
"contrastRatio": 3.24,
"fontSize": "7.2pt (9.6px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<button class=\"chip-amt\" type=\"button\" data-amt=\"360\" aria-pressed=\"false\">$360<small>3 points, 1 year</small></button>",
"target": [
"button[data-amt=\"360\"]"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.24 (foreground color: #838781, background color: #f6f1e7, font size: 7.2pt (9.6px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<small>3 points, 1 year</small>",
"target": [
"button[data-amt=\"360\"] > small"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.24 (foreground color: #838781, background color: #f6f1e7, font size: 7.2pt (9.6px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#838781",
"bgColor": "#f6f1e7",
"contrastRatio": 3.24,
"fontSize": "7.2pt (9.6px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<button class=\"chip-amt\" type=\"button\" data-amt=\"1200\" aria-pressed=\"false\">$1,200<small>10 points, 1 year</small></button>",
"target": [
"button[data-amt=\"1200\"]"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.24 (foreground color: #838781, background color: #f6f1e7, font size: 7.2pt (9.6px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<small>10 points, 1 year</small>",
"target": [
"button[data-amt=\"1200\"] > small"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.24 (foreground color: #838781, background color: #f6f1e7, font size: 7.2pt (9.6px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#777c76",
"bgColor": "#f6f1e7",
"contrastRatio": 3.78,
"fontSize": "7.6pt (10.08px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"panel revealed\" data-reveal=\"\" style=\"transition-delay: 70ms;\">",
"target": [
".panel.revealed[data-reveal=\"\"]:nth-child(1)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 7.6pt (10.08px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<label class=\"field-lbl\" style=\"margin-top:1.6rem\">Direct my gift to</label>",
"target": [
".field-lbl:nth-child(6)"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 7.6pt (10.08px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c8752a",
"bgColor": "#f6f1e7",
"contrastRatio": 3.09,
"fontSize": "8.9pt (11.84px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<button class=\"fund\" type=\"button\" data-fund=\"corps\" aria-pressed=\"false\">\n <b>Mechanic Corps Scholarship</b><i>Fund code MCS-11</i><em>$450 = 1 mechanic</em>\n </button>",
"target": [
"button[data-fund=\"corps\"]"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.09 (foreground color: #c8752a, background color: #f6f1e7, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<em>$450 = 1 mechanic</em>",
"target": [
"button[data-fund=\"corps\"] > em"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.09 (foreground color: #c8752a, background color: #f6f1e7, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c8752a",
"bgColor": "#f6f1e7",
"contrastRatio": 3.09,
"fontSize": "8.9pt (11.84px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<button class=\"fund\" type=\"button\" data-fund=\"lab\" aria-pressed=\"false\">\n <b>Water Quality Lab</b><i>Fund code WQL-04</i><em>$60 = 40 samples</em>\n </button>",
"target": [
"button[data-fund=\"lab\"]"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.09 (foreground color: #c8752a, background color: #f6f1e7, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<em>$60 = 40 samples</em>",
"target": [
"button[data-fund=\"lab\"] > em"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.09 (foreground color: #c8752a, background color: #f6f1e7, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#c8752a",
"bgColor": "#f6f1e7",
"contrastRatio": 3.09,
"fontSize": "8.9pt (11.84px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<button class=\"fund\" type=\"button\" data-fund=\"rapid\" aria-pressed=\"false\">\n <b>Rapid Response Repair</b><i>Fund code RRR-99</i><em>$250 = 1 response</em>\n </button>",
"target": [
"button[data-fund=\"rapid\"]"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.09 (foreground color: #c8752a, background color: #f6f1e7, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<em>$250 = 1 response</em>",
"target": [
"button[data-fund=\"rapid\"] > em"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.09 (foreground color: #c8752a, background color: #f6f1e7, font size: 8.9pt (11.84px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#8e928b",
"bgColor": "#f6f1e7",
"contrastRatio": 2.81,
"fontSize": "7.6pt (10.08px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"panel revealed\" data-reveal=\"\" style=\"transition-delay: 70ms;\">",
"target": [
".panel.revealed[data-reveal=\"\"]:nth-child(1)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 2.81 (foreground color: #8e928b, background color: #f6f1e7, font size: 7.6pt (10.08px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<p class=\"mono\" style=\"font-size:.63rem;letter-spacing:.1em;text-transform:uppercase;color:rgba(15,29,26,.45);margin-top:1.1rem\">Or leave it unrestricted \u2014 61% of our individual giving is deployed where downtime is highest.</p>",
"target": [
".mono:nth-child(8)"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 2.81 (foreground color: #8e928b, background color: #f6f1e7, font size: 7.6pt (10.08px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#6b726c",
"bgColor": "#f6f1e7",
"contrastRatio": 4.39,
"fontSize": "8.4pt (11.2px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"panel readout revealed\" data-reveal=\"\" style=\"transition-delay: 140ms;\">",
"target": [
".readout"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.39 (foreground color: #6b726c, background color: #f6f1e7, font size: 8.4pt (11.2px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"big-cap\" id=\"ro-cap\">people projected to hold continuous safe water access from your <b>endowment</b> gift</span>",
"target": [
"#ro-cap"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.39 (foreground color: #6b726c, background color: #f6f1e7, font size: 8.4pt (11.2px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#6b726c",
"bgColor": "#f6f1e7",
"contrastRatio": 4.39,
"fontSize": "8.4pt (11.2px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"panel readout revealed\" data-reveal=\"\" style=\"transition-delay: 140ms;\">",
"target": [
".readout"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.39 (foreground color: #6b726c, background color: #f6f1e7, font size: 8.4pt (11.2px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<b>endowment</b>",
"target": [
"#ro-cap > b"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.39 (foreground color: #6b726c, background color: #f6f1e7, font size: 8.4pt (11.2px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#777c76",
"bgColor": "#f6f1e7",
"contrastRatio": 3.78,
"fontSize": "7.9pt (10.56px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"mini\"><b id=\"ro-points\">0.71</b><span>Water points under 10-yr contract</span></div>",
"target": [
".mini:nth-child(1)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 7.9pt (10.56px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>Water points under 10-yr contract</span>",
"target": [
".mini:nth-child(1) > span"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 7.9pt (10.56px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#777c76",
"bgColor": "#f6f1e7",
"contrastRatio": 3.78,
"fontSize": "7.9pt (10.56px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"mini\"><b id=\"ro-tech\">1.7</b><span>Technician-days deployed</span></div>",
"target": [
".mini:nth-child(2)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 7.9pt (10.56px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>Technician-days deployed</span>",
"target": [
".mini:nth-child(2) > span"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 7.9pt (10.56px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#777c76",
"bgColor": "#f6f1e7",
"contrastRatio": 3.78,
"fontSize": "7.9pt (10.56px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"mini\"><b id=\"ro-samples\">2.83</b><span>Lab samples assayed</span></div>",
"target": [
".mini:nth-child(3)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 7.9pt (10.56px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>Lab samples assayed</span>",
"target": [
".mini:nth-child(3) > span"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 7.9pt (10.56px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#777c76",
"bgColor": "#f6f1e7",
"contrastRatio": 3.78,
"fontSize": "7.6pt (10.08px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"panel readout revealed\" data-reveal=\"\" style=\"transition-delay: 140ms;\">",
"target": [
".readout"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 7.6pt (10.08px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<label class=\"field-lbl\">Where the money goes</label>",
"target": [
".split > .field-lbl"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 7.6pt (10.08px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#6b726c",
"bgColor": "#f6f1e7",
"contrastRatio": 4.39,
"fontSize": "7.9pt (10.56px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"panel readout revealed\" data-reveal=\"\" style=\"transition-delay: 140ms;\">",
"target": [
".readout"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.39 (foreground color: #6b726c, background color: #f6f1e7, font size: 7.9pt (10.56px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<p class=\"mono\" style=\"font-size:.66rem;letter-spacing:.1em;margin-top:.9rem;color:rgba(15,29,26,.6)\">Effective cost per person-served-year: <b id=\"ro-cppy\" style=\"color:var(--teal)\">$0.37</b> \u00b7 ten-year horizon reach: <b id=\"ro-tenyr\" style=\"color:var(--teal)\">2,267</b></p>",
"target": [
".split > .mono"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.39 (foreground color: #6b726c, background color: #f6f1e7, font size: 7.9pt (10.56px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#73776f",
"bgColor": "#ede5d6",
"contrastRatio": 3.64,
"fontSize": "7.9pt (10.56px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"therm\" style=\"border:1px solid var(--line);border-radius:3px;margin-top:1.5rem;background:var(--paper-2);padding:1.1rem 1.2rem\">",
"target": [
".therm"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.64 (foreground color: #73776f, background color: #ede5d6, font size: 7.9pt (10.56px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span id=\"th-raised\">$1,412,640 of $2,000,000</span>",
"target": [
"#th-raised"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.64 (foreground color: #73776f, background color: #ede5d6, font size: 7.9pt (10.56px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#ffffff",
"bgColor": "#ede5d6",
"contrastRatio": 1.25,
"fontSize": "9.4pt (12.48px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"tank\" role=\"progressbar\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"70.6\" id=\"th-bar\">\n <i class=\"water\" id=\"th-water\" style=\"width: 70.632%;\"></i>\n <span class=\"tank-pct\" id=\"th-pct\">70.6%</span>\n </div>",
"target": [
"#th-bar"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 1.25 (foreground color: #ffffff, background color: #ede5d6, font size: 9.4pt (12.48px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"tank-pct\" id=\"th-pct\">70.6%</span>",
"target": [
"#th-pct"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 1.25 (foreground color: #ffffff, background color: #ede5d6, font size: 9.4pt (12.48px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#73776f",
"bgColor": "#ede5d6",
"contrastRatio": 3.64,
"fontSize": "7.9pt (10.56px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"therm\" style=\"border:1px solid var(--line);border-radius:3px;margin-top:1.5rem;background:var(--paper-2);padding:1.1rem 1.2rem\">",
"target": [
".therm"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.64 (foreground color: #73776f, background color: #ede5d6, font size: 7.9pt (10.56px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span id=\"th-donors\">3,908 donors</span>",
"target": [
"#th-donors"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.64 (foreground color: #73776f, background color: #ede5d6, font size: 7.9pt (10.56px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#73776f",
"bgColor": "#ede5d6",
"contrastRatio": 3.64,
"fontSize": "7.9pt (10.56px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"therm\" style=\"border:1px solid var(--line);border-radius:3px;margin-top:1.5rem;background:var(--paper-2);padding:1.1rem 1.2rem\">",
"target": [
".therm"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.64 (foreground color: #73776f, background color: #ede5d6, font size: 7.9pt (10.56px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>Closes 31 December \u00b7 match expires with it</span>",
"target": [
".therm-meta > span:nth-child(2)"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.64 (foreground color: #73776f, background color: #ede5d6, font size: 7.9pt (10.56px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#6b726c",
"bgColor": "#f6f1e7",
"contrastRatio": 4.39,
"fontSize": "9.4pt (12.48px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"panel readout revealed\" data-reveal=\"\" style=\"transition-delay: 140ms;\">",
"target": [
".readout"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.39 (foreground color: #6b726c, background color: #f6f1e7, font size: 9.4pt (12.48px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>Processed on a PCI-DSS Level 1 checkout. Keepwell Foundation is a registered 501(c)(3); gifts are tax-deductible in the United States. EIN 47-2891034. You will receive an itemised receipt and your asset's register number within 48 hours.</span>",
"target": [
".give-note > span"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.39 (foreground color: #6b726c, background color: #f6f1e7, font size: 9.4pt (12.48px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#777c76",
"bgColor": "#f6f1e7",
"contrastRatio": 3.78,
"fontSize": "7.7pt (10.24px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"panel readout revealed\" data-reveal=\"\" style=\"transition-delay: 140ms;\">",
"target": [
".readout"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>Visa \u00b7 Mastercard \u00b7 Amex</span>",
"target": [
".receipt > span:nth-child(1)"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#777c76",
"bgColor": "#f6f1e7",
"contrastRatio": 3.78,
"fontSize": "7.7pt (10.24px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"panel readout revealed\" data-reveal=\"\" style=\"transition-delay: 140ms;\">",
"target": [
".readout"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>ACH / wire</span>",
"target": [
".receipt > span:nth-child(2)"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#777c76",
"bgColor": "#f6f1e7",
"contrastRatio": 3.78,
"fontSize": "7.7pt (10.24px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"panel readout revealed\" data-reveal=\"\" style=\"transition-delay: 140ms;\">",
"target": [
".readout"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>DAF & crypto</span>",
"target": [
".receipt > span:nth-child(3)"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#777c76",
"bgColor": "#f6f1e7",
"contrastRatio": 3.78,
"fontSize": "7.7pt (10.24px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"panel readout revealed\" data-reveal=\"\" style=\"transition-delay: 140ms;\">",
"target": [
".readout"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>Stock transfer</span>",
"target": [
".receipt > span:nth-child(4)"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#777c76",
"bgColor": "#f6f1e7",
"contrastRatio": 3.78,
"fontSize": "7.7pt (10.24px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"panel readout revealed\" data-reveal=\"\" style=\"transition-delay: 140ms;\">",
"target": [
".readout"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>Payroll giving</span>",
"target": [
".receipt > span:nth-child(5)"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#838781",
"bgColor": "#f6f1e7",
"contrastRatio": 3.24,
"fontSize": "7.2pt (9.6px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"panel revealed\" data-reveal=\"\" style=\"grid-column: 1 / -1; transition-delay: 210ms;\">",
"target": [
".give-grid:nth-child(3) > .panel.revealed[data-reveal=\"\"]"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.24 (foreground color: #838781, background color: #f6f1e7, font size: 7.2pt (9.6px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<small>Rapid Response Repair</small>",
"target": [
"li:nth-child(1) > span:nth-child(2) > small"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.24 (foreground color: #838781, background color: #f6f1e7, font size: 7.2pt (9.6px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#838781",
"bgColor": "#f6f1e7",
"contrastRatio": 3.24,
"fontSize": "7.2pt (9.6px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"panel revealed\" data-reveal=\"\" style=\"grid-column: 1 / -1; transition-delay: 210ms;\">",
"target": [
".give-grid:nth-child(3) > .panel.revealed[data-reveal=\"\"]"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.24 (foreground color: #838781, background color: #f6f1e7, font size: 7.2pt (9.6px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<small style=\"display:block;text-align:right\">2 min ago</small>",
"target": [
"li:nth-child(1) > .amt > small"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.24 (foreground color: #838781, background color: #f6f1e7, font size: 7.2pt (9.6px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#838781",
"bgColor": "#f6f1e7",
"contrastRatio": 3.24,
"fontSize": "7.2pt (9.6px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"panel revealed\" data-reveal=\"\" style=\"grid-column: 1 / -1; transition-delay: 210ms;\">",
"target": [
".give-grid:nth-child(3) > .panel.revealed[data-reveal=\"\"]"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.24 (foreground color: #838781, background color: #f6f1e7, font size: 7.2pt (9.6px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<small>Well Maintenance Endowment</small>",
"target": [
"li:nth-child(2) > span:nth-child(2) > small"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.24 (foreground color: #838781, background color: #f6f1e7, font size: 7.2pt (9.6px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#838781",
"bgColor": "#f6f1e7",
"contrastRatio": 3.24,
"fontSize": "7.2pt (9.6px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"panel revealed\" data-reveal=\"\" style=\"grid-column: 1 / -1; transition-delay: 210ms;\">",
"target": [
".give-grid:nth-child(3) > .panel.revealed[data-reveal=\"\"]"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.24 (foreground color: #838781, background color: #f6f1e7, font size: 7.2pt (9.6px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<small style=\"display:block;text-align:right\">11 min ago</small>",
"target": [
"li:nth-child(2) > .amt > small"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.24 (foreground color: #838781, background color: #f6f1e7, font size: 7.2pt (9.6px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#838781",
"bgColor": "#f6f1e7",
"contrastRatio": 3.24,
"fontSize": "7.2pt (9.6px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"panel revealed\" data-reveal=\"\" style=\"grid-column: 1 / -1; transition-delay: 210ms;\">",
"target": [
".give-grid:nth-child(3) > .panel.revealed[data-reveal=\"\"]"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.24 (foreground color: #838781, background color: #f6f1e7, font size: 7.2pt (9.6px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<small>Well Maintenance Endowment</small>",
"target": [
"li:nth-child(3) > span:nth-child(2) > small"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.24 (foreground color: #838781, background color: #f6f1e7, font size: 7.2pt (9.6px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#838781",
"bgColor": "#f6f1e7",
"contrastRatio": 3.24,
"fontSize": "7.2pt (9.6px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"panel revealed\" data-reveal=\"\" style=\"grid-column: 1 / -1; transition-delay: 210ms;\">",
"target": [
".give-grid:nth-child(3) > .panel.revealed[data-reveal=\"\"]"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.24 (foreground color: #838781, background color: #f6f1e7, font size: 7.2pt (9.6px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<small style=\"display:block;text-align:right\">34 min ago</small>",
"target": [
"li:nth-child(3) > .amt > small"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.24 (foreground color: #838781, background color: #f6f1e7, font size: 7.2pt (9.6px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#838781",
"bgColor": "#f6f1e7",
"contrastRatio": 3.24,
"fontSize": "7.2pt (9.6px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"panel revealed\" data-reveal=\"\" style=\"grid-column: 1 / -1; transition-delay: 210ms;\">",
"target": [
".give-grid:nth-child(3) > .panel.revealed[data-reveal=\"\"]"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.24 (foreground color: #838781, background color: #f6f1e7, font size: 7.2pt (9.6px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<small>Mechanic Corps Scholarship</small>",
"target": [
"li:nth-child(4) > span:nth-child(2) > small"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.24 (foreground color: #838781, background color: #f6f1e7, font size: 7.2pt (9.6px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#838781",
"bgColor": "#f6f1e7",
"contrastRatio": 3.24,
"fontSize": "7.2pt (9.6px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"panel revealed\" data-reveal=\"\" style=\"grid-column: 1 / -1; transition-delay: 210ms;\">",
"target": [
".give-grid:nth-child(3) > .panel.revealed[data-reveal=\"\"]"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.24 (foreground color: #838781, background color: #f6f1e7, font size: 7.2pt (9.6px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<small style=\"display:block;text-align:right\">1 hr ago</small>",
"target": [
"li:nth-child(4) > .amt > small"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.24 (foreground color: #838781, background color: #f6f1e7, font size: 7.2pt (9.6px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#8e928b",
"bgColor": "#f6f1e7",
"contrastRatio": 2.81,
"fontSize": "7.4pt (9.92px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"panel revealed\" data-reveal=\"\" style=\"grid-column: 1 / -1; transition-delay: 210ms;\">",
"target": [
".give-grid:nth-child(3) > .panel.revealed[data-reveal=\"\"]"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 2.81 (foreground color: #8e928b, background color: #f6f1e7, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<p class=\"mono\" style=\"font-size:.62rem;letter-spacing:.11em;text-transform:uppercase;color:rgba(15,29,26,.45);margin-top:1rem\">Names published with donor consent. 39% of givers choose anonymity \u2014 we honour that in the ledger and in the register.</p>",
"target": [
".give-grid:nth-child(3) > .panel.revealed[data-reveal=\"\"] > .panel-b > .mono"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 2.81 (foreground color: #8e928b, background color: #f6f1e7, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#777c76",
"bgColor": "#f6f1e7",
"contrastRatio": 3.78,
"fontSize": "9.8pt (13.12px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<figure class=\"pc revealed\" data-reveal=\"\" style=\"transition-delay: 350ms;\">",
"target": [
"figure:nth-child(1)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 9.8pt (13.12px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<b>Grace Mwamba</b>",
"target": [
"figure:nth-child(1) > figcaption > span > b"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 9.8pt (13.12px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#777c76",
"bgColor": "#f6f1e7",
"contrastRatio": 3.78,
"fontSize": "7.0pt (9.28px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<figure class=\"pc revealed\" data-reveal=\"\" style=\"transition-delay: 350ms;\">",
"target": [
"figure:nth-child(1)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 7.0pt (9.28px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>Chair, Karenga water committee</span>",
"target": [
"figure:nth-child(1) > figcaption > span > span"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 7.0pt (9.28px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#777c76",
"bgColor": "#f6f1e7",
"contrastRatio": 3.78,
"fontSize": "9.8pt (13.12px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<figure class=\"pc revealed\" data-reveal=\"\" style=\"transition-delay: 0ms;\">",
"target": [
"figure:nth-child(2)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 9.8pt (13.12px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<b>Alphas Khumalo</b>",
"target": [
"figure:nth-child(2) > figcaption > span > b"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 9.8pt (13.12px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#777c76",
"bgColor": "#f6f1e7",
"contrastRatio": 3.78,
"fontSize": "7.0pt (9.28px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<figure class=\"pc revealed\" data-reveal=\"\" style=\"transition-delay: 0ms;\">",
"target": [
"figure:nth-child(2)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 7.0pt (9.28px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>Certified pump mechanic</span>",
"target": [
"figure:nth-child(2) > figcaption > span > span"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 7.0pt (9.28px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#777c76",
"bgColor": "#f6f1e7",
"contrastRatio": 3.78,
"fontSize": "9.8pt (13.12px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<figure class=\"pc revealed\" data-reveal=\"\" style=\"transition-delay: 70ms;\">",
"target": [
"figure:nth-child(3)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 9.8pt (13.12px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<b>Dr. Nasrin Haq</b>",
"target": [
"figure:nth-child(3) > figcaption > span > b"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 9.8pt (13.12px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#777c76",
"bgColor": "#f6f1e7",
"contrastRatio": 3.78,
"fontSize": "7.0pt (9.28px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<figure class=\"pc revealed\" data-reveal=\"\" style=\"transition-delay: 70ms;\">",
"target": [
"figure:nth-child(3)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 7.0pt (9.28px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>District environmental health officer</span>",
"target": [
"figure:nth-child(3) > figcaption > span > span"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 7.0pt (9.28px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#777c76",
"bgColor": "#f6f1e7",
"contrastRatio": 3.78,
"fontSize": "9.8pt (13.12px)",
"fontWeight": "bold",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<figure class=\"pc revealed\" data-reveal=\"\" style=\"transition-delay: 140ms;\">",
"target": [
"figure:nth-child(4)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 9.8pt (13.12px), font weight: bold). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<b>Peter Otieno</b>",
"target": [
"figure:nth-child(4) > figcaption > span > b"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 9.8pt (13.12px), font weight: bold). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#777c76",
"bgColor": "#f6f1e7",
"contrastRatio": 3.78,
"fontSize": "7.0pt (9.28px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<figure class=\"pc revealed\" data-reveal=\"\" style=\"transition-delay: 140ms;\">",
"target": [
"figure:nth-child(4)"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 7.0pt (9.28px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>Head teacher, Chibata Primary</span>",
"target": [
"figure:nth-child(4) > figcaption > span > span"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 7.0pt (9.28px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#777c76",
"bgColor": "#f6f1e7",
"contrastRatio": 3.78,
"fontSize": "7.6pt (10.08px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<body>",
"target": [
"body"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 7.6pt (10.08px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>Field study 07 \u00b7 reported by Dr. Imani Sero \u00b7 14 min read</span>",
"target": [
".meta > span"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.78 (foreground color: #777c76, background color: #f6f1e7, font size: 7.6pt (10.08px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#707670",
"bgColor": "#0f1d1a",
"contrastRatio": 3.72,
"fontSize": "7.4pt (9.92px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section class=\"pad dark\" id=\"journal\" aria-labelledby=\"acct-title\">",
"target": [
"#journal"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.72 (foreground color: #707670, background color: #0f1d1a, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"jdate\">18 Oct 2025<br>7 min</span>",
"target": [
"li:nth-child(1) > a[href$=\"#journal\"] > .jdate"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.72 (foreground color: #707670, background color: #0f1d1a, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#707670",
"bgColor": "#0f1d1a",
"contrastRatio": 3.72,
"fontSize": "7.4pt (9.92px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section class=\"pad dark\" id=\"journal\" aria-labelledby=\"acct-title\">",
"target": [
"#journal"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.72 (foreground color: #707670, background color: #0f1d1a, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"jdate\">02 Oct 2025<br>5 min</span>",
"target": [
"li:nth-child(2) > a[href$=\"#journal\"] > .jdate"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.72 (foreground color: #707670, background color: #0f1d1a, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#707670",
"bgColor": "#0f1d1a",
"contrastRatio": 3.72,
"fontSize": "7.4pt (9.92px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section class=\"pad dark\" id=\"journal\" aria-labelledby=\"acct-title\">",
"target": [
"#journal"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.72 (foreground color: #707670, background color: #0f1d1a, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"jdate\">21 Sep 2025<br>11 min</span>",
"target": [
"li:nth-child(3) > a[href$=\"#journal\"] > .jdate"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.72 (foreground color: #707670, background color: #0f1d1a, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#707670",
"bgColor": "#0f1d1a",
"contrastRatio": 3.72,
"fontSize": "7.4pt (9.92px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section class=\"pad dark\" id=\"journal\" aria-labelledby=\"acct-title\">",
"target": [
"#journal"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.72 (foreground color: #707670, background color: #0f1d1a, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"jdate\">04 Sep 2025<br>4 min</span>",
"target": [
"li:nth-child(4) > a[href$=\"#journal\"] > .jdate"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.72 (foreground color: #707670, background color: #0f1d1a, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#707670",
"bgColor": "#0f1d1a",
"contrastRatio": 3.72,
"fontSize": "7.4pt (9.92px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<section class=\"pad dark\" id=\"journal\" aria-labelledby=\"acct-title\">",
"target": [
"#journal"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.72 (foreground color: #707670, background color: #0f1d1a, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"jdate\">27 Aug 2025<br>6 min</span>",
"target": [
"li:nth-child(5) > a[href$=\"#journal\"] > .jdate"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.72 (foreground color: #707670, background color: #0f1d1a, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#717771",
"bgColor": "#192623",
"contrastRatio": 3.41,
"fontSize": "7.0pt (9.28px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"scard revealed\" data-reveal=\"\" style=\"transition-delay: 70ms;\">",
"target": [
".scard.revealed[data-reveal=\"\"]"
]
},
{
"html": "<section class=\"pad dark\" id=\"journal\" aria-labelledby=\"acct-title\">",
"target": [
"#journal"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.41 (foreground color: #717771, background color: #192623, font size: 7.0pt (9.28px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"ext\">PDF \u00b7 8.4 MB</span>",
"target": [
"li:nth-child(1) > a[href$=\"#journal\"] > .ext"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.41 (foreground color: #717771, background color: #192623, font size: 7.0pt (9.28px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#717771",
"bgColor": "#192623",
"contrastRatio": 3.41,
"fontSize": "7.0pt (9.28px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"scard revealed\" data-reveal=\"\" style=\"transition-delay: 70ms;\">",
"target": [
".scard.revealed[data-reveal=\"\"]"
]
},
{
"html": "<section class=\"pad dark\" id=\"journal\" aria-labelledby=\"acct-title\">",
"target": [
"#journal"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.41 (foreground color: #717771, background color: #192623, font size: 7.0pt (9.28px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"ext\">PDF \u00b7 1.2 MB</span>",
"target": [
"li:nth-child(2) > a[href$=\"#journal\"] > .ext"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.41 (foreground color: #717771, background color: #192623, font size: 7.0pt (9.28px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#717771",
"bgColor": "#192623",
"contrastRatio": 3.41,
"fontSize": "7.0pt (9.28px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"scard revealed\" data-reveal=\"\" style=\"transition-delay: 70ms;\">",
"target": [
".scard.revealed[data-reveal=\"\"]"
]
},
{
"html": "<section class=\"pad dark\" id=\"journal\" aria-labelledby=\"acct-title\">",
"target": [
"#journal"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.41 (foreground color: #717771, background color: #192623, font size: 7.0pt (9.28px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"ext\">PDF \u00b7 3.1 MB</span>",
"target": [
"li:nth-child(3) > a[href$=\"#journal\"] > .ext"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.41 (foreground color: #717771, background color: #192623, font size: 7.0pt (9.28px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#717771",
"bgColor": "#192623",
"contrastRatio": 3.41,
"fontSize": "7.0pt (9.28px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"scard revealed\" data-reveal=\"\" style=\"transition-delay: 70ms;\">",
"target": [
".scard.revealed[data-reveal=\"\"]"
]
},
{
"html": "<section class=\"pad dark\" id=\"journal\" aria-labelledby=\"acct-title\">",
"target": [
"#journal"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.41 (foreground color: #717771, background color: #192623, font size: 7.0pt (9.28px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"ext\">DOCX \u00b7 240 KB</span>",
"target": [
"li:nth-child(4) > a[href$=\"#journal\"] > .ext"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.41 (foreground color: #717771, background color: #192623, font size: 7.0pt (9.28px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#717771",
"bgColor": "#192623",
"contrastRatio": 3.41,
"fontSize": "7.0pt (9.28px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"scard revealed\" data-reveal=\"\" style=\"transition-delay: 70ms;\">",
"target": [
".scard.revealed[data-reveal=\"\"]"
]
},
{
"html": "<section class=\"pad dark\" id=\"journal\" aria-labelledby=\"acct-title\">",
"target": [
"#journal"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.41 (foreground color: #717771, background color: #192623, font size: 7.0pt (9.28px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"ext\">CSV \u00b7 612 KB</span>",
"target": [
"li:nth-child(5) > a[href$=\"#journal\"] > .ext"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.41 (foreground color: #717771, background color: #192623, font size: 7.0pt (9.28px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#717771",
"bgColor": "#192623",
"contrastRatio": 3.41,
"fontSize": "7.0pt (9.28px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"scard revealed\" data-reveal=\"\" style=\"transition-delay: 70ms;\">",
"target": [
".scard.revealed[data-reveal=\"\"]"
]
},
{
"html": "<section class=\"pad dark\" id=\"journal\" aria-labelledby=\"acct-title\">",
"target": [
"#journal"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.41 (foreground color: #717771, background color: #192623, font size: 7.0pt (9.28px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"ext\">PDF \u00b7 480 KB</span>",
"target": [
"li:nth-child(6) > a[href$=\"#journal\"] > .ext"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.41 (foreground color: #717771, background color: #192623, font size: 7.0pt (9.28px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#39210a",
"bgColor": "#c8752a",
"contrastRatio": 4.32,
"fontSize": "10.6pt (14.08px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"scard ask revealed\" data-reveal=\"\" style=\"transition-delay: 210ms;\">",
"target": [
".ask"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.32 (foreground color: #39210a, background color: #c8752a, font size: 10.6pt (14.08px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<p>Dr. Imani Sero and the M&E team host an open town hall on 21 November \u2014 agenda: our year-three failure data, unredacted. Submit a question in advance or attend live.</p>",
"target": [
".ask > p"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.32 (foreground color: #39210a, background color: #c8752a, font size: 10.6pt (14.08px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#767b75",
"bgColor": "#192623",
"contrastRatio": 3.61,
"fontSize": "7.0pt (9.28px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"scard revealed\" data-reveal=\"\" style=\"transition-delay: 350ms;\">",
"target": [
".scard.revealed[data-reveal=\"\"]:nth-child(5)"
]
},
{
"html": "<section class=\"pad dark\" id=\"journal\" aria-labelledby=\"acct-title\">",
"target": [
"#journal"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.61 (foreground color: #767b75, background color: #192623, font size: 7.0pt (9.28px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>Districts served</span>",
"target": [
".scard.revealed[data-reveal=\"\"]:nth-child(5) > .dl > div:nth-child(1) > span"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.61 (foreground color: #767b75, background color: #192623, font size: 7.0pt (9.28px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#767b75",
"bgColor": "#192623",
"contrastRatio": 3.61,
"fontSize": "7.0pt (9.28px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"scard revealed\" data-reveal=\"\" style=\"transition-delay: 350ms;\">",
"target": [
".scard.revealed[data-reveal=\"\"]:nth-child(5)"
]
},
{
"html": "<section class=\"pad dark\" id=\"journal\" aria-labelledby=\"acct-title\">",
"target": [
"#journal"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.61 (foreground color: #767b75, background color: #192623, font size: 7.0pt (9.28px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>Population reached</span>",
"target": [
".scard.revealed[data-reveal=\"\"]:nth-child(5) > .dl > div:nth-child(2) > span"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.61 (foreground color: #767b75, background color: #192623, font size: 7.0pt (9.28px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#767b75",
"bgColor": "#192623",
"contrastRatio": 3.61,
"fontSize": "7.0pt (9.28px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"scard revealed\" data-reveal=\"\" style=\"transition-delay: 350ms;\">",
"target": [
".scard.revealed[data-reveal=\"\"]:nth-child(5)"
]
},
{
"html": "<section class=\"pad dark\" id=\"journal\" aria-labelledby=\"acct-title\">",
"target": [
"#journal"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.61 (foreground color: #767b75, background color: #192623, font size: 7.0pt (9.28px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>Mechanics certified</span>",
"target": [
".scard.revealed[data-reveal=\"\"]:nth-child(5) > .dl > div:nth-child(3) > span"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.61 (foreground color: #767b75, background color: #192623, font size: 7.0pt (9.28px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#767b75",
"bgColor": "#192623",
"contrastRatio": 3.61,
"fontSize": "7.0pt (9.28px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"scard revealed\" data-reveal=\"\" style=\"transition-delay: 350ms;\">",
"target": [
".scard.revealed[data-reveal=\"\"]:nth-child(5)"
]
},
{
"html": "<section class=\"pad dark\" id=\"journal\" aria-labelledby=\"acct-title\">",
"target": [
"#journal"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.61 (foreground color: #767b75, background color: #192623, font size: 7.0pt (9.28px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>Committees trained</span>",
"target": [
".scard.revealed[data-reveal=\"\"]:nth-child(5) > .dl > div:nth-child(4) > span"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.61 (foreground color: #767b75, background color: #192623, font size: 7.0pt (9.28px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#767b75",
"bgColor": "#192623",
"contrastRatio": 3.61,
"fontSize": "7.0pt (9.28px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"scard revealed\" data-reveal=\"\" style=\"transition-delay: 350ms;\">",
"target": [
".scard.revealed[data-reveal=\"\"]:nth-child(5)"
]
},
{
"html": "<section class=\"pad dark\" id=\"journal\" aria-labelledby=\"acct-title\">",
"target": [
"#journal"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.61 (foreground color: #767b75, background color: #192623, font size: 7.0pt (9.28px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>Samples FY2024</span>",
"target": [
".scard.revealed[data-reveal=\"\"]:nth-child(5) > .dl > div:nth-child(5) > span"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.61 (foreground color: #767b75, background color: #192623, font size: 7.0pt (9.28px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#767b75",
"bgColor": "#192623",
"contrastRatio": 3.61,
"fontSize": "7.0pt (9.28px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"scard revealed\" data-reveal=\"\" style=\"transition-delay: 350ms;\">",
"target": [
".scard.revealed[data-reveal=\"\"]:nth-child(5)"
]
},
{
"html": "<section class=\"pad dark\" id=\"journal\" aria-labelledby=\"acct-title\">",
"target": [
"#journal"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.61 (foreground color: #767b75, background color: #192623, font size: 7.0pt (9.28px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>Assets abandoned</span>",
"target": [
".scard.revealed[data-reveal=\"\"]:nth-child(5) > .dl > div:nth-child(6) > span"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.61 (foreground color: #767b75, background color: #192623, font size: 7.0pt (9.28px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#838781",
"bgColor": "#f6f1e7",
"contrastRatio": 3.24,
"fontSize": "7.4pt (9.92px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<body>",
"target": [
"body"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.24 (foreground color: #838781, background color: #f6f1e7, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>Ten-year commitments \u00b7 unrestricted core</span>",
"target": [
".tier.revealed[data-reveal=\"\"] > .tier-h > span"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.24 (foreground color: #838781, background color: #f6f1e7, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#838781",
"bgColor": "#f6f1e7",
"contrastRatio": 3.24,
"fontSize": "7.4pt (9.92px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<body>",
"target": [
"body"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.24 (foreground color: #838781, background color: #f6f1e7, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>Ten-year commitments \u00b7 unrestricted core</span>",
"target": [
".tier.revealed[data-reveal=\"\"]:nth-child(2) > .tier-h > span"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.24 (foreground color: #838781, background color: #f6f1e7, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#838781",
"bgColor": "#f6f1e7",
"contrastRatio": 3.24,
"fontSize": "7.4pt (9.92px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<body>",
"target": [
"body"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.24 (foreground color: #838781, background color: #f6f1e7, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>Restricted grants \u00b7 joint evaluation</span>",
"target": [
".tier.revealed[data-reveal=\"\"]:nth-child(3) > .tier-h > span"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.24 (foreground color: #838781, background color: #f6f1e7, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#838781",
"bgColor": "#f6f1e7",
"contrastRatio": 3.24,
"fontSize": "7.4pt (9.92px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<body>",
"target": [
"body"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.24 (foreground color: #838781, background color: #f6f1e7, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>Matching gifts \u00b7 in-kind logistics \u00b7 employee volunteering</span>",
"target": [
".tier.revealed[data-reveal=\"\"]:nth-child(4) > .tier-h > span"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.24 (foreground color: #838781, background color: #f6f1e7, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#686d65",
"bgColor": "#ede5d6",
"contrastRatio": 4.23,
"fontSize": "10.1pt (13.44px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<article class=\"icard events revealed\" data-reveal=\"\" style=\"transition-delay: 210ms;\">",
"target": [
".events"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.23 (foreground color: #686d65, background color: #ede5d6, font size: 10.1pt (13.44px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>A working dinner on the O&M funding cliff. 90 seats, three speakers, one very long table.</span>",
"target": [
"li:nth-child(1) > .ev-title > span"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.23 (foreground color: #686d65, background color: #ede5d6, font size: 10.1pt (13.44px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#686d65",
"bgColor": "#ede5d6",
"contrastRatio": 4.23,
"fontSize": "10.1pt (13.44px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<article class=\"icard events revealed\" data-reveal=\"\" style=\"transition-delay: 210ms;\">",
"target": [
".events"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.23 (foreground color: #686d65, background color: #ede5d6, font size: 10.1pt (13.44px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>Dr. Imani Sero presents the unredacted cohort-9 to cohort-11 attrition analysis. Questions taken in advance.</span>",
"target": [
"li:nth-child(2) > .ev-title > span"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.23 (foreground color: #686d65, background color: #ede5d6, font size: 10.1pt (13.44px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#686d65",
"bgColor": "#ede5d6",
"contrastRatio": 4.23,
"fontSize": "10.1pt (13.44px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<article class=\"icard events revealed\" data-reveal=\"\" style=\"transition-delay: 210ms;\">",
"target": [
".events"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.23 (foreground color: #686d65, background color: #ede5d6, font size: 10.1pt (13.44px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>Northwind Bottling triples every gift to the Well Maintenance Endowment for 24 hours, capped at $180,000.</span>",
"target": [
"li:nth-child(3) > .ev-title > span"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.23 (foreground color: #686d65, background color: #ede5d6, font size: 10.1pt (13.44px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#686d65",
"bgColor": "#ede5d6",
"contrastRatio": 4.23,
"fontSize": "10.1pt (13.44px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<article class=\"icard events revealed\" data-reveal=\"\" style=\"transition-delay: 210ms;\">",
"target": [
".events"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.23 (foreground color: #686d65, background color: #ede5d6, font size: 10.1pt (13.44px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>Eleven certifications issued. Families, dealers, district office and our board are all in the room.</span>",
"target": [
"li:nth-child(4) > .ev-title > span"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.23 (foreground color: #686d65, background color: #ede5d6, font size: 10.1pt (13.44px), font weight: normal). Expected contrast ratio of 4.5:1"
}
]
},
{
"id": "scrollable-region-focusable",
"impact": "serious",
"tags": [
"cat.keyboard",
"wcag2a",
"wcag211",
"wcag213",
"TTv5",
"TT4.a",
"EN-301-549",
"EN-9.2.1.1",
"EN-9.2.1.3"
],
"description": "Ensure elements that have scrollable content are accessible by keyboard",
"help": "Scrollable region must have keyboard access",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/scrollable-region-focusable?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "focusable-content",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "Element should have focusable content"
},
{
"id": "focusable-element",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "Element should be focusable"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<ul class=\"feed\" id=\"feed\">",
"target": [
"#feed"
],
"failureSummary": "Fix any of the following:\n Element should have focusable content\n Element should be focusable"
}
]
},
{
"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": {
"minSize": 24,
"width": 104.4,
"height": 22.3
},
"relatedNodes": [],
"impact": "serious",
"message": "Target has insufficient size (104.4px by 22.3px, should be at least 24px by 24px)"
},
{
"id": "target-offset",
"data": {
"closestOffset": 22.2,
"minOffset": 24
},
"relatedNodes": [
{
"html": "<a href=\"mailto:donors@keepwell.org\">donors@keepwell.org</a>",
"target": [
"p:nth-child(3) > a[href=\"mailto:donors@keepwell.org\"]"
]
}
],
"impact": "serious",
"message": "Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 22.2px instead of at least 24px."
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"tel:+16515550147\">+1 (651) 555-0147</a>",
"target": [
"p:nth-child(3) > a[href=\"tel:+16515550147\"]"
],
"failureSummary": "Fix any of the following:\n Target has insufficient size (104.4px by 22.3px, should be at least 24px by 24px)\n Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 22.2px instead of at least 24px."
},
{
"any": [
{
"id": "target-size",
"data": {
"minSize": 24,
"width": 135.3,
"height": 22.3
},
"relatedNodes": [],
"impact": "serious",
"message": "Target has insufficient size (135.3px by 22.3px, should be at least 24px by 24px)"
},
{
"id": "target-offset",
"data": {
"closestOffset": 22.2,
"minOffset": 24
},
"relatedNodes": [
{
"html": "<a href=\"tel:+16515550147\">+1 (651) 555-0147</a>",
"target": [
"p:nth-child(3) > a[href=\"tel:+16515550147\"]"
]
}
],
"impact": "serious",
"message": "Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 22.2px instead of at least 24px."
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<a href=\"mailto:donors@keepwell.org\">donors@keepwell.org</a>",
"target": [
"p:nth-child(3) > a[href=\"mailto:donors@keepwell.org\"]"
],
"failureSummary": "Fix any of the following:\n Target has insufficient size (135.3px by 22.3px, should be at least 24px by 24px)\n Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of 22.2px instead of at least 24px."
}
]
}
],
"coverage": {
"contract": "main-document-vertical-scroll",
"complete": true,
"positions": [
{
"y": 0,
"height": 17341
},
{
"y": 576,
"height": 17341
},
{
"y": 1152,
"height": 17341
},
{
"y": 1728,
"height": 17341
},
{
"y": 2304,
"height": 17341
},
{
"y": 2880,
"height": 17341
},
{
"y": 3456,
"height": 17341
},
{
"y": 4032,
"height": 17341
},
{
"y": 4608,
"height": 17341
},
{
"y": 5184,
"height": 17341
},
{
"y": 5760,
"height": 17341
},
{
"y": 6336,
"height": 17341
},
{
"y": 6912,
"height": 17341
},
{
"y": 7488,
"height": 17341
},
{
"y": 8064,
"height": 17341
},
{
"y": 8640,
"height": 17341
},
{
"y": 9216,
"height": 17341
},
{
"y": 9792,
"height": 17341
},
{
"y": 10368,
"height": 17341
},
{
"y": 10944,
"height": 17341
},
{
"y": 11520,
"height": 17341
},
{
"y": 12096,
"height": 17341
},
{
"y": 12672,
"height": 17341
},
{
"y": 13248,
"height": 17341
},
{
"y": 13824,
"height": 17341
},
{
"y": 14400,
"height": 17341
},
{
"y": 14976,
"height": 17341
},
{
"y": 15552,
"height": 17341
},
{
"y": 16128,
"height": 17341
},
{
"y": 16621,
"height": 17341
}
],
"scans": 31,
"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 "Non-Profit/Charity" 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: "Non-Profit/Charity"
- Description: Charitable organizations, non-profit initiatives, volunteering, and fundraising resources.
**Your Creative Task:**
1. **Invent:** Create a unique, professional-sounding site name and a strong tagline fitting the "Non-Profit/Charity" 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: "Partners", "Donate", "Impact".
- **MAIN CONTENT:** Structure this area with **at least 3-4 distinct, well-developed sections**.
- Address key topics relevant to the "Non-Profit/Charity" category. Consider themes similar to: "Impact Stories", "Resource Center", "Beneficiary Stories".
- **Content Depth:** Populate each section with **substantial, realistic text** (multiple sentences/paragraphs). Use authentic industry language and terminology like: "impact measurement", "beneficiary", "charitable giving".
- **Visuals:** Integrate relevant placeholder images logically within the content sections.
- **Calls to Action:** Include clear and contextually relevant CTAs. Use strong verbs similar to: "Give Now", "Join Event", "Start Giving".
- **ENGAGEMENT (Recommended):** Strongly consider incorporating **one meaningful interactive element** that would genuinely benefit a user in the "Non-Profit/Charity" sector. Ideas similar but not limited to: "donation tracker".
- **SIDEBAR (Optional):** If your design includes a sidebar, populate it with **useful, relevant content**. Ideas: "recent news", "impact reports", "partner highlights".
- **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.