fix: Improve WCAG AA contrast ratios across all public pages

Apply the same contrast fixes from the homepage audit to 10 additional
pages. All changes are one shade darker within the same hue family:

- text-teal-600 → text-teal-700 (4.08:1 → 5.31:1)
- text-emerald-600 → text-emerald-700 (4.52:1 → 5.94:1)
- text-gray-500 → text-gray-600 on gray backgrounds (3.77:1 → 5.27:1)

Files: architecture, village-case-study, implementer, leader, timeline,
api-reference, koha, koha/transparency, gdpr, agent-lightning

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
TheFlow 2026-02-11 06:52:18 +13:00
parent ca2d9c09d2
commit 4a13e04aef
10 changed files with 42 additions and 42 deletions

View file

@ -50,12 +50,12 @@
<a href="#authentication" class="block py-2 px-3 text-sm text-gray-600 hover:text-gray-900 hover:bg-gray-100 rounded">Authentication</a>
<a href="#documents" class="block py-2 px-3 text-sm text-gray-600 hover:text-gray-900 hover:bg-gray-100 rounded">Documents</a>
<a href="#governance" class="block py-2 px-3 text-sm text-gray-600 hover:text-gray-900 hover:bg-gray-100 rounded font-semibold">Governance Services</a>
<a href="#governance" class="block py-2 px-3 pl-6 text-sm text-gray-500 hover:text-gray-900 hover:bg-gray-100 rounded">1. Classifier</a>
<a href="#governance" class="block py-2 px-3 pl-6 text-sm text-gray-500 hover:text-gray-900 hover:bg-gray-100 rounded">2. Validator</a>
<a href="#governance" class="block py-2 px-3 pl-6 text-sm text-gray-500 hover:text-gray-900 hover:bg-gray-100 rounded">3. BoundaryEnforcer</a>
<a href="#governance" class="block py-2 px-3 pl-6 text-sm text-gray-500 hover:text-gray-900 hover:bg-gray-100 rounded">4. Pressure Monitor</a>
<a href="#governance" class="block py-2 px-3 pl-6 text-sm text-gray-500 hover:text-gray-900 hover:bg-gray-100 rounded">5. Verifier</a>
<a href="#governance" class="block py-2 px-3 pl-6 text-sm text-gray-500 hover:text-gray-900 hover:bg-gray-100 rounded">6. AuditLogger</a>
<a href="#governance" class="block py-2 px-3 pl-6 text-sm text-gray-600 hover:text-gray-900 hover:bg-gray-100 rounded">1. Classifier</a>
<a href="#governance" class="block py-2 px-3 pl-6 text-sm text-gray-600 hover:text-gray-900 hover:bg-gray-100 rounded">2. Validator</a>
<a href="#governance" class="block py-2 px-3 pl-6 text-sm text-gray-600 hover:text-gray-900 hover:bg-gray-100 rounded">3. BoundaryEnforcer</a>
<a href="#governance" class="block py-2 px-3 pl-6 text-sm text-gray-600 hover:text-gray-900 hover:bg-gray-100 rounded">4. Pressure Monitor</a>
<a href="#governance" class="block py-2 px-3 pl-6 text-sm text-gray-600 hover:text-gray-900 hover:bg-gray-100 rounded">5. Verifier</a>
<a href="#governance" class="block py-2 px-3 pl-6 text-sm text-gray-600 hover:text-gray-900 hover:bg-gray-100 rounded">6. AuditLogger</a>
<a href="#admin" class="block py-2 px-3 text-sm text-gray-600 hover:text-gray-900 hover:bg-gray-100 rounded">Admin</a>
<a href="#errors" class="block py-2 px-3 text-sm text-gray-600 hover:text-gray-900 hover:bg-gray-100 rounded">Error Codes</a>
</nav>
@ -822,8 +822,8 @@
<table class="w-full">
<thead class="bg-gray-50 border-b">
<tr>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase">Code</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase">Description</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-600 uppercase">Code</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-600 uppercase">Description</th>
</tr>
</thead>
<tbody class="divide-y divide-gray-200">

View file

