Qwen Qwen3.8 2.4T A95B – Law Government and Politics

via Modal · Generated

  • AIMAC Debt 5.27
  • Cost $0.25
  • Total Violations 31
  • HTML Size 82 KB
  • Em Dashes 73

Screenshot

View Qwen Qwen3.8 2.4T A95B Law Government and Politics page View Live Page

Accessibility Issues Found

31 Serious

  • color-contrast serious 31 instances

    Elements must meet minimum color contrast ratio thresholds

    Example HTML <p class="foot-disclaimer">

Artifacts

View Generated HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>The Civic Ledger — Democracy, Annotated</title>
<meta name="description" content="The Civic Ledger is a nonpartisan civic-literacy organization publishing plain-language legal guides, tracking legislation, and training residents to participate in public process.">
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'%3E%3Crect width='64' height='64' fill='%2314202E'/%3E%3Ctext x='32' y='44' font-size='36' text-anchor='middle' fill='%23F4EFE3' font-family='Georgia'%3E%C2%A7%3C/text%3E%3C/svg%3E">
<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=Libre+Franklin:ital,wght@0,300..800;1,300..800&family=Spline+Sans+Mono:wght@400..700&display=swap" rel="stylesheet">
<style>
/* ============ TOKENS & BASE ============ */
:root{
  --paper:#F4EFE3; --paper-2:#EAE3D2; --paper-3:#E0D7C0;
  --ink:#14202E; --ink-2:#26374A; --ink-soft:rgba(20,32,46,.72);
  --red:#A6271B; --red-hi:#C03221; --brass:#A8802C; --green:#2E6B4F;
  --line:rgba(20,32,46,.22); --line-soft:rgba(20,32,46,.12);
  --navy:#0F1A26;
  --disp:"Fraunces",Georgia,serif; --body:"Libre Franklin",system-ui,sans-serif; --mono:"Spline Sans Mono",ui-monospace,monospace;
  --shadow-hard:5px 5px 0 rgba(20,32,46,.92);
}
*{margin:0;padding:0;box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
@media (prefers-reduced-motion:no-preference){html{scroll-behavior:smooth}}
body{background:var(--paper);color:var(--ink);font-family:var(--body);font-size:16.5px;line-height:1.65;overflow-x:hidden}
::selection{background:var(--red);color:var(--paper)}
img{display:block;max-width:100%}
a{color:inherit}
button{font-family:inherit;cursor:pointer}
:focus-visible{outline:2px solid var(--red);outline-offset:3px}
section[id],div[id]{scroll-margin-top:84px}
.container{width:min(1180px,92vw);margin-inline:auto}
.grain{position:fixed;inset:-50%;width:200%;height:200%;pointer-events:none;z-index:2000;opacity:.05;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='300' height='300'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");}
.kicker{font-family:var(--mono);font-size:.72rem;letter-spacing:.22em;text-transform:uppercase;color:var(--red);font-weight:600}
.kicker .pilcrow{color:var(--brass)}
.display{font-family:var(--disp);font-weight:560;line-height:1.02;letter-spacing:-.015em}
h2.display{font-size:clamp(2rem,4.2vw,3.3rem);line-height:1.06}
em{font-style:italic}
.rule-double{height:6px;border-top:2px solid var(--ink);border-bottom:1px solid var(--ink);margin-top:14px}
.sec-head{max-width:760px}
.sec-sub{margin-top:16px;color:var(--ink-soft);max-width:60ch}
/* buttons */
.btn{display:inline-flex;align-items:center;gap:10px;font-family:var(--mono);font-size:.78rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;text-decoration:none;border:1.5px solid var(--ink);padding:15px 24px;background:var(--ink);color:var(--paper);box-shadow:var(--shadow-hard);transition:transform .22s ease,box-shadow .22s ease,background .22s ease}
.btn:hover{transform:translate(-2px,-2px);box-shadow:7px 7px 0 var(--red)}
.btn:active{transform:translate(1px,1px);box-shadow:2px 2px 0 var(--red)}
.btn-ghost{background:transparent;color:var(--ink)}
.btn-red{background:var(--red);border-color:var(--red);color:#fff}
.btn-red:hover{box-shadow:7px 7px 0 var(--ink)}
.btn-paper{background:var(--paper);color:var(--ink);border-color:var(--paper)}
.btn-paper:hover{box-shadow:7px 7px 0 rgba(15,26,38,.85)}
/* reveal */
.rv{opacity:0;transform:translateY(26px);transition:opacity .75s ease,transform .75s cubic-bezier(.2,.6,.1,1)}
.rv.in{opacity:1;transform:none}
.mask .ln{display:block;overflow:hidden}
.mask .ln-in{display:block;transform:translateY(112%);transition:transform .9s cubic-bezier(.2,.65,.1,1)}
.mask.in .ln:nth-child(1) .ln-in{transition-delay:.08s}
.mask.in .ln:nth-child(2) .ln-in{transition-delay:.22s}
.mask.in .ln:nth-child(3) .ln-in{transition-delay:.36s}
.mask.in .ln-in{transform:translateY(0)}
/* ============ TOP BAR + TICKER ============ */
.topbar{background:var(--navy);color:var(--paper);font-family:var(--mono);font-size:.7rem;letter-spacing:.14em;text-transform:uppercase}
.topbar .container{display:flex;justify-content:space-between;gap:16px;padding:9px 0;flex-wrap:wrap}
.topbar b{color:var(--brass);font-weight:600}
.topbar a{color:var(--paper);text-decoration:none;border-bottom:1px solid rgba(244,239,227,.3)}
.topbar a:hover{border-color:var(--brass);color:var(--brass)}
.ticker{background:var(--ink);color:var(--paper);border-bottom:1px solid var(--ink);overflow:hidden;position:relative}
.ticker::before{content:"SESSION WATCH";position:absolute;left:0;top:0;bottom:0;display:flex;align-items:center;background:var(--red);color:#fff;font-family:var(--mono);font-size:.66rem;letter-spacing:.2em;font-weight:700;padding:0 16px;z-index:2}
.ticker-track{display:flex;width:max-content;padding:11px 0;animation:tick 46s linear infinite}
.ticker:hover .ticker-track{animation-play-state:paused}
@keyframes tick{to{transform:translateX(-50%)}}
.tick-item{font-family:var(--mono);font-size:.72rem;letter-spacing:.08em;text-transform:uppercase;padding:0 34px;white-space:nowrap;position:relative}
.tick-item::after{content:"§";position:absolute;right:-4px;color:var(--brass)}
.tick-item b{color:var(--brass);font-weight:600}
.tick-item .up{color:#8FBF9F}
/* ============ MASTHEAD + NAV ============ */
.masthead{border-bottom:1px solid var(--ink);background:var(--paper)}
.masthead .container{display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:20px;padding:22px 0}
.mast-meta{font-family:var(--mono);font-size:.68rem;letter-spacing:.16em;text-transform:uppercase;color:var(--ink-soft);line-height:2}
.mast-meta.right{text-align:right}
.brand{display:flex;align-items:center;gap:16px;justify-content:center;text-decoration:none}
.brand img{width:54px;height:54px;border:1.5px solid var(--ink);box-shadow:3px 3px 0 var(--brass)}
.brand-name{font-family:var(--disp);font-weight:640;font-size:clamp(1.5rem,3vw,2.05rem);letter-spacing:.01em;line-height:1;text-align:center}
.brand-tag{font-family:var(--mono);font-size:.66rem;letter-spacing:.3em;text-transform:uppercase;color:var(--red);margin-top:6px;text-align:center}
.nav{position:sticky;top:0;z-index:100;background:var(--paper);border-bottom:1.5px solid var(--ink);transition:box-shadow .3s ease}
.nav.scrolled{box-shadow:0 10px 30px -12px rgba(20,32,46,.35)}
.nav .container{display:flex;align-items:center;justify-content:space-between;padding:0}
.nav-links{display:flex;align-items:stretch;list-style:none}
.nav-links a{display:flex;align-items:center;padding:18px 19px;font-family:var(--mono);font-size:.72rem;font-weight:600;letter-spacing:.16em;text-transform:uppercase;text-decoration:none;border-right:1px solid var(--line-soft);position:relative;transition:background .2s}
.nav-links a::after{content:"";position:absolute;left:0;right:100%;bottom:0;height:3px;background:var(--red);transition:right .25s ease}
.nav-links a:hover{background:var(--paper-2)}
.nav-links a:hover::after{right:0}
.nav-right{display:flex;align-items:center;gap:14px}
.nav .btn{padding:11px 20px;box-shadow:none}
.nav .btn:hover{box-shadow:3px 3px 0 var(--ink)}
.burger{display:none;background:none;border:1.5px solid var(--ink);width:44px;height:40px;flex-direction:column;justify-content:center;align-items:center;gap:5px}
.burger span{display:block;width:20px;height:2px;background:var(--ink);transition:transform .3s,opacity .3s}
.nav-open .burger span:nth-child(1){transform:translateY(7px) rotate(45deg)}
.nav-open .burger span:nth-child(2){opacity:0}
.nav-open .burger span:nth-child(3){transform:translateY(-7px) rotate(-45deg)}
/* ============ HERO ============ */
.hero{padding:clamp(56px,7vw,96px) 0 clamp(64px,8vw,110px);border-bottom:1.5px solid var(--ink);position:relative;overflow:hidden}
.hero::before{content:"§";position:absolute;right:-2%;top:6%;font-family:var(--disp);font-size:34vw;line-height:1;color:transparent;-webkit-text-stroke:1px rgba(20,32,46,.07);pointer-events:none}
.hero-grid{display:grid;grid-template-columns:1.12fr .88fr;gap:clamp(36px,5vw,72px);align-items:start;position:relative}
.hero h1{font-size:clamp(2.9rem,6.4vw,5.4rem);margin:20px 0 26px}
.hero h1 em{color:var(--red);font-style:italic;font-weight:480}
.lede{font-size:clamp(1.05rem,1.4vw,1.2rem);color:var(--ink-soft);max-width:56ch}
.lede strong{color:var(--ink)}
.hero-cta{display:flex;gap:18px;flex-wrap:wrap;margin:34px 0 44px}
.hero-stats{display:grid;grid-template-columns:repeat(4,1fr);border:1.5px solid var(--ink);background:var(--paper)}
.stat{padding:18px 16px;border-right:1px solid var(--line-soft)}
.stat:last-child{border-right:0}
.stat-n{font-family:var(--disp);font-weight:600;font-size:clamp(1.5rem,2.4vw,2rem);display:block;line-height:1}
.stat-n .suf{color:var(--red)}
.stat-l{font-family:var(--mono);font-size:.62rem;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-soft);display:block;margin-top:8px}
.term-box{margin-top:26px;border:1px solid var(--line);background:var(--paper-2);padding:18px 20px;max-width:520px}
.term-head{display:flex;justify-content:space-between;align-items:center;gap:12px}
.term-head .kicker{font-size:.62rem}
.term-refresh{background:none;border:1px solid var(--ink);font-family:var(--mono);font-size:.65rem;letter-spacing:.12em;padding:5px 10px;text-transform:uppercase;transition:background .2s,color .2s}
.term-refresh:hover{background:var(--ink);color:var(--paper)}
.term-name{font-family:var(--disp);font-style:italic;font-weight:560;font-size:1.5rem;margin:8px 0 4px;color:var(--red)}
.term-def{font-size:.88rem;color:var(--ink-soft)}
/* hero right */
.hero-right{position:relative;padding-bottom:86px}
.frame{border:1.5px solid var(--ink);background:var(--paper);padding:10px;box-shadow:8px 8px 0 rgba(20,32,46,.14)}
.photo{position:relative;overflow:hidden}
.photo .ph{overflow:hidden;position:relative}
.photo .ph::after{content:"";position:absolute;inset:0;background:var(--red);mix-blend-mode:multiply;opacity:.1;pointer-events:none}
.photo img{filter:grayscale(1) contrast(1.06) brightness(.99);width:100%}
.kenburns .ph img{animation:kb 20s ease-in-out infinite alternate;transform-origin:62% 38%}
@keyframes kb{from{transform:scale(1)}to{transform:scale(1.09) translate(-1.2%,1%)}}
.photo figcaption{font-family:var(--mono);font-size:.66rem;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-soft);padding:12px 4px 2px;border-top:1px solid var(--line-soft);margin-top:10px}
.alert-card{position:absolute;left:-34px;bottom:8px;width:min(330px,90%);background:var(--paper);border:1.5px solid var(--ink);border-top:5px solid var(--red);padding:18px 20px;box-shadow:var(--shadow-hard);z-index:3}
.alert-card .kicker{font-size:.62rem}
.alert-card p{font-size:.86rem;margin:8px 0 12px;line-height:1.55}
.alert-card a{font-family:var(--mono);font-size:.7rem;letter-spacing:.14em;text-transform:uppercase;font-weight:700;color:var(--red);text-decoration:none;border-bottom:2px solid var(--red);padding-bottom:2px}
.alert-card a:hover{background:var(--red);color:#fff}
.seal{position:absolute;top:-38px;right:-26px;width:126px;height:126px;z-index:4;filter:drop-shadow(3px 4px 0 rgba(20,32,46,.3))}
.seal .rot{animation:spin 40s linear infinite;transform-origin:50% 50%}
@keyframes spin{to{transform:rotate(360deg)}}
.seal text{font-family:var(--mono);font-size:10px;letter-spacing:2.6px;fill:var(--paper);font-weight:600}
.seal .glyph{font-family:var(--disp);font-size:52px;fill:var(--paper)}
/* ============ MISSION / PILLARS ============ */
.section{padding:clamp(72px,9vw,116px) 0}
.pillar-list{margin-top:46px;border-top:2px solid var(--ink)}
.pillar{display:grid;grid-template-columns:110px 1fr auto 60px;gap:26px;align-items:center;padding:30px 10px;border-bottom:1px solid var(--line);text-decoration:none;position:relative;transition:background .3s ease}
.pillar:hover{background:var(--paper-2)}
.pillar-n{font-family:var(--disp);font-weight:600;font-size:2.4rem;color:var(--red);line-height:1;transition:transform .3s}
.pillar:hover .pillar-n{transform:scale(1.12) rotate(-3deg)}
.pillar h3{font-family:var(--disp);font-weight:600;font-size:clamp(1.25rem,2vw,1.65rem);line-height:1.15;margin-bottom:8px}
.pillar p{color:var(--ink-soft);font-size:.94rem;max-width:62ch}
.pillar-tags{display:flex;flex-direction:column;gap:6px}
.pillar-tags span{font-family:var(--mono);font-size:.62rem;letter-spacing:.14em;text-transform:uppercase;border:1px solid var(--line);padding:4px 10px;white-space:nowrap;color:var(--ink-soft)}
.pillar-arrow{font-size:1.5rem;justify-self:end;transition:transform .3s;color:var(--ink)}
.pillar:hover .pillar-arrow{transform:translateX(8px);color:var(--red)}
/* ============ GUIDES ============ */
.guides{background:var(--paper-2);border-top:1.5px solid var(--ink);border-bottom:1.5px solid var(--ink)}
.filter-bar{display:flex;gap:10px;flex-wrap:wrap;margin:38px 0 34px}
.chip{font-family:var(--mono);font-size:.68rem;letter-spacing:.14em;text-transform:uppercase;border:1.5px solid var(--ink);background:transparent;color:var(--ink);padding:10px 16px;transition:all .22s ease}
.chip:hover{transform:translateY(-2px);box-shadow:3px 3px 0 var(--ink)}
.chip[aria-pressed="true"]{background:var(--ink);color:var(--paper);box-shadow:3px 3px 0 var(--brass)}
.guide-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:26px}
.guide-card{background:var(--paper);border:1.5px solid var(--ink);display:flex;flex-direction:column;transition:transform .3s ease,box-shadow .3s ease}
.guide-card:hover{transform:translateY(-6px);box-shadow:7px 9px 0 rgba(20,32,46,.16)}
.guide-card.pop{animation:cardin .5s cubic-bezier(.2,.6,.2,1) both}
@keyframes cardin{from{opacity:0;transform:translateY(18px)}}
.guide-thumb{overflow:hidden;border-bottom:1.5px solid var(--ink);aspect-ratio:3/2;position:relative}
.guide-thumb img{width:100%;height:100%;object-fit:cover;filter:grayscale(1) contrast(1.05);transition:transform .7s ease,filter .5s}
.guide-card:hover .guide-thumb img{transform:scale(1.07);filter:grayscale(.4) contrast(1.05)}
.guide-cat{position:absolute;top:12px;left:12px;background:var(--red);color:#fff;font-family:var(--mono);font-size:.6rem;letter-spacing:.18em;text-transform:uppercase;padding:5px 10px;font-weight:600}
.guide-body{padding:22px 22px 20px;display:flex;flex-direction:column;flex:1}
.guide-body h3{font-family:var(--disp);font-weight:600;font-size:1.28rem;line-height:1.22;margin-bottom:10px}
.guide-body p{font-size:.9rem;color:var(--ink-soft);flex:1}
.guide-meta{display:flex;gap:12px;font-family:var(--mono);font-size:.64rem;letter-spacing:.1em;text-transform:uppercase;color:var(--brass);margin:16px 0 14px;flex-wrap:wrap}
.guide-link{font-family:var(--mono);font-size:.7rem;letter-spacing:.16em;text-transform:uppercase;font-weight:700;text-decoration:none;color:var(--red);border-top:1px solid var(--line);padding-top:14px;transition:letter-spacing .25s}
.guide-link:hover{letter-spacing:.26em}
.guides-more{margin-top:38px;display:flex;justify-content:center}
/* ============ TESTIFY (sticky 2-col) ============ */
.testify-grid{display:grid;grid-template-columns:5fr 7fr;gap:clamp(40px,5vw,80px);margin-top:14px}
.sticky-col{position:sticky;top:100px;align-self:start}
.sticky-col .photo{margin:26px 0}
.sticky-col p{color:var(--ink-soft);margin:18px 0 26px}
.steps{border-top:2px solid var(--ink)}
.step{display:grid;grid-template-columns:86px 1fr;gap:22px;padding:32px 0;border-bottom:1px solid var(--line)}
.step-n{font-family:var(--mono);font-weight:700;font-size:.85rem;letter-spacing:.1em;color:var(--paper);background:var(--ink);width:64px;height:64px;display:flex;align-items:center;justify-content:center;box-shadow:3px 3px 0 var(--brass)}
.step h3{font-family:var(--disp);font-weight:600;font-size:1.35rem;margin-bottom:8px}
.step p{font-size:.93rem;color:var(--ink-soft)}
.step-note{font-family:var(--mono);font-size:.66rem;letter-spacing:.1em;text-transform:uppercase;color:var(--red);margin-top:12px;display:block}
/* ============ QUIZ ============ */
.quiz-band{background:var(--navy);color:var(--paper);border-top:1.5px solid var(--ink);position:relative;overflow:hidden}
.quiz-band::before{content:"?";position:absolute;left:-3%;bottom:-18%;font-family:var(--disp);font-size:30rem;line-height:1;color:transparent;-webkit-text-stroke:1px rgba(244,239,227,.06);pointer-events:none}
.quiz-band .kicker{color:var(--brass)}
.quiz-grid{display:grid;grid-template-columns:5fr 7fr;gap:clamp(40px,5vw,70px);align-items:start;position:relative}
.quiz-intro h2{color:var(--paper)}
.quiz-intro p{color:rgba(244,239,227,.72);margin:20px 0}
.quiz-rules{list-style:none;margin-top:26px;border-top:1px solid rgba(244,239,227,.2)}
.quiz-rules li{font-family:var(--mono);font-size:.72rem;letter-spacing:.12em;text-transform:uppercase;padding:13px 0;border-bottom:1px solid rgba(244,239,227,.2);color:rgba(244,239,227,.82)}
.quiz-rules li::before{content:"▸ ";color:var(--brass)}
.quiz-sheet{background:var(--paper);color:var(--ink);border:1.5px solid var(--ink);box-shadow:10px 10px 0 var(--brass);padding:0}
.quiz-bar{display:flex;justify-content:space-between;align-items:center;background:var(--ink);color:var(--paper);font-family:var(--mono);font-size:.64rem;letter-spacing:.2em;text-transform:uppercase;padding:11px 22px}
.quiz-bar .stamp{color:var(--brass)}
.quiz-inner{padding:28px clamp(20px,3vw,36px) 34px}
.q-progress{height:5px;background:var(--paper-3);margin-bottom:26px;position:relative}
.q-progress i{position:absolute;inset:0;right:auto;background:var(--red);width:0%;transition:width .5s cubic-bezier(.2,.6,.2,1)}
.q-count{font-family:var(--mono);font-size:.68rem;letter-spacing:.18em;text-transform:uppercase;color:var(--red);font-weight:700}
.q-text{font-family:var(--disp);font-weight:600;font-size:clamp(1.25rem,2vw,1.6rem);line-height:1.28;margin:10px 0 22px}
.q-opts{display:grid;gap:10px}
.q-opt{display:grid;grid-template-columns:38px 1fr;gap:14px;align-items:center;text-align:left;background:var(--paper);border:1.5px solid var(--line);padding:13px 15px;font-size:.94rem;line-height:1.45;transition:border-color .2s,background .2s,transform .2s}
.q-opt .let{font-family:var(--mono);font-weight:700;font-size:.75rem;width:32px;height:32px;border:1.5px solid var(--ink);display:flex;align-items:center;justify-content:center;background:var(--paper-2)}
.q-opt:not(:disabled):hover{border-color:var(--ink);transform:translateX(4px);background:var(--paper-2)}
.q-opt.is-correct{border-color:var(--green);background:rgba(46,107,79,.1)}
.q-opt.is-correct .let{background:var(--green);color:#fff;border-color:var(--green)}
.q-opt.is-wrong{border-color:var(--red);background:rgba(166,39,27,.08)}
.q-opt.is-wrong .let{background:var(--red);color:#fff;border-color:var(--red)}
.q-opt:disabled{cursor:default;opacity:.82}
.q-feed{margin-top:20px;border-left:4px solid var(--brass);background:var(--paper-2);padding:14px 18px;font-size:.88rem;display:none}
.q-feed.show{display:block;animation:cardin .45s both}
.q-feed .verdict{font-family:var(--mono);font-size:.66rem;letter-spacing:.18em;text-transform:uppercase;font-weight:700;display:block;margin-bottom:6px}
.q-feed.good .verdict{color:var(--green)} .q-feed.good{border-color:var(--green)}
.q-feed.bad .verdict{color:var(--red)} .q-feed.bad{border-color:var(--red)}
.q-next{margin-top:22px;display:none}
.q-next.show{display:inline-flex;animation:cardin .4s both}
.q-result{text-align:center;padding:20px 0 8px}
.q-result .score{font-family:var(--disp);font-weight:640;font-size:4.6rem;line-height:1;color:var(--red)}
.q-result .score small{font-size:1.8rem;color:var(--ink-soft);font-weight:480}
.q-result .v-title{font-family:var(--disp);font-style:italic;font-weight:560;font-size:1.5rem;margin:14px 0 8px}
.q-result p{color:var(--ink-soft);font-size:.92rem;max-width:42ch;margin:0 auto 24px}
.q-result .btn-row{display:flex;gap:14px;justify-content:center;flex-wrap:wrap}
/* ============ THE RECORD ============ */
.record-grid{display:grid;grid-template-columns:8fr 4fr;gap:clamp(30px,4vw,54px);margin-top:46px}
.story-feature{border:1.5px solid var(--ink);background:var(--paper)}
.story-feature .photo{border:0;padding:0;box-shadow:none}
.story-body{padding:26px 28px 28px}
.story-kick{font-family:var(--mono);font-size:.64rem;letter-spacing:.2em;text-transform:uppercase;color:var(--red);font-weight:700}
.story-body h3{font-family:var(--disp);font-weight:600;font-size:clamp(1.4rem,2.4vw,1.9rem);line-height:1.18;margin:10px 0 12px}
.story-body p{color:var(--ink-soft);font-size:.95rem}
.story-2col{display:grid;grid-template-columns:1fr 1fr;gap:26px;margin-top:26px}
.story-sm{border-top:3px solid var(--ink);padding-top:18px}
.story-sm h4{font-family:var(--disp);font-weight:600;font-size:1.2rem;line-height:1.25;margin:8px 0}
.story-sm p{font-size:.88rem;color:var(--ink-soft)}
.story-sm a{font-family:var(--mono);font-size:.66rem;letter-spacing:.16em;text-transform:uppercase;font-weight:700;text-decoration:none;color:var(--red)}
.story-sm a:hover{text-decoration:underline}
.sidebar{display:flex;flex-direction:column;gap:26px}
.side-block{border:1.5px solid var(--ink);background:var(--paper);padding:22px}
.side-block h3{font-family:var(--mono);font-size:.7rem;letter-spacing:.22em;text-transform:uppercase;padding-bottom:12px;border-bottom:1px solid var(--line);display:flex;justify-content:space-between;align-items:center}
.side-block h3 .dot{width:9px;height:9px;background:var(--red);border-radius:50%;animation:pulse 2.2s infinite}
@keyframes pulse{0%,100%{box-shadow:0 0 0 0 rgba(166,39,27,.45)}50%{box-shadow:0 0 0 7px rgba(166,39,27,0)}}
.alert-item{padding:14px 0;border-bottom:1px dashed var(--line);font-size:.87rem;line-height:1.5}
.alert-item:last-child{border-bottom:0;padding-bottom:2px}
.alert-item b{font-family:var(--mono);font-size:.6rem;letter-spacing:.16em;text-transform:uppercase;background:var(--red);color:#fff;padding:3px 7px;margin-right:8px;font-weight:600;vertical-align:2px}
.alert-item .due{display:block;font-family:var(--mono);font-size:.62rem;letter-spacing:.14em;text-transform:uppercase;color:var(--brass);margin-top:6px}
.win-item{display:grid;grid-template-columns:34px 1fr;gap:12px;padding:13px 0;border-bottom:1px dashed var(--line);font-size:.86rem}
.win-item:last-child{border-bottom:0}
.win-check{font-family:var(--mono);font-weight:700;color:var(--green);border:1.5px solid var(--green);width:28px;height:28px;display:flex;align-items:center;justify-content:center;font-size:.8rem}
.win-item .yr{font-family:var(--mono);font-size:.62rem;letter-spacing:.14em;color:var(--brass);text-transform:uppercase;display:block;margin-bottom:3px}
.hotline-card{background:var(--ink);color:var(--paper);border-color:var(--ink)}
.hotline-card h3{color:var(--paper);border-color:rgba(244,239,227,.25)}
.hotline-card .num{font-family:var(--disp);font-weight:640;font-size:2rem;letter-spacing:.01em;color:var(--brass);margin:10px 0 6px}
.hotline-card p{font-size:.84rem;color:rgba(244,239,227,.72)}
/* ============ EVENTS ============ */
.events{background:var(--paper-2);border-top:1.5px solid var(--ink);border-bottom:1.5px solid var(--ink)}
.event-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:22px;margin-top:44px}
.event-card{background:var(--paper);border:1.5px solid var(--ink);padding:22px;display:flex;flex-direction:column;gap:12px;transition:transform .3s,box-shadow .3s}
.event-card:hover{transform:translateY(-6px) rotate(-.5deg);box-shadow:6px 8px 0 rgba(20,32,46,.15)}
.event-date{display:flex;align-items:baseline;gap:10px;border-bottom:1px solid var(--line);padding-bottom:12px}
.event-date .d{font-family:var(--disp);font-weight:640;font-size:2.6rem;line-height:1;color:var(--red)}
.event-date .m{font-family:var(--mono);font-size:.7rem;letter-spacing:.22em;text-transform:uppercase}
.event-tag{font-family:var(--mono);font-size:.58rem;letter-spacing:.18em;text-transform:uppercase;background:var(--paper-3);padding:4px 9px;align-self:flex-start;font-weight:600}
.event-card h3{font-family:var(--disp);font-weight:600;font-size:1.12rem;line-height:1.25}
.event-meta{font-family:var(--mono);font-size:.66rem;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-soft);line-height:2}
.event-card .btn{margin-top:auto;padding:11px 16px;justify-content:center;font-size:.66rem;box-shadow:3px 3px 0 var(--ink)}
.event-card .btn:hover{box-shadow:4px 4px 0 var(--red)}
/* ============ VOICES (scattered postcards) ============ */
.voices-wrap{display:grid;grid-template-columns:repeat(3,1fr);gap:34px;margin-top:60px;align-items:start}
.postcard{background:var(--paper);border:1.5px solid var(--ink);padding:30px 28px 26px;position:relative;box-shadow:6px 8px 0 rgba(20,32,46,.12);transition:transform .45s cubic-bezier(.2,.6,.2,1),box-shadow .45s}
.postcard:nth-child(1){transform:rotate(-2.2deg)}
.postcard:nth-child(2){transform:rotate(1.4deg) translateY(26px)}
.postcard:nth-child(3){transform:rotate(-1.2deg) translateY(8px)}
.postcard:hover{transform:rotate(0) translateY(-6px);box-shadow:10px 14px 0 rgba(20,32,46,.16);z-index:2}
.postcard::before{content:"§";position:absolute;top:14px;right:16px;width:34px;height:34px;border:1.5px dashed var(--red);color:var(--red);display:flex;align-items:center;justify-content:center;font-family:var(--disp);font-size:1.1rem}
.postcard blockquote{font-family:var(--disp);font-style:italic;font-weight:480;font-size:1.12rem;line-height:1.5}
.postcard blockquote::before{content:"“";color:var(--red);font-size:1.6rem}
.pc-person{display:flex;align-items:center;gap:14px;margin-top:22px;border-top:1px solid var(--line);padding-top:18px}
.pc-person img{width:48px;height:48px;border-radius:50%;border:1.5px solid var(--ink);filter:grayscale(1)}
.pc-person b{font-size:.9rem;display:block}
.pc-person span{font-family:var(--mono);font-size:.62rem;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-soft)}
/* ============ VOLUNTEER BAND ============ */
.volunteer{border-top:1.5px solid var(--ink);border-bottom:1.5px solid var(--ink);background:var(--paper)}
.vol-grid{display:grid;grid-template-columns:1.2fr .8fr;gap:50px;align-items:center}
.vol-roles{display:flex;gap:10px;flex-wrap:wrap;margin-top:22px}
.vol-roles span{font-family:var(--mono);font-size:.66rem;letter-spacing:.14em;text-transform:uppercase;border:1.5px solid var(--ink);padding:8px 14px;background:var(--paper-2);transition:all .2s}
.vol-roles span:hover{background:var(--ink);color:var(--paper);transform:translateY(-2px)}
.vol-right{border:1.5px solid var(--ink);background:var(--ink);color:var(--paper);padding:34px;box-shadow:8px 8px 0 var(--brass)}
.vol-right .big{font-family:var(--disp);font-weight:640;font-size:3.4rem;line-height:1;color:var(--brass)}
.vol-right p{font-size:.9rem;color:rgba(244,239,227,.78);margin:12px 0 22px}
.vol-right .note{font-family:var(--mono);font-size:.62rem;letter-spacing:.16em;text-transform:uppercase;color:rgba(244,239,227,.55);margin-top:16px;display:block}
/* ============ FAQ ============ */
.faq-list{margin-top:44px;max-width:840px;border-top:2px solid var(--ink)}
.acc-item{border-bottom:1px solid var(--line)}
.acc-btn{width:100%;display:grid;grid-template-columns:70px 1fr 40px;gap:18px;align-items:center;background:none;border:0;padding:24px 6px;text-align:left}
.acc-btn .qn{font-family:var(--mono);font-size:.7rem;letter-spacing:.14em;color:var(--brass);font-weight:700}
.acc-btn .qt{font-family:var(--disp);font-weight:600;font-size:clamp(1.05rem,1.8vw,1.35rem);line-height:1.3;transition:color .2s}
.acc-btn:hover .qt{color:var(--red)}
.acc-ico{position:relative;width:22px;height:22px;justify-self:end}
.acc-ico::before,.acc-ico::after{content:"";position:absolute;background:var(--ink);transition:transform .35s ease}
.acc-ico::before{top:10px;left:0;width:22px;height:2px}
.acc-ico::after{left:10px;top:0;width:2px;height:22px}
.acc-item.open .acc-ico::after{transform:rotate(90deg)}
.acc-item.open .acc-ico::before{transform:rotate(180deg)}
.acc-panel{display:grid;grid-template-rows:0fr;transition:grid-template-rows .45s cubic-bezier(.2,.6,.2,1)}
.acc-item.open .acc-panel{grid-template-rows:1fr}
.acc-panel-in{overflow:hidden}
.acc-panel p{color:var(--ink-soft);font-size:.93rem;padding:0 6px 26px 94px;max-width:64ch}
/* ============ SUBSCRIBE ============ */
.subscribe{background:var(--red);color:#fff;border-top:1.5px solid var(--ink);position:relative;overflow:hidden}
.subscribe::before{content:"THE BRIEFING · THE BRIEFING · THE BRIEFING · THE BRIEFING · THE BRIEFING · ";position:absolute;top:18px;left:0;white-space:nowrap;font-family:var(--mono);font-size:.66rem;letter-spacing:.34em;opacity:.28;animation:tick 30s linear infinite;width:max-content}
.sub-grid{display:grid;grid-template-columns:1fr 1fr;gap:60px;align-items:center;padding:clamp(60px,7vw,90px) 0}
.sub-grid h2{font-size:clamp(2.2rem,4.4vw,3.6rem);color:#fff}
.sub-grid h2 em{color:var(--paper);font-style:italic}
.sub-grid .sub-copy{color:rgba(255,245,238,.85);margin-top:18px;max-width:48ch}
.sub-form{background:var(--paper);border:1.5px solid var(--ink);box-shadow:9px 9px 0 var(--navy);padding:30px;color:var(--ink)}
.sub-form label{font-family:var(--mono);font-size:.66rem;letter-spacing:.2em;text-transform:uppercase;font-weight:700;display:block;margin-bottom:14px;color:var(--red)}
.sub-form .row{display:flex;gap:0}
.sub-form input{flex:1;border:1.5px solid var(--ink);border-right:0;background:#fff;padding:15px 16px;font-family:var(--body);font-size:.95rem;min-width:0}
.sub-form input:focus{outline:2px solid var(--red);outline-offset:0}
.sub-form .btn{box-shadow:none}
.sub-form .btn:hover{box-shadow:none;background:var(--navy)}
.sub-note{font-family:var(--mono);font-size:.62rem;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-soft);margin-top:14px;display:block}
.sub-msg{display:none;margin-top:14px;font-family:var(--mono);font-size:.72rem;letter-spacing:.1em;background:var(--ink);color:var(--brass);padding:12px 14px}
.sub-msg.show{display:block;animation:cardin .4s both}
/* ============ FOOTER ============ */
footer{background:var(--navy);color:rgba(244,239,227,.8)}
.foot-main{display:grid;grid-template-columns:1.4fr 1fr 1fr 1.2fr;gap:44px;padding:clamp(56px,7vw,84px) 0 50px;border-bottom:1px solid rgba(244,239,227,.15)}
.foot-brand img{width:52px;height:52px;border:1px solid rgba(244,239,227,.4);margin-bottom:18px}
.foot-brand .name{font-family:var(--disp);font-weight:640;font-size:1.5rem;color:var(--paper)}
.foot-brand .tag{font-family:var(--mono);font-size:.62rem;letter-spacing:.28em;text-transform:uppercase;color:var(--brass);margin:6px 0 16px}
.foot-brand p{font-size:.84rem;line-height:1.7;color:rgba(244,239,227,.6);max-width:38ch}
.foot-col h4{font-family:var(--mono);font-size:.66rem;letter-spacing:.22em;text-transform:uppercase;color:var(--brass);margin-bottom:18px}
.foot-col ul{list-style:none}
.foot-col li{margin-bottom:11px}
.foot-col a{text-decoration:none;font-size:.88rem;color:rgba(244,239,227,.78);border-bottom:1px solid transparent;transition:color .2s,border-color .2s}
.foot-col a:hover{color:var(--paper);border-color:var(--red-hi)}
.foot-contact address{font-style:normal;font-size:.88rem;line-height:2}
.foot-contact .hot{font-family:var(--mono);color:var(--brass);font-size:.82rem;letter-spacing:.08em}
.socials{display:flex;gap:10px;margin-top:18px;flex-wrap:wrap}
.socials a{font-family:var(--mono);font-size:.62rem;letter-spacing:.16em;text-transform:uppercase;border:1px solid rgba(244,239,227,.35);padding:7px 12px;text-decoration:none;transition:all .2s}
.socials a:hover{background:var(--red);border-color:var(--red);color:#fff;transform:translateY(-2px)}
.foot-bottom{display:flex;justify-content:space-between;gap:18px;flex-wrap:wrap;padding:24px 0;font-family:var(--mono);font-size:.64rem;letter-spacing:.14em;text-transform:uppercase;color:rgba(244,239,227,.5)}
.foot-bottom a{color:rgba(244,239,227,.65);text-decoration:none}
.foot-bottom a:hover{color:var(--brass)}
.foot-disclaimer{padding:0 0 40px;font-size:.74rem;color:rgba(244,239,227,.45);max-width:90ch;line-height:1.7}
/* ============ RESPONSIVE ============ */
@media (max-width:1024px){
  .hero-grid,.quiz-grid,.testify-grid{grid-template-columns:1fr}
  .hero-right{margin-top:20px;max-width:560px}
  .sticky-col{position:static}
  .guide-grid{grid-template-columns:repeat(2,1fr)}
  .event-grid{grid-template-columns:repeat(2,1fr)}
  .record-grid{grid-template-columns:1fr}
  .vol-grid,.sub-grid{grid-template-columns:1fr;gap:40px}
  .foot-main{grid-template-columns:1fr 1fr}
  .masthead .container{grid-template-columns:auto 1fr}
  .mast-meta.right{display:none}
  .brand{justify-content:flex-start}
}
@media (max-width:880px){
  .nav-links{display:none;position:absolute;top:100%;left:0;right:0;background:var(--paper);flex-direction:column;border-bottom:2px solid var(--ink);box-shadow:0 20px 40px rgba(20,32,46,.25)}
  .nav-links a{border-right:0;border-top:1px solid var(--line-soft);padding:16px 22px}
  .nav.menu-open .nav-links{display:flex;animation:cardin .3s both}
  .burger{display:flex}
  .topbar .tb-mid{display:none}
}
@media (max-width:640px){
  .hero-stats{grid-template-columns:1fr 1fr}
  .stat:nth-child(2){border-right:0}
  .stat{border-bottom:1px solid var(--line-soft)}
  .stat:nth-child(3),.stat:nth-child(4){border-bottom:0}
  .guide-grid,.event-grid,.voices-wrap,.story-2col{grid-template-columns:1fr}
  .postcard:nth-child(n){transform:none}
  .pillar{grid-template-columns:60px 1fr;gap:14px}
  .pillar-tags,.pillar-arrow{display:none}
  .acc-btn{grid-template-columns:1fr 30px}
  .acc-btn .qn{display:none}
  .acc-panel p{padding-left:6px}
  .alert-card{left:0}
  .seal{width:96px;height:96px;top:-26px;right:-8px}
  .foot-main{grid-template-columns:1fr}
  .masthead .container{grid-template-columns:1fr}
  .mast-meta.left{display:none}
  .brand{justify-content:center}
}
/* ============ REDUCED MOTION ============ */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.01ms !important;animation-iteration-count:1 !important;transition-duration:.01ms !important}
  .ticker{overflow-x:auto}
  .ticker-track{animation:none;width:auto}
  .kenburns .ph img{animation:none}
  .seal .rot{animation:none}
  .rv{opacity:1;transform:none}
  .mask .ln-in{transform:none}
}
</style>
</head>
<body>
<div class="grain" aria-hidden="true"></div>

<!-- ======= UTILITY BAR ======= -->
<div class="topbar">
  <div class="container">
    <span id="topDate"><b>Today’s session:</b> loading…</span>
    <span class="tb-mid"><b>Rights Hotline:</b> 1-800-555-0134 · Open 24 hrs</span>
    <span>Nonpartisan 501(c)(3) · <a href="#action">EN</a> / <a href="#action">ES</a></span>
  </div>
</div>

<!-- ======= SESSION TICKER ======= -->
<div class="ticker" aria-label="Live legislative session watch">
  <div class="ticker-track">
    <span class="tick-item"><b>HB 402</b> Rental Repair Escrow — committee vote Thursday, 10:00</span>
    <span class="tick-item"><span class="up">▲ WIN</span> Ordinance 24-114 right-to-counsel enacted after 14 months of testimony</span>
    <span class="tick-item"><b>SB 88</b> Open Records Modernization — floor vote scheduled</span>
    <span class="tick-item">Public comment closes Friday — Transit Redistricting Maps, Docket 25-07</span>
    <span class="tick-item">Voter registration deadline: <b>30 days</b> before any general election</span>
    <span class="tick-item"><b>HB 402</b> Rental Repair Escrow — committee vote Thursday, 10:00</span>
    <span class="tick-item"><span class="up">▲ WIN</span> Ordinance 24-114 right-to-counsel enacted after 14 months of testimony</span>
    <span class="tick-item"><b>SB 88</b> Open Records Modernization — floor vote scheduled</span>
    <span class="tick-item">Public comment closes Friday — Transit Redistricting Maps, Docket 25-07</span>
    <span class="tick-item">Voter registration deadline: <b>30 days</b> before any general election</span>
  </div>
</div>

<!-- ======= MASTHEAD ======= -->
<header class="masthead">
  <div class="container">
    <div class="mast-meta left">Vol. 16 · No. 07<br>Fairmont, Ohio</div>
    <a class="brand" href="#top" aria-label="The Civic Ledger — home">
      <img src="https://placehold.co/112x112/14202E/F4EFE3?text=CL&font=oswald" alt="The Civic Ledger seal mark" width="54" height="54">
      <span>
        <span class="brand-name">The Civic Ledger</span>
        <span class="brand-tag">Democracy, annotated.</span>
      </span>
    </a>
    <div class="mast-meta right">Legal literacy · Government affairs<br>Civic engagement since 2009</div>
  </div>
</header>

<!-- ======= NAV ======= -->
<nav class="nav" id="siteNav" aria-label="Primary navigation">
  <div class="container">
    <ul class="nav-links" id="navLinks">
      <li><a href="#mission">About</a></li>
      <li><a href="#guides">Resources</a></li>
      <li><a href="#record">Session Watch</a></li>
      <li><a href="#events">Events</a></li>
      <li><a href="#volunteer">Volunteer</a></li>
      <li><a href="#quiz">Rights Check</a></li>
    </ul>
    <div class="nav-right">
      <a class="btn btn-red" href="#action">Donate</a>
      <button class="burger" id="navToggle" aria-expanded="false" aria-controls="navLinks" aria-label="Toggle menu">
        <span></span><span></span><span></span>
      </button>
    </div>
  </div>
</nav>

<main id="top">

<!-- ======= HERO / FRONT PAGE ======= -->
<section class="hero">
  <div class="container hero-grid">
    <div class="hero-left">
      <p class="kicker rv"><span class="pilcrow">¶</span> <span id="decodeKicker">Nonpartisan civic literacy · Est. 2009</span></p>
      <h1 class="display mask rv">
        <span class="ln"><span class="ln-in">The law is public.</span></span>
        <span class="ln"><span class="ln-in"><em>We make it legible.</em></span></span>
      </h1>
      <p class="lede rv">The Civic Ledger turns statutes, dockets, and city-hall jargon into plain-language guides, live legislative tracking, and free community clinics. Because <strong>civic participation shouldn’t require a law degree</strong> — it should require a library card and an hour.</p>
      <div class="hero-cta rv">
        <a class="btn" href="#guides">Find Resources</a>
        <a class="btn btn-ghost" href="#quiz">Take the Rights Check ↗</a>
      </div>
      <div class="hero-stats rv">
        <div class="stat"><span class="stat-n"><span data-count="42">0</span></span><span class="stat-l">Plain-language guides</span></div>
        <div class="stat"><span class="stat-n"><span data-count="18500">0</span><span class="suf">+</span></span><span class="stat-l">Residents counseled</span></div>
        <div class="stat"><span class="stat-n"><span data-count="23">0</span></span><span class="stat-l">Ordinances improved</span></div>
        <div class="stat"><span class="stat-n"><span data-count="900">0</span><span class="suf">+</span></span><span class="stat-l">Trained volunteers</span></div>
      </div>
      <div class="term-box rv">
        <div class="term-head">
          <span class="kicker">Term of the day</span>
          <button class="term-refresh" id="termNext">Next term ↻</button>
        </div>
        <p class="term-name" id="termName" aria-live="polite">habeas corpus</p>
        <p class="term-def" id="termDef">Latin for “produce the body.” A court order demanding a jailer justify a detention — the oldest safeguard against unlawful imprisonment.</p>
      </div>
    </div>
    <div class="hero-right rv">
      <svg class="seal" viewBox="0 0 160 160" aria-hidden="true">
        <circle cx="80" cy="80" r="78" fill="#A6271B"/>
        <circle cx="80" cy="80" r="58" fill="none" stroke="#F4EFE3" stroke-width="1" stroke-dasharray="3 4"/>
        <defs><path id="circ" d="M80,80 m-66,0 a66,66 0 1,1 132,0 a66,66 0 1,1 -132,0"/></defs>
        <g class="rot"><text><textPath href="#circ">THE CIVIC LEDGER · NONPARTISAN · EST. 2009 · DEMOCRACY, ANNOTATED ·</textPath></text></g>
        <text class="glyph" x="80" y="98" text-anchor="middle">§</text>
      </svg>
      <figure class="photo frame kenburns">
        <div class="ph"><img src="https://picsum.photos/seed/civic-hall-steps/900/1100?grayscale" alt="Residents gathering on the steps of city hall carrying folders of signed petitions" width="900" height="1100"></div>
        <figcaption>Ward 7 Tenants’ Union delivers 214 signed repair complaints to City Hall — October session.</figcaption>
      </figure>
      <aside class="alert-card">
        <span class="kicker">⚑ Action alert — live</span>
        <p><strong>HB 402 (Rental Repair Escrow)</strong> reaches committee vote Thursday. Two minutes on the phone to your representative changes the count.</p>
        <a href="#record">Contact Representative →</a>
      </aside>
    </div>
  </div>
</section>

<!-- ======= §01 MISSION / PILLARS ======= -->
<section class="section" id="mission">
  <div class="container">
    <header class="sec-head rv">
      <p class="kicker"><span class="pilcrow">§</span> 01 — Our Mandate</p>
      <h2 class="display mask rv"><span class="ln"><span class="ln-in">Four desks. One mission:</span></span><span class="ln"><span class="ln-in"><em>a government you can read.</em></span></span></h2>
      <p class="sec-sub">We operate like a newsroom and a legal aid office had a very studious child. Every guide is fact-checked against current statute; every alert is verified against the official docket; every workshop is led by a trained volunteer or staff attorney.</p>
      <div class="rule-double"></div>
    </header>
    <div class="pillar-list rv">
      <a class="pillar" href="#guides">
        <span class="pillar-n">01</span>
        <span><h3>Know-Your-Rights Education</h3><p>From traffic stops to tenant inspections, we publish field-tested guides and host workshops that walk residents through due process step by step. More than 18,500 people have used our materials to assert their rights — calmly, lawfully, and on the record.</p></span>
        <span class="pillar-tags"><span>Workshops</span><span>Guides</span><span>24-hr hotline</span></span>
        <span class="pillar-arrow" aria-hidden="true">→</span>
      </a>
      <a class="pillar" href="#record">
        <span class="pillar-n">02</span>
        <span><h3>Legislative Watch</h3><p>Our analysts track every bill from first reading to the governor’s signature — committee votes, fiscal notes, amendment language, and who introduced it. Subscribers receive a plain-English digest of the statutes that will actually reach their block.</p></span>
        <span class="pillar-tags"><span>Bill tracking</span><span>Digests</span><span>Vote alerts</span></span>
        <span class="pillar-arrow" aria-hidden="true">→</span>
      </a>
      <a class="pillar" href="#testify">
        <span class="pillar-n">03</span>
        <span><h3>Community Advocacy</h3><p>We organize testimony drives, public-comment campaigns, and records requests so that individual voices arrive at the hearing as a coordinated constituency. In fifteen years we’ve learned one truth: when the record speaks, the record wins.</p></span>
        <span class="pillar-tags"><span>Organizing</span><span>Public comment</span><span>FOIA</span></span>
        <span class="pillar-arrow" aria-hidden="true">→</span>
      </a>
      <a class="pillar" href="#events">
        <span class="pillar-n">04</span>
        <span><h3>Voter Services</h3><p>Registration drives, deadline reminders, sample ballots, and polling-place accessibility audits — plus a staffed hotline on every election day. We treat civic participation like infrastructure: it should work for everyone, or it doesn’t work.</p></span>
        <span class="pillar-tags"><span>Registration</span><span>Election hotline</span><span>Accessibility</span></span>
        <span class="pillar-arrow" aria-hidden="true">→</span>
      </a>
    </div>
  </div>
</section>

<!-- ======= §02 GUIDE LIBRARY ======= -->
<section class="section guides" id="guides">
  <div class="container">
    <header class="sec-head rv">
      <p class="kicker"><span class="pilcrow">§</span> 02 — Resource Library</p>
      <h2 class="display mask rv"><span class="ln"><span class="ln-in">Plain-language guides,</span></span><span class="ln"><span class="ln-in"><em>reviewed by attorneys.</em></span></span></h2>
      <p class="sec-sub">Free to read, free to print, free to hand to your neighbor. Every guide cites its controlling statute so you can verify the fine print yourself — that’s the whole point.</p>
    </header>
    <div class="filter-bar rv" role="group" aria-label="Filter guides by topic">
      <button class="chip" data-filter="all" aria-pressed="true">All guides</button>
      <button class="chip" data-filter="housing" aria-pressed="false">Housing</button>
      <button class="chip" data-filter="rights" aria-pressed="false">Policing &amp; Rights</button>
      <button class="chip" data-filter="voting" aria-pressed="false">Voting</button>
      <button class="chip" data-filter="benefits" aria-pressed="false">Public Benefits</button>
      <button class="chip" data-filter="open" aria-pressed="false">Open Government</button>
    </div>
    <div class="guide-grid" id="guideGrid">
      <article class="guide-card rv" data-cat="housing">
        <div class="guide-thumb"><img src="https://picsum.photos/seed/tenant-playbook/480/320?grayscale" alt="Stack of housing lease documents on a desk" loading="lazy"><span class="guide-cat">Housing</span></div>
        <div class="guide-body">
          <h3>The Tenant’s Playbook: Repairs, Rent Escrow &amp; Eviction Defense</h3>
          <div class="guide-meta"><span>18 min read</span><span>·</span><span>Updated Feb 2025</span><span>·</span><span>PDF</span></div>
          <p>Repair request letters, rent escrow procedure, and eviction defense timelines — with the exact statute numbers your landlord hopes you never read. Drafted with three housing attorneys and forty tenant testimonials.</p>
          <a class="guide-link" href="#action">Read the guide →</a>
        </div>
      </article>
      <article class="guide-card rv" data-cat="rights">
        <div class="guide-thumb"><img src="https://picsum.photos/seed/traffic-stop/480/320?grayscale" alt="Car pulled over at roadside at dusk" loading="lazy"><span class="guide-cat">Rights</span></div>
        <div class="guide-body">
          <h3>Stopped, Questioned, Searched: Rights During Police Encounters</h3>
          <div class="guide-meta"><span>9 min read</span><span>·</span><span>Updated Jan 2025</span><span>·</span><span>Card deck</span></div>
          <p>What the Fourth Amendment permits at a traffic stop, on the sidewalk, and at your front door — including word-for-word scripts for staying calm, staying silent, and staying on the record.</p>
          <a class="guide-link" href="#action">Read the guide →</a>
        </div>
      </article>
      <article class="guide-card rv" data-cat="open">
        <div class="guide-thumb"><img src="https://picsum.photos/seed/read-a-bill/480/320?grayscale" alt="Annotated printed bill with highlighted sections" loading="lazy"><span class="guide-cat">Open Gov</span></div>
        <div class="guide-body">
          <h3>How to Read a Bill in Twenty Minutes</h3>
          <div class="guide-meta"><span>12 min read</span><span>·</span><span>Updated Mar 2025</span><span>·</span><span>Worksheet</span></div>
          <p>Enacting clauses, section numbers, strike-through text, and fiscal notes: a guided walkthrough of real bill text with margin annotations. By the end, the docket stops looking like Latin — even when it is.</p>
          <a class="guide-link" href="#action">Read the guide →</a>
        </div>
      </article>
      <article class="guide-card rv" data-cat="voting">
        <div class="guide-thumb"><img src="https://picsum.photos/seed/mail-ballot/480/320?grayscale" alt="Ballot envelopes sorted on a table" loading="lazy"><span class="guide-cat">Voting</span></div>
        <div class="guide-body">
          <h3>Voting by Mail: Deadlines, Cure Rules &amp; Ballot Tracking</h3>
          <div class="guide-meta"><span>7 min read</span><span>·</span><span>Updated Mar 2025</span><span>·</span><span>Checklist</span></div>
          <p>Postmark versus receipt deadlines, signature-cure procedures, and exactly what to do if your ballot is challenged. Includes a printable checklist used by our election-day hotline volunteers.</p>
          <a class="guide-link" href="#action">Read the guide →</a>
        </div>
      </article>
      <article class="guide-card rv" data-cat="benefits">
        <div class="guide-thumb"><img src="https://picsum.photos/seed/benefits-appeal/480/320?grayscale" alt="Person reviewing official letters at a kitchen table" loading="lazy"><span class="guide-cat">Benefits</span></div>
        <div class="guide-body">
          <h3>Public Benefits Appeals: Your Right to a Fair Hearing</h3>
          <div class="guide-meta"><span>14 min read</span><span>·</span><span>Updated Dec 2024</span><span>·</span><span>PDF</span></div>
          <p>Denied SNAP, Medicaid, or unemployment benefits trigger administrative due-process rights most people never hear about. Here are the appeal deadlines, the evidence rules, and how to request aid-paid-pending-hearing.</p>
          <a class="guide-link" href="#action">Read the guide →</a>
        </div>
      </article>
      <article class="guide-card rv" data-cat="open">
        <div class="guide-thumb"><img src="https://picsum.photos/seed/foia-desk/480/320?grayscale" alt="Filing cabinet with labeled public records folders" loading="lazy"><span class="guide-cat">Open Gov</span></div>
        <div class="guide-body">
          <h3>The FOIA Letter Kit: Public Records That Actually Arrive</h3>
          <div class="guide-meta"><span>10 min read</span><span>·</span><span>Updated Feb 2025</span><span>·</span><span>Templates</span></div>
          <p>Copy-paste request language, fee-waiver arguments, and a calendar for statutory response deadlines. We’ve filed over 300 requests; this kit is everything we wish we’d known at request number one.</p>
          <a class="guide-link" href="#action">Read the guide →</a>
        </div>
      </article>
    </div>
    <div class="guides-more rv"><a class="btn btn-ghost" href="#action">Browse all 42 guides →</a></div>
  </div>
</section>

<!-- ======= §03 HOW TO TESTIFY (sticky) ======= -->
<section class="section" id="testify">
  <div class="container testify-grid">
    <div class="sticky-col">
      <header class="rv">
        <p class="kicker"><span class="pilcrow">§</span> 03 — Field Manual</p>
        <h2 class="display mask rv" style="margin-top:14px"><span class="ln"><span class="ln-in">Testify at the hearing.</span></span><span class="ln"><span class="ln-in"><em>It moves the vote.</em></span></span></h2>
        <p>Committee staff count testimony. Legislators quote it on the floor. In 2024 alone, bills with coordinated public comment were <strong>three times more likely</strong> to be amended or advanced than bills that sailed through silent. Here is our five-step protocol — the same one our volunteer testimony coaches drill before every session.</p>
      </header>
      <figure class="photo frame kenburns rv">
        <div class="ph"><img src="https://picsum.photos/seed/public-hearing/700/500?grayscale" alt="Resident speaking at a podium before a committee dais" loading="lazy"></div>
        <figcaption>A first-time witness at the Housing Committee podium, March session.</figcaption>
      </figure>
      <a class="btn rv" href="#action">Download the Testimony Kit</a>
    </div>
    <div class="steps">
      <div class="step rv">
        <span class="step-n">01</span>
        <div><h3>Find your bill</h3><p>Every hearing begins with a published agenda. Locate the bill number, the assigned committee, and the hearing date on our Session Watch desk — then set an alert, because reschedules happen more often than they should.</p><span class="step-note">Field note — most agendas are posted 72 hours ahead, by rule or statute.</span></div>
      </div>
      <div class="step rv">
        <span class="step-n">02</span>
        <div><h3>Register to speak</h3><p>Sign up online before the deadline or arrive thirty minutes early to register in person. Your name and hometown enter the public record alongside your remarks — that visibility is part of the power.</p><span class="step-note">Field note — committees typically allot 2–3 minutes per witness.</span></div>
      </div>
      <div class="step rv">
        <span class="step-n">03</span>
        <div><h3>Draft your 90 seconds</h3><p>Lead with the ask: “I urge a yes vote on HB 402.” Then one story, one fact, one consequence. Legislators remember testimony that names the statute and the people it touches — not testimony that recites it at them.</p><span class="step-note">Field note — submit written remarks even if you also speak aloud.</span></div>
      </div>
      <div class="step rv">
        <span class="step-n">04</span>
        <div><h3>Submit exhibits on time</h3><p>Photos, letters, data tables — email them to the committee clerk before the filing deadline and bring twelve printed copies. Properly filed exhibits become part of the docket, where they outlive the hearing.</p><span class="step-note">Field note — exhibits entered into the record can be cited in the final report.</span></div>
      </div>
      <div class="step rv">
        <span class="step-n">05</span>
        <div><h3>Track the vote, then follow up</h3><p>After the hearing, watch for committee markup. If your bill advances, thank the sponsors in writing. If it stalls, request a carryover or interim study. Persistence is not optional — it is the process.</p><span class="step-note">Field note — 41% of Ledger-backed bills passed on their second session.</span></div>
      </div>
    </div>
  </div>
</section>

<!-- ======= §04 THE RIGHTS CHECK (quiz) ======= -->
<section class="section quiz-band" id="quiz">
  <div class="container quiz-grid">
    <div class="quiz-intro rv">
      <p class="kicker"><span class="pilcrow">§</span> 04 — Interactive</p>
      <h2 class="display mask rv" style="margin-top:14px"><span class="ln"><span class="ln-in">The Rights Check:</span></span><span class="ln"><span class="ln-in">six questions,</span></span><span class="ln"><span class="ln-in"><em>no legalese.</em></span></span></h2>
      <p>A quick civics diagnostic drawn from the same material we teach in our workshops. Every answer comes with the controlling citation, so even a wrong answer leaves you smarter than it found you.</p>
      <ul class="quiz-rules">
        <li>Six questions · roughly three minutes</li>
        <li>Instant feedback with the constitutional basis</li>
        <li>No sign-up, no tracking, no grades on file</li>
        <li>Score 6/6 and we’ll send you a printable certificate</li>
      </ul>
    </div>
    <div class="quiz-sheet rv" aria-label="The Rights Check quiz">
      <div class="quiz-bar"><span>Form RC-6 · Civics</span><span class="stamp">★ Official ★</span></div>
      <div class="quiz-inner" id="quizRoot">
        <div class="q-progress" aria-hidden="true"><i id="qBar"></i></div>
        <div id="qBody">
          <p class="q-count" id="qCount">Question 01 of 06</p>
          <h3 class="q-text" id="qText"></h3>
          <div class="q-opts" id="qOpts" role="group" aria-label="Answer choices"></div>
          <div class="q-feed" id="qFeed" aria-live="polite"><span class="verdict" id="qVerdict"></span><span id="qExplain"></span></div>
          <button class="btn q-next" id="qNext">Next question →</button>
        </div>
        <div class="q-result" id="qResult" hidden>
          <p class="score" id="rScore">0<small> / 6</small></p>
          <p class="v-title" id="rTitle"></p>
          <p id="rText"></p>
          <div class="btn-row">
            <button class="btn" id="qRetake">Retake the check</button>
            <a class="btn btn-ghost" href="#guides">Browse the guides</a>
          </div>
        </div>
      </div>
    </div>
  </div>
</section>

<!-- ======= §05 THE RECORD ======= -->
<section class="section" id="record">
  <div class="container">
    <header class="sec-head rv">
      <p class="kicker"><span class="pilcrow">§</span> 05 — The Record</p>
      <h2 class="display mask rv"><span class="ln"><span class="ln-in">What happened this session,</span></span><span class="ln"><span class="ln-in"><em>and what it means for you.</em></span></span></h2>
      <div class="rule-double"></div>
    </header>
    <div class="record-grid">
      <div class="record-main rv">
        <article class="story-feature">
          <figure class="photo kenburns"><div class="ph"><img src="https://picsum.photos/seed/redistricting-map/900/520?grayscale" alt="Community members studying a large printed district map" loading="lazy"></div></figure>
          <div class="story-body">
            <span class="story-kick">Analysis · 8 min read · Docket 25-07</span>
            <h3>How 612 public comments rewrote the redistricting map</h3>
            <p>When the commission posted its draft map, Ward 9 was poised to be split across three districts — diluting a community’s voice precisely where the statute says it should be concentrated. Over two weeks, residents used our testimony kit to file 612 coordinated comments, each citing the same charter provision. The final map kept the neighborhood whole. Public comment is not theater; it is evidence, and this is what evidence does.</p>
          </div>
        </article>
        <div class="story-2col">
          <article class="story-sm rv">
            <span class="story-kick">Explainer · 6 min</span>
            <h4>“Home rule,” explained: why your city can act when the state won’t</h4>
            <p>Municipal charters, Dillon’s Rule, and the narrow but real space where local ordinance carries the force of law — mapped in one page.</p>
            <a href="#action">Read the explainer →</a>
          </article>
          <article class="story-sm rv">
            <span class="story-kick">Follow-up · 4 min</span>
            <h4>FOIA win: the city will publish its towing-contract data</h4>
            <p>Sixty days after our records request was denied under a blanket exemption, an appeal — citing case law our volunteers annotated — forced disclosure. The data goes live next month.</p>
            <a href="#action">Read the follow-up →</a>
          </article>
        </div>
      </div>
      <aside class="sidebar" aria-label="Action alerts, advocacy wins, and hotline">
        <div class="side-block rv">
          <h3>Action alerts <span class="dot" aria-hidden="true"></span></h3>
          <div class="alert-item"><b>Urgent</b> HB 402 (rental repair escrow) hits committee Thursday. A two-minute call moves the count.<span class="due">Deadline · Thu 09:00</span></div>
          <div class="alert-item">Submit a comment on the transit redistricting maps — our template takes four minutes.<span class="due">Deadline · Friday 17:00</span></div>
          <div class="alert-item">City Council budget session, Tuesday 6 p.m. Seating is limited; witnesses register first.<span class="due">RSVP · Mon 12:00</span></div>
        </div>
        <div class="side-block rv">
          <h3>Advocacy wins</h3>
          <div class="win-item"><span class="win-check">✓</span><span><span class="yr">2025</span>Right to counsel in eviction proceedings enacted — Ordinance 24-114.</span></div>
          <div class="win-item"><span class="win-check">✓</span><span><span class="yr">2024</span>Early-voting hours extended at 11 sites after our accessibility audit.</span></div>
          <div class="win-item"><span class="win-check">✓</span><span><span class="yr">2024</span>Towing-contract data published following a settled FOIA appeal.</span></div>
          <div class="win-item"><span class="win-check">✓</span><span><span class="yr">2023</span>Participatory budgeting pilot funded — $2.1M decided by residents.</span></div>
        </div>
        <div class="side-block hotline-card rv">
          <h3>24-hr rights hotline</h3>
          <p class="num">1-800-555-0134</p>
          <p>Staffed around the clock on election days and during major protest events. Interpreters available in Spanish, Somali, and ASL via relay.</p>
        </div>
      </aside>
    </div>
  </div>
</section>

<!-- ======= §06 EVENTS ======= -->
<section class="section events" id="events">
  <div class="container">
    <header class="sec-head rv">
      <p class="kicker"><span class="pilcrow">§</span> 06 — On the Calendar</p>
      <h2 class="display mask rv"><span class="ln"><span class="ln-in">Show up. It’s the whole point.</span></span></h2>
      <p class="sec-sub">Clinics, town halls, and trainings — every event is free unless marked otherwise, and every one produces a record you can cite later.</p>
    </header>
    <div class="event-grid">
      <article class="event-card rv">
        <div class="event-date"><span class="d">14</span><span class="m">Mar · Sat</span></div>
        <span class="event-tag">In person · Free</span>
        <h3>Community Rights Clinic</h3>
        <p class="event-meta">Ward 7 Branch Library<br>10:00 — 13:00 · Walk-ins welcome<br>Attorneys on site for consults</p>
        <a class="btn btn-ghost" href="#action">Reserve a slot</a>
      </article>
      <article class="event-card rv">
        <div class="event-date"><span class="d">20</span><span class="m">Mar · Fri</span></div>
        <span class="event-tag">Public comment night</span>
        <h3>Town Hall: The Transit Budget</h3>
        <p class="event-meta">Fairmont Community Center<br>18:30 — 20:30 · Testimony coaching from 17:45<br>Childcare provided</p>
        <a class="btn btn-ghost" href="#action">Register to speak</a>
      </article>
      <article class="event-card rv">
        <div class="event-date"><span class="d">29</span><span class="m">Mar · Sun</span></div>
        <span class="event-tag">Volunteer training</span>
        <h3>Ballot Hotline Orientation</h3>
        <p class="event-meta">Virtual · 15:00 ET<br>2-hr session · Script &amp; statute binder included<br>Counts toward certification</p>
        <a class="btn btn-ghost" href="#volunteer">Join the corps</a>
      </article>
      <article class="event-card rv">
        <div class="event-date"><span class="d">06</span><span class="m">Apr · Mon</span></div>
        <span class="event-tag">En español · Gratis</span>
        <h3>Conozca Sus Derechos</h3>
        <p class="event-meta">Southside Mutual Aid Hall<br>18:00 — 20:00 · Taller bilingüe<br>Cuidado de niños disponible</p>
        <a class="btn btn-ghost" href="#action">Reservar lugar</a>
      </article>
    </div>
  </div>
</section>

<!-- ======= §07 VOICES ======= -->
<section class="section" id="voices">
  <div class="container">
    <header class="sec-head rv">
      <p class="kicker"><span class="pilcrow">§</span> 07 — From the Floor</p>
      <h2 class="display mask rv"><span class="ln"><span class="ln-in">Testimony, <em>in their words.</em></span></span></h2>
    </header>
    <div class="voices-wrap">
      <figure class="postcard rv">
        <blockquote>I used the testimony kit at my first hearing ever. Three minutes, one fact, and the council member quoted me from the dais. That’s when I understood the record is a weapon you’re allowed to carry.”</blockquote>
        <figcaption class="pc-person">
          <img src="https://i.pravatar.cc/96?u=danawhitfield" alt="Portrait of Dana Whitfield">
          <span><b>Dana Whitfield</b><span>Tenant organizer, Ward 9</span></span>
        </figcaption>
      </figure>
      <figure class="postcard rv">
        <blockquote>Their plain-language guides do what half my intake team wishes it could. I send every new client to the Ledger first — they arrive calmer, earlier, and with their paperwork in order.”</blockquote>
        <figcaption class="pc-person">
          <img src="https://i.pravatar.cc/96?u=marcusellison" alt="Portrait of Marcus Ellison">
          <span><b>Marcus Ellison</b><span>Staff attorney, County Public Defender</span></span>
        </figcaption>
      </figure>
      <figure class="postcard rv">
        <blockquote>My government class takes the Rights Check every semester. It is the only quiz they have ever begged to retake — and the only one their parents have done at the dinner table.”</blockquote>
        <figcaption class="pc-person">
          <img src="https://i.pravatar.cc/96?u=priyaraman" alt="Portrait of Priya Raman">
          <span><b>Priya Raman</b><span>Civics teacher, Fairmont North High</span></span>
        </figcaption>
      </figure>
    </div>
  </div>
</section>

<!-- ======= §08 VOLUNTEER ======= -->
<section class="section volunteer" id="volunteer">
  <div class="container vol-grid">
    <div class="rv">
      <p class="kicker"><span class="pilcrow">§</span> 08 — The Corps</p>
      <h2 class="display mask rv" style="margin-top:14px"><span class="ln"><span class="ln-in">The Ledger runs on</span></span><span class="ln"><span class="ln-in"><em>neighbors with clipboards.</em></span></span></h2>
      <p class="sec-sub" style="margin-top:18px">No law degree required — just four hours a month and a tolerance for fluorescent lighting. We train you, pair you with a mentor, and hand you the scripts. Roles currently open:</p>
      <div class="vol-roles">
        <span>Hotline responder</span><span>Testimony coach</span><span>Translator (ES · SO · AR)</span><span>Bill tracker</span><span>Poll monitor</span><span>Guide fact-checker</span>
      </div>
    </div>
    <div class="vol-right rv">
      <span class="big">900+</span>
      <p>active volunteers across 14 counties — from retired clerks of court to first-time canvassers who joined after using a guide themselves.</p>
      <a class="btn btn-paper" href="#action">Sign Up to Volunteer</a>
      <span class="note">Next orientation: first Sunday of each month · Virtual</span>
    </div>
  </div>
</section>

<!-- ======= §09 FAQ ======= -->
<section class="section" id="faq">
  <div class="container">
    <header class="sec-head rv">
      <p class="kicker"><span class="pilcrow">§</span> 09 — Common Questions</p>
      <h2 class="display mask rv"><span class="ln"><span class="ln-in">Objections, <em>answered.</em></span></span></h2>
      <div class="rule-double"></div>
    </header>
    <div class="faq-list rv">
      <div class="acc-item">
        <button class="acc-btn" aria-expanded="false"><span class="qn">Q.01</span><span class="qt">Are you affiliated with any party or candidate?</span><span class="acc-ico" aria-hidden="true"></span></button>
        <div class="acc-panel"><div class="acc-panel-in"><p>No, and structurally so. The Civic Ledger is a 501(c)(3) organization; our bylaws prohibit endorsements, contributions, or coordination with any party or campaign. We critique and defend officeholders of every stripe by the same standard: what the record shows.</p></div></div>
      </div>
      <div class="acc-item">
        <button class="acc-btn" aria-expanded="false"><span class="qn">Q.02</span><span class="qt">Is your material legal advice?</span><span class="acc-ico" aria-hidden="true"></span></button>
        <div class="acc-panel"><div class="acc-panel-in"><p>It is legal <em>information</em>, reviewed by licensed attorneys and updated as statutes change — but it is not a substitute for counsel on your specific facts. For representation, our clinic directory lists legal-aid offices by county and income threshold, and the hotline can connect you after hours.</p></div></div>
      </div>
      <div class="acc-item">
        <button class="acc-btn" aria-expanded="false"><span class="qn">Q.03</span><span class="qt">Who funds the Civic Ledger?</span><span class="acc-ico" aria-hidden="true"></span></button>
        <div class="acc-panel"><div class="acc-panel-in"><p>Roughly 70% of our budget comes from individual donors and community foundations; the rest from workshop fees paid by libraries and schools (never charged to residents). We accept no government contracts and no PAC money, and we publish our audited financials and Form 990 every spring.</p></div></div>
      </div>
      <div class="acc-item">
        <button class="acc-btn" aria-expanded="false"><span class="qn">Q.04</span><span class="qt">Do I need experience to volunteer?</span><span class="acc-ico" aria-hidden="true"></span></button>
        <div class="acc-panel"><div class="acc-panel-in"><p>None. Every role starts with a two-hour orientation and a scripted playbook, and hotline responders shadow two shifts before going live. What we screen for is reliability and calm — the statutes we can teach you.</p></div></div>
      </div>
      <div class="acc-item">
        <button class="acc-btn" aria-expanded="false"><span class="qn">Q.05</span><span class="qt">May I reprint or teach from your guides?</span><span class="acc-ico" aria-hidden="true"></span></button>
        <div class="acc-panel"><div class="acc-panel-in"><p>Please do. All guides are released under a Creative Commons BY-NC 4.0 license — credit The Civic Ledger and don’t sell them. Libraries, clinics, and classrooms can order free bulk print runs through our distribution desk; we ship about 30,000 copies a year.</p></div></div>
      </div>
    </div>
  </div>
</section>

<!-- ======= §10 SUBSCRIBE ======= -->
<section class="subscribe" id="action">
  <div class="container sub-grid">
    <div class="rv">
      <p class="kicker" style="color:#FFD9A0">§ 10 — Subscribe · Take Action · Donate</p>
      <h2 class="display">Get <em>The Briefing.</em></h2>
      <p class="sub-copy">One email every Friday: five bills worth knowing, one deadline you shouldn’t miss, and a guide to read over coffee. No legalese, no spam, unsubscribe with a single click. Join <strong>12,400 subscribers</strong> — or go one step further and fund the next guide.</p>
    </div>
    <form class="sub-form rv" id="briefForm" novalidate>
      <label for="briefEmail">The Briefing — free, every Friday</label>
      <div class="row">
        <input type="email" id="briefEmail" name="email" placeholder="you@example.org" required aria-label="Email address">
        <button class="btn btn-red" type="submit">Subscribe</button>
      </div>
      <span class="sub-note">We never sell or share your address. Read our privacy pledge below.</span>
      <p class="sub-msg" id="briefMsg" role="status">✓ You’re on the docket. First Briefing arrives Friday, 7:00 a.m.</p>
    </form>
  </div>
</section>

</main>

<!-- ======= FOOTER ======= -->
<footer>
  <div class="container">
    <div class="foot-main">
      <div class="foot-brand">
        <img src="https://placehold.co/112x112/A6271B/F4EFE3?text=CL&font=oswald" alt="The Civic Ledger seal mark">
        <p class="name">The Civic Ledger</p>
        <p class="tag">Democracy, annotated.</p>
        <p>A nonpartisan 501(c)(3) civic-literacy organization. We publish plain-language legal guides, track legislation in real time, and train residents to participate in the public process that governs their lives.</p>
        <div class="socials">
          <a href="#top" aria-label="Follow on X">X ↗</a>
          <a href="#top" aria-label="Follow on Instagram">Instagram ↗</a>
          <a href="#top" aria-label="Connect on LinkedIn">LinkedIn ↗</a>
          <a href="#top" aria-label="Watch on YouTube">YouTube ↗</a>
        </div>
      </div>
      <div class="foot-col">
        <h4>Explore</h4>
        <ul>
          <li><a href="#mission">About the Ledger</a></li>
          <li><a href="#guides">Resource Library</a></li>
          <li><a href="#record">Session Watch</a></li>
          <li><a href="#events">Events</a></li>
          <li><a href="#quiz">The Rights Check</a></li>
        </ul>
      </div>
      <div class="foot-col">
        <h4>Get Involved</h4>
        <ul>
          <li><a href="#volunteer">Volunteer</a></li>
          <li><a href="#action">Subscribe</a></li>
          <li><a href="#action">Donate</a></li>
          <li><a href="#action">Bulk guide orders</a></li>
          <li><a href="#action">Press inquiries</a></li>
        </ul>
      </div>
      <div class="foot-col foot-contact">
        <h4>The Office</h4>
        <address>
          100 Constitution Square, Suite 400<br>
          Fairmont, OH 43002<br>
          <a href="mailto:desk@civicledger.org" style="color:inherit">desk@civicledger.org</a><br>
          (614) 555-0142<br>
          <span class="hot">Hotline: 1-800-555-0134</span>
        </address>
      </div>
    </div>
    <p class="foot-disclaimer">Disclaimer: The Civic Ledger provides legal information and civic education, not legal advice. Guides reflect the law as of their published revision date; statutes change. For advice about your specific situation, consult a licensed attorney — our clinic directory is a good place to start. The Civic Ledger is a fictional demonstration organization.</p>
    <div class="foot-bottom">
      <span>© <span id="year">2025</span> The Civic Ledger · EIN 00-0000000 · Made in Fairmont</span>
      <span><a href="#top">Privacy Policy</a> · <a href="#top">Terms of Use</a> · <a href="#top">Accessibility</a> · <a href="#top">Financial Disclosures</a></span>
    </div>
  </div>
</footer>

<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));

/* ---- Date, year ---- */
$("#year").textContent = new Date().getFullYear();
$("#topDate").innerHTML = "<b>Today:</b> " + new Date().toLocaleDateString("en-US",{weekday:"long",month:"long",day:"numeric",year:"numeric"});

/* ---- Nav: scroll state + mobile menu ---- */
const nav = $("#siteNav"), navToggle = $("#navToggle");
addEventListener("scroll", ()=> nav.classList.toggle("scrolled", scrollY > 8), {passive:true});
navToggle.addEventListener("click", ()=>{
  const open = nav.classList.toggle("menu-open");
  navToggle.setAttribute("aria-expanded", open);
});
$$("#navLinks a").forEach(a=> a.addEventListener("click", ()=> nav.classList.remove("menu-open")));

/* ---- Scramble decode ---- */
const CHARS = "§¶†‡ABCDEFGHKLMNPRSTUVXZ0123456789";
function scramble(el, finalText, dur){
  dur = dur || 900;
  if(RM){ el.textContent = finalText; return; }
  const start = performance.now();
  (function frame(t){
    const p = Math.min((t-start)/dur, 1);
    let out = "";
    const reveal = Math.floor(p * finalText.length);
    for(let i=0;i<finalText.length;i++){
      if(i < reveal || finalText[i]===" ") out += finalText[i];
      else out += CHARS[(Math.random()*CHARS.length)|0];
    }
    el.textContent = out;
    if(p < 1) requestAnimationFrame(frame); else el.textContent = finalText;
  })(start);
}
setTimeout(()=> scramble($("#decodeKicker"), $("#decodeKicker").textContent.trim(), 1300), 300);

/* ---- Term of the day ---- */
const TERMS = [
  {t:"habeas corpus", d:"Latin for “produce the body.” A court order demanding a jailer justify a detention — the oldest safeguard against unlawful imprisonment."},
  {t:"quorum", d:"The minimum number of members who must be present before a legislative body may conduct business. No quorum, no vote — a favorite tool of the strategic walkout."},
  {t:"filibuster", d:"Extended debate used to delay or block a floor vote. In the U.S. Senate, ending one typically requires 60 votes via cloture."},
  {t:"subpoena duces tecum", d:"A court order compelling a witness to appear AND bring documents. The “duces tecum” part is where the evidence lives."},
  {t:"home rule", d:"Authority granted to a municipality to govern local matters through its own charter, independent of case-by-case state legislation."},
  {t:"exculpatory evidence", d:"Material that tends to clear a defendant of guilt. Under Brady v. Maryland, prosecutors must hand it over — withholding it violates due process."}
];
let termIdx = 0;
$("#termNext").addEventListener("click", ()=>{
  termIdx = (termIdx+1) % TERMS.length;
  scramble($("#termName"), TERMS[termIdx].t, 700);
  const def = $("#termDef");
  def.style.opacity = 0;
  setTimeout(()=>{ def.textContent = TERMS[termIdx].d; def.style.transition="opacity .5s"; def.style.opacity = 1; }, RM?0:200);
});

/* ---- Reveal on scroll ---- */
const io = new IntersectionObserver(entries=>{
  entries.forEach(e=>{ if(e.isIntersecting){ e.target.classList.add("in"); io.unobserve(e.target); } });
},{threshold:.14, rootMargin:"0px 0px -40px 0px"});
$$(".rv, .mask").forEach(el=> io.observe(el));

/* ---- Counters ---- */
function countUp(el){
  const target = +el.dataset.count, dur = 1600, start = performance.now();
  if(RM){ el.textContent = target.toLocaleString("en-US"); return; }
  (function frame(t){
    const p = Math.min((t-start)/dur, 1), ease = 1 - Math.pow(1-p, 3);
    el.textContent = Math.round(target*ease).toLocaleString("en-US");
    if(p<1) requestAnimationFrame(frame);
  })(start);
}
const cio = new IntersectionObserver(entries=>{
  entries.forEach(e=>{ if(e.isIntersecting){ countUp(e.target); cio.unobserve(e.target); } });
},{threshold:.6});
$$("[data-count]").forEach(el=> cio.observe(el));

/* ---- Guide filter ---- */
const chips = $$(".chip"), cards = $$(".guide-card");
chips.forEach(btn=> btn.addEventListener("click", ()=>{
  chips.forEach(b=> b.setAttribute("aria-pressed", b===btn));
  const f = btn.dataset.filter;
  cards.forEach(c=>{
    const show = f==="all" || c.dataset.cat===f;
    c.style.display = show ? "" : "none";
    if(show && !RM){ c.classList.remove("pop"); void c.offsetWidth; c.classList.add("pop"); }
  });
}));

/* ---- Accordion ---- */
$$(".acc-item").forEach(item=>{
  const btn = $(".acc-btn", item);
  btn.addEventListener("click", ()=>{
    const wasOpen = item.classList.contains("open");
    $$(".acc-item.open").forEach(o=>{ o.classList.remove("open"); $(".acc-btn",o).setAttribute("aria-expanded","false"); });
    if(!wasOpen){ item.classList.add("open"); btn.setAttribute("aria-expanded","true"); }
  });
});

/* ---- THE RIGHTS CHECK (quiz) ---- */
const QUIZ = [
  {q:"Which amendment protects freedom of speech, of the press, and of peaceful assembly?",
   a:["The Fourth Amendment","The First Amendment","The Tenth Amendment","The Fifth Amendment"], c:1,
   x:"First Amendment, ratified 1791 — it shields speech, press, assembly, petition, and religion from government interference."},
  {q:"“Due process of law” means that…",
   a:["trials are always closed to the public","only federal courts may hear criminal cases","the government must follow fair procedures before depriving anyone of life, liberty, or property","laws expire after ten years unless renewed"], c:2,
   x:"The Fifth Amendment binds the federal government; the Fourteenth extends due process to the states."},
  {q:"Under the Twenty-Sixth Amendment, the minimum voting age nationwide is…",
   a:["21","18","17","16"], c:1,
   x:"Ratified in 1971 in just 100 days — the fastest amendment in U.S. history, driven by the slogan “old enough to fight, old enough to vote.”"},
  {q:"An officer asks to search your home. There is no warrant and no emergency. Generally, you may…",
   a:["refuse consent","be arrested for refusing","be searched regardless","demand the officer pay a fee"], c:0,
   x:"The Fourth Amendment bars unreasonable searches. Consent is a major exception — and it is yours to withhold, politely and clearly."},
  {q:"A United States Senator represents…",
   a:["only their home county","a single congressional district","only the voters of their own party","all residents of their entire state"], c:3,
   x:"Each state elects two senators who represent the state as a whole; district-based representation belongs to the House."},
  {q:"At a peaceful protest, the government may impose…",
   a:["no restrictions under any circumstances","reasonable time, place, and manner rules applied equally to all views","restrictions only on unpopular viewpoints","permit fees that vary with the message"], c:1,
   x:"Content-neutral time, place, and manner restrictions are permitted. Viewpoint discrimination — including price-tagged permits — is not."}
];
const VERDICTS = [
  {min:6, t:"Certified Constituent", d:"A perfect record. Frankly, we’d like to recruit you — the volunteer corps has a desk with your name on it."},
  {min:4, t:"Informed Voter", d:"Solid fundamentals. The fine print is where it gets interesting — the Guide Library will sharpen the edges."},
  {min:2, t:"Getting Warmed Up", d:"You know more than most, and less than you will in ten minutes. Start with “How to Read a Bill in Twenty Minutes.”"},
  {min:0, t:"No Verdict Yet", d:"Every expert was once a beginner. Grab a guide, then come back and retake the check — it’s on the record that you may."}
];
let qi = 0, score = 0;
const qCount=$("#qCount"), qText=$("#qText"), qOpts=$("#qOpts"),
      qFeed=$("#qFeed"), qVerdict=$("#qVerdict"), qExplain=$("#qExplain"),
      qNext=$("#qNext"), qBar=$("#qBar"), qBody=$("#qBody"), qResult=$("#qResult");

function renderQ(){
  const item = QUIZ[qi];
  qCount.textContent = "Question " + String(qi+1).padStart(2,"0") + " of " + String(QUIZ.length).padStart(2,"0");
  qText.textContent = item.q;
  qBar.style.width = (qi / QUIZ.length * 100) + "%";
  qOpts.innerHTML = "";
  qFeed.className = "q-feed"; qNext.className = "btn q-next";
  item.a.forEach((opt, i)=>{
    const b = document.createElement("button");
    b.className = "q-opt"; b.type = "button";
    b.innerHTML = '<span class="let">' + "ABCD"[i] + '</span><span>' + opt + '</span>';
    b.addEventListener("click", ()=> answer(b, i, item));
    qOpts.appendChild(b);
  });
}
function answer(btn, i, item){
  if(qFeed.classList.contains("show")) return;
  $$(".q-opt", qOpts).forEach(b=> b.disabled = true);
  const correct = i === item.c;
  if(correct){ btn.classList.add("is-correct"); score++; qFeed.classList.add("good"); qVerdict.textContent = "✓ Correct — sustained."; }
  else{
    btn.classList.add("is-wrong");
    $$(".q-opt", qOpts)[item.c].classList.add("is-correct");
    qFeed.classList.add("bad"); qVerdict.textContent = "✗ Overruled.";
  }
  qExplain.textContent = " " + item.x;
  qFeed.classList.add("show");
  qNext.textContent = (qi === QUIZ.length-1) ? "See your verdict →" : "Next question →";
  qNext.classList.add("show");
  qNext.focus();
}
qNext.addEventListener("click", ()=>{
  qi++;
  if(qi < QUIZ.length){ renderQ(); }
  else{
    qBar.style.width = "100%";
    qBody.hidden = true; qResult.hidden = false;
    $("#rScore").innerHTML = score + "<small> / " + QUIZ.length + "</small>";
    const v = VERDICTS.find(v=> score >= v.min);
    $("#rTitle").textContent = v.t; $("#rText").textContent = v.d;
  }
});
$("#qRetake").addEventListener("click", ()=>{
  qi = 0; score = 0;
  qResult.hidden = true; qBody.hidden = false;
  renderQ();
});
renderQ();

/* ---- Subscribe form ---- */
$("#briefForm").addEventListener("submit", e=>{
  e.preventDefault();
  const email = $("#briefEmail");
  if(!email.checkValidity()){ email.reportValidity(); return; }
  $("#briefMsg").classList.add("show");
  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:29:41.826Z",
  "url": "https://benchmark.aimac.invalid/a4156b7574f099883e46e4e4c33399bd01cc27354ec614eedbe4afd7d5165246.html",
  "toolOptions": {
    "runOnly": {
      "type": "tag",
      "values": [
        "wcag2a",
        "wcag2aa",
        "wcag21a",
        "wcag21aa",
        "wcag22a",
        "wcag22aa"
      ]
    },
    "resultTypes": [
      "violations"
    ],
    "reporter": "v1"
  },
  "inapplicable": [
    {
      "id": "area-alt",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag244",
        "wcag412",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT6.a",
        "EN-301-549",
        "EN-9.2.4.4",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure <area> elements of image maps have alternative text",
      "help": "Active <area> elements must have alternative text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/area-alt?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-braille-equivalent",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure aria-braillelabel and aria-brailleroledescription have a non-braille equivalent",
      "help": "aria-braille attributes must have a non-braille equivalent",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-braille-equivalent?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-command-name",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "TTv5",
        "TT6.a",
        "EN-301-549",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure every ARIA button, link and menuitem has an accessible name",
      "help": "ARIA commands must have an accessible name",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-command-name?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-input-field-name",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "TTv5",
        "TT5.c",
        "EN-301-549",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure every ARIA input field has an accessible name",
      "help": "ARIA input fields must have an accessible name",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-input-field-name?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-meter-name",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag111",
        "EN-301-549",
        "EN-9.1.1.1"
      ],
      "description": "Ensure every ARIA meter node has an accessible name",
      "help": "ARIA meter nodes must have an accessible name",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-meter-name?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-progressbar-name",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag111",
        "EN-301-549",
        "EN-9.1.1.1"
      ],
      "description": "Ensure every ARIA progressbar node has an accessible name",
      "help": "ARIA progressbar nodes must have an accessible name",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-progressbar-name?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-required-children",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag131",
        "EN-301-549",
        "EN-9.1.3.1"
      ],
      "description": "Ensure elements with an ARIA role that require child roles contain them",
      "help": "Certain ARIA roles must contain particular children",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-required-children?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-required-parent",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag131",
        "EN-301-549",
        "EN-9.1.3.1"
      ],
      "description": "Ensure elements with an ARIA role that require parent roles are contained by them",
      "help": "Certain ARIA roles must be contained by particular parents",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-required-parent?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-toggle-field-name",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "TTv5",
        "TT5.c",
        "EN-301-549",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure every ARIA toggle field has an accessible name",
      "help": "ARIA toggle fields must have an accessible name",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-toggle-field-name?application=axeAPI",
      "nodes": []
    },
    {
      "id": "aria-tooltip-name",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure every ARIA tooltip node has an accessible name",
      "help": "ARIA tooltip nodes must have an accessible name",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-tooltip-name?application=axeAPI",
      "nodes": []
    },
    {
      "id": "autocomplete-valid",
      "impact": null,
      "tags": [
        "cat.forms",
        "wcag21aa",
        "wcag135",
        "EN-301-549",
        "EN-9.1.3.5",
        "ACT"
      ],
      "description": "Ensure the autocomplete attribute is correct and suitable for the form field",
      "help": "autocomplete attribute must be used correctly",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/autocomplete-valid?application=axeAPI",
      "nodes": []
    },
    {
      "id": "blink",
      "impact": null,
      "tags": [
        "cat.time-and-media",
        "wcag2a",
        "wcag222",
        "section508",
        "section508.22.j",
        "TTv5",
        "TT2.b",
        "EN-301-549",
        "EN-9.2.2.2"
      ],
      "description": "Ensure <blink> elements are not used",
      "help": "<blink> elements are deprecated and must not be used",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/blink?application=axeAPI",
      "nodes": []
    },
    {
      "id": "definition-list",
      "impact": null,
      "tags": [
        "cat.structure",
        "wcag2a",
        "wcag131",
        "EN-301-549",
        "EN-9.1.3.1"
      ],
      "description": "Ensure <dl> elements are structured correctly",
      "help": "<dl> elements must only directly contain properly-ordered <dt> and <dd> groups, <script>, <template> or <div> elements",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/definition-list?application=axeAPI",
      "nodes": []
    },
    {
      "id": "dlitem",
      "impact": null,
      "tags": [
        "cat.structure",
        "wcag2a",
        "wcag131",
        "EN-301-549",
        "EN-9.1.3.1"
      ],
      "description": "Ensure <dt> and <dd> elements are contained by a <dl>",
      "help": "<dt> and <dd> elements must be contained by a <dl>",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/dlitem?application=axeAPI",
      "nodes": []
    },
    {
      "id": "frame-focusable-content",
      "impact": null,
      "tags": [
        "cat.keyboard",
        "wcag2a",
        "wcag211",
        "TTv5",
        "TT4.a",
        "EN-301-549",
        "EN-9.2.1.1"
      ],
      "description": "Ensure <frame> and <iframe> elements with focusable content do not have tabindex=-1",
      "help": "Frames with focusable content must not have tabindex=-1",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/frame-focusable-content?application=axeAPI",
      "nodes": []
    },
    {
      "id": "frame-title-unique",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag412",
        "TTv5",
        "TT12.d",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure <iframe> and <frame> elements contain a unique title attribute",
      "help": "Frames must have a unique title attribute",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/frame-title-unique?application=axeAPI",
      "nodes": []
    },
    {
      "id": "frame-title",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag412",
        "section508",
        "section508.22.i",
        "TTv5",
        "TT12.d",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure <iframe> and <frame> elements have an accessible name",
      "help": "Frames must have an accessible name",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/frame-title?application=axeAPI",
      "nodes": []
    },
    {
      "id": "html-xml-lang-mismatch",
      "impact": null,
      "tags": [
        "cat.language",
        "wcag2a",
        "wcag311",
        "EN-301-549",
        "EN-9.3.1.1",
        "ACT"
      ],
      "description": "Ensure that HTML elements with both valid lang and xml:lang attributes agree on the base language of the page",
      "help": "HTML elements with lang and xml:lang must have the same base language",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/html-xml-lang-mismatch?application=axeAPI",
      "nodes": []
    },
    {
      "id": "input-button-name",
      "impact": null,
      "tags": [
        "cat.name-role-value",
        "wcag2a",
        "wcag412",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT5.c",
        "EN-301-549",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure input buttons have discernible text",
      "help": "Input buttons must have discernible text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/input-button-name?application=axeAPI",
      "nodes": []
    },
    {
      "id": "input-image-alt",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag111",
        "wcag412",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT7.a",
        "EN-301-549",
        "EN-9.1.1.1",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure <input type=\"image\"> elements have alternative text",
      "help": "Image buttons must have alternative text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/input-image-alt?application=axeAPI",
      "nodes": []
    },
    {
      "id": "marquee",
      "impact": null,
      "tags": [
        "cat.parsing",
        "wcag2a",
        "wcag222",
        "TTv5",
        "TT2.b",
        "EN-301-549",
        "EN-9.2.2.2"
      ],
      "description": "Ensure <marquee> elements are not used",
      "help": "<marquee> elements are deprecated and must not be used",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/marquee?application=axeAPI",
      "nodes": []
    },
    {
      "id": "meta-refresh",
      "impact": null,
      "tags": [
        "cat.time-and-media",
        "wcag2a",
        "wcag221",
        "TTv5",
        "TT8.a",
        "EN-301-549",
        "EN-9.2.2.1"
      ],
      "description": "Ensure <meta http-equiv=\"refresh\"> is not used for delayed refresh",
      "help": "Delayed refresh under 20 hours must not be used",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/meta-refresh?application=axeAPI",
      "nodes": []
    },
    {
      "id": "object-alt",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag111",
        "section508",
        "section508.22.a",
        "EN-301-549",
        "EN-9.1.1.1"
      ],
      "description": "Ensure <object> elements have alternative text",
      "help": "<object> elements must have alternative text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/object-alt?application=axeAPI",
      "nodes": []
    },
    {
      "id": "role-img-alt",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag111",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT7.a",
        "EN-301-549",
        "EN-9.1.1.1",
        "ACT"
      ],
      "description": "Ensure [role=\"img\"] elements have alternative text",
      "help": "[role=\"img\"] elements must have an alternative text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/role-img-alt?application=axeAPI",
      "nodes": []
    },
    {
      "id": "scrollable-region-focusable",
      "impact": null,
      "tags": [
        "cat.keyboard",
        "wcag2a",
        "wcag211",
        "wcag213",
        "TTv5",
        "TT4.a",
        "EN-301-549",
        "EN-9.2.1.1",
        "EN-9.2.1.3"
      ],
      "description": "Ensure elements that have scrollable content are accessible by keyboard",
      "help": "Scrollable region must have keyboard access",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/scrollable-region-focusable?application=axeAPI",
      "nodes": []
    },
    {
      "id": "select-name",
      "impact": null,
      "tags": [
        "cat.forms",
        "wcag2a",
        "wcag412",
        "section508",
        "section508.22.n",
        "TTv5",
        "TT5.c",
        "EN-301-549",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure select element has an accessible name",
      "help": "Select element must have an accessible name",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/select-name?application=axeAPI",
      "nodes": []
    },
    {
      "id": "server-side-image-map",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag211",
        "section508",
        "section508.22.f",
        "TTv5",
        "TT4.a",
        "EN-301-549",
        "EN-9.2.1.1"
      ],
      "description": "Ensure that server-side image maps are not used",
      "help": "Server-side image maps must not be used",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/server-side-image-map?application=axeAPI",
      "nodes": []
    },
    {
      "id": "summary-name",
      "impact": null,
      "tags": [
        "cat.name-role-value",
        "wcag2a",
        "wcag412",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT6.a",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure summary elements have discernible text",
      "help": "Summary elements must have discernible text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/summary-name?application=axeAPI",
      "nodes": []
    },
    {
      "id": "svg-img-alt",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag111",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT7.a",
        "EN-301-549",
        "EN-9.1.1.1",
        "ACT"
      ],
      "description": "Ensure <svg> elements with an img, graphics-document or graphics-symbol role have an accessible text",
      "help": "<svg> elements with an img role must have an alternative text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/svg-img-alt?application=axeAPI",
      "nodes": []
    },
    {
      "id": "td-headers-attr",
      "impact": null,
      "tags": [
        "cat.tables",
        "wcag2a",
        "wcag131",
        "section508",
        "section508.22.g",
        "TTv5",
        "TT14.b",
        "EN-301-549",
        "EN-9.1.3.1"
      ],
      "description": "Ensure that each cell in a table that uses the headers attribute refers only to other cells in that table",
      "help": "Table cells that use the headers attribute must only refer to cells in the same table",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/td-headers-attr?application=axeAPI",
      "nodes": []
    },
    {
      "id": "th-has-data-cells",
      "impact": null,
      "tags": [
        "cat.tables",
        "wcag2a",
        "wcag131",
        "section508",
        "section508.22.g",
        "TTv5",
        "TT14.b",
        "EN-301-549",
        "EN-9.1.3.1"
      ],
      "description": "Ensure that <th> elements and elements with role=columnheader/rowheader have data cells they describe",
      "help": "Table headers in a data table must refer to data cells",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/th-has-data-cells?application=axeAPI",
      "nodes": []
    },
    {
      "id": "valid-lang",
      "impact": null,
      "tags": [
        "cat.language",
        "wcag2aa",
        "wcag312",
        "TTv5",
        "TT11.b",
        "EN-301-549",
        "EN-9.3.1.2",
        "ACT"
      ],
      "description": "Ensure lang attributes have valid values",
      "help": "lang attribute must have a valid value",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/valid-lang?application=axeAPI",
      "nodes": []
    },
    {
      "id": "video-caption",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag122",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT17.a",
        "EN-301-549",
        "EN-9.1.2.2"
      ],
      "description": "Ensure <video> elements have captions",
      "help": "<video> elements must have captions",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/video-caption?application=axeAPI",
      "nodes": []
    },
    {
      "id": "no-autoplay-audio",
      "impact": null,
      "tags": [
        "cat.time-and-media",
        "wcag2a",
        "wcag142",
        "TTv5",
        "TT2.a",
        "EN-301-549",
        "EN-9.1.4.2",
        "ACT"
      ],
      "description": "Ensure <video> or <audio> elements do not autoplay audio for more than 3 seconds without a control mechanism to stop or mute the audio",
      "help": "<video> or <audio> elements must not play automatically",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/no-autoplay-audio?application=axeAPI",
      "nodes": []
    }
  ],
  "passes": [
    {
      "id": "aria-allowed-attr",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure an element's role supports its ARIA attributes",
      "help": "Elements must only use supported ARIA attributes",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-allowed-attr?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [
            {
              "id": "aria-allowed-attr",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "ARIA attributes are used correctly for the defined role"
            }
          ],
          "none": [
            {
              "id": "aria-unsupported-attr",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "ARIA attribute is supported"
            }
          ],
          "impact": null,
          "html": "<div class=\"ticker\" aria-label=\"Live legislative session watch\">",
          "target": [
            ".ticker"
          ]
        }
      ]
    },
    {
      "id": "aria-conditional-attr",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure ARIA attributes are used as described in the specification of the element's role",
      "help": "ARIA attributes must be used as specified for the element's role",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-conditional-attr?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [
            {
              "id": "aria-conditional-attr",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "ARIA attribute is allowed"
            }
          ],
          "none": [],
          "impact": null,
          "html": "<div class=\"ticker\" aria-label=\"Live legislative session watch\">",
          "target": [
            ".ticker"
          ]
        }
      ]
    },
    {
      "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=\"filter-bar rv\" role=\"group\" aria-label=\"Filter guides by topic\">",
          "target": [
            ".filter-bar"
          ]
        }
      ]
    },
    {
      "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=\"grain\" aria-hidden=\"true\"></div>",
          "target": [
            ".grain"
          ]
        }
      ]
    },
    {
      "id": "aria-prohibited-attr",
      "impact": "serious",
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure ARIA attributes are not prohibited for an element's role",
      "help": "Elements must only use permitted ARIA attributes",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-prohibited-attr?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [],
          "none": [
            {
              "id": "aria-prohibited-attr",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "ARIA attribute is allowed"
            }
          ],
          "impact": null,
          "html": "<a class=\"brand\" href=\"#top\" aria-label=\"The Civic Ledger \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=\"filter-bar rv\" role=\"group\" aria-label=\"Filter guides by topic\">",
          "target": [
            ".filter-bar"
          ]
        }
      ]
    },
    {
      "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=\"filter-bar rv\" role=\"group\" aria-label=\"Filter guides by topic\">",
          "target": [
            ".filter-bar"
          ]
        }
      ]
    },
    {
      "id": "aria-valid-attr-value",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure all ARIA attributes have valid values",
      "help": "ARIA attributes must conform to valid values",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-valid-attr-value?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [
            {
              "id": "aria-valid-attr-value",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "ARIA attribute values are valid"
            },
            {
              "id": "aria-errormessage",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "aria-errormessage exists and references elements visible to screen readers that use a supported aria-errormessage technique"
            },
            {
              "id": "aria-level",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "aria-level values are valid"
            }
          ],
          "none": [],
          "impact": null,
          "html": "<div class=\"ticker\" aria-label=\"Live legislative session watch\">",
          "target": [
            ".ticker"
          ]
        }
      ]
    },
    {
      "id": "aria-valid-attr",
      "impact": null,
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure attributes that begin with aria- are valid ARIA attributes",
      "help": "ARIA attributes must conform to valid names",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-valid-attr?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "aria-valid-attr",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "ARIA attribute name is valid"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<div class=\"ticker\" aria-label=\"Live legislative session watch\">",
          "target": [
            ".ticker"
          ]
        }
      ]
    },
    {
      "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": "<a href=\"mailto:desk@civicledger.org\" style=\"color:inherit\">desk@civicledger.org</a>",
          "target": [
            "a[href=\"mailto:desk@civicledger.org\"]"
          ]
        }
      ]
    },
    {
      "id": "button-name",
      "impact": null,
      "tags": [
        "cat.name-role-value",
        "wcag2a",
        "wcag412",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT6.a",
        "EN-301-549",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure buttons have discernible text",
      "help": "Buttons must have discernible text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/button-name?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "button-has-visible-text",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "Element has inner text that is visible to screen readers"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<button class=\"term-refresh\" id=\"termNext\">Next term \u21bb</button>",
          "target": [
            "#termNext"
          ]
        }
      ]
    },
    {
      "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=\"display mask rv in\">\n        <span class=\"ln\"><span class=\"ln-in\">The law is public.</span></span>\n        <span class=\"ln\"><span class=\"ln-in\"><em>We make it legible.</em></span></span>\n      </h1>",
                  "target": [
                    "h1"
                  ]
                },
                {
                  "html": "<h2 class=\"display mask rv\"><span class=\"ln\"><span class=\"ln-in\">Four desks. One mission:</span></span><span class=\"ln\"><span class=\"ln-in\"><em>a government you can read.</em></span></span></h2>",
                  "target": [
                    "#mission > .container > .sec-head > h2"
                  ]
                },
                {
                  "html": "<h3>Know-Your-Rights Education</h3>",
                  "target": [
                    ".pillar[href$=\"#guides\"] > span:nth-child(2) > h3"
                  ]
                },
                {
                  "html": "<h3>Legislative Watch</h3>",
                  "target": [
                    ".pillar[href$=\"#record\"] > span:nth-child(2) > h3"
                  ]
                },
                {
                  "html": "<h3>Community Advocacy</h3>",
                  "target": [
                    "a[href$=\"#testify\"] > span:nth-child(2) > h3"
                  ]
                },
                {
                  "html": "<h3>Voter Services</h3>",
                  "target": [
                    ".pillar[href$=\"#events\"] > span:nth-child(2) > h3"
                  ]
                },
                {
                  "html": "<h2 class=\"display mask rv\"><span class=\"ln\"><span class=\"ln-in\">Plain-language guides,</span></span><span class=\"ln\"><span class=\"ln-in\"><em>reviewed by attorneys.</em></span></span></h2>",
                  "target": [
                    "#guides > .container > .sec-head > h2"
                  ]
                },
                {
                  "html": "<h3>The Tenant\u2019s Playbook: Repairs, Rent Escrow &amp; Eviction Defense</h3>",
                  "target": [
                    "article[data-cat=\"housing\"] > .guide-body > h3"
                  ]
                },
                {
                  "html": "<h3>Stopped, Questioned, Searched: Rights During Police Encounters</h3>",
                  "target": [
                    "article[data-cat=\"rights\"] > .guide-body > h3"
                  ]
                },
                {
                  "html": "<h3>How to Read a Bill in Twenty Minutes</h3>",
                  "target": [
                    ".guide-card[data-cat=\"open\"]:nth-child(3) > .guide-body > h3"
                  ]
                },
                {
                  "html": "<h3>Voting by Mail: Deadlines, Cure Rules &amp; Ballot Tracking</h3>",
                  "target": [
                    "article[data-cat=\"voting\"] > .guide-body > h3"
                  ]
                },
                {
                  "html": "<h3>Public Benefits Appeals: Your Right to a Fair Hearing</h3>",
                  "target": [
                    "article[data-cat=\"benefits\"] > .guide-body > h3"
                  ]
                },
                {
                  "html": "<h3>The FOIA Letter Kit: Public Records That Actually Arrive</h3>",
                  "target": [
                    ".guide-card[data-cat=\"open\"]:nth-child(6) > .guide-body > h3"
                  ]
                },
                {
                  "html": "<h2 class=\"display mask rv\" style=\"margin-top:14px\"><span class=\"ln\"><span class=\"ln-in\">Testify at the hearing.</span></span><span class=\"ln\"><span class=\"ln-in\"><em>It moves the vote.</em></span></span></h2>",
                  "target": [
                    ".sticky-col > header > h2"
                  ]
                },
                {
                  "html": "<h3>Find your bill</h3>",
                  "target": [
                    ".step.rv:nth-child(1) > div > h3"
                  ]
                },
                {
                  "html": "<h3>Register to speak</h3>",
                  "target": [
                    ".step.rv:nth-child(2) > div > h3"
                  ]
                },
                {
                  "html": "<h3>Draft your 90 seconds</h3>",
                  "target": [
                    ".step.rv:nth-child(3) > div > h3"
                  ]
                },
                {
                  "html": "<h3>Submit exhibits on time</h3>",
                  "target": [
                    ".step.rv:nth-child(4) > div > h3"
                  ]
                },
                {
                  "html": "<h3>Track the vote, then follow up</h3>",
                  "target": [
                    ".step.rv:nth-child(5) > div > h3"
                  ]
                },
                {
                  "html": "<h2 class=\"display mask rv\" style=\"margin-top:14px\"><span class=\"ln\"><span class=\"ln-in\">The Rights Check:</span></span><span class=\"ln\"><span class=\"ln-in\">six questions,</span></span><span class=\"ln\"><span class=\"ln-in\"><em>no legalese.</em></span></span></h2>",
                  "target": [
                    ".quiz-intro > h2"
                  ]
                },
                {
                  "html": "<h3 class=\"q-text\" id=\"qText\">Which amendment protects freedom of speech, of the press, and of peaceful assembly?</h3>",
                  "target": [
                    "#qText"
                  ]
                },
                {
                  "html": "<h2 class=\"display mask rv\"><span class=\"ln\"><span class=\"ln-in\">What happened this session,</span></span><span class=\"ln\"><span class=\"ln-in\"><em>and what it means for you.</em></span></span></h2>",
                  "target": [
                    "#record > .container > .sec-head > h2"
                  ]
                },
                {
                  "html": "<h3>How 612 public comments rewrote the redistricting map</h3>",
                  "target": [
                    ".story-body > h3"
                  ]
                },
                {
                  "html": "<h4>\u201cHome rule,\u201d explained: why your city can act when the state won\u2019t</h4>",
                  "target": [
                    ".story-sm:nth-child(1) > h4"
                  ]
                },
                {
                  "html": "<h4>FOIA win: the city will publish its towing-contract data</h4>",
                  "target": [
                    ".story-sm:nth-child(2) > h4"
                  ]
                },
                {
                  "html": "<h3>Action alerts <span class=\"dot\" aria-hidden=\"true\"></span></h3>",
                  "target": [
                    ".side-block.rv:nth-child(1) > h3"
                  ]
                },
                {
                  "html": "<h3>Advocacy wins</h3>",
                  "target": [
                    ".side-block.rv:nth-child(2) > h3"
                  ]
                },
                {
                  "html": "<h3>24-hr rights hotline</h3>",
                  "target": [
                    ".hotline-card > h3"
                  ]
                },
                {
                  "html": "<h2 class=\"display mask rv\"><span class=\"ln\"><span class=\"ln-in\">Show up. It\u2019s the whole point.</span></span></h2>",
                  "target": [
                    "#events > .container > .sec-head > h2"
                  ]
                },
                {
                  "html": "<h3>Community Rights Clinic</h3>",
                  "target": [
                    ".event-card:nth-child(1) > h3"
                  ]
                },
                {
                  "html": "<h3>Town Hall: The Transit Budget</h3>",
                  "target": [
                    ".event-card:nth-child(2) > h3"
                  ]
                },
                {
                  "html": "<h3>Ballot Hotline Orientation</h3>",
                  "target": [
                    ".event-card:nth-child(3) > h3"
                  ]
                },
                {
                  "html": "<h3>Conozca Sus Derechos</h3>",
                  "target": [
                    ".event-card:nth-child(4) > h3"
                  ]
                },
                {
                  "html": "<h2 class=\"display mask rv\"><span class=\"ln\"><span class=\"ln-in\">Testimony, <em>in their words.</em></span></span></h2>",
                  "target": [
                    "#voices > .container > .sec-head > h2"
                  ]
                },
                {
                  "html": "<h2 class=\"display mask rv\" style=\"margin-top:14px\"><span class=\"ln\"><span class=\"ln-in\">The Ledger runs on</span></span><span class=\"ln\"><span class=\"ln-in\"><em>neighbors with clipboards.</em></span></span></h2>",
                  "target": [
                    ".vol-grid > .rv:nth-child(1) > h2"
                  ]
                },
                {
                  "html": "<h2 class=\"display mask rv\"><span class=\"ln\"><span class=\"ln-in\">Objections, <em>answered.</em></span></span></h2>",
                  "target": [
                    "#faq > .container > .sec-head > h2"
                  ]
                },
                {
                  "html": "<h2 class=\"display\">Get <em>The Briefing.</em></h2>",
                  "target": [
                    ".sub-grid > .rv:nth-child(1) > h2"
                  ]
                },
                {
                  "html": "<h4>Explore</h4>",
                  "target": [
                    ".foot-col:nth-child(2) > h4"
                  ]
                },
                {
                  "html": "<h4>Get Involved</h4>",
                  "target": [
                    ".foot-col:nth-child(3) > h4"
                  ]
                },
                {
                  "html": "<h4>The Office</h4>",
                  "target": [
                    ".foot-contact > h4"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Page has a heading"
            },
            {
              "id": "landmark",
              "data": null,
              "relatedNodes": [
                {
                  "html": "<main id=\"top\">",
                  "target": [
                    "#top"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Page has a landmark region"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<html lang=\"en\">",
          "target": [
            "html"
          ]
        }
      ]
    },
    {
      "id": "color-contrast",
      "impact": "serious",
      "tags": [
        "cat.color",
        "wcag2aa",
        "wcag143",
        "TTv5",
        "TT13.c",
        "EN-301-549",
        "EN-9.1.4.3",
        "ACT"
      ],
      "description": "Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds",
      "help": "Elements must meet minimum color contrast ratio thresholds",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/color-contrast?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#f4efe3",
                "bgColor": "#0f1a26",
                "contrastRatio": 15.3,
                "fontSize": "8.4pt (11.2px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [],
              "impact": "serious",
              "message": "Element has sufficient color contrast of 15.3"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<span id=\"topDate\"><b>Today:</b> Thursday, November 12, 2026</span>",
          "target": [
            "#topDate"
          ]
        }
      ]
    },
    {
      "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": "navLinks",
              "relatedNodes": [],
              "impact": "critical",
              "message": "Document has no elements referenced with ARIA or labels that share the same id attribute"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<ul class=\"nav-links\" id=\"navLinks\">",
          "target": [
            "#navLinks"
          ]
        }
      ]
    },
    {
      "id": "form-field-multiple-labels",
      "impact": null,
      "tags": [
        "cat.forms",
        "wcag2a",
        "wcag332",
        "TTv5",
        "TT5.c",
        "EN-301-549",
        "EN-9.3.3.2"
      ],
      "description": "Ensure form field does not have multiple label elements",
      "help": "Form field must not have multiple label elements",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/form-field-multiple-labels?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [],
          "none": [
            {
              "id": "multiple-label",
              "data": null,
              "relatedNodes": [
                {
                  "html": "<label for=\"briefEmail\">The Briefing \u2014 free, every Friday</label>",
                  "target": [
                    "label"
                  ]
                }
              ],
              "impact": "moderate",
              "message": "Form field does not have multiple label elements"
            }
          ],
          "impact": null,
          "html": "<input type=\"email\" id=\"briefEmail\" name=\"email\" placeholder=\"you@example.org\" required=\"\" aria-label=\"Email address\">",
          "target": [
            "#briefEmail"
          ]
        }
      ]
    },
    {
      "id": "html-has-lang",
      "impact": null,
      "tags": [
        "cat.language",
        "wcag2a",
        "wcag311",
        "TTv5",
        "TT11.a",
        "EN-301-549",
        "EN-9.3.1.1",
        "ACT"
      ],
      "description": "Ensure every HTML document has a lang attribute",
      "help": "<html> element must have a lang attribute",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/html-has-lang?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "has-lang",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "The <html> element has a lang attribute"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<html lang=\"en\">",
          "target": [
            "html"
          ]
        }
      ]
    },
    {
      "id": "html-lang-valid",
      "impact": null,
      "tags": [
        "cat.language",
        "wcag2a",
        "wcag311",
        "TTv5",
        "TT11.a",
        "EN-301-549",
        "EN-9.3.1.1",
        "ACT"
      ],
      "description": "Ensure the lang attribute of the <html> element has a valid value",
      "help": "<html> element must have a valid value for the lang attribute",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/html-lang-valid?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [],
          "none": [
            {
              "id": "valid-lang",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "Value of lang attribute is included in the list of valid languages"
            }
          ],
          "impact": null,
          "html": "<html lang=\"en\">",
          "target": [
            "html"
          ]
        }
      ]
    },
    {
      "id": "image-alt",
      "impact": null,
      "tags": [
        "cat.text-alternatives",
        "wcag2a",
        "wcag111",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT7.a",
        "TT7.b",
        "EN-301-549",
        "EN-9.1.1.1",
        "ACT"
      ],
      "description": "Ensure <img> elements have alternative text or a role of none or presentation",
      "help": "Images must have alternative text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/image-alt?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "has-alt",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "Element has an alt attribute"
            }
          ],
          "all": [],
          "none": [
            {
              "id": "alt-space-value",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "Element has a valid alt attribute value"
            }
          ],
          "impact": null,
          "html": "<img src=\"https://placehold.co/112x112/14202E/F4EFE3?text=CL&amp;font=oswald\" alt=\"The Civic Ledger seal mark\" width=\"54\" height=\"54\">",
          "target": [
            "img[width=\"54\"]"
          ]
        }
      ]
    },
    {
      "id": "label",
      "impact": null,
      "tags": [
        "cat.forms",
        "wcag2a",
        "wcag412",
        "section508",
        "section508.22.n",
        "TTv5",
        "TT5.c",
        "EN-301-549",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure every form element has a label",
      "help": "Form elements must have labels",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/label?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "explicit-label",
              "data": null,
              "relatedNodes": [
                {
                  "html": "<label for=\"briefEmail\">The Briefing \u2014 free, every Friday</label>",
                  "target": [
                    "label"
                  ]
                }
              ],
              "impact": "critical",
              "message": "Element has an explicit <label>"
            },
            {
              "id": "aria-label",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "aria-label attribute exists and is not empty"
            },
            {
              "id": "non-empty-placeholder",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "Element has a placeholder attribute"
            }
          ],
          "all": [],
          "none": [
            {
              "id": "hidden-explicit-label",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "Form element has a visible explicit <label>"
            }
          ],
          "impact": null,
          "html": "<input type=\"email\" id=\"briefEmail\" name=\"email\" placeholder=\"you@example.org\" required=\"\" aria-label=\"Email address\">",
          "target": [
            "#briefEmail"
          ]
        }
      ]
    },
    {
      "id": "link-in-text-block",
      "impact": null,
      "tags": [
        "cat.color",
        "wcag2a",
        "wcag141",
        "TTv5",
        "TT13.a",
        "EN-301-549",
        "EN-9.1.4.1"
      ],
      "description": "Ensure links are distinguished from surrounding text in a way that does not rely on color",
      "help": "Links must be distinguishable without relying on color",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/link-in-text-block?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "link-in-text-block",
              "data": null,
              "relatedNodes": [
                {
                  "html": "<span>Nonpartisan 501(c)(3) \u00b7 <a href=\"#action\">EN</a> / <a href=\"#action\">ES</a></span>",
                  "target": [
                    ".container > span:nth-child(3)"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Links can be distinguished from surrounding text in some way other than by color"
            },
            {
              "id": "link-in-text-block-style",
              "data": null,
              "relatedNodes": [
                {
                  "html": "<span>Nonpartisan 501(c)(3) \u00b7 <a href=\"#action\">EN</a> / <a href=\"#action\">ES</a></span>",
                  "target": [
                    ".container > span:nth-child(3)"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Links can be distinguished from surrounding text by visual styling"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<a href=\"#action\">EN</a>",
          "target": [
            "span:nth-child(3) > a[href$=\"#action\"]:nth-child(1)"
          ]
        }
      ]
    },
    {
      "id": "link-name",
      "impact": null,
      "tags": [
        "cat.name-role-value",
        "wcag2a",
        "wcag244",
        "wcag412",
        "section508",
        "section508.22.a",
        "TTv5",
        "TT6.a",
        "EN-301-549",
        "EN-9.2.4.4",
        "EN-9.4.1.2",
        "ACT"
      ],
      "description": "Ensure links have discernible text",
      "help": "Links must have discernible text",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/link-name?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "has-visible-text",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "Element has text that is visible to screen readers"
            }
          ],
          "all": [],
          "none": [
            {
              "id": "focusable-no-name",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "Element is not in tab order or has accessible text"
            }
          ],
          "impact": null,
          "html": "<a href=\"#action\">EN</a>",
          "target": [
            "span:nth-child(3) > a[href$=\"#action\"]:nth-child(1)"
          ]
        }
      ]
    },
    {
      "id": "list",
      "impact": null,
      "tags": [
        "cat.structure",
        "wcag2a",
        "wcag131",
        "EN-301-549",
        "EN-9.1.3.1"
      ],
      "description": "Ensure that lists are structured correctly",
      "help": "<ul> and <ol> must only directly contain <li>, <script> or <template> elements",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/list?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [],
          "none": [
            {
              "id": "only-listitems",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "List element only has direct children that are allowed inside <li> elements"
            }
          ],
          "impact": null,
          "html": "<ul class=\"nav-links\" id=\"navLinks\">",
          "target": [
            "#navLinks"
          ]
        }
      ]
    },
    {
      "id": "listitem",
      "impact": null,
      "tags": [
        "cat.structure",
        "wcag2a",
        "wcag131",
        "EN-301-549",
        "EN-9.1.3.1"
      ],
      "description": "Ensure <li> elements are used semantically",
      "help": "<li> elements must be contained in a <ul> or <ol>",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/listitem?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "listitem",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "List item has a <ul>, <ol> or role=\"list\" parent element"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<li><a href=\"#mission\">About</a></li>",
          "target": [
            "#navLinks > li:nth-child(1)"
          ]
        }
      ]
    },
    {
      "id": "meta-viewport",
      "impact": null,
      "tags": [
        "cat.sensory-and-visual-cues",
        "wcag2aa",
        "wcag144",
        "EN-301-549",
        "EN-9.1.4.4",
        "ACT"
      ],
      "description": "Ensure <meta name=\"viewport\"> does not disable text scaling and zooming",
      "help": "Zooming and scaling must not be disabled",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/meta-viewport?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "meta-viewport",
              "data": null,
              "relatedNodes": [],
              "impact": "critical",
              "message": "<meta> tag does not disable zooming on mobile devices"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">",
          "target": [
            "meta[name=\"viewport\"]"
          ]
        }
      ]
    },
    {
      "id": "nested-interactive",
      "impact": null,
      "tags": [
        "cat.keyboard",
        "wcag2a",
        "wcag412",
        "TTv5",
        "TT6.a",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure interactive controls are not nested as they are not always announced by screen readers or can cause focus problems for assistive technologies",
      "help": "Interactive controls must not be nested",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/nested-interactive?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "no-focusable-content",
              "data": null,
              "relatedNodes": [],
              "impact": "serious",
              "message": "Element does not have focusable descendants"
            }
          ],
          "all": [],
          "none": [],
          "impact": null,
          "html": "<img src=\"https://placehold.co/112x112/14202E/F4EFE3?text=CL&amp;font=oswald\" alt=\"The Civic Ledger seal mark\" width=\"54\" height=\"54\">",
          "target": [
            "img[width=\"54\"]"
          ]
        }
      ]
    },
    {
      "id": "target-size",
      "impact": null,
      "tags": [
        "cat.sensory-and-visual-cues",
        "wcag22aa",
        "wcag258"
      ],
      "description": "Ensure touch targets have sufficient size and space",
      "help": "All touch targets must be 24px large, or leave sufficient space",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/target-size?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "target-size",
              "data": {
                "minSize": 24,
                "width": 542.4,
                "height": 54
              },
              "relatedNodes": [],
              "impact": "serious",
              "message": "Control has sufficient size (542.4px by 54px, 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=\"brand\" href=\"#top\" aria-label=\"The Civic Ledger \u2014 home\">",
          "target": [
            ".brand"
          ]
        }
      ]
    }
  ],
  "incomplete": [
    {
      "id": "aria-prohibited-attr",
      "impact": "serious",
      "tags": [
        "cat.aria",
        "wcag2a",
        "wcag412",
        "EN-301-549",
        "EN-9.4.1.2"
      ],
      "description": "Ensure ARIA attributes are not prohibited for an element's role",
      "help": "Elements must only use permitted ARIA attributes",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-prohibited-attr?application=axeAPI",
      "nodes": [
        {
          "any": [],
          "all": [],
          "none": [
            {
              "id": "aria-prohibited-attr",
              "data": {
                "role": null,
                "nodeName": "div",
                "messageKey": "noRoleSingular",
                "prohibited": [
                  "aria-label"
                ]
              },
              "relatedNodes": [],
              "impact": "serious",
              "message": "aria-label attribute is not well supported on a div with no valid role attribute."
            }
          ],
          "impact": "serious",
          "html": "<div class=\"ticker\" aria-label=\"Live legislative session watch\">",
          "target": [
            ".ticker"
          ],
          "failureSummary": "Fix all of the following:\n  aria-label attribute is not well supported on a div with no valid role attribute."
        }
      ]
    },
    {
      "id": "color-contrast",
      "impact": "serious",
      "tags": [
        "cat.color",
        "wcag2aa",
        "wcag143",
        "TTv5",
        "TT13.c",
        "EN-301-549",
        "EN-9.1.4.3",
        "ACT"
      ],
      "description": "Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds",
      "help": "Elements must meet minimum color contrast ratio thresholds",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/color-contrast?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fontSize": "8.6pt (11.52px)",
                "fontWeight": "normal",
                "messageKey": "pseudoContent",
                "expectedContrastRatio": "4.5:1"
              },
              "relatedNodes": [
                {
                  "html": "<div class=\"ticker\" aria-label=\"Live legislative session watch\">",
                  "target": [
                    ".ticker"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element's background color could not be determined due to a pseudo element"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"tick-item\"><b>HB 402</b> Rental Repair Escrow \u2014 committee vote Thursday, 10:00</span>",
          "target": [
            ".tick-item:nth-child(1)"
          ],
          "failureSummary": "Fix any of the following:\n  Element's background color could not be determined due to a pseudo element"
        }
      ]
    }
  ],
  "violations": [
    {
      "id": "color-contrast",
      "impact": "serious",
      "tags": [
        "cat.color",
        "wcag2aa",
        "wcag143",
        "TTv5",
        "TT13.c",
        "EN-301-549",
        "EN-9.1.4.3",
        "ACT"
      ],
      "description": "Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds",
      "help": "Elements must meet minimum color contrast ratio thresholds",
      "helpUrl": "https://dequeuniversity.com/rules/axe/4.10/color-contrast?application=axeAPI",
      "nodes": [
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#767a7b",
                "bgColor": "#0f1a26",
                "contrastRatio": 4.04,
                "fontSize": "8.9pt (11.84px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<footer>",
                  "target": [
                    "footer"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 4.04 (foreground color: #767a7b, background color: #0f1a26, font size: 8.9pt (11.84px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<p class=\"foot-disclaimer\">",
          "target": [
            ".foot-disclaimer"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 4.04 (foreground color: #767a7b, background color: #0f1a26, font size: 8.9pt (11.84px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#a8802c",
                "bgColor": "#f4efe3",
                "contrastRatio": 3.16,
                "fontSize": "7.7pt (10.24px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<article class=\"guide-card rv in\" data-cat=\"housing\">",
                  "target": [
                    "article[data-cat=\"housing\"]"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span>18 min read</span>",
          "target": [
            "article[data-cat=\"housing\"] > .guide-body > .guide-meta > span:nth-child(1)"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#a8802c",
                "bgColor": "#f4efe3",
                "contrastRatio": 3.16,
                "fontSize": "7.7pt (10.24px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<article class=\"guide-card rv in\" data-cat=\"housing\">",
                  "target": [
                    "article[data-cat=\"housing\"]"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span>Updated Feb 2025</span>",
          "target": [
            "article[data-cat=\"housing\"] > .guide-body > .guide-meta > span:nth-child(3)"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#a8802c",
                "bgColor": "#f4efe3",
                "contrastRatio": 3.16,
                "fontSize": "7.7pt (10.24px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<article class=\"guide-card rv in\" data-cat=\"housing\">",
                  "target": [
                    "article[data-cat=\"housing\"]"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span>PDF</span>",
          "target": [
            "article[data-cat=\"housing\"] > .guide-body > .guide-meta > span:nth-child(5)"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#a8802c",
                "bgColor": "#f4efe3",
                "contrastRatio": 3.16,
                "fontSize": "7.7pt (10.24px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<article class=\"guide-card rv in\" data-cat=\"rights\">",
                  "target": [
                    "article[data-cat=\"rights\"]"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span>9 min read</span>",
          "target": [
            "article[data-cat=\"rights\"] > .guide-body > .guide-meta > span:nth-child(1)"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#a8802c",
                "bgColor": "#f4efe3",
                "contrastRatio": 3.16,
                "fontSize": "7.7pt (10.24px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<article class=\"guide-card rv in\" data-cat=\"rights\">",
                  "target": [
                    "article[data-cat=\"rights\"]"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span>Updated Jan 2025</span>",
          "target": [
            "article[data-cat=\"rights\"] > .guide-body > .guide-meta > span:nth-child(3)"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#a8802c",
                "bgColor": "#f4efe3",
                "contrastRatio": 3.16,
                "fontSize": "7.7pt (10.24px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<article class=\"guide-card rv in\" data-cat=\"rights\">",
                  "target": [
                    "article[data-cat=\"rights\"]"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span>Card deck</span>",
          "target": [
            "article[data-cat=\"rights\"] > .guide-body > .guide-meta > span:nth-child(5)"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#a8802c",
                "bgColor": "#f4efe3",
                "contrastRatio": 3.16,
                "fontSize": "7.7pt (10.24px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<article class=\"guide-card rv in\" data-cat=\"open\">",
                  "target": [
                    ".guide-card[data-cat=\"open\"]:nth-child(3)"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span>12 min read</span>",
          "target": [
            ".guide-card[data-cat=\"open\"]:nth-child(3) > .guide-body > .guide-meta > span:nth-child(1)"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#a8802c",
                "bgColor": "#f4efe3",
                "contrastRatio": 3.16,
                "fontSize": "7.7pt (10.24px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<article class=\"guide-card rv in\" data-cat=\"open\">",
                  "target": [
                    ".guide-card[data-cat=\"open\"]:nth-child(3)"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span>Updated Mar 2025</span>",
          "target": [
            ".guide-card[data-cat=\"open\"]:nth-child(3) > .guide-body > .guide-meta > span:nth-child(3)"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#a8802c",
                "bgColor": "#f4efe3",
                "contrastRatio": 3.16,
                "fontSize": "7.7pt (10.24px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<article class=\"guide-card rv in\" data-cat=\"open\">",
                  "target": [
                    ".guide-card[data-cat=\"open\"]:nth-child(3)"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span>Worksheet</span>",
          "target": [
            ".guide-card[data-cat=\"open\"]:nth-child(3) > .guide-body > .guide-meta > span:nth-child(5)"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#a8802c",
                "bgColor": "#f4efe3",
                "contrastRatio": 3.16,
                "fontSize": "7.7pt (10.24px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<article class=\"guide-card rv in\" data-cat=\"voting\">",
                  "target": [
                    "article[data-cat=\"voting\"]"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span>7 min read</span>",
          "target": [
            "article[data-cat=\"voting\"] > .guide-body > .guide-meta > span:nth-child(1)"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#a8802c",
                "bgColor": "#f4efe3",
                "contrastRatio": 3.16,
                "fontSize": "7.7pt (10.24px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<article class=\"guide-card rv in\" data-cat=\"voting\">",
                  "target": [
                    "article[data-cat=\"voting\"]"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span>Updated Mar 2025</span>",
          "target": [
            "article[data-cat=\"voting\"] > .guide-body > .guide-meta > span:nth-child(3)"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#a8802c",
                "bgColor": "#f4efe3",
                "contrastRatio": 3.16,
                "fontSize": "7.7pt (10.24px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<article class=\"guide-card rv in\" data-cat=\"voting\">",
                  "target": [
                    "article[data-cat=\"voting\"]"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span>Checklist</span>",
          "target": [
            "article[data-cat=\"voting\"] > .guide-body > .guide-meta > span:nth-child(5)"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#a8802c",
                "bgColor": "#f4efe3",
                "contrastRatio": 3.16,
                "fontSize": "7.7pt (10.24px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<article class=\"guide-card rv in\" data-cat=\"benefits\">",
                  "target": [
                    "article[data-cat=\"benefits\"]"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span>14 min read</span>",
          "target": [
            "article[data-cat=\"benefits\"] > .guide-body > .guide-meta > span:nth-child(1)"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#a8802c",
                "bgColor": "#f4efe3",
                "contrastRatio": 3.16,
                "fontSize": "7.7pt (10.24px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<article class=\"guide-card rv in\" data-cat=\"benefits\">",
                  "target": [
                    "article[data-cat=\"benefits\"]"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span>Updated Dec 2024</span>",
          "target": [
            "article[data-cat=\"benefits\"] > .guide-body > .guide-meta > span:nth-child(3)"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#a8802c",
                "bgColor": "#f4efe3",
                "contrastRatio": 3.16,
                "fontSize": "7.7pt (10.24px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<article class=\"guide-card rv in\" data-cat=\"benefits\">",
                  "target": [
                    "article[data-cat=\"benefits\"]"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span>PDF</span>",
          "target": [
            "article[data-cat=\"benefits\"] > .guide-body > .guide-meta > span:nth-child(5)"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#a8802c",
                "bgColor": "#f4efe3",
                "contrastRatio": 3.16,
                "fontSize": "7.7pt (10.24px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<article class=\"guide-card rv in\" data-cat=\"open\">",
                  "target": [
                    ".guide-card[data-cat=\"open\"]:nth-child(6)"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span>10 min read</span>",
          "target": [
            ".guide-card[data-cat=\"open\"]:nth-child(6) > .guide-body > .guide-meta > span:nth-child(1)"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#a8802c",
                "bgColor": "#f4efe3",
                "contrastRatio": 3.16,
                "fontSize": "7.7pt (10.24px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<article class=\"guide-card rv in\" data-cat=\"open\">",
                  "target": [
                    ".guide-card[data-cat=\"open\"]:nth-child(6)"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span>Updated Feb 2025</span>",
          "target": [
            ".guide-card[data-cat=\"open\"]:nth-child(6) > .guide-body > .guide-meta > span:nth-child(3)"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#a8802c",
                "bgColor": "#f4efe3",
                "contrastRatio": 3.16,
                "fontSize": "7.7pt (10.24px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<article class=\"guide-card rv in\" data-cat=\"open\">",
                  "target": [
                    ".guide-card[data-cat=\"open\"]:nth-child(6)"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span>Templates</span>",
          "target": [
            ".guide-card[data-cat=\"open\"]:nth-child(6) > .guide-body > .guide-meta > span:nth-child(5)"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.7pt (10.24px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#a8802c",
                "bgColor": "#f4efe3",
                "contrastRatio": 3.16,
                "fontSize": "7.4pt (9.92px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<div class=\"side-block rv in\">",
                  "target": [
                    ".side-block.in.rv:nth-child(1)"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"due\">Deadline \u00b7 Thu 09:00</span>",
          "target": [
            ".alert-item:nth-child(2) > .due"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#a8802c",
                "bgColor": "#f4efe3",
                "contrastRatio": 3.16,
                "fontSize": "7.4pt (9.92px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<div class=\"side-block rv in\">",
                  "target": [
                    ".side-block.in.rv:nth-child(1)"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"due\">Deadline \u00b7 Friday 17:00</span>",
          "target": [
            ".alert-item:nth-child(3) > .due"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#a8802c",
                "bgColor": "#f4efe3",
                "contrastRatio": 3.16,
                "fontSize": "7.4pt (9.92px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<div class=\"side-block rv in\">",
                  "target": [
                    ".side-block.in.rv:nth-child(1)"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"due\">RSVP \u00b7 Mon 12:00</span>",
          "target": [
            ".alert-item:nth-child(4) > .due"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#a8802c",
                "bgColor": "#f4efe3",
                "contrastRatio": 3.16,
                "fontSize": "7.4pt (9.92px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<div class=\"side-block rv in\">",
                  "target": [
                    ".side-block.in.rv:nth-child(2)"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"yr\">2025</span>",
          "target": [
            ".win-item:nth-child(2) > span:nth-child(2) > .yr"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#a8802c",
                "bgColor": "#f4efe3",
                "contrastRatio": 3.16,
                "fontSize": "7.4pt (9.92px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<div class=\"side-block rv in\">",
                  "target": [
                    ".side-block.in.rv:nth-child(2)"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"yr\">2024</span>",
          "target": [
            ".win-item:nth-child(3) > span:nth-child(2) > .yr"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#a8802c",
                "bgColor": "#f4efe3",
                "contrastRatio": 3.16,
                "fontSize": "7.4pt (9.92px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<div class=\"side-block rv in\">",
                  "target": [
                    ".side-block.in.rv:nth-child(2)"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"yr\">2024</span>",
          "target": [
            ".win-item:nth-child(4) > span:nth-child(2) > .yr"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#a8802c",
                "bgColor": "#f4efe3",
                "contrastRatio": 3.16,
                "fontSize": "7.4pt (9.92px)",
                "fontWeight": "normal",
                "messageKey": null,
                "expectedContrastRatio": "4.5:1",
                "shadowColor": null
              },
              "relatedNodes": [
                {
                  "html": "<div class=\"side-block rv in\">",
                  "target": [
                    ".side-block.in.rv:nth-child(2)"
                  ]
                }
              ],
              "impact": "serious",
              "message": "Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"yr\">2023</span>",
          "target": [
            ".win-item:nth-child(5) > span:nth-child(2) > .yr"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 7.4pt (9.92px), font weight: normal). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#a8802c",
                "bgColor": "#f4efe3",
                "contrastRatio": 3.16,
                "fontSize": "8.4pt (11.2px)",
                "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.16 (foreground color: #a8802c, background color: #f4efe3, font size: 8.4pt (11.2px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"qn\">Q.01</span>",
          "target": [
            ".acc-item:nth-child(1) > .acc-btn > .qn"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 8.4pt (11.2px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#a8802c",
                "bgColor": "#f4efe3",
                "contrastRatio": 3.16,
                "fontSize": "8.4pt (11.2px)",
                "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.16 (foreground color: #a8802c, background color: #f4efe3, font size: 8.4pt (11.2px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"qn\">Q.02</span>",
          "target": [
            ".acc-item:nth-child(2) > .acc-btn > .qn"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 8.4pt (11.2px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#a8802c",
                "bgColor": "#f4efe3",
                "contrastRatio": 3.16,
                "fontSize": "8.4pt (11.2px)",
                "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.16 (foreground color: #a8802c, background color: #f4efe3, font size: 8.4pt (11.2px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"qn\">Q.03</span>",
          "target": [
            ".acc-item:nth-child(3) > .acc-btn > .qn"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 8.4pt (11.2px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#a8802c",
                "bgColor": "#f4efe3",
                "contrastRatio": 3.16,
                "fontSize": "8.4pt (11.2px)",
                "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.16 (foreground color: #a8802c, background color: #f4efe3, font size: 8.4pt (11.2px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"qn\">Q.04</span>",
          "target": [
            ".acc-item:nth-child(4) > .acc-btn > .qn"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 8.4pt (11.2px), font weight: bold). Expected contrast ratio of 4.5:1"
        },
        {
          "any": [
            {
              "id": "color-contrast",
              "data": {
                "fgColor": "#a8802c",
                "bgColor": "#f4efe3",
                "contrastRatio": 3.16,
                "fontSize": "8.4pt (11.2px)",
                "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.16 (foreground color: #a8802c, background color: #f4efe3, font size: 8.4pt (11.2px), font weight: bold). Expected contrast ratio of 4.5:1"
            }
          ],
          "all": [],
          "none": [],
          "impact": "serious",
          "html": "<span class=\"qn\">Q.05</span>",
          "target": [
            ".acc-item:nth-child(5) > .acc-btn > .qn"
          ],
          "failureSummary": "Fix any of the following:\n  Element has insufficient color contrast of 3.16 (foreground color: #a8802c, background color: #f4efe3, font size: 8.4pt (11.2px), font weight: bold). Expected contrast ratio of 4.5:1"
        }
      ]
    }
  ],
  "coverage": {
    "contract": "main-document-vertical-scroll",
    "complete": true,
    "positions": [
      {
        "y": 0,
        "height": 12118
      },
      {
        "y": 576,
        "height": 12118
      },
      {
        "y": 1152,
        "height": 12118
      },
      {
        "y": 1728,
        "height": 12118
      },
      {
        "y": 2304,
        "height": 12118
      },
      {
        "y": 2880,
        "height": 12118
      },
      {
        "y": 3456,
        "height": 12118
      },
      {
        "y": 4032,
        "height": 12118
      },
      {
        "y": 4608,
        "height": 12118
      },
      {
        "y": 5184,
        "height": 12118
      },
      {
        "y": 5760,
        "height": 12118
      },
      {
        "y": 6336,
        "height": 12118
      },
      {
        "y": 6912,
        "height": 12118
      },
      {
        "y": 7488,
        "height": 12118
      },
      {
        "y": 8064,
        "height": 12118
      },
      {
        "y": 8640,
        "height": 12118
      },
      {
        "y": 9216,
        "height": 12118
      },
      {
        "y": 9792,
        "height": 12118
      },
      {
        "y": 10368,
        "height": 12118
      },
      {
        "y": 10944,
        "height": 12118
      },
      {
        "y": 11398,
        "height": 12118
      }
    ],
    "scans": 22,
    "max_states": 512,
    "settle_ms": 5000,
    "page_timeout_seconds": 150,
    "layout_stability": "consecutive 100ms size samples within one CSS pixel",
    "animation_settling": "finite animations present when scroll resources are ready finish or are cancelled",
    "interactive_states": "not exercised",
    "horizontal_scroll": "not exercised"
  }
}
System Prompt
You are a lead web developer at a top digital agency, tasked with creating a one-page website for a new client based on the given specifications, delivered as an HTML file. First non-whitespace char '<', last non-whitespace char '>'. Use the following services to generate placeholder images where needed:
- placehold.co (text): https://placehold.co/[{w}x{h}|{size}][/{bg-color}/{text-color}]?text={text}&font=[lato|lora|montserrat|noto sans|open sans|oswald|playfair display|poppins|pt sans|raleway|roboto|source sans|source sans pro]
- picsum.photos (photos): https://picsum.photos/[{w}/{h}|{size}]?[grayscale][&blur={1-10}]
- pravatar.cc (avatars): https://i.pravatar.cc/{size}?u={identifier}
Choose sizes appropriate to layout.
User Prompt
Create a **complete, polished, production-quality** primary web page for a new client in the "Law, Government, & Politics" 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: "Law, Government, & Politics"
- Description: Legal information, political organizations, government affairs, and civic engagement resources.

**Your Creative Task:**
1.  **Invent:** Create a unique, professional-sounding site name and a strong tagline fitting the "Law, Government, & Politics" 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: "Events", "Resources", "Volunteer".
-   **MAIN CONTENT:** Structure this area with **at least 3-4 distinct, well-developed sections**.
    -   Address key topics relevant to the "Law, Government, & Politics" category. Consider themes similar to: "Community Advocacy", "Legal Resources", "Civil Liberties".
    -   **Content Depth:** Populate each section with **substantial, realistic text** (multiple sentences/paragraphs). Use authentic industry language and terminology like: "civic participation", "due process", "statute".
    -   **Visuals:** Integrate relevant placeholder images logically within the content sections.
    -   **Calls to Action:** Include clear and contextually relevant CTAs. Use strong verbs similar to: "Contact Representative", "Subscribe", "Find Resources".
-   **ENGAGEMENT (Recommended):** Strongly consider incorporating **one meaningful interactive element** that would genuinely benefit a user in the "Law, Government, & Politics" sector. Ideas similar but not limited to: "rights quiz".
-   **SIDEBAR (Optional):** If your design includes a sidebar, populate it with **useful, relevant content**. Ideas: "advocacy wins", "action alerts", "community events".
-   **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.