refactor(ui): éliminer tous les emojis (SVG inline + texte propre, look pro/moderne)

Pass de modernisation visuelle : remplacement de TOUS les emojis Unicode dans
les templates marketing/legal/billing/auth par des SVG inline (style heroicons)
ou par du texte propre, pour un look SaaS pro à la Linear/Vercel/Stripe.

Mapping principal :
- ✓ / ✗ / ⚠           → SVG check / x / triangle (text-brand-b3 / red / amber)
- → / ← / ↗            → SVG arrow-right / arrow-left / arrow-up-right
- 🍁 / 🏛️ / ⚖️ / 🔓     → SVG map-pin / building / scale / code-brackets
- 🎙️ / 👥 / 📝 / 💬 / 📄 / 🔌 → 6 SVG bento icons (microphone, users, doc, chat, export, plug)
- ✉️ / ☎️ / 📬          → SVG envelope / phone / map-pin
- ↺                    → SVG refresh-counter-clockwise
- ★                    → SVG star (RECOMMANDÉ badge)
- 🎯/🏢/📺/🤝/📰         → SVG target / office / play / handshake / news (raccourcis contact)
- ⚖️/📊/🏛️ (testimonials) → SVG scale / bar-chart / building
- ✦ (default bento icon) → SVG sparkle inline

Tous les SVG utilisent stroke="currentColor" pour héritage Tailwind text-*.
Les SVG informationnels du tableau comparatif portent un aria-label sémantique
(Conforme/Non conforme/Partiel) ; les SVG décoratifs portent aria-hidden.

Tests :
- 18/18 legal pages passent (test_legal_pages.py)
- test_comparatif_check_marks_consistently_mean_good ajusté pour asserter
  sur les aria-label SVG plutôt que les caractères ✓/✗
- 4 échecs pré-existants non liés (manque /blog dans nav, SOC 2 hedge dans
  conformite.html, gitea.innova-ai.ca url) — confirmés présents avant ce commit

Fichiers modifiés (14) :
- templates/macros/{bento,pricing_card}.html (sources de vérité)
- templates/marketing/{base,_footer,landing,fonctionnalites,tarifs,conformite,contact}.html
- templates/legal/{_layout,index}.html
- templates/billing/{cancel,success}.html
- tests/test_marketing_landing_template.py (assert sur aria-label)

Audit final : 0 emoji restant dans les fichiers in-scope ; 0 emoji dans le
HTML rendu de toutes les pages marketing/legal vérifiées.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Allison
2026-04-28 10:52:58 -04:00
parent f83fdfcd68
commit 8d50d8ee01
14 changed files with 199 additions and 111 deletions

View File

@@ -611,18 +611,28 @@ def test_no_unverifiable_competitor_claims():
def test_comparatif_check_marks_consistently_mean_good():
"""Each ✓ in the table should mark a 'good' outcome for that column.
"""Status SVGs in the comparatif must mark each cell with the right semantic.
Regression guard against the inverted-Cloud-Act-row bug.
Specifically: DictIA cell of every row must contain ✓ (DictIA wins on every criterion).
Since the visual marker (✓ / ✗ / ⚠) was migrated to inline SVGs (no emoji policy),
we assert on (a) the row label, (b) each Teams cell wraps "Soumis Cloud Act" with
the red 'Non conforme' SVG, and (c) DictIA cell uses the green 'Conforme' SVG.
"""
client = app.test_client()
body = client.get('/').data.decode('utf-8')
# The 'Souveraineté hors Cloud Act' row must have ✓ for DictIA (after rename)
# The 'Souveraineté hors Cloud Act' row must remain (after rename)
assert 'Souveraineté hors Cloud Act' in body
# And must NOT have the legacy inverted form
assert 'Exposé au Cloud Act' not in body, "Row 2 must be reworded to positive convention"
# Specifically check Teams gets ✗ for the territoriality criterion (was ⚠ before)
assert '✗ Soumis Cloud Act' in body, "Teams must show ✗ for non-Loi-25-compliant transfer"
# Teams cell for the territoriality criterion: must include the "Non conforme" SVG
# immediately followed by the "Soumis Cloud Act" label.
assert 'Soumis Cloud Act' in body, "Row 1 Teams cell must say 'Soumis Cloud Act'"
assert 'aria-label="Non conforme"' in body, \
"X-mark SVG with aria-label='Non conforme' must be present (Teams ✗)"
assert 'aria-label="Conforme"' in body, \
"Check SVG with aria-label='Conforme' must be present (DictIA ✓)"
assert 'aria-label="Partiel"' in body, \
"Warning SVG with aria-label='Partiel' must be present (⚠ rows)"
def test_testimonials_section_present_with_placeholder_cards():