Skip to main content

political-data-visualization

CSS-only data visualization (charts, heat maps, progress bars) for political metrics on static websites

Informações da origem

Repositório
Hack23/riksdagsmonitor
Última atividade na origem
16 de abril de 2026 às 09:31
Idioma detectado do SKILL.md
inglês
Estrelas
12
Forks
4

Opções de instalação

Por padrão, está selecionado o prompt que primeiro revisa a origem. Você pode mudar para um comando direto ou baixar uma cópia local.

Revise os arquivos de origem

Leia o SKILL.md e os arquivos complementares exibidos pelo SkillsMP antes de decidir se vai instalar.

Exibindo SKILL.md

SKILL.md
Instruções da origem · Visualização somente leitura
name
political-data-visualization
description
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 1. **CSS-Only**: No JavaScript frameworks - pure HTML/CSS for reliability and security 2. **Accessibility First**: WCAG 2.1 AA compliant, screen reader friendly 3. **Semantic Markup**: Use `<table>` with ARIA for complex data 4. **Progressive Disclosure**: Show summary, reveal details on interaction 5. **Color-Blind Safe**: Multiple visual cues beyond color (patterns, labels, icons) 6. **Responsive Design**: Adapt visualizations to mobile/tablet/desktop 7. **Performance**: Minimal CSS, no external libraries, fast rendering ## Visualization Types ### Progress Bars (Voting Discipline, Party Cohesion) ```css /* Semantic HTML */ <div class="progress" role="progressbar" aria-valuenow="87" aria-valuemin="0" aria-valuemax="100"> <span class="progress-label">Party Cohesion: 87%</span> <div class="progress-bar" style="--value: 87%"></div> </div> /* CSS implementation */ .progress { position: relative; width: 100%; height: 2rem; background: var(--dark-bg); border-radius: 0.5rem; overflow: hidden; border: 2px solid var(--primary-cyan); } .progress-bar { height: 100%; width: var(--value); background: linear-gradient(90deg, var(--primary-magenta), var(--primary-cyan)); transition: width 0.5s ease-in-out; } .progress-label { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: var(--light-text); font-weight: bold; z-index: 1; } ``` ### Bar Charts (MPs by Party, Committee Activity) ```css /* Horizontal bar chart */ <div class="bar-chart"> <div class="bar-row"> <span class="bar-label">S (Social Democrats)</span> <div class="bar" style="--value: 30%; --color: var(--party-s)"> <span class="bar-value">107 MPs</span> </div> </div> <div class="bar-row"> <span class="bar-label">M (Moderates)</span> <div class="bar" style="--value: 19%; --color: var(--party-m)"> <span class="bar-value">68 MPs</span> </div> </div> </div> /* CSS */ .bar-chart { display: grid; gap: 1rem; } .bar-row { display: grid; grid-template-columns: 200px 1fr; align-items: center; gap: 1rem; } .bar { position: relative; height: 2.5rem; width: var(--value); max-width: 100%; background: var(--color); border-radius: 0.25rem; display: flex; align-items: center; padding: 0 0.5rem; } .bar-value { color: white; font-weight: bold; font-size: 0.875rem; } /* Responsive */ @media (max-width: 767px) { .bar-row { grid-template-columns: 1fr; } .bar-label { font-size: 0.875rem; } } ``` ### Heat Maps (Voting Patterns, Committee Attendance) ```css /* Grid-based heat map */ <div class="heat-map"> <div class="heat-cell" style="--intensity: 1.0" title="100% attendance"> <span class="sr-only">100% attendance</span> </div> <div class="heat-cell" style="--intensity: 0.75" title="75% attendance"> <span class="sr-only">75% attendance</span> </div> <div class="heat-cell" style="--intensity: 0.5" title="50% attendance"> <span class="sr-only">50% attendance</span> </div> </div> /* CSS */ .heat-map { display: grid; grid-template-columns: repeat(auto-fill, minmax(2rem, 1fr)); gap: 0.25rem; } .heat-cell { aspect-ratio: 1; background: color-mix( in srgb, var(--primary-magenta) calc(var(--intensity) * 100%), var(--dark-bg) ); border: 1px solid var(--mid-bg); border-radius: 0.25rem; cursor: help; transition: transform 0.2s; } .heat-cell:hover, .heat-cell:focus { transform: scale(1.2); z-index: 1; outline: 2px solid var(--primary-cyan); } ``` ### Donut Charts (Coalition Breakdown, Vote Distribution) ```css /* CSS-only donut chart using conic-gradient */ <div class="donut-chart" style=" --s: 107; --m: 68; --sd: 73; --total: 349; --s-pct: calc(var(--s) / var(--total) * 100); --m-pct: calc(var(--m) / var(--total) * 100); --sd-pct: calc(var(--sd) / var(--total) * 100); " role="img" aria-label="Coalition distribution: S 107, M 68, SD 73 of 349 MPs"> <div class="donut-hole"> <span class="donut-total">349</span> <span class="donut-label">MPs</span> </div> </div> /* CSS */ .donut-chart { width: 200px; height: 200px; border-radius: 50%; background: conic-gradient( from 0deg, var(--party-s) 0% var(--s-pct), var(--party-m) var(--s-pct) calc(var(--s-pct) + var(--m-pct)), var(--party-sd) calc(var(--s-pct) + var(--m-pct)) 100% ); display: flex; align-items: center; justify-content: center; position: relative; } .donut-hole { width: 60%; height: 60%; border-radius: 50%; background: var(--dark-bg); display: flex; flex-direction: column; align-items: center; justify-content: center; } .donut-total { font-size: 2rem; font-weight: bold; color: var(--primary-cyan); } .donut-label { font-size: 0.875rem; color: var(--light-text); } ``` ### Timeline Visualizations (Legislative Process, MP Career) ```css /* Vertical timeline */ <ol class="timeline"> <li class="timeline-item"> <time datetime="2024-09-15">2024-09-15</time> <div class="timeline-content"> <h3>Motion Submitted</h3> <p>MP submitted motion to committee</p> </div> </li> <li class="timeline-item"> <time datetime="2024-10-20">2024-10-20</time> <div class="timeline-content"> <h3>Committee Review</h3> <p>Committee issued report</p> </div> </li> </ol> /* CSS */ .timeline { list-style: none; padding: 0; margin: 0; position: relative; } .timeline::before { content: ''; position: absolute; left: 2rem; top: 0; bottom: 0; width: 2px; background: var(--primary-cyan); } .timeline-item { position: relative; padding-left: 5rem; padding-bottom: 2rem; } .timeline-item::before { content: ''; position: absolute; left: 1.5rem; top: 0.25rem; width: 1rem; height: 1rem; border-radius: 50%; background: var(--primary-magenta); border: 3px solid var(--dark-bg); box-shadow: 0 0 0 3px var(--primary-cyan); } .timeline-item time { position: absolute; left: 0; top: 0; font-size: 0.875rem; color: var(--primary-cyan); } ``` ## Party Color Palette ```css :root { /* Swedish political parties (official colors) */ --party-s: #E8112d; /* Socialdemokraterna (Red) */ --party-m: #52BDEC; /* Moderaterna (Blue) */ --party-sd: #DDDD00; /* Sverigedemokraterna (Yellow) */ --party-c: #009933; /* Centerpartiet (Green) */ --party-v: #DA291C; /* Vänsterpartiet (Red) */ --party-kd: #000077; /* Kristdemokraterna (Dark Blue) */ --party-l: #006AB3; /* Liberalerna (Blue) */ --party-mp: #83CF39; /* Miljöpartiet (Green) */ } ``` ## Accessibility Requirements ### Screen Reader Support ```html <!-- Always include sr-only labels for data --> <div class="progress-bar" style="--value: 87%"> <span class="sr-only">87% party cohesion</span> </div> <!-- Data tables for complex visualizations --> <table class="data-table" role="table"> <caption>MPs by Party Distribution</caption> <thead> <tr> <th scope="col">Party</th> <th scope="col">MPs</th> <th scope="col">Percentage</th> </tr> </thead> <tbody> <tr> <th scope="row">Socialdemokraterna (S)</th> <td>107</td> <td>30.7%</td> </tr> </tbody> </table> <!-- Hide visual chart from screen readers, show data table --> <div aria-hidden="true" class="visual-chart">...</div> ``` ### Color Contrast ```css /* 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 ); } ``` ### Keyboard Navigation ```css /* Make interactive elements focusable */ .heat-cell { cursor: pointer; position: relative; } .heat-cell:focus { outline: 2px solid var(--primary-cyan); outline-offset: 2px; z-index: 1; } /* Tooltip on focus/hover */ .heat-cell::after { content: attr(title); position: absolute; bottom: 100%; left: 50%; transform: translateX(-50%);
Ver no GitHub
Este SKILL.md e muito grande, entao o SkillsMP mostra aqui apenas a primeira secao. Ver no GitHub