@ -163,15 +163,15 @@
</div>
<div class="grid grid-cols-1 md:grid-cols-3 gap-4 mb-4">
<div class="flex items-start">
<svg class="w-5 h-5 text-emerald-600 mr-2 mt-0.5 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z"/></svg>
<svg class="w-5 h-5 text-emerald-700 mr-2 mt-0.5 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z"/></svg>
<span class="text-gray-700 text-sm" data-i18n="defence_in_depth.layer2_strength1"></span>
</div>
<div class="flex items-start">
<svg class="w-5 h-5 text-emerald-600 mr-2 mt-0.5 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z"/></svg>
<svg class="w-5 h-5 text-emerald-700 mr-2 mt-0.5 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z"/></svg>
<span class="text-gray-700 text-sm" data-i18n="defence_in_depth.layer2_strength2"></span>
</div>
<div class="flex items-start">
<svg class="w-5 h-5 text-emerald-600 mr-2 mt-0.5 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z"/></svg>
<svg class="w-5 h-5 text-emerald-700 mr-2 mt-0.5 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z"/></svg>
<span class="text-gray-700 text-sm" data-i18n="defence_in_depth.layer2_strength3"></span>
</div>
</div>
@ -487,15 +487,15 @@
<p class="text-gray-600 text-sm mb-3">Where the framework started: six services validate every AI action before execution.</p>
<ul class="text-gray-700 text-sm space-y-2">
<li class="flex items-start">
<span class="text-teal-600 mr-2">&#10003;</span>
<span class="text-teal-700 mr-2">&#10003;</span>
<span>Response cannot reach user without governance validation</span>
</li>
<li class="flex items-start">
<span class="text-teal-600 mr-2">&#10003;</span>
<span class="text-teal-700 mr-2">&#10003;</span>
<span>Values decisions deferred to humans</span>
</li>
<li class="flex items-start">
<span class="text-teal-600 mr-2">&#10003;</span>
<span class="text-teal-700 mr-2">&#10003;</span>
<span>Audit trail for every decision</span>
</li>
</ul>
@ -507,15 +507,15 @@
<p class="text-gray-600 text-sm mb-3">Where the research is going: governance inside the training loop, not post-hoc filtering.</p>
<ul class="text-gray-700 text-sm space-y-2">
<li class="flex items-start">
<span class="text-teal-600 mr-2">&#10003;</span>
<span class="text-teal-700 mr-2">&#10003;</span>
<span>BoundaryEnforcer validates every training batch before forward pass</span>
</li>
<li class="flex items-start">
<span class="text-teal-600 mr-2">&#10003;</span>
<span class="text-teal-700 mr-2">&#10003;</span>
<span>Cross-tenant data rejected at the training step, not after</span>
</li>
<li class="flex items-start">
<span class="text-teal-600 mr-2">&#10003;</span>
<span class="text-teal-700 mr-2">&#10003;</span>
<span>Consent verified per content item before inclusion</span>
</li>
</ul>
@ -900,7 +900,7 @@
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/>
</svg>
<h3 class="text-lg font-semibold text-gray-700 mb-2" data-i18n="interactive.panel_default_title"></h3>
<p class="text-sm text-gray-500 max-w-md" data-i18n="interactive.panel_default_text"></p>
<p class="text-sm text-gray-600 max-w-md" data-i18n="interactive.panel_default_text"></p>
</div>
</div>
</div>
@ -984,19 +984,19 @@
</p>
<ul class="space-y-2 text-gray-700 text-sm">
<li class="flex items-start">
<svg class="w-4 h-4 text-teal-600 mr-2 mt-0.5" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z"/></svg>
<svg class="w-4 h-4 text-teal-700 mr-2 mt-0.5" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z"/></svg>
<span>Governance during training (Not-Separateness applied to optimisation)</span>
</li>
<li class="flex items-start">
<svg class="w-4 h-4 text-teal-600 mr-2 mt-0.5" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z"/></svg>
<svg class="w-4 h-4 text-teal-700 mr-2 mt-0.5" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z"/></svg>
<span>Two-model architecture (3B fast + 8B reasoning) under unified governance</span>
</li>
<li class="flex items-start">
<svg class="w-4 h-4 text-teal-600 mr-2 mt-0.5" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z"/></svg>
<svg class="w-4 h-4 text-teal-700 mr-2 mt-0.5" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z"/></svg>
<span>Per-tenant LoRA adapters with consent-verified training data</span>
</li>
<li class="flex items-start">
<svg class="w-4 h-4 text-teal-600 mr-2 mt-0.5" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z"/></svg>
<svg class="w-4 h-4 text-teal-700 mr-2 mt-0.5" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z"/></svg>
<span>Thirteen wisdom traditions available for Layer 3 adoption</span>
</li>
</ul>

