CSS-only data visualization (charts, heat maps, progress bars) for political metrics on static websites
license
Apache-2.0
Political Data Visualization
🔴 AI FIRST Quality Principle
Apply the AI FIRST principle: never accept first-pass quality. Minimum 2 iterations. Read all output, improve every section. No shortcuts.
Purpose
Create compelling, accessible data visualizations using pure HTML/CSS (no JavaScript) to display political metrics, voting patterns, parliamentary activity, and democratic accountability indicators for riksdagsmonitor.
Core Principles
CSS-Only: No JavaScript frameworks - pure HTML/CSS for reliability and security
Accessibility First: WCAG 2.1 AA compliant, screen reader friendly
Semantic Markup: Use <table> with ARIA for complex data
Progressive Disclosure: Show summary, reveal details on interaction
Color-Blind Safe: Multiple visual cues beyond color (patterns, labels, icons)
Responsive Design: Adapt visualizations to mobile/tablet/desktop
Performance: Minimal CSS, no external libraries, fast rendering
<!-- Always include sr-only labels for data --><divclass="progress-bar"style="--value: 87%"><spanclass="sr-only">87% party cohesion</span></div><!-- Data tables for complex visualizations --><tableclass="data-table"role="table"><caption>MPs by Party Distribution</caption><thead><tr><thscope="col">Party</th><thscope="col">MPs</th><thscope="col">Percentage</th></tr></thead><tbody><tr><thscope="row">Socialdemokraterna (S)</th><td>107</td><td>30.7%</td></tr></tbody></table><!-- Hide visual chart from screen readers, show data table --><divaria-hidden="true"class="visual-chart">...</div>
Color Contrast
/* Ensure 4.5:1 contrast ratio minimum */.bar-label {
color: var(--light-text); /* #e0e0e0 on #0a0e27 = 12.6:1 ✅ */
}
/* Use patterns for color-blind accessibility */.bar-striped {
background-image: repeating-linear-gradient(
45deg,
transparent,
transparent 10px,
rgba(255,255,255,0.1) 10px,
rgba(255,255,255,0.1) 20px
);
}
<!-- ❌ BAD: Requires JavaScript library --><scriptsrc="https://cdn.example.com/charts.js"></script><canvasid="chart"></canvas><script>newChart(document.getElementById('chart'), {...});
</script><!-- ✅ GOOD: Pure CSS visualization --><divclass="bar-chart"role="img"aria-label="MPs by party"><!-- CSS-only bars --></div>
Anti-Pattern: Inaccessible Visualizations
<!-- ❌ BAD: No screen reader support --><divclass="donut"style="background: conic-gradient(...)"></div><!-- ✅ GOOD: Full accessibility --><divclass="donut"role="img"aria-label="Coalition: S 107, M 68, SD 73 MPs"><!-- Visual chart --></div><tableclass="sr-only"><caption>Coalition Distribution</caption><!-- Data table for screen readers --></table>
Remember
CSS-only - no JavaScript libraries
Accessibility mandatory - WCAG 2.1 AA, screen reader support
Semantic HTML - use <table> for data, proper ARIA roles
Responsive - adapt to mobile/tablet/desktop
Color-blind safe - use patterns, labels, icons beyond color
Performance - minimal CSS, fast rendering
Party colors - use official colors for Swedish parties
Progressive disclosure - summary view, details on interaction
Data tables - always provide for screen readers
Tooltip support - title attribute + CSS hover/focus