feat(IFK-9): interactive world map, charts, stats banner, timeline
All checks were successful
Deploy Internet for Kids / Build & Push (push) Successful in 9s
Deploy Internet for Kids / Deploy (push) Successful in 6s
Deploy Internet for Kids / Health Check (push) Successful in 2s
Deploy Internet for Kids / Smoke Tests (push) Successful in 4s
Deploy Internet for Kids / IndexNow Ping (push) Successful in 8s
Deploy Internet for Kids / Promote to Latest (push) Successful in 1s
Deploy Internet for Kids / Rollback (push) Has been skipped
Deploy Internet for Kids / Audit (push) Successful in 2s

- Add centralized data/countries.json with all 17 countries (EN/DE/FR)
- Add Leaflet choropleth world map with TopoJSON boundaries
- Add stats banner shortcode (enforced/passed/progress/guidelines counts)
- Add Chart.js charts (status donut, age limits bar, legislation timeline)
- Add Mermaid timeline of legislation milestones 2020-2026
- Refactor child-safety-map table to use data file (DRY)
- Update all 3 language articles (EN/DE/FR)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Christian Gick
2026-04-03 12:03:02 +03:00
parent 5e76d8745a
commit 308034e40d
9 changed files with 488 additions and 120 deletions

View File

@@ -0,0 +1,49 @@
{{ $lang := .Page.Language.Lang }}
{{ $countries := hugo.Data.countries }}
{{ $enforced := 0 }}{{ $passed := 0 }}{{ $progress := 0 }}{{ $guidelines := 0 }}
{{ range $countries }}
{{ if eq .status "enforced" }}{{ $enforced = add $enforced 1 }}
{{ else if eq .status "passed" }}{{ $passed = add $passed 1 }}
{{ else if eq .status "progress" }}{{ $progress = add $progress 1 }}
{{ else if eq .status "guidelines" }}{{ $guidelines = add $guidelines 1 }}
{{ end }}
{{ end }}
<style>
.ifk-stats {
display: grid; grid-template-columns: repeat(4, 1fr); gap: 1rem;
margin: 2rem 0; text-align: center;
}
.ifk-stat {
background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);
border-radius: 10px; padding: 1.25rem 0.75rem;
border: 1px solid #e2e8f0; transition: transform 0.15s;
}
.ifk-stat:hover { transform: translateY(-2px); }
.ifk-stat-num { font-size: 2rem; font-weight: 800; line-height: 1.1; }
.ifk-stat-label { font-size: 0.75rem; color: #64748b; margin-top: 0.25rem; font-weight: 500; text-transform: uppercase; letter-spacing: 0.05em; }
@media (max-width: 480px) {
.ifk-stats { grid-template-columns: repeat(2, 1fr); }
.ifk-stat-num { font-size: 1.5rem; }
}
</style>
<div class="ifk-stats">
<div class="ifk-stat">
<div class="ifk-stat-num" style="color:#1e40af">{{ $enforced }}</div>
<div class="ifk-stat-label">{{ if eq $lang "de" }}In Kraft{{ else if eq $lang "fr" }}En vigueur{{ else }}Enforced{{ end }}</div>
</div>
<div class="ifk-stat">
<div class="ifk-stat-num" style="color:#3b82f6">{{ $passed }}</div>
<div class="ifk-stat-label">{{ if eq $lang "de" }}Verabschiedet{{ else if eq $lang "fr" }}Adoptées{{ else }}Passed{{ end }}</div>
</div>
<div class="ifk-stat">
<div class="ifk-stat-num" style="color:#6366f1">{{ $progress }}</div>
<div class="ifk-stat-label">{{ if eq $lang "de" }}In Bearbeitung{{ else if eq $lang "fr" }}En cours{{ else }}In Progress{{ end }}</div>
</div>
<div class="ifk-stat">
<div class="ifk-stat-num" style="color:#8b5cf6">{{ $guidelines }}</div>
<div class="ifk-stat-label">{{ if eq $lang "de" }}Richtlinien{{ else if eq $lang "fr" }}Directives{{ else }}Guidelines{{ end }}</div>
</div>
</div>