View file

@ -41,7 +41,7 @@
<div class="mb-12">
<h1 class="text-4xl md:text-5xl font-bold text-gray-900 mb-4" data-i18n="header.title">GDPR Compliance</h1>
<p class="text-lg text-gray-600" data-i18n="header.subtitle">How Tractatus approaches data protection through architectural constraints</p>
<p class="text-sm text-gray-500 mt-2" data-i18n="header.last_updated">Last updated: October 28, 2025</p>
<p class="text-sm text-gray-600 mt-2" data-i18n="header.last_updated">Last updated: October 28, 2025</p>
</div>
<!-- Introduction -->

View file

@ -1472,7 +1472,7 @@ for user_message in conversation:
<!-- Additional Governance Services -->
<div class="bg-white rounded-lg p-6 shadow-md">
<div class="flex items-start mb-3">
<span class="text-3xl mr-3 text-teal-600">
<span class="text-3xl mr-3 text-teal-700">
<svg class="w-8 h-8" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"/></svg>
</span>
<div>

View file

@ -26,7 +26,7 @@
<div class="inline-flex items-center justify-center w-20 h-20 rounded-full bg-gradient-to-br from-purple-600 to-indigo-600 text-white text-4xl mb-6 shadow-lg"></div>
<h1 class="text-4xl md:text-5xl font-bold text-gray-900 mb-4" data-i18n="hero.title">Agent Lightning Integration</h1>
<p class="text-xl text-gray-600 max-w-3xl mx-auto leading-relaxed" data-i18n="hero.subtitle">Governance + Performance: Can safety boundaries persist through reinforcement learning optimization?</p>
<p class="text-sm text-gray-500 mt-4"><strong data-i18n="hero.status">Status:</strong> <span data-i18n="hero.status_value">Operational (CPU baseline established)</span> | <strong data-i18n="hero.integration_date">Integration Date:</strong> <span data-i18n="hero.integration_date_value">November 2025</span></p>
<p class="text-sm text-gray-600 mt-4"><strong data-i18n="hero.status">Status:</strong> <span data-i18n="hero.status_value">Operational (CPU baseline established)</span> | <strong data-i18n="hero.integration_date">Integration Date:</strong> <span data-i18n="hero.integration_date_value">November 2025</span></p>
</div>
<!-- What is Agent Lightning? -->

View file

@ -248,7 +248,7 @@
class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:border-blue-600 focus:outline-none"
aria-describedby="public-name-help"
>
<p id="public-name-help" class="text-xs text-gray-500 mt-1" data-i18n="form.public_name_help">Can be your real name, organization, or pseudonym</p>
<p id="public-name-help" class="text-xs text-gray-600 mt-1" data-i18n="form.public_name_help">Can be your real name, organization, or pseudonym</p>
</div>
</div>

View file

@ -56,7 +56,7 @@
Full visibility into donations received and how we allocate them to support the Tractatus Framework.
</p>
<div class="flex items-center justify-center gap-4 mt-6">
<p class="text-sm text-gray-500" id="last-updated">
<p class="text-sm text-gray-600" id="last-updated">
Last updated: Loading...
</p>
<button id="export-csv" class="text-sm bg-white border border-gray-300 text-gray-700 px-4 py-2 rounded-md hover:bg-gray-50 transition flex items-center gap-2">

View file

