Meta Muse Spark Open – Law Government and Politics
via Modal · Generated
- AIMAC Debt 8.71
- Cost $0.07
- Total Violations 7
- HTML Size 50 KB
- Em Dashes 27
Screenshot
View Live Page
Accessibility Issues Found
1 Critical 6 Serious
-
aria-required-children critical 1 instance
Certain ARIA roles must contain particular children
Example HTML
<div class="filters" role="tablist" aria-label="Filters"> -
color-contrast serious 6 instances
Elements must meet minimum color contrast ratio thresholds
Example HTML
<span>National Civic League</span>
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 — Law, Policy & Civic Power for Everyone</title>
<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:opsz,ital,soft,wght@9..144,0,0..100,600;9..144,1,0..100,600&family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@500&display=swap" rel="stylesheet">
<script src="https://unpkg.com/lucide@latest"></script>
<style>
:root{
--navy:#0F2340;
--navy-2:#142E54;
--cream:#F6F1E6;
--cream-2:#EDE6D6;
--gold:#C8A86A;
--gold-2:#B8934F;
--teal:#155E59;
--teal-light:#E6F0EF;
--line:#E2D9C3;
--text:#1A2332;
--muted:#5A6678;
--radius:18px;
--shadow:0 18px 40px rgba(15,35,64,0.10);
}
*{box-sizing:border-box}
html{scroll-behavior:smooth}
body{margin:0; font-family:Inter,system-ui,-apple-system,sans-serif; color:var(--text); background:var(--cream); line-height:1.6}
a{color:inherit; text-decoration:none}
img{max-width:100%; display:block}
.container{width:min(1220px,92vw); margin:0 auto}
.mono{font-family:"JetBrains Mono",monospace; letter-spacing:0.08em; text-transform:uppercase; font-size:12px}
.serif{font-family:Fraunces,serif}
/* Header */
.topbar{background:var(--navy); color:var(--cream); font-size:13px}
.topbar-inner{display:flex; justify-content:space-between; align-items:center; padding:10px 0; gap:16px; flex-wrap:wrap}
.topbar-left{display:flex; gap:18px; align-items:center; flex-wrap:wrap}
.pill-live{display:inline-flex; align-items:center; gap:8px; background:rgba(255,255,255,0.08); border:1px solid rgba(255,255,255,0.16); padding:6px 10px; border-radius:999px}
.dot{width:8px; height:8px; background:#3DD68C; border-radius:50%; box-shadow:0 0 0 6px rgba(61,214,140,0.15)}
header.sticky{position:sticky; top:0; z-index:40; background:rgba(246,241,230,0.92); backdrop-filter:blur(12px); border-bottom:1px solid var(--line)}
.header-inner{display:flex; align-items:center; justify-content:space-between; padding:14px 0; gap:18px}
.brand{display:flex; align-items:center; gap:14px}
.logo{width:46px; height:46px; background:var(--navy); color:var(--gold); display:grid; place-items:center; border-radius:12px; border:1px solid rgba(200,168,106,0.4); font-family:Fraunces,serif; font-weight:700; font-size:20px}
.brand h1{margin:0; font-family:Fraunces,serif; font-size:22px; line-height:1; color:var(--navy)}
.brand p{margin:2px 0 0; font-size:11px; letter-spacing:0.14em; text-transform:uppercase; color:var(--muted); font-weight:600}
nav.main-nav{display:flex; align-items:center; gap:18px; font-size:14px; font-weight:500}
nav.main-nav a{opacity:0.85}
nav.main-nav a:hover{opacity:1; color:var(--navy)}
.btn{border:none; cursor:pointer; font-weight:700; border-radius:999px; padding:13px 20px; display:inline-flex; align-items:center; gap:8px; transition:.2s; justify-content:center}
.btn-gold{background:var(--gold); color:var(--navy)}
.btn-gold:hover{background:var(--gold-2); transform:translateY(-1px)}
.btn-navy{background:var(--navy); color:white}
.btn-navy:hover{background:var(--navy-2)}
.btn-outline{border:1.5px solid var(--navy); background:transparent}
.mobile-toggle{display:none; background:white; border:1px solid var(--line); width:44px; height:44px; border-radius:50%; place-items:center}
/* Hero */
.hero{padding:28px 0 0; background:linear-gradient(180deg, var(--cream) 60%, #FFFFFF 100%)}
.hero-grid{display:grid; grid-template-columns:1.05fr 0.85fr; gap:28px; align-items:center}
.eyebrow{display:inline-flex; align-items:center; gap:10px; color:var(--teal); font-weight:700; font-size:12px; letter-spacing:0.12em; text-transform:uppercase}
.eyebrow span{width:28px; height:1.5px; background:var(--gold)}
.hero h2{font-family:Fraunces,serif; font-size:54px; line-height:0.95; margin:16px 0; color:var(--navy); font-weight:600; letter-spacing:-0.02em}
.hero h2 em{font-style:italic; color:var(--teal); font-weight:600}
.hero p.lead{font-size:17px; color:var(--muted); max-width:560px}
.hero-actions{display:flex; gap:12px; margin:22px 0 18px; flex-wrap:wrap}
.hero-stats{display:flex; gap:26px; border-top:1px solid var(--line); padding-top:16px; margin-top:20px; flex-wrap:wrap}
.stat-num{font-family:Fraunces,serif; font-size:26px; color:var(--navy); line-height:1}
.stat-label{font-size:12px; color:var(--muted); letter-spacing:0.08em; text-transform:uppercase; font-weight:600}
.hero-visual{position:relative; padding:18px}
.visual-card{background:white; border-radius:24px; overflow:hidden; box-shadow:var(--shadow); border:1px solid var(--line)}
.visual-card img{height:380px; width:100%; object-fit:cover}
.visual-overlay{position:absolute; bottom:6px; left:6px; right:22px; background:white; border-radius:18px; padding:16px; box-shadow:0 12px 30px rgba(0,0,0,0.12); border:1px solid var(--line); display:grid; grid-template-columns:1fr 1fr; gap:12px}
.mini{border-radius:14px; padding:12px; background:var(--cream)}
.mini strong{font-size:18px; color:var(--navy)}
.trust-bar{background:white; border-top:1px solid var(--line); border-bottom:1px solid var(--line)}
.trust-inner{display:flex; justify-content:space-between; align-items:center; gap:18px; padding:14px 0; flex-wrap:wrap; color:var(--muted); font-size:13px; font-weight:600}
.trust-logos{display:flex; gap:22px; align-items:center; flex-wrap:wrap; opacity:0.8}
/* Sections */
section{padding:64px 0}
.section-head{display:flex; justify-content:space-between; align-items:end; gap:20px; flex-wrap:wrap; margin-bottom:28px}
.section-head h3{margin:8px 0 0; font-family:Fraunces,serif; font-size:38px; line-height:1; color:var(--navy)}
.section-head p{max-width:520px; color:var(--muted); margin:10px 0 0}
.kicker{color:var(--teal); letter-spacing:0.14em; text-transform:uppercase; font-weight:800; font-size:11px}
.grid-3{display:grid; grid-template-columns:repeat(3,1fr); gap:18px}
.card{background:white; border:1px solid var(--line); border-radius:20px; padding:22px; box-shadow:0 8px 20px rgba(15,35,64,0.04)}
.card h4{margin:12px 0 8px; font-family:Fraunces,serif; font-size:22px; color:var(--navy)}
.card p{color:var(--muted); font-size:14.5px}
.icon{width:44px; height:44px; border-radius:12px; display:grid; place-items:center; color:white}
.two-col{display:grid; grid-template-columns:1.15fr 0.85fr; gap:22px; align-items:start}
.tracker{background:var(--navy); border-radius:24px; color:white; padding:28px; position:relative; overflow:hidden}
.tracker::after{content:""; position:absolute; inset:auto -40px -40px auto; width:260px; height:260px; background:radial-gradient(circle at center, rgba(200,168,106,0.22), transparent 70%); pointer-events:none}
.filters{display:flex; gap:10px; flex-wrap:wrap; margin:18px 0}
.filter{padding:8px 14px; border-radius:999px; border:1px solid rgba(255,255,255,0.16); background:rgba(255,255,255,0.06); color:white; font-size:13px; cursor:pointer}
.filter.active{background:white; color:var(--navy)}
.bill-list{display:grid; gap:12px; position:relative; z-index:1}
.bill{background:rgba(255,255,255,0.07); border:1px solid rgba(255,255,255,0.12); border-radius:16px; padding:16px; display:grid; grid-template-columns: 1fr auto; gap:14px; align-items:center}
.bill h5{margin:0 0 4px; font-size:15px}
.bill p{margin:0; font-size:13px; color:rgba(255,255,255,0.72)}
.badge{padding:6px 10px; border-radius:999px; font-size:11px; font-weight:800; letter-spacing:0.06em; text-transform:uppercase}
.badge-committee{background:#F9E1B5; color:#7A4D0A}
.badge-floor{background:#BCEBD0; color:#0B4D2A}
.badge-enacted{background:white; color:var(--navy)}
.progress{height:6px; background:rgba(255,255,255,0.12); border-radius:999px; overflow:hidden; margin-top:10px}
.progress span{display:block; height:100%; background:var(--gold)}
.alerts{background:white; border:1px solid var(--line); border-radius:20px; padding:20px}
.alerts h4{font-family:Fraunces,serif; color:var(--navy); margin:0 0 12px; font-size:22px}
.alert-item{padding:14px; border-radius:14px; border:1px solid var(--line); margin-bottom:12px}
.alert-item:last-child{margin-bottom:0}
.alert-item strong{font-size:13px}
.alert-item p{font-size:13px; color:var(--muted); margin:6px 0 10px}
.link-teal{color:var(--teal); font-weight:700; font-size:13px; display:inline-flex; gap:6px; align-items:center}
.split-features{display:grid; grid-template-columns:1fr 1fr; gap:22px}
.feature-img{border-radius:20px; overflow:hidden; border:1px solid var(--line); box-shadow:var(--shadow); background:white}
.feature-img img{height:320px; width:100%; object-fit:cover}
.feature-text h4{font-family:Fraunces,serif; font-size:28px; margin:0; color:var(--navy)}
.feature-text p{color:var(--muted)}
.checks{display:grid; gap:10px; margin:16px 0}
.check{display:flex; gap:10px; align-items:flex-start; font-size:14px}
.check i{color:var(--teal); margin-top:3px}
.rep-tool{background:#FFFFFF; border:1px solid var(--line); border-radius:24px; padding:26px; box-shadow:var(--shadow)}
.rep-grid{display:grid; grid-template-columns:1.1fr 0.9fr; gap:24px; align-items:center}
.input-row{display:flex; gap:10px; margin:14px 0}
.input-row input{flex:1; padding:14px 16px; border:1.5px solid var(--line); border-radius:999px; background:var(--cream); font-size:15px; outline:none}
.rep-result{border:1px solid var(--line); border-radius:18px; padding:16px; background:var(--cream); min-height:220px}
.rep-person{display:flex; gap:12px; align-items:center; background:white; padding:12px; border-radius:14px; border:1px solid var(--line); margin-bottom:10px}
.rep-person img{width:52px; height:52px; border-radius:50%; object-fit:cover}
.testimonial-grid{display:grid; grid-template-columns:repeat(3,1fr); gap:16px}
.quote{background:white; border:1px solid var(--line); border-radius:20px; padding:18px; position:relative}
.quote::before{content:"“"; position:absolute; top:10px; right:18px; font-family:Fraunces,serif; font-size:48px; color:var(--cream-2); line-height:1}
.stars{color:var(--gold); letter-spacing:0.08em}
.volunteer{display:grid; grid-template-columns: 1.1fr 0.9fr; gap:24px; background:var(--navy); color:white; border-radius:24px; padding:30px}
.volunteer h3{font-family:Fraunces,serif; font-size:32px; margin:0}
.opps{display:grid; gap:10px}
.opp{background:rgba(255,255,255,0.07); border:1px solid rgba(255,255,255,0.1); border-radius:16px; padding:14px; display:flex; justify-content:space-between; gap:12px; align-items:center}
.faq{max-width:760px; margin:0 auto}
.faq-item{border:1px solid var(--line); background:white; border-radius:16px; margin-bottom:12px; overflow:hidden}
.faq-q{width:100%; display:flex; justify-content:space-between; align-items:center; padding:16px 18px; background:white; border:none; cursor:pointer; font-weight:700; text-align:left; color:var(--navy); font-size:15px}
.faq-a{padding:0 18px 16px; color:var(--muted); font-size:14px; display:none}
.faq-item.open .faq-a{display:block}
.newsletter{background:var(--cream-2); border:1px solid var(--line); border-radius:24px; padding:26px; display:grid; grid-template-columns:1.2fr 0.8fr; gap:18px; align-items:center}
footer{background:var(--navy); color:rgba(255,255,255,0.84); padding:40px 0 18px}
.footer-grid{display:grid; grid-template-columns:1.4fr 1fr 1fr 1fr; gap:22px}
footer h5{color:white; margin:0 0 10px}
footer a{color:rgba(255,255,255,0.78); font-size:14px}
footer a:hover{color:white}
.subfooter{border-top:1px solid rgba(255,255,255,0.12); margin-top:22px; padding-top:14px; display:flex; justify-content:space-between; align-items:center; gap:12px; flex-wrap:wrap; font-size:13px; color:rgba(255,255,255,0.6)}
.social{display:flex; gap:10px}
.social a{width:36px; height:36px; border-radius:50%; border:1px solid rgba(255,255,255,0.14); display:grid; place-items:center; background:rgba(255,255,255,0.06)}
@media(max-width:980px){
.hero-grid, .two-col, .split-features, .rep-grid, .volunteer, .newsletter, .footer-grid, .grid-3, .testimonial-grid{grid-template-columns:1fr}
.mobile-toggle{display:grid}
nav.main-nav{position:fixed; inset:106px 16px auto 16px; background:white; border:1px solid var(--line); border-radius:18px; padding:14px; flex-direction:column; align-items:stretch; box-shadow:var(--shadow); display:none}
nav.main-nav.open{display:flex}
.hero h2{font-size:42px}
.visual-overlay{position:static; margin-top:-18px}
.header-inner{flex-wrap:wrap}
}
</style>
</head>
<body>
<div class="topbar">
<div class="container topbar-inner">
<div class="topbar-left">
<span class="pill-live"><span class="dot"></span> LIVE: Senate Judiciary markup — Watch live testimony & submit comment by 5PM ET</span>
<span style="opacity:0.7">Next Civic Clinic: Sat, May 17 — Free legal aid, no appointment needed</span>
</div>
<div style="display:flex; gap:16px; align-items:center">
<a href="#contact" style="color:white; font-weight:700">En Español</a>
<a href="#tracker" style="background:var(--gold); color:var(--navy); padding:7px 12px; border-radius:999px; font-weight:800">Action Alerts (3)</a>
</div>
</div>
</div>
<header class="sticky">
<div class="container header-inner">
<div class="brand">
<div class="logo" aria-hidden="true">◈</div>
<div>
<h1>The Civic Ledger</h1>
<p>Democracy in plain language • Est. 2014</p>
</div>
<img src="https://placehold.co/120x44/0F2340/F6F1E6?text=CL+%E2%97%88+LEDGER&font=playfair display" alt="Civic Ledger logo" style="border-radius:10px; border:1px solid var(--line); display:none">
</div>
<nav class="main-nav" aria-label="Primary">
<a href="#initiatives">Initiatives</a>
<a href="#tracker">Legislative Tracker</a>
<a href="#legal">Legal Aid</a>
<a href="#about">About</a>
<a href="#volunteer">Volunteer</a>
<a href="#contact">Contact</a>
<a class="btn btn-gold" href="#donate" style="padding:10px 16px">Donate <i data-lucide="heart" style="width:16px;height:16px"></i></a>
</nav>
<button class="mobile-toggle" id="menuBtn" aria-label="Open menu"><i data-lucide="menu"></i></button>
</div>
</header>
<main>
<!-- HERO -->
<section class="hero">
<div class="container hero-grid">
<div>
<div class="eyebrow"><span></span> Public Interest Law & Civic Engagement</div>
<h2>We translate <em>power</em> into action you can use.</h2>
<p class="lead">The Civic Ledger is a nonpartisan public interest organization combining litigation, legislative advocacy, and grassroots organizing. We demystify the legislative process and give every community the tools for meaningful civic participation.</p>
<div class="hero-actions">
<a href="#rep-finder" class="btn btn-gold">Contact Representative <i data-lucide="arrow-right" style="width:16px;height:16px"></i></a>
<a href="#legal" class="btn btn-outline"><i data-lucide="shield-check" style="width:16px;height:16px"></i> Get Legal Aid</a>
<a href="#tracker" class="btn btn-navy">Sign Petition <i data-lucide="pen-line" style="width:16px;height:16px"></i></a>
</div>
<div class="hero-stats">
<div><div class="stat-num">47k+</div><div class="stat-label">Constituents trained</div></div>
<div><div class="stat-num">312</div><div class="stat-label">Bills tracked this session</div></div>
<div><div class="stat-num">89%</div><div class="stat-label">Clinic cases resolved</div></div>
</div>
</div>
<div class="hero-visual">
<div class="visual-card">
<img src="https://picsum.photos/640/420?random=11" alt="Civic hall with audience">
<div style="padding:14px 16px; display:flex; justify-content:space-between; align-items:center; background:white">
<div><div class="mono" style="color:var(--muted)">Next Public Hearing</div><strong style="color:var(--navy)">Housing Justice & Tenant Protections</strong></div>
<span class="badge badge-floor">RSVP Open</span>
</div>
</div>
<div class="visual-overlay">
<div class="mini">
<div class="mono" style="color:var(--muted)">Litigation Update</div>
<strong>Doe v. State Board</strong>
<div style="font-size:12px; color:var(--muted)">Preliminary injunction granted. Voting access restored in 3 counties.</div>
<div class="progress" aria-hidden="true"><span style="width:72%"></span></div>
</div>
<div class="mini" style="background:var(--navy); color:white">
<div class="mono" style="color:rgba(255,255,255,0.7)">New Resource</div>
<strong style="color:white">Know Your Rights: Protest & Assembly</strong>
<a href="#" style="color:var(--gold); font-weight:800; font-size:12px; display:inline-flex; gap:6px; align-items:center; margin-top:6px">Download PDF <i data-lucide="download" style="width:14px;height:14px"></i></a>
</div>
</div>
</div>
</div>
</section>
<div class="trust-bar">
<div class="container trust-inner">
<span>TRUSTED BY LEADING INSTITUTIONS & COALITIONS:</span>
<div class="trust-logos">
<span>National Civic League</span><span>•</span><span>Legal Aid Alliance</span><span>•</span><span>Open Governance Institute</span><span>•</span><span>Civic Futures Fund</span>
</div>
</div>
</div>
<!-- INITIATIVES -->
<section id="initiatives" style="background:white">
<div class="container">
<div class="section-head">
<div>
<div class="kicker">What we do</div>
<h3>From courthouse to capitol to community.</h3>
</div>
<p>We work at every level of the legislative process — drafting policy, filing strategic litigation, and organizing neighbors to ensure public interest isn't an afterthought.</p>
</div>
<div class="grid-3">
<article class="card">
<div class="icon" style="background:var(--teal)"><i data-lucide="scale"></i></div>
<h4>Public Interest Litigation</h4>
<p>Our attorneys challenge unlawful government action and defend civil rights in state and federal courts. From voting rights to administrative procedure, we bring precedent-setting cases with direct community impact.</p>
<p>We partner with law school clinics and pro bono counsel to keep litigation accessible, transparent, and rooted in lived experience — not abstract doctrine.</p>
<a href="#legal" class="link-teal">Explore docket <i data-lucide="arrow-right" style="width:14px;height:14px"></i></a>
<img src="https://picsum.photos/420/220?random=12" alt="Law library" style="border-radius:14px; margin-top:14px; height:160px; object-fit:cover; width:100%">
</article>
<article class="card" style="background:var(--cream)">
<div class="icon" style="background:var(--navy)"><i data-lucide="landmark"></i></div>
<h4>Legislative Advocacy & Oversight</h4>
<p>We monitor committee hearings, markup sessions, and floor votes in real time. Our nonpartisan analysts publish plain-language summaries so you understand not just what passed, but what it means for your district.</p>
<p>Through testimony, coalition letters, and ethics complaints, we hold the legislative process accountable to due process, transparency, and constituent input.</p>
<a href="#tracker" class="link-teal">View Legislative Tracker <i data-lucide="arrow-right" style="width:14px;height:14px"></i></a>
<img src="https://placehold.co/420x160/EDE6D6/0F2340?text=Policy+Brief+%E2%80%A2+2025+Session&font=lora" alt="Policy brief placeholder" style="border-radius:14px; margin-top:14px">
</article>
<article class="card">
<div class="icon" style="background:var(--gold); color:var(--navy)"><i data-lucide="users"></i></div>
<h4>Grassroots Organizing</h4>
<p>Democracy requires civic participation beyond election day. Our organizers train neighborhood captains, host know-your-council workshops, and turn petition signatures into lasting, precinct-level power.</p>
<p>We center impacted communities in every campaign — providing stipends, childcare, and translation so engagement isn't a privilege.</p>
<a href="#volunteer" class="link-teal">Join an organizing cohort <i data-lucide="arrow-right" style="width:14px;height:14px"></i></a>
<img src="https://picsum.photos/420/220?random=13" alt="Community organizing meeting" style="border-radius:14px; margin-top:14px; height:160px; object-fit:cover; width:100%">
</article>
</div>
</div>
</section>
<!-- TRACKER + SIDEBAR -->
<section id="tracker">
<div class="container two-col">
<div>
<div class="tracker">
<div style="display:flex; justify-content:space-between; gap:12px; align-items:center; flex-wrap:wrap">
<div>
<div class="mono" style="color:var(--gold)">Legislative Updates • 119th Session</div>
<h3 class="serif" style="margin:6px 0 0; font-size:30px">Real-time bill tracker</h3>
<p style="margin:6px 0 0; color:rgba(255,255,255,0.72); max-width:620px">We track every committee report and amendment. Filter by issue area and take action before the floor vote. This is your window into the legislative process.</p>
</div>
<a href="#" class="btn btn-gold" style="white-space:nowrap">Sign Petition <i data-lucide="file-signature" style="width:16px;height:16px"></i></a>
</div>
<div class="filters" role="tablist" aria-label="Filters">
<button class="filter active" data-filter="all">All Issues</button>
<button class="filter" data-filter="voting">Voting & Ethics</button>
<button class="filter" data-filter="housing">Housing</button>
<button class="filter" data-filter="climate">Climate & Utilities</button>
</div>
<div class="bill-list" id="billList">
<div class="bill" data-cat="voting">
<div>
<h5>HB 442 — Voter Registration Modernization Act</h5>
<p>Committee substitute adopted 5/12. Would allow automatic voter registration at DMV with opt-out and same-day registration safeguards.</p>
<div class="progress"><span style="width:60%"></span></div>
</div>
<div style="text-align:right; min-width:150px">
<span class="badge badge-committee">In Committee</span>
<div style="margin-top:10px; display:grid; gap:8px">
<a href="#rep-finder" class="btn btn-gold" style="padding:8px 12px; font-size:13px">Contact Representative</a>
<a href="#" style="font-size:13px; color:var(--gold); font-weight:700">Read summary</a>
</div>
</div>
</div>
<div class="bill" data-cat="housing">
<div>
<h5>SB 118 — Tenant Right to Counsel Pilot</h5>
<p>Passed Senate Housing 7-4. Establishes funded legal representation for tenants facing eviction in 6 counties. Fiscal note: $4.2M.</p>
<div class="progress"><span style="width:80%"></span></div>
</div>
<div style="text-align:right; min-width:150px">
<span class="badge badge-floor">Floor Vote</span>
<div style="margin-top:10px; display:grid; gap:8px">
<a href="#rep-finder" class="btn btn-gold" style="padding:8px 12px; font-size:13px">Urge Yes Vote</a>
<a href="#" style="font-size:13px; color:var(--gold); font-weight:700">See testimony</a>
</div>
</div>
</div>
<div class="bill" data-cat="climate">
<div>
<h5>HB 309 — Utility Transparency & Rate Review</h5>
<p>Enacted 5/01/2025. Requires independent audit of rate hikes >12% and creates public comment portal with judicial review.</p>
<div class="progress"><span style="width:100%"></span></div>
</div>
<div style="text-align:right; min-width:150px">
<span class="badge badge-enacted">Enacted</span>
<div style="margin-top:10px; display:grid; gap:8px">
<a href="#" class="btn" style="background:white; color:var(--navy); padding:8px 12px; font-size:13px">Implementation guide</a>
<a href="#" style="font-size:13px; color:var(--gold); font-weight:700">Litigation analysis</a>
</div>
</div>
</div>
</div>
</div>
<div style="margin-top:18px; display:grid; grid-template-columns:1fr 1fr; gap:14px">
<div class="card" style="display:flex; gap:12px; align-items:center">
<img src="https://picsum.photos/80/80?random=14" alt="Hearing" style="width:64px; height:64px; border-radius:12px; object-fit:cover">
<div><strong style="font-size:14px; color:var(--navy)">How we read a bill</strong><p style="margin:2px 0 0; font-size:13px; color:var(--muted)">From first reading to reconciliation — a 90-second explainer every organizer uses.</p></div>
</div>
<div class="card" style="display:flex; gap:12px; align-items:center; background:var(--cream)">
<div class="icon" style="background:var(--navy)"><i data-lucide="mic"></i></div>
<div><strong>Testimony Training</strong><p style="margin:2px 0 0; font-size:13px; color:var(--muted)">Learn to give 2-minute public comment that moves a committee.</p></div>
</div>
</div>
</div>
<aside class="alerts">
<h4>Action Alerts & Research</h4>
<p style="margin:0 0 12px; color:var(--muted); font-size:14px">Stay ahead of the legislative process. These are vetted volunteer opportunities and reports you can use today.</p>
<div class="alert-item">
<span class="mono" style="color:var(--teal)">Volunteer Opportunity</span>
<div><strong>Court Watch — Housing Court, District 4</strong></div>
<p>Observe eviction proceedings and document due process issues. Training + stipend provided. No legal experience required.</p>
<a href="#volunteer" class="link-teal">Reserve a shift — Tue/Thu 9AM <i data-lucide="arrow-right" style="width:14px;height:14px"></i></a>
</div>
<div class="alert-item" style="background:var(--teal-light); border-color:#C8DDDB">
<span class="mono" style="color:var(--teal)">New Report</span>
<div><strong>Access to Counsel: 2025 Outcomes Study</strong></div>
<p>Tenants with representation were 3.4x less likely to receive a writ of possession. Read the peer-reviewed findings.</p>
<img src="https://placehold.co/360x100/155E59/FFFFFF?text=Download+Report+PDF&font=inter" alt="Report download" style="border-radius:10px; margin:8px 0">
<a href="#" class="link-teal">Download (PDF, 2.1MB)</a>
</div>
<div class="alert-item">
<span class="mono" style="color:var(--gold-2)">Hearing This Week</span>
<div><strong>Public Hearing: Campaign Finance Disclosure</strong></div>
<p>May 15, 2:00 PM — City Hall, Room 340. Submit written testimony via our portal.</p>
<div style="display:flex; gap:8px; margin-top:8px">
<a href="#rep-finder" class="btn btn-navy" style="padding:8px 12px; font-size:13px; flex:1">Submit Comment</a>
<a href="#" class="btn btn-outline" style="padding:8px 12px; font-size:13px; flex:1">Add to calendar</a>
</div>
</div>
</aside>
</div>
</section>
<!-- LEGAL AID -->
<section id="legal" style="background:white; border-top:1px solid var(--line); border-bottom:1px solid var(--line)">
<div class="container">
<div class="split-features">
<div class="feature-img">
<img src="https://picsum.photos/700/500?random=20" alt="Legal aid consultation">
<div style="padding:16px; display:flex; gap:12px; align-items:center; justify-content:space-between; flex-wrap:wrap">
<div style="display:flex; gap:10px; align-items:center">
<img src="https://i.pravatar.cc/100?u=attorney1" alt="Attorney avatar" style="width:40px; height:40px; border-radius:50%">
<div><strong style="font-size:14px">Free Civic Legal Clinic</strong><div style="font-size:13px; color:var(--muted)">Second & Fourth Saturday • Walk-ins welcome</div></div>
</div>
<span class="badge" style="background:var(--teal); color:white">No-cost</span>
</div>
</div>
<div class="feature-text">
<div class="kicker">Legal Aid That Meets You Where You Are</div>
<h4>Get legal aid without the legalese.</h4>
<p>Whether you received an eviction notice, need help navigating administrative hearings, or were denied public records, our clinic provides trauma-informed, multilingual support. We don't just answer questions — we stand beside you in the legislative process and in court.</p>
<p>All consultations are confidential and conducted by licensed attorneys or supervised law students. If we cannot represent you directly, we will connect you to a vetted referral within 48 hours and remain your point of contact.</p>
<div class="checks">
<div class="check"><i data-lucide="check-circle" style="width:18px;height:18px"></i><span><strong>Housing & eviction defense:</strong> lease review, habitability claims, and emergency stays.</span></div>
<div class="check"><i data-lucide="check-circle" style="width:18px;height:18px"></i><span><strong>Administrative advocacy:</strong> benefits, records requests, and licensing disputes.</span></div>
<div class="check"><i data-lucide="check-circle" style="width:18px;height:18px"></i><span><strong>Civic rights:</strong> protest, voting access, and police oversight complaints.</span></div>
</div>
<div style="display:flex; gap:10px; margin-top:16px; flex-wrap:wrap">
<a href="#contact" class="btn btn-navy">Get Legal Aid — Intake Form</a>
<a href="#" class="btn btn-outline">Know Your Rights Library</a>
</div>
<div style="margin-top:14px; display:flex; gap:14px; color:var(--muted); font-size:13px; flex-wrap:wrap">
<span style="display:flex; align-items:center; gap:6px"><i data-lucide="languages" style="width:14px;height:14px"></i> EN • ES • AR • VI</span>
<span style="display:flex; align-items:center; gap:6px"><i data-lucide="clock" style="width:14px;height:14px"></i> Avg. response: 1.2 days</span>
</div>
</div>
</div>
</div>
</section>
<!-- REP FINDER INTERACTIVE -->
<section id="rep-finder">
<div class="container rep-tool">
<div class="rep-grid">
<div>
<div class="kicker">Engagement Tool</div>
<h3 class="serif" style="font-size:32px; margin:6px 0; color:var(--navy)">Find your representative & take action in 60 seconds.</h3>
<p style="color:var(--muted)">Enter your ZIP or address. We’ll match you to your federal and state decision-makers, provide a tested script for the legislative process, and send your message directly.</p>
<div class="input-row">
<input id="repInput" placeholder="Enter ZIP code (e.g., 30303) or address" aria-label="ZIP code or address">
<button class="btn btn-navy" id="repBtn">Find Representatives</button>
</div>
<div style="display:flex; gap:8px; flex-wrap:wrap; align-items:center">
<span class="mono" style="color:var(--muted)">Try:</span>
<button class="filter" style="color:var(--navy); background:white; border-color:var(--line)" onclick="document.getElementById('repInput').value='10001'; doRepSearch()">10001</button>
<button class="filter" style="color:var(--navy); background:white; border-color:var(--line)" onclick="document.getElementById('repInput').value='60607'; doRepSearch()">60607</button>
<button class="filter" style="color:var(--navy); background:white; border-color:var(--line)" onclick="document.getElementById('repInput').value='90012'; doRepSearch()">90012</button>
<span style="font-size:12px; color:var(--muted)">We never store your address.</span>
</div>
<div style="margin-top:16px; background:var(--cream); border:1px solid var(--line); border-radius:14px; padding:14px; font-size:13px; color:var(--muted)">
<strong style="color:var(--navy)">How to use this script:</strong> Personalize line 1 with your story. Litigation outcomes improve when lawmakers hear specific community impacts, not form letters.
</div>
</div>
<div class="rep-result" id="repResult">
<div style="text-align:center; padding:18px 10px">
<div style="width:52px; height:52px; border-radius:50%; background:var(--teal-light); display:grid; place-items:center; margin:0 auto; color:var(--teal)"><i data-lucide="search"></i></div>
<h4 style="margin:10px 0 4px; color:var(--navy)">Ready to connect?</h4>
<p style="margin:0; color:var(--muted); font-size:14px">Your representatives and a tailored call script will appear here. You can email, call, or generate a public comment.</p>
</div>
</div>
</div>
</div>
</section>
<!-- ABOUT + TESTIMONIALS -->
<section id="about" style="padding-top:0">
<div class="container">
<div class="testimonial-grid">
<div class="quote">
<div class="stars">★★★★★</div>
<p style="font-size:14.5px; margin:10px 0 14px">“The Civic Ledger’s clinic stopped my eviction the week my son started kindergarten. They explained every filing, and the organizer stayed after court to help me speak at the hearing.”</p>
<div style="display:flex; gap:10px; align-items:center">
<img src="https://i.pravatar.cc/100?u=marisol" alt="Marisol avatar" style="width:36px; height:36px; border-radius:50%">
<div><strong style="font-size:13px">Marisol R.</strong><div style="font-size:12px; color:var(--muted)">Clinic Client, District 4</div></div>
</div>
</div>
<div class="quote" style="background:var(--navy); color:white; border-color:var(--navy)">
<div class="stars" style="color:var(--gold)">★★★★★</div>
<p style="font-size:14.5px; margin:10px 0 14px">“As a first-time testifier, I was terrified. Their testimony lab helped me turn my story into two minutes that actually moved the committee to amend the bill.”</p>
<div style="display:flex; gap:10px; align-items:center">
<img src="https://i.pravatar.cc/100?u=james" alt="James avatar" style="width:36px; height:36px; border-radius:50%">
<div><strong style="font-size:13px; color:white">James K.</strong><div style="font-size:12px; color:rgba(255,255,255,0.7)">Volunteer Advocate, Tenant Union</div></div>
</div>
</div>
<div class="quote">
<div class="stars">★★★★★</div>
<p style="font-size:14.5px; margin:10px 0 14px">“Their legislative tracker is the only nonpartisan source I trust. Plain language, primary sources, and no fundraising spin. We use it in our high school civics class.”</p>
<div style="display:flex; gap:10px; align-items:center">
<img src="https://i.pravatar.cc/100?u=priya" alt="Priya avatar" style="width:36px; height:36px; border-radius:50%">
<div><strong style="font-size:13px">Priya S.</strong><div style="font-size:12px; color:var(--muted)">Educator, Civics Lab</div></div>
</div>
</div>
</div>
<div style="margin-top:22px; display:grid; grid-template-columns:1.3fr 0.7fr; gap:18px" class="two-col">
<div class="card" style="background:white">
<div class="kicker">About The Civic Ledger</div>
<h4 style="margin:4px 0">A public interest law firm and civic hub built for participation.</h4>
<p>Founded in 2014 by legal aid attorneys and community organizers, we exist because access to the legislative process shouldn't require an insider credential. Today, our team of 28 staff — attorneys, policy analysts, and field organizers — serves more than 12,000 residents annually through clinics, trainings, and strategic litigation.</p>
<p>We are nonpartisan and donor-transparent. Our litigation docket is driven by community need, not politics, and every policy position is published with its underlying research, fiscal analysis, and dissent. That transparency is why courts, councils, and neighbors trust us.</p>
<div style="display:flex; gap:16px; margin-top:12px; flex-wrap:wrap">
<div><strong style="color:var(--navy)">2014</strong><div style="font-size:12px; color:var(--muted)">FOUNDED</div></div>
<div><strong style="color:var(--navy)">1,240+</strong><div style="font-size:12px; color:var(--muted)">CASES WON</div></div>
<div><strong style="color:var(--navy)">56</strong><div style="font-size:12px; color:var(--muted)">COALITION PARTNERS</div></div>
</div>
</div>
<div class="card" style="background:var(--cream)">
<img src="https://picsum.photos/400/220?random=30" alt="Team" style="border-radius:14px; height:150px; object-fit:cover; width:100%">
<p style="font-size:13px; color:var(--muted); margin:10px 0 8px">Leadership is elected annually by staff and community advisors — including clients — to keep power close to impact.</p>
<a href="#volunteer" class="btn btn-gold" style="width:100%">Meet the team & bylaws</a>
</div>
</div>
</div>
</section>
<!-- VOLUNTEER -->
<section id="volunteer" style="padding-top:0">
<div class="container volunteer">
<div>
<div class="mono" style="color:var(--gold)">Grassroots Power</div>
<h3>Volunteer. Lead. Change the outcome.</h3>
<p style="color:rgba(255,255,255,0.78)">No experience needed — we train you in litigation support, legislative testimony, and relational organizing. Choose a role that fits your schedule and build durable civic participation in your precinct.</p>
<div style="display:flex; gap:10px; margin-top:16px; flex-wrap:wrap">
<a href="#contact" class="btn btn-gold">Join Volunteer Cohort</a>
<a href="#" class="btn" style="background:rgba(255,255,255,0.08); color:white; border:1px solid rgba(255,255,255,0.14)">Attend orientation — May 20</a>
</div>
</div>
<div class="opps">
<div class="opp"><div><strong style="font-size:14px">Court Watch Monitor</strong><div style="font-size:13px; color:rgba(255,255,255,0.7)">2 hrs/week • In-person • Training stipend: $50</div></div><span class="badge" style="background:var(--gold); color:var(--navy)">12 spots</span></div>
<div class="opp"><div><strong style="font-size:14px">Legislative Correspondent</strong><div style="font-size:13px; color:rgba(255,255,255,0.7)">Remote • Track committee & draft summaries</div></div><span class="badge" style="background:white; color:var(--navy)">Open</span></div>
<div class="opp"><div><strong style="font-size:14px">Neighborhood Captain</strong><div style="font-size:13px; color:rgba(255,255,255,0.7)">Lead 25 doors/month • Bilingual needs: ES/AR</div></div><span class="badge" style="background:#BCEBD0; color:#0B4D2A">High need</span></div>
</div>
</div>
</section>
<!-- FAQ -->
<section style="background:white">
<div class="container faq">
<div style="text-align:center; max-width:640px; margin:0 auto 20px">
<div class="kicker">Transparency & FAQ</div>
<h3 class="serif" style="font-size:34px; color:var(--navy); margin:6px 0">Common questions about working with us.</h3>
<p style="color:var(--muted)">We believe legal information should be as accessible as the law is consequential. If you don’t find your answer, our intake team responds within one business day.</p>
</div>
<div class="faq-item open">
<button class="faq-q">Do you provide direct legal representation? <i data-lucide="chevron-down"></i></button>
<div class="faq-a">Yes, in housing, administrative, and civic-rights matters. We prioritize cases where our litigation can establish precedent or where clients face barriers to counsel. If we cannot take your case, we provide a warm referral and procedural support through filing deadlines and hearings.</div>
</div>
<div class="faq-item">
<button class="faq-q">Is The Civic Ledger partisan? <i data-lucide="chevron-down"></i></button>
<div class="faq-a">No. We are a 501(c)(3) nonpartisan public interest organization. We evaluate bills on due process, equity impact, and constituent input — not party affiliation — and publish our methodology alongside every position.</div>
</div>
<div class="faq-item">
<button class="faq-q">How does your representative finder work? <i data-lucide="chevron-down"></i></button>
<div class="faq-a">We use open government district shapefiles to match your address to federal (House/Senate) and state legislators. Scripts are drafted by our policy team and reviewed for factual accuracy and respectful tone before delivery.</div>
</div>
<div class="faq-item">
<button class="faq-q">What does volunteering require? <i data-lucide="chevron-down"></i></button>
<div class="faq-a">Most roles ask 2–4 hours per week with a 3-month commitment. We provide training, transit support, and stipends for high-need shifts. Youth (16+) may volunteer with guardian consent for court watch and canvassing.</div>
</div>
</div>
</section>
<!-- NEWSLETTER / CONTACT -->
<section id="contact" style="padding-top:0; background:white">
<div class="container newsletter">
<div>
<h3 class="serif" style="margin:0; color:var(--navy); font-size:24px">Get the weekly civic brief — not the noise.</h3>
<p style="margin:6px 0 0; color:var(--muted)">Every Monday: 3 bills to watch, 1 action to take, and a plain-language explainer of the legislative process. No spam, unsubscribe anytime.</p>
<form onsubmit="event.preventDefault(); alert('Thanks for subscribing! Check your email to confirm.');" style="display:flex; gap:10px; margin-top:14px; flex-wrap:wrap">
<input type="email" required placeholder="Your email address" style="flex:1; min-width:220px; padding:14px 16px; border-radius:999px; border:1.5px solid var(--line); background:white">
<button class="btn btn-navy" type="submit">Subscribe <i data-lucide="mail" style="width:16px;height:16px"></i></button>
</form>
</div>
<div class="card" style="background:var(--navy); color:white; border-color:var(--navy)">
<h4 style="margin:0 0 6px; color:white; font-size:18px">Contact</h4>
<p style="margin:0; color:rgba(255,255,255,0.7); font-size:14px">121 Civic Way, Suite 400<br>Washington, DC 20005<br>Mon–Fri 9AM–6PM ET</p>
<div style="margin-top:12px; display:grid; gap:8px; font-size:14px">
<a href="tel:+12025550142" style="color:var(--gold); font-weight:800; display:flex; gap:8px; align-items:center"><i data-lucide="phone" style="width:16px;height:16px"></i> (202) 555-0142</a>
<a href="mailto:help@civicledger.org" style="color:white; display:flex; gap:8px; align-items:center"><i data-lucide="mail" style="width:16px;height:16px"></i> help@civicledger.org</a>
</div>
</div>
</div>
</section>
</main>
<footer id="donate">
<div class="container">
<div class="footer-grid">
<div>
<div style="display:flex; gap:10px; align-items:center; margin-bottom:10px">
<div style="width:40px; height:40px; border-radius:10px; background:white; color:var(--navy); display:grid; place-items:center; font-family:Fraunces,serif; font-weight:700">◈</div>
<div><strong style="color:white">The Civic Ledger</strong><div style="font-size:12px; color:rgba(255,255,255,0.6)">Democracy in plain language.</div></div>
</div>
<p style="font-size:13px; color:rgba(255,255,255,0.7)">Nonpartisan public interest law, legislative oversight, and grassroots organizing. We make civic participation possible — and powerful — for every neighbor.</p>
<div style="margin-top:12px; display:flex; gap:8px; flex-wrap:wrap">
<span class="badge" style="background:rgba(255,255,255,0.1); color:white; border:1px solid rgba(255,255,255,0.12)">501(c)(3) EIN 84-1234567</span>
<span class="badge" style="background:var(--gold); color:var(--navy)">Donate is tax-deductible</span>
</div>
</div>
<div>
<h5>Explore</h5>
<div style="display:grid; gap:8px">
<a href="#initiatives">Our Initiatives</a><a href="#tracker">Legislative Tracker</a><a href="#legal">Legal Aid Clinic</a><a href="#rep-finder">Find Your Rep</a><a href="#volunteer">Volunteer Hub</a>
</div>
</div>
<div>
<h5>Resources</h5>
<div style="display:grid; gap:8px">
<a href="#">Know Your Rights PDFs</a><a href="#">Annual Impact Report</a><a href="#">Research & Litigation Docket</a><a href="#">Press & Media Kit</a><a href="#">Privacy Policy</a>
</div>
</div>
<div>
<h5>Stay Close</h5>
<p style="font-size:13px; color:rgba(255,255,255,0.7)">Follow live hearings, action alerts, and community stories.</p>
<div class="social">
<a href="#" aria-label="X"><i data-lucide="bird" style="width:16px;height:16px"></i></a>
<a href="#" aria-label="Instagram"><i data-lucide="camera" style="width:16px;height:16px"></i></a>
<a href="#" aria-label="YouTube"><i data-lucide="play" style="width:16px;height:16px"></i></a>
<a href="#" aria-label="LinkedIn"><i data-lucide="briefcase" style="width:16px;height:16px"></i></a>
</div>
<a href="#contact" class="btn btn-gold" style="margin-top:12px; width:100%">Support our work</a>
</div>
</div>
<div class="subfooter">
<span>© 2026 The Civic Ledger. All rights reserved. • <a href="#" style="color:rgba(255,255,255,0.7)">Terms</a> • <a href="#" style="color:rgba(255,255,255,0.7)">Privacy</a> • <a href="#" style="color:rgba(255,255,255,0.7)">Accessibility</a></span>
<span style="display:flex; gap:8px; align-items:center"><i data-lucide="shield" style="width:14px;height:14px"></i> Nonpartisan • Independent • Community-governed</span>
</div>
</div>
</footer>
<script>
lucide.createIcons();
const menuBtn=document.getElementById('menuBtn');
const nav=document.querySelector('.main-nav');
menuBtn?.addEventListener('click',()=> nav.classList.toggle('open'));
document.querySelectorAll('.filter').forEach(btn=>{
if(btn.dataset.filter!==undefined){
btn.addEventListener('click',()=>{
document.querySelectorAll('.filter[data-filter]').forEach(b=>b.classList.remove('active'));
btn.classList.add('active');
const f=btn.dataset.filter;
document.querySelectorAll('.bill').forEach(b=>{
b.style.display = (f==='all' || b.dataset.cat===f) ? 'grid' : 'none';
});
});
}
});
document.querySelectorAll('.faq-q').forEach(q=>{
q.addEventListener('click',()=> q.parentElement.classList.toggle('open'));
});
function doRepSearch(){
const val=document.getElementById('repInput').value.trim();
const out=document.getElementById('repResult');
if(!val){ out.innerHTML='<p style="color:#991B1B; padding:12px">Please enter a ZIP or address.</p>'; return; }
// mock data
const reps=[
{name:'Rep. Alicia Mendez', role:'U.S. House • District 7', party:'Member of Congress', img:'https://i.pravatar.cc/100?u=rep1', phone:'(202) 225-4811', email:'mendez.house.gov/contact'},
{name:'Sen. Daniel Park', role:'U.S. Senate • Class II', party:'Senator', img:'https://i.pravatar.cc/100?u=rep2', phone:'(202) 224-3121', email:'park.senate.gov/contact'},
{name:'Asmb. Keisha Williams', role:'State Assembly • District 14', party:'State Representative', img:'https://i.pravatar.cc/100?u=rep3', phone:'(555) 014-2900', email:'williams.assembly.gov/contact'}
];
out.innerHTML=`
<div style="display:flex; justify-content:space-between; align-items:center; gap:10px; flex-wrap:wrap">
<h4 style="margin:0; color:var(--navy)">Your representatives for ${val}</h4>
<span class="mono" style="background:var(--teal); color:white; padding:6px 10px; border-radius:999px">3 matches</span>
</div>
<div style="margin-top:12px">
${reps.map(r=>`
<div class="rep-person">
<img src="${r.img}" alt="${r.name}">
<div style="flex:1">
<strong style="font-size:14px; color:var(--navy)">${r.name}</strong><div style="font-size:12px; color:var(--muted)">${r.role} • ${r.party}</div>
</div>
<div style="text-align:right">
<div style="font-size:12px; font-weight:700; color:var(--teal)">${r.phone}</div>
<a href="#" style="font-size:12px; color:var(--navy); font-weight:700">Email →</a>
</div>
</div>
`).join('')}
</div>
<div style="background:white; border:1px solid var(--line); border-radius:14px; padding:12px; margin-top:10px">
<div class="mono" style="color:var(--muted)">Your personalized script — HB 442</div>
<p style="font-size:13px; margin:6px 0 8px; color:var(--text)">Hi, my name is [Your Name] from ZIP ${val}. I'm calling to urge a YES on HB 442, the Voter Registration Modernization Act. As a [parent/worker/student] in this district, automatic registration with clear opt-out protections will reduce barriers I've seen at the DMV. Please support it in committee this week. Thank you.</p>
<div style="display:flex; gap:8px; flex-wrap:wrap">
<button class="btn btn-navy" style="padding:8px 12px; font-size:13px" onclick="alert('Message sent to representatives!')">Send Email Now</button>
<button class="btn btn-outline" style="padding:8px 12px; font-size:13px" onclick="navigator.clipboard.writeText(this.parentElement.previousElementSibling.innerText); alert('Script copied!')">Copy Script</button>
<button class="btn btn-gold" style="padding:8px 12px; font-size:13px" onclick="alert('Call connected: (202) 225-4811')">Call Now</button>
</div>
</div>
`;
lucide.createIcons();
}
document.getElementById('repBtn').addEventListener('click', doRepSearch);
document.getElementById('repInput').addEventListener('keydown', e=>{ if(e.key==='Enter') doRepSearch(); });
</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:09:33.445Z",
"url": "https://benchmark.aimac.invalid/a79b98d75173b099a9fb9f50d61e1250711b347c97d3b90b785c9476bbd48ac4.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-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": "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": []
},
{
"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": "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": []
},
{
"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": []
},
{
"id": "marquee",
"impact": null,
"tags": [
"cat.parsing",
"wcag2a",
"wcag222",
"TTv5",
"TT2.b",
"EN-301-549",
"EN-9.2.2.2"
],
"description": "Ensure <marquee> elements are not used",
"help": "<marquee> elements are deprecated and must not be used",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/marquee?application=axeAPI",
"nodes": []
},
{
"id": "meta-refresh",
"impact": null,
"tags": [
"cat.time-and-media",
"wcag2a",
"wcag221",
"TTv5",
"TT8.a",
"EN-301-549",
"EN-9.2.2.1"
],
"description": "Ensure <meta http-equiv=\"refresh\"> is not used for delayed refresh",
"help": "Delayed refresh under 20 hours must not be used",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/meta-refresh?application=axeAPI",
"nodes": []
},
{
"id": "object-alt",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag111",
"section508",
"section508.22.a",
"EN-301-549",
"EN-9.1.1.1"
],
"description": "Ensure <object> elements have alternative text",
"help": "<object> elements must have alternative text",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/object-alt?application=axeAPI",
"nodes": []
},
{
"id": "role-img-alt",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag111",
"section508",
"section508.22.a",
"TTv5",
"TT7.a",
"EN-301-549",
"EN-9.1.1.1",
"ACT"
],
"description": "Ensure [role=\"img\"] elements have alternative text",
"help": "[role=\"img\"] elements must have an alternative text",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/role-img-alt?application=axeAPI",
"nodes": []
},
{
"id": "scrollable-region-focusable",
"impact": null,
"tags": [
"cat.keyboard",
"wcag2a",
"wcag211",
"wcag213",
"TTv5",
"TT4.a",
"EN-301-549",
"EN-9.2.1.1",
"EN-9.2.1.3"
],
"description": "Ensure elements that have scrollable content are accessible by keyboard",
"help": "Scrollable region must have keyboard access",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/scrollable-region-focusable?application=axeAPI",
"nodes": []
},
{
"id": "select-name",
"impact": null,
"tags": [
"cat.forms",
"wcag2a",
"wcag412",
"section508",
"section508.22.n",
"TTv5",
"TT5.c",
"EN-301-549",
"EN-9.4.1.2",
"ACT"
],
"description": "Ensure select element has an accessible name",
"help": "Select element must have an accessible name",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/select-name?application=axeAPI",
"nodes": []
},
{
"id": "server-side-image-map",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag211",
"section508",
"section508.22.f",
"TTv5",
"TT4.a",
"EN-301-549",
"EN-9.2.1.1"
],
"description": "Ensure that server-side image maps are not used",
"help": "Server-side image maps must not be used",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/server-side-image-map?application=axeAPI",
"nodes": []
},
{
"id": "summary-name",
"impact": null,
"tags": [
"cat.name-role-value",
"wcag2a",
"wcag412",
"section508",
"section508.22.a",
"TTv5",
"TT6.a",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure summary elements have discernible text",
"help": "Summary elements must have discernible text",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/summary-name?application=axeAPI",
"nodes": []
},
{
"id": "svg-img-alt",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag111",
"section508",
"section508.22.a",
"TTv5",
"TT7.a",
"EN-301-549",
"EN-9.1.1.1",
"ACT"
],
"description": "Ensure <svg> elements with an img, graphics-document or graphics-symbol role have an accessible text",
"help": "<svg> elements with an img role must have an alternative text",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/svg-img-alt?application=axeAPI",
"nodes": []
},
{
"id": "td-headers-attr",
"impact": null,
"tags": [
"cat.tables",
"wcag2a",
"wcag131",
"section508",
"section508.22.g",
"TTv5",
"TT14.b",
"EN-301-549",
"EN-9.1.3.1"
],
"description": "Ensure that each cell in a table that uses the headers attribute refers only to other cells in that table",
"help": "Table cells that use the headers attribute must only refer to cells in the same table",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/td-headers-attr?application=axeAPI",
"nodes": []
},
{
"id": "th-has-data-cells",
"impact": null,
"tags": [
"cat.tables",
"wcag2a",
"wcag131",
"section508",
"section508.22.g",
"TTv5",
"TT14.b",
"EN-301-549",
"EN-9.1.3.1"
],
"description": "Ensure that <th> elements and elements with role=columnheader/rowheader have data cells they describe",
"help": "Table headers in a data table must refer to data cells",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/th-has-data-cells?application=axeAPI",
"nodes": []
},
{
"id": "valid-lang",
"impact": null,
"tags": [
"cat.language",
"wcag2aa",
"wcag312",
"TTv5",
"TT11.b",
"EN-301-549",
"EN-9.3.1.2",
"ACT"
],
"description": "Ensure lang attributes have valid values",
"help": "lang attribute must have a valid value",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/valid-lang?application=axeAPI",
"nodes": []
},
{
"id": "video-caption",
"impact": null,
"tags": [
"cat.text-alternatives",
"wcag2a",
"wcag122",
"section508",
"section508.22.a",
"TTv5",
"TT17.a",
"EN-301-549",
"EN-9.1.2.2"
],
"description": "Ensure <video> elements have captions",
"help": "<video> elements must have captions",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/video-caption?application=axeAPI",
"nodes": []
},
{
"id": "no-autoplay-audio",
"impact": null,
"tags": [
"cat.time-and-media",
"wcag2a",
"wcag142",
"TTv5",
"TT2.a",
"EN-301-549",
"EN-9.1.4.2",
"ACT"
],
"description": "Ensure <video> or <audio> elements do not autoplay audio for more than 3 seconds without a control mechanism to stop or mute the audio",
"help": "<video> or <audio> elements must not play automatically",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/no-autoplay-audio?application=axeAPI",
"nodes": []
}
],
"passes": [
{
"id": "aria-allowed-attr",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure an element's role supports its ARIA attributes",
"help": "Elements must only use supported ARIA attributes",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-allowed-attr?application=axeAPI",
"nodes": [
{
"any": [],
"all": [
{
"id": "aria-allowed-attr",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "ARIA attributes are used correctly for the defined role"
}
],
"none": [
{
"id": "aria-unsupported-attr",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "ARIA attribute is supported"
}
],
"impact": null,
"html": "<nav class=\"main-nav\" aria-label=\"Primary\">",
"target": [
"nav"
]
}
]
},
{
"id": "aria-conditional-attr",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure ARIA attributes are used as described in the specification of the element's role",
"help": "ARIA attributes must be used as specified for the element's role",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-conditional-attr?application=axeAPI",
"nodes": [
{
"any": [],
"all": [
{
"id": "aria-conditional-attr",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "ARIA attribute is allowed"
}
],
"none": [],
"impact": null,
"html": "<nav class=\"main-nav\" aria-label=\"Primary\">",
"target": [
"nav"
]
}
]
},
{
"id": "aria-deprecated-role",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure elements do not use deprecated roles",
"help": "Deprecated ARIA roles must not be used",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-deprecated-role?application=axeAPI",
"nodes": [
{
"any": [],
"all": [],
"none": [
{
"id": "deprecatedrole",
"data": null,
"relatedNodes": [],
"impact": "minor",
"message": "ARIA role is not deprecated"
}
],
"impact": null,
"html": "<div class=\"filters\" role=\"tablist\" aria-label=\"Filters\">",
"target": [
".filters"
]
}
]
},
{
"id": "aria-hidden-body",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag131",
"wcag412",
"EN-301-549",
"EN-9.1.3.1",
"EN-9.4.1.2"
],
"description": "Ensure aria-hidden=\"true\" is not present on the document body.",
"help": "aria-hidden=\"true\" must not be present on the document body",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-hidden-body?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "aria-hidden-body",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "No aria-hidden attribute is present on document body"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<body>",
"target": [
"body"
]
}
]
},
{
"id": "aria-hidden-focus",
"impact": null,
"tags": [
"cat.name-role-value",
"wcag2a",
"wcag412",
"TTv5",
"TT6.a",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure aria-hidden elements are not focusable nor contain focusable elements",
"help": "ARIA hidden element must not be focusable or contain focusable elements",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-hidden-focus?application=axeAPI",
"nodes": [
{
"any": [],
"all": [
{
"id": "focusable-modal-open",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "No focusable elements while a modal is open"
},
{
"id": "focusable-disabled",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "No focusable elements contained within element"
},
{
"id": "focusable-not-tabbable",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "No focusable elements contained within element"
}
],
"none": [],
"impact": null,
"html": "<div class=\"logo\" aria-hidden=\"true\">\u25c8</div>",
"target": [
".logo"
]
}
]
},
{
"id": "aria-prohibited-attr",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure ARIA attributes are not prohibited for an element's role",
"help": "Elements must only use permitted ARIA attributes",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-prohibited-attr?application=axeAPI",
"nodes": [
{
"any": [],
"all": [],
"none": [
{
"id": "aria-prohibited-attr",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "ARIA attribute is allowed"
}
],
"impact": null,
"html": "<nav class=\"main-nav\" aria-label=\"Primary\">",
"target": [
"nav"
]
}
]
},
{
"id": "aria-required-attr",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure elements with ARIA roles have all required ARIA attributes",
"help": "Required ARIA attributes must be provided",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-required-attr?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "aria-required-attr",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "All required ARIA attributes are present"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<div class=\"filters\" role=\"tablist\" aria-label=\"Filters\">",
"target": [
".filters"
]
}
]
},
{
"id": "aria-roles",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure all elements with a role attribute use a valid value",
"help": "ARIA roles used must conform to valid values",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-roles?application=axeAPI",
"nodes": [
{
"any": [],
"all": [],
"none": [
{
"id": "invalidrole",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "ARIA role is valid"
},
{
"id": "abstractrole",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "Abstract roles are not used"
},
{
"id": "unsupportedrole",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "ARIA role is supported"
}
],
"impact": null,
"html": "<div class=\"filters\" role=\"tablist\" aria-label=\"Filters\">",
"target": [
".filters"
]
}
]
},
{
"id": "aria-valid-attr-value",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure all ARIA attributes have valid values",
"help": "ARIA attributes must conform to valid values",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-valid-attr-value?application=axeAPI",
"nodes": [
{
"any": [],
"all": [
{
"id": "aria-valid-attr-value",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "ARIA attribute values are valid"
},
{
"id": "aria-errormessage",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "aria-errormessage exists and references elements visible to screen readers that use a supported aria-errormessage technique"
},
{
"id": "aria-level",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "aria-level values are valid"
}
],
"none": [],
"impact": null,
"html": "<nav class=\"main-nav\" aria-label=\"Primary\">",
"target": [
"nav"
]
}
]
},
{
"id": "aria-valid-attr",
"impact": null,
"tags": [
"cat.aria",
"wcag2a",
"wcag412",
"EN-301-549",
"EN-9.4.1.2"
],
"description": "Ensure attributes that begin with aria- are valid ARIA attributes",
"help": "ARIA attributes must conform to valid names",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/aria-valid-attr?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "aria-valid-attr",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "ARIA attribute name is valid"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<nav class=\"main-nav\" aria-label=\"Primary\">",
"target": [
"nav"
]
}
]
},
{
"id": "avoid-inline-spacing",
"impact": null,
"tags": [
"cat.structure",
"wcag21aa",
"wcag1412",
"EN-301-549",
"EN-9.1.4.12",
"ACT"
],
"description": "Ensure that text spacing set through style attributes can be adjusted with custom stylesheets",
"help": "Inline text spacing must be adjustable with custom stylesheets",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/avoid-inline-spacing?application=axeAPI",
"nodes": [
{
"any": [],
"all": [
{
"id": "important-letter-spacing",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "Letter-spacing in the style attribute is not set to !important, or meets the minimum"
},
{
"id": "important-word-spacing",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "word-spacing in the style attribute is not set to !important, or meets the minimum"
},
{
"id": "important-line-height",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "line-height in the style attribute is not set to !important, or meets the minimum"
}
],
"none": [],
"impact": null,
"html": "<span style=\"opacity:0.7\">Next Civic Clinic: Sat, May 17 \u2014 Free legal aid, no appointment needed</span>",
"target": [
".topbar-left > span:nth-child(2)"
]
}
]
},
{
"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=\"filter active\" data-filter=\"all\">All Issues</button>",
"target": [
".active"
]
}
]
},
{
"id": "bypass",
"impact": null,
"tags": [
"cat.keyboard",
"wcag2a",
"wcag241",
"section508",
"section508.22.o",
"TTv5",
"TT9.a",
"EN-301-549",
"EN-9.2.4.1"
],
"description": "Ensure each page has at least one mechanism for a user to bypass navigation and jump straight to the content",
"help": "Page must have means to bypass repeated blocks",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/bypass?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "internal-link-present",
"data": null,
"relatedNodes": [],
"impact": "serious",
"message": "Valid skip link found"
},
{
"id": "header-present",
"data": null,
"relatedNodes": [
{
"html": "<h1>The Civic Ledger</h1>",
"target": [
"h1"
]
},
{
"html": "<h2>We translate <em>power</em> into action you can use.</h2>",
"target": [
"h2"
]
},
{
"html": "<h3>From courthouse to capitol to community.</h3>",
"target": [
".section-head > div > h3"
]
},
{
"html": "<h4>Public Interest Litigation</h4>",
"target": [
"article:nth-child(1) > h4"
]
},
{
"html": "<h4>Legislative Advocacy & Oversight</h4>",
"target": [
"article:nth-child(2) > h4"
]
},
{
"html": "<h4>Grassroots Organizing</h4>",
"target": [
"article:nth-child(3) > h4"
]
},
{
"html": "<h3 class=\"serif\" style=\"margin:6px 0 0; font-size:30px\">Real-time bill tracker</h3>",
"target": [
".tracker > div:nth-child(1) > div > .serif"
]
},
{
"html": "<h5>HB 442 \u2014 Voter Registration Modernization Act</h5>",
"target": [
"div[data-cat=\"voting\"] > div:nth-child(1) > h5"
]
},
{
"html": "<h5>SB 118 \u2014 Tenant Right to Counsel Pilot</h5>",
"target": [
"div[data-cat=\"housing\"] > div:nth-child(1) > h5"
]
},
{
"html": "<h5>HB 309 \u2014 Utility Transparency & Rate Review</h5>",
"target": [
"div[data-cat=\"climate\"] > div:nth-child(1) > h5"
]
},
{
"html": "<h4>Action Alerts & Research</h4>",
"target": [
"aside > h4"
]
},
{
"html": "<h4>Get legal aid without the legalese.</h4>",
"target": [
".feature-text > h4"
]
},
{
"html": "<h3 class=\"serif\" style=\"font-size:32px; margin:6px 0; color:var(--navy)\">Find your representative & take action in 60 seconds.</h3>",
"target": [
".rep-grid > div:nth-child(1) > .serif"
]
},
{
"html": "<h4 style=\"margin:10px 0 4px; color:var(--navy)\">Ready to connect?</h4>",
"target": [
"#repResult > div > h4"
]
},
{
"html": "<h4 style=\"margin:4px 0\">A public interest law firm and civic hub built for participation.</h4>",
"target": [
".two-col > .card:nth-child(1) > h4"
]
},
{
"html": "<h3>Volunteer. Lead. Change the outcome.</h3>",
"target": [
".volunteer > div:nth-child(1) > h3"
]
},
{
"html": "<h3 class=\"serif\" style=\"font-size:34px; color:var(--navy); margin:6px 0\">Common questions about working with us.</h3>",
"target": [
".faq > div:nth-child(1) > .serif"
]
},
{
"html": "<h3 class=\"serif\" style=\"margin:0; color:var(--navy); font-size:24px\">Get the weekly civic brief \u2014 not the noise.</h3>",
"target": [
".newsletter > div:nth-child(1) > .serif"
]
},
{
"html": "<h4 style=\"margin:0 0 6px; color:white; font-size:18px\">Contact</h4>",
"target": [
".newsletter > .card > h4"
]
},
{
"html": "<h5>Explore</h5>",
"target": [
"div:nth-child(2) > h5"
]
},
{
"html": "<h5>Resources</h5>",
"target": [
"div:nth-child(3) > h5"
]
},
{
"html": "<h5>Stay Close</h5>",
"target": [
"div:nth-child(4) > h5"
]
}
],
"impact": "serious",
"message": "Page has a heading"
},
{
"id": "landmark",
"data": null,
"relatedNodes": [
{
"html": "<main>",
"target": [
"main"
]
}
],
"impact": "serious",
"message": "Page has a landmark region"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<html lang=\"en\">",
"target": [
"html"
]
}
]
},
{
"id": "color-contrast",
"impact": "serious",
"tags": [
"cat.color",
"wcag2aa",
"wcag143",
"TTv5",
"TT13.c",
"EN-301-549",
"EN-9.1.4.3",
"ACT"
],
"description": "Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds",
"help": "Elements must meet minimum color contrast ratio thresholds",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/color-contrast?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#f6f1e6",
"bgColor": "#22354f",
"contrastRatio": 11.03,
"fontSize": "9.8pt (13px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [],
"impact": "serious",
"message": "Element has sufficient color contrast of 11.03"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<span class=\"pill-live\"><span class=\"dot\"></span> LIVE: Senate Judiciary markup \u2014 Watch live testimony & submit comment by 5PM ET</span>",
"target": [
".pill-live"
]
}
]
},
{
"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": "form-field-multiple-labels",
"impact": null,
"tags": [
"cat.forms",
"wcag2a",
"wcag332",
"TTv5",
"TT5.c",
"EN-301-549",
"EN-9.3.3.2"
],
"description": "Ensure form field does not have multiple label elements",
"help": "Form field must not have multiple label elements",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/form-field-multiple-labels?application=axeAPI",
"nodes": [
{
"any": [],
"all": [],
"none": [
{
"id": "multiple-label",
"data": null,
"relatedNodes": [],
"impact": "moderate",
"message": "Form field does not have multiple label elements"
}
],
"impact": null,
"html": "<input id=\"repInput\" placeholder=\"Enter ZIP code (e.g., 30303) or address\" aria-label=\"ZIP code or address\">",
"target": [
"#repInput"
]
}
]
},
{
"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://picsum.photos/640/420?random=11\" alt=\"Civic hall with audience\">",
"target": [
"img[alt=\"Civic hall with audience\"]"
]
}
]
},
{
"id": "label",
"impact": null,
"tags": [
"cat.forms",
"wcag2a",
"wcag412",
"section508",
"section508.22.n",
"TTv5",
"TT5.c",
"EN-301-549",
"EN-9.4.1.2",
"ACT"
],
"description": "Ensure every form element has a label",
"help": "Form elements must have labels",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/label?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "aria-label",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "aria-label attribute exists and is not empty"
},
{
"id": "non-empty-placeholder",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "Element has a placeholder attribute"
}
],
"all": [],
"none": [
{
"id": "hidden-explicit-label",
"data": null,
"relatedNodes": [],
"impact": "critical",
"message": "Form element has a visible explicit <label>"
}
],
"impact": null,
"html": "<input id=\"repInput\" placeholder=\"Enter ZIP code (e.g., 30303) or address\" aria-label=\"ZIP code or address\">",
"target": [
"#repInput"
]
}
]
},
{
"id": "link-in-text-block",
"impact": null,
"tags": [
"cat.color",
"wcag2a",
"wcag141",
"TTv5",
"TT13.a",
"EN-301-549",
"EN-9.1.4.1"
],
"description": "Ensure links are distinguished from surrounding text in a way that does not rely on color",
"help": "Links must be distinguishable without relying on color",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/link-in-text-block?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "link-in-text-block-style",
"data": null,
"relatedNodes": [
{
"html": "<div class=\"mini\" style=\"background:var(--navy); color:white\">",
"target": [
".mini:nth-child(2)"
]
}
],
"impact": "serious",
"message": "Links can be distinguished from surrounding text by visual styling"
}
],
"all": [],
"none": [],
"impact": null,
"html": "<a href=\"#\" style=\"color:var(--gold); font-weight:800; font-size:12px; display:inline-flex; gap:6px; align-items:center; margin-top:6px\">",
"target": [
".mini:nth-child(2) > a[href=\"#\"]"
]
}
]
},
{
"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=\"#contact\" style=\"color:white; font-weight:700\">En Espa\u00f1ol</a>",
"target": [
"div:nth-child(2) > a[href$=\"#contact\"]"
]
}
]
},
{
"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://picsum.photos/640/420?random=11\" alt=\"Civic hall with audience\">",
"target": [
"img[alt=\"Civic hall with audience\"]"
]
}
]
},
{
"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-offset",
"data": {
"closestOffset": 24,
"minOffset": 24
},
"relatedNodes": [],
"impact": "serious",
"message": "Target has sufficient space from its closest neighbors. Safe clickable space has a diameter of 24px which is at least 24px."
}
],
"all": [],
"none": [],
"impact": null,
"html": "<a href=\"#contact\" style=\"color:white; font-weight:700\">En Espa\u00f1ol</a>",
"target": [
"div:nth-child(2) > a[href$=\"#contact\"]"
]
}
]
}
],
"incomplete": [
{
"id": "color-contrast",
"impact": "serious",
"tags": [
"cat.color",
"wcag2aa",
"wcag143",
"TTv5",
"TT13.c",
"EN-301-549",
"EN-9.1.4.3",
"ACT"
],
"description": "Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds",
"help": "Elements must meet minimum color contrast ratio thresholds",
"helpUrl": "https://dequeuniversity.com/rules/axe/4.10/color-contrast?application=axeAPI",
"nodes": [
{
"any": [
{
"id": "color-contrast",
"data": {
"messageKey": "nonBmp"
},
"relatedNodes": [],
"impact": "serious",
"message": "Element content contains only non-text characters"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<div class=\"logo\" aria-hidden=\"true\">\u25c8</div>",
"target": [
".logo"
],
"failureSummary": "Fix any of the following:\n Element content contains only non-text characters"
}
]
}
],
"violations": [
{
"id": "aria-required-children",
"impact": "critical",
"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": [
{
"any": [
{
"id": "aria-required-children",
"data": {
"messageKey": "unallowed",
"values": "button[tabindex]"
},
"relatedNodes": [
{
"html": "<button class=\"filter active\" data-filter=\"all\">All Issues</button>",
"target": [
".active"
]
},
{
"html": "<button class=\"filter\" data-filter=\"voting\">Voting & Ethics</button>",
"target": [
"button[data-filter=\"voting\"]"
]
},
{
"html": "<button class=\"filter\" data-filter=\"housing\">Housing</button>",
"target": [
"button[data-filter=\"housing\"]"
]
},
{
"html": "<button class=\"filter\" data-filter=\"climate\">Climate & Utilities</button>",
"target": [
"button[data-filter=\"climate\"]"
]
}
],
"impact": "critical",
"message": "Element has children which are not allowed: button[tabindex]"
}
],
"all": [],
"none": [],
"impact": "critical",
"html": "<div class=\"filters\" role=\"tablist\" aria-label=\"Filters\">",
"target": [
".filters"
],
"failureSummary": "Fix any of the following:\n Element has children which are not allowed: button[tabindex]"
}
]
},
{
"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": "#7b8593",
"bgColor": "#ffffff",
"contrastRatio": 3.73,
"fontSize": "9.8pt (13px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"trust-bar\">",
"target": [
".trust-bar"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.73 (foreground color: #7b8593, background color: #ffffff, font size: 9.8pt (13px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>National Civic League</span>",
"target": [
".trust-logos > span:nth-child(1)"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.73 (foreground color: #7b8593, background color: #ffffff, font size: 9.8pt (13px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#7b8593",
"bgColor": "#ffffff",
"contrastRatio": 3.73,
"fontSize": "9.8pt (13px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"trust-bar\">",
"target": [
".trust-bar"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.73 (foreground color: #7b8593, background color: #ffffff, font size: 9.8pt (13px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>Legal Aid Alliance</span>",
"target": [
"span:nth-child(3)"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.73 (foreground color: #7b8593, background color: #ffffff, font size: 9.8pt (13px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#7b8593",
"bgColor": "#ffffff",
"contrastRatio": 3.73,
"fontSize": "9.8pt (13px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"trust-bar\">",
"target": [
".trust-bar"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.73 (foreground color: #7b8593, background color: #ffffff, font size: 9.8pt (13px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>Open Governance Institute</span>",
"target": [
".trust-logos > span:nth-child(5)"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.73 (foreground color: #7b8593, background color: #ffffff, font size: 9.8pt (13px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#7b8593",
"bgColor": "#ffffff",
"contrastRatio": 3.73,
"fontSize": "9.8pt (13px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<div class=\"trust-bar\">",
"target": [
".trust-bar"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 3.73 (foreground color: #7b8593, background color: #ffffff, font size: 9.8pt (13px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span>Civic Futures Fund</span>",
"target": [
"span:nth-child(7)"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 3.73 (foreground color: #7b8593, background color: #ffffff, font size: 9.8pt (13px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#b8934f",
"bgColor": "#ffffff",
"contrastRatio": 2.86,
"fontSize": "9.0pt (12px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<aside class=\"alerts\">",
"target": [
"aside"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 2.86 (foreground color: #b8934f, background color: #ffffff, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<span class=\"mono\" style=\"color:var(--gold-2)\">Hearing This Week</span>",
"target": [
".alert-item:nth-child(5) > .mono"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 2.86 (foreground color: #b8934f, background color: #ffffff, font size: 9.0pt (12px), font weight: normal). Expected contrast ratio of 4.5:1"
},
{
"any": [
{
"id": "color-contrast",
"data": {
"fgColor": "#5a6678",
"bgColor": "#e4e1d9",
"contrastRatio": 4.45,
"fontSize": "8.3pt (11px)",
"fontWeight": "normal",
"messageKey": null,
"expectedContrastRatio": "4.5:1",
"shadowColor": null
},
"relatedNodes": [
{
"html": "<header class=\"sticky\">",
"target": [
"header"
]
},
{
"html": "<div class=\"tracker\">",
"target": [
".tracker"
]
}
],
"impact": "serious",
"message": "Element has insufficient color contrast of 4.45 (foreground color: #5a6678, background color: #e4e1d9, font size: 8.3pt (11px), font weight: normal). Expected contrast ratio of 4.5:1"
}
],
"all": [],
"none": [],
"impact": "serious",
"html": "<p>Democracy in plain language \u2022 Est. 2014</p>",
"target": [
".brand > div:nth-child(2) > p"
],
"failureSummary": "Fix any of the following:\n Element has insufficient color contrast of 4.45 (foreground color: #5a6678, background color: #e4e1d9, font size: 8.3pt (11px), font weight: normal). Expected contrast ratio of 4.5:1"
}
]
}
],
"coverage": {
"contract": "main-document-vertical-scroll",
"complete": true,
"positions": [
{
"y": 0,
"height": 6260
},
{
"y": 576,
"height": 6260
},
{
"y": 1152,
"height": 6260
},
{
"y": 1728,
"height": 6260
},
{
"y": 2304,
"height": 6260
},
{
"y": 2880,
"height": 6260
},
{
"y": 3456,
"height": 6260
},
{
"y": 4032,
"height": 6260
},
{
"y": 4608,
"height": 6260
},
{
"y": 5184,
"height": 6260
},
{
"y": 5540,
"height": 6260
}
],
"scans": 12,
"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: "Contact", "About", "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: "Grassroots Organizing", "Legislative Updates", "Public Interest".
- **Content Depth:** Populate each section with **substantial, realistic text** (multiple sentences/paragraphs). Use authentic industry language and terminology like: "litigation", "civic participation", "legislative process".
- **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", "Get Legal Aid", "Sign Petition".
- **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: "representative finder".
- **SIDEBAR (Optional):** If your design includes a sidebar, populate it with **useful, relevant content**. Ideas: "volunteer opportunities", "research reports", "action alerts".
- **FOOTER:** Include a professional footer with invented contact details, copyright (current year), social media links, and standard links (Privacy, Terms).
- **MODERN WEB PATTERNS:** Include modern web patterns like testimonial cards, feature grids, or FAQ accordions where appropriate.