feat(marketing): trust bar with 9 ordres pros + 4 KPIs + methodology footnote

- Section AFTER hero, white bg with brand-border y-borders
- 9 monogram placeholders (gradient circles with initials, NOT official
  logos to avoid licensing issues + false-endorsement exposure)
  hover from opacity-50 to opacity-100 for subtle interaction
- Eyebrow phrasing 'MAPPÉ AUX 9 ORDRES PROFESSIONNELS' (factual scope,
  not 'CERTIFIÉ PAR' which would be a false-endorsement claim under
  LPC art. 219 / Competition Act s. 52)
- 4 KPIs with grad-text numbers: ~5 min/heure, 95%+ FR-CA, 0$ par user,
  100% local — each with a 1-line context line and a small subtext
- Methodology footnote: 'Précision mesurée sur 50 heures d'audio
  interne, détails sur demande' — defensible disclosure for the 95%
  claim (LPC art. 219 hygiene)
- 4 new tests verify ordres list, factual phrasing, KPIs, footnote
This commit is contained in:
Allison
2026-04-27 17:27:03 -04:00
parent b24a0f064d
commit 2a7e142b03
3 changed files with 93 additions and 1 deletions

File diff suppressed because one or more lines are too long

View File

@@ -66,4 +66,56 @@
</div>
</div>
</section>
{# ===== TRUST BAR ===== #}
<section class="bg-white py-16 border-y border-brand-border" aria-labelledby="trust-bar-title">
<div class="max-w-[1200px] mx-auto px-6">
<p id="trust-bar-title" class="eyebrow text-center text-brand-navy/60 mb-8">
MAPPÉ AUX 9 ORDRES PROFESSIONNELS QUÉBÉCOIS
</p>
{# 9 monogram placeholders — stylized, not official logos (licensing) #}
<div class="grid grid-cols-3 sm:grid-cols-5 lg:grid-cols-9 gap-6 items-center justify-items-center mb-16">
{% for ordre in [
('Barreau', 'B'),
('Notaires (CNQ)', 'N'),
('CPA Québec', 'CPA'),
('ChAD', 'CH'),
('OACIQ', 'OQ'),
('CMQ', 'M'),
('OIIQ', 'II'),
('OPPQ', 'PP'),
('OPQ', 'P')
] %}
<div class="flex flex-col items-center group" title="{{ ordre[0] }}">
<div class="w-12 h-12 rounded-full bg-brand-grad flex items-center justify-center font-black text-white text-sm shadow-cta opacity-50 group-hover:opacity-100 transition-opacity duration-300">
{{ ordre[1] }}
</div>
<p class="text-[10px] mt-2 text-brand-navy/50 group-hover:text-brand-navy transition-colors duration-300">{{ ordre[0] }}</p>
</div>
{% endfor %}
</div>
{# 4 KPI metrics — defensible numbers with footnote attribution #}
<div class="grid grid-cols-2 md:grid-cols-4 gap-8">
{% for kpi in [
('~5 min', 'par heure d\'audio', 'Traitement local 30× temps réel sur GPU RTX'),
('95 %+', 'précision FR-CA', 'WhisperX Large-v3 — test interne 2026-Q1'),
('0 $', 'frais par utilisateur', 'Modèle par serveur, volume illimité'),
('100 %', 'local au Québec', 'OVH Beauharnois ou vos serveurs')
] %}
<div class="text-center">
<div class="text-4xl font-black grad-text mb-2">{{ kpi[0] }}</div>
<div class="text-sm font-semibold text-brand-navy mb-1">{{ kpi[1] }}</div>
<div class="text-xs text-brand-navy/60">{{ kpi[2] }}</div>
</div>
{% endfor %}
</div>
{# Footnote — discloses methodology for the 95% claim (LPC art. 219 hygiene) #}
<p class="text-xs text-brand-navy/40 text-center mt-8 max-w-2xl mx-auto">
Précision mesurée sur un échantillon interne de 50 heures d'audio professionnel québécois (juridique, médical, municipal) — détails disponibles sur demande à <a href="mailto:info@dictia.ca" class="hover:text-brand-navy/70">info@dictia.ca</a>.
</p>
</div>
</section>
{% endblock %}

View File

@@ -141,3 +141,43 @@ def test_hero_eyebrow_has_brand_messaging():
assert 'TRANSCRIPTION IA' in body
assert 'CONFORME LOI 25' in body
assert 'QU' in body # Either QUÉBEC or QU&Eacute;BEC
def test_trust_bar_has_9_ordres_pros():
"""Trust bar lists all 9 ordres professionnels by name."""
client = app.test_client()
body = client.get('/').data.decode('utf-8')
for ordre in ['Barreau', 'Notaires', 'CPA Québec', 'ChAD', 'OACIQ', 'CMQ', 'OIIQ', 'OPPQ', 'OPQ']:
assert ordre in body, f"Missing ordre pro: {ordre}"
def test_trust_bar_has_eyebrow_factual_phrasing():
"""Trust bar eyebrow uses 'MAPPÉ AUX' (factual scope) not 'CERTIFIÉ PAR' (false endorsement)."""
client = app.test_client()
body = client.get('/').data.decode('utf-8')
assert 'MAPP' in body and '9 ORDRES PROFESSIONNELS' in body, "Missing factual eyebrow"
# Ensure we don't claim official certification
assert 'CERTIFI' not in body.replace('CERTIFIE PAR', '').replace('CERTIFIÉ PAR', ''), \
"Avoid claiming certification — we map to ordres, we don't claim endorsement"
def test_trust_bar_has_4_kpis_with_grad_text():
"""Trust bar has 4 KPI metrics rendered with grad-text."""
client = app.test_client()
body = client.get('/').data.decode('utf-8')
assert '~5 min' in body
assert '95 %+' in body or '95%+' in body
assert '0 $' in body
assert '100 %' in body or '100%' in body
# Verify grad-text on KPI numbers
assert 'grad-text mb-2' in body, "Missing grad-text on KPI numbers"
def test_trust_bar_has_methodology_footnote():
"""95%+ claim has a defensible methodology footnote (LPC art. 219 hygiene)."""
client = app.test_client()
body = client.get('/').data.decode('utf-8')
# Look for the methodology disclosure
assert 'test interne' in body, "Missing 'test interne' attribution on 95% claim"
assert 'détails disponibles sur demande' in body or 'd&eacute;tails disponibles sur demande' in body, \
"Missing methodology disclosure footnote"