@ -499,7 +499,7 @@
<div class="border border-gray-300 rounded-lg mb-4">
<button type="button" class="accordion-button bg-gray-50 p-5 flex justify-between items-center" data-accordion="arch-layers" aria-expanded="false" aria-controls="arch-layers-content" id="arch-layers-button">
<h3 class="font-semibold text-gray-900" data-i18n="sections.architectural_approach.three_layer_title">Three-Layer Architecture</h3>
<svg id="arch-layers-icon" class="accordion-icon w-5 h-5 text-gray-500" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<svg id="arch-layers-icon" class="accordion-icon w-5 h-5 text-gray-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/>
</svg>
</button>
@ -531,7 +531,7 @@
<div class="border border-gray-300 rounded-lg">
<button type="button" class="accordion-button bg-gray-50 p-5 flex justify-between items-center" data-accordion="services" aria-expanded="false" aria-controls="services-content" id="services-button">
<h3 class="font-semibold text-gray-900" data-i18n="sections.architectural_approach.services_title">Six Governance Services</h3>
<svg id="services-icon" class="accordion-icon w-5 h-5 text-gray-500" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<svg id="services-icon" class="accordion-icon w-5 h-5 text-gray-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/>
</svg>
</button>
@ -809,7 +809,7 @@
<div class="border border-gray-300 rounded-lg">
<button type="button" class="accordion-button bg-gray-50 p-5 flex justify-between items-center" data-accordion="validation" aria-expanded="false" aria-controls="validation-content" id="validation-button">
<h3 class="font-semibold text-gray-900" data-i18n="sections.development_status.validation_title">Validated vs. Not Validated</h3>
<svg id="validation-icon" class="accordion-icon w-5 h-5 text-gray-500" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<svg id="validation-icon" class="accordion-icon w-5 h-5 text-gray-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/>
</svg>
</button>
@ -836,7 +836,7 @@
<div class="border border-gray-300 rounded-lg">
<button type="button" class="accordion-button bg-gray-50 p-5 flex justify-between items-center" data-accordion="euaiact" aria-expanded="false" aria-controls="euaiact-content" id="euaiact-button">
<h3 class="font-semibold text-gray-900" data-i18n="sections.eu_ai_act.article_14_title">Regulation 2024/1689, Article 14: Human Oversight</h3>
<svg id="euaiact-icon" class="accordion-icon w-5 h-5 text-gray-500" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<svg id="euaiact-icon" class="accordion-icon w-5 h-5 text-gray-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/>
</svg>
</button>
@ -872,7 +872,7 @@
<div class="border border-gray-300 rounded-lg">
<button type="button" class="accordion-button bg-gray-50 p-5 flex justify-between items-center" data-accordion="research" aria-expanded="false" aria-controls="research-content" id="research-button">
<h3 class="font-semibold text-gray-900" data-i18n="sections.research_foundations.org_theory_title">Organisational Theory & Philosophical Basis</h3>
<svg id="research-icon" class="accordion-icon w-5 h-5 text-gray-500" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<svg id="research-icon" class="accordion-icon w-5 h-5 text-gray-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/>
</svg>
</button>
@ -922,7 +922,7 @@
<div class="border border-gray-300 rounded-lg">
<button type="button" class="accordion-button bg-gray-50 p-5 flex justify-between items-center" data-accordion="scope" aria-expanded="false" aria-controls="scope-content" id="scope-button">
<h3 class="font-semibold text-gray-900" data-i18n="sections.scope_limitations.title">What This Is Not • What It Offers</h3>
<svg id="scope-icon" class="accordion-icon w-5 h-5 text-gray-500" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<svg id="scope-icon" class="accordion-icon w-5 h-5 text-gray-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"/>
</svg>
</button>

View file

