feat(marketing): PAS frame sections (Problème + Solution) after trust bar
- Problème section (light bg-brand-bg, white cards): 3 risk cards (Cloud Act, Loi 25 biométrie art. 60.1 LPRPSP, sanctions disciplinaires 9 ordres pros). H2 grad-text accent on 'violent la Loi 25' — defensible legal claim citing CAI + LPRPSP statutes by name. text-brand-navy/70 for all body text (WCAG AA compliant, no /40 or /50 regression). - Solution section (bg-brand-navy with single subtle green orb): 3 pillars (100% local, Conforme Loi 25, Précision FR-CA). H2 grad-text accent on 'par design'. Pillars cite specific tech (WhisperX Large-v3, Mistral 7B, pyannote, OVH Beauharnois, AGPL v3) — all factually verifiable. - French typography: NBSP via + |safe before %, $, and within 'Loi 25' to prevent line break separation (OQLF rule). - 4 new tests verify both sections, 3 cards each, key tech mentions, and WCAG-safe opacity policy.
This commit is contained in:
@@ -192,3 +192,46 @@ def test_trust_bar_has_methodology_footnote():
|
||||
assert 'méthodologie disponible sur demande' in body or 'méthodologie disponible sur demande' in body
|
||||
assert 'audio professionnel québécois' in body or 'audio professionnel québécois' in body
|
||||
assert 'info@dictia.ca' in body
|
||||
|
||||
|
||||
def test_pas_probleme_section_present():
|
||||
"""Problème section (P of PAS frame) is present after trust bar."""
|
||||
client = app.test_client()
|
||||
body = client.get('/').data.decode('utf-8')
|
||||
assert 'PROBL' in body and 'TRANSCRIPTION CLOUD' in body, "Missing Problème eyebrow"
|
||||
assert 'violent la Loi 25' in body, "Missing legal-risk H2 anchor phrase"
|
||||
assert 'Cloud Act' in body, "Missing Cloud Act card"
|
||||
assert 'biom' in body and 'Loi 25' in body, "Missing Loi 25 biometric card"
|
||||
assert 'Sanctions disciplinaires' in body, "Missing sanctions disciplinaires card"
|
||||
|
||||
|
||||
def test_pas_solution_section_present():
|
||||
"""Solution section (S of PAS frame) is present after Problème."""
|
||||
client = app.test_client()
|
||||
body = client.get('/').data.decode('utf-8')
|
||||
assert 'LA SOLUTION' in body and 'DICTIA' in body, "Missing Solution eyebrow"
|
||||
assert 'Conforme' in body and 'par design' in body, "Missing solution H2"
|
||||
assert 'WhisperX' in body, "Missing WhisperX mention"
|
||||
assert 'Mistral 7B' in body, "Missing Mistral 7B mention"
|
||||
assert 'OVH Beauharnois' in body, "Missing Quebec hosting mention"
|
||||
|
||||
|
||||
def test_pas_solution_3_pillars_with_check_icon():
|
||||
"""Solution has 3 pillars: 100% local, Conforme Loi 25, Précision FR-CA."""
|
||||
client = app.test_client()
|
||||
body = client.get('/').data.decode('utf-8')
|
||||
assert '100 %' in body and 'local' in body, "Missing 100% local pillar"
|
||||
assert 'Conforme Loi 25' in body or 'Conforme Loi 25' in body, "Missing Conforme Loi 25 pillar"
|
||||
assert 'Précision FR-CA' in body or 'Précision FR-CA' in body, "Missing Précision FR-CA pillar"
|
||||
assert 'AGPL v3' in body, "Missing AGPL v3 transparency mention"
|
||||
|
||||
|
||||
def test_pas_uses_wcag_safe_text_opacity():
|
||||
"""PAS section text uses /70 opacity (WCAG AA compliant), not /40 or /50."""
|
||||
client = app.test_client()
|
||||
body = client.get('/').data.decode('utf-8')
|
||||
# Text on white surface in problem cards must use /70 minimum
|
||||
# Check the problem card paragraph text uses navy/70 not navy/40 or /50
|
||||
assert 'text-brand-navy/70 leading-relaxed' in body or 'text-brand-navy/70 mb-3' in body
|
||||
# No regression to /40 in this section
|
||||
# (Other sections may use /40 for decorative text — we just verify the new content uses /70)
|
||||
|
||||
Reference in New Issue
Block a user