@ -173,7 +173,7 @@
<div class="timeline-dot bg-teal-500 dot-teal"></div>
<div class="md:w-5/12 md:mr-auto md:pr-8">
<div class="bg-white rounded-xl shadow-md p-6 border border-gray-200">
<span class="text-xs font-semibold text-teal-600 uppercase tracking-wider">October 16-19, 2025</span>
<span class="text-xs font-semibold text-teal-700 uppercase tracking-wider">October 16-19, 2025</span>
<h3 class="text-xl font-bold text-gray-900 mt-1 mb-3">Internationalisation</h3>
<p class="text-gray-700 text-sm mb-3">
Full i18n support was added across all pages using a custom lightweight system (no framework dependency). Initial languages: English, German, French, with te reo M&#257;ori added later via DeepL. The language selection includes the Tino Rangatiratanga flag for M&#257;ori &mdash; a deliberate choice reflecting the project's commitment to indigenous data sovereignty over national symbolism.
@ -238,7 +238,7 @@
<div class="timeline-dot bg-emerald-500 dot-emerald"></div>
<div class="md:w-5/12 md:mr-auto md:pr-8">
<div class="bg-white rounded-xl shadow-md p-6 border border-gray-200 border-l-4 border-l-emerald-500">
<span class="text-xs font-semibold text-emerald-600 uppercase tracking-wider">December 2025</span>
<span class="text-xs font-semibold text-emerald-700 uppercase tracking-wider">December 2025</span>
<h3 class="text-xl font-bold text-gray-900 mt-1 mb-3">Village Case Study</h3>
<p class="text-gray-700 text-sm mb-3">
The Village platform &mdash; a community-governed digital space &mdash; became the primary production deployment of Tractatus governance. Home AI, the platform's locally-scoped language model, applies all six governance services to every user interaction: RAG-based help, document OCR, story assistance, and AI memory transparency.
@ -246,7 +246,7 @@
<p class="text-gray-700 text-sm">
A formal case study was published documenting the deployment, including honest limitations: early-stage federated deployment, self-reported metrics, operator-developer overlap. Independent validation was scheduled for 2026.
</p>
<a href="/village-case-study.html" class="inline-block mt-3 text-sm text-emerald-600 hover:text-emerald-700 font-medium">Read the case study &rarr;</a>
<a href="/village-case-study.html" class="inline-block mt-3 text-sm text-emerald-700 hover:text-emerald-800 font-medium">Read the case study &rarr;</a>
</div>
</div>
</div>
@ -306,11 +306,11 @@
<div class="text-sm text-gray-600 mt-1">Governance services</div>
</div>
<div>
<div class="text-3xl font-bold text-teal-600">5</div>
<div class="text-3xl font-bold text-teal-700">5</div>
<div class="text-sm text-gray-600 mt-1">Languages supported</div>
</div>
<div>
<div class="text-3xl font-bold text-emerald-600">3</div>
<div class="text-3xl font-bold text-emerald-700">3</div>
<div class="text-sm text-gray-600 mt-1">Paper editions</div>
</div>
</div>

View file

@ -271,7 +271,7 @@
<div class="bg-white rounded-xl shadow-md p-6">
<div class="flex items-center mb-4">
<div class="w-12 h-12 rounded-lg bg-teal-100 flex items-center justify-center mr-4">
<svg class="w-6 h-6 text-teal-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<svg class="w-6 h-6 text-teal-700" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8.228 9c.549-1.165 2.03-2 3.772-2 2.21 0 4 1.343 4 3 0 1.4-1.278 2.575-3.006 2.907-.542.104-.994.54-.994 1.093m0 3h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/>
</svg>
</div>
@ -290,7 +290,7 @@
<div class="bg-white rounded-xl shadow-md p-6">
<div class="flex items-center mb-4">
<div class="w-12 h-12 rounded-lg bg-teal-100 flex items-center justify-center mr-4">
<svg class="w-6 h-6 text-teal-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<svg class="w-6 h-6 text-teal-700" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/>
</svg>
</div>
@ -309,7 +309,7 @@
<div class="bg-white rounded-xl shadow-md p-6">
<div class="flex items-center mb-4">
<div class="w-12 h-12 rounded-lg bg-teal-100 flex items-center justify-center mr-4">
<svg class="w-6 h-6 text-teal-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<svg class="w-6 h-6 text-teal-700" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z"/>
</svg>
</div>
@ -329,7 +329,7 @@
<div class="bg-white rounded-xl shadow-md p-6">
<div class="flex items-center mb-4">
<div class="w-12 h-12 rounded-lg bg-teal-100 flex items-center justify-center mr-4">
<svg class="w-6 h-6 text-teal-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<svg class="w-6 h-6 text-teal-700" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"/>
</svg>
</div>