+
+ {# Spec list cliquable / hover — déclenche feature dans réacteur #}
+
+
Fonctions clés
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{# ===== INTÉGRATIONS ===== #}
diff --git a/tests/test_marketing_secondary_pages.py b/tests/test_marketing_secondary_pages.py
index 07f7eb0..121c9e8 100644
--- a/tests/test_marketing_secondary_pages.py
+++ b/tests/test_marketing_secondary_pages.py
@@ -131,6 +131,55 @@ def test_fonctionnalites_renders_6_bento_cards():
assert kw in body
+def test_fonctionnalites_how_it_works_reactor_section():
+ """New 'Comment ça marche' interactive reactor section (post-6-features, pre-integrations).
+
+ Validates structure (heading + reactor + spec list + Mistral card), 6 cycling features,
+ canonical content, and a11y signals (aria-labelledby + aria-live status panel).
+ """
+ client = app.test_client()
+ body = client.get('/fonctionnalites').data.decode('utf-8')
+
+ # Section heading + canonical phrasing
+ assert 'how-it-works-title' in body, "Missing how-it-works section anchor"
+ assert 'COMMENT ÇA MARCHE' in body, "Missing canonical eyebrow"
+ assert 'Du fichier au résumé' in body, "Missing canonical H2 phrasing"
+ assert 'en temps réel' in body
+ assert 'Survolez une fonctionnalité pour voir la machine en action' in body
+
+ # 6 cycling features (canonical names)
+ for feat in ['Transcription', 'Diarisation', '99+ langues', 'Exports',
+ 'Utilisateurs illimités', 'Partage & Classement']:
+ assert feat in body, f"Missing cycling feature: {feat}"
+
+ # Reactor visual: rings, orbits, wordmark, Auto badge
+ assert 'reactor-ring' in body and 'ring-outer' in body and 'ring-mid' in body and 'ring-inner' in body
+ assert 'orbit orbit-1' in body and 'orbit orbit-8' in body, "Missing 8 orbital particles"
+ assert '>DictIA<' in body, "Missing reactor centre wordmark"
+
+ # Mistral 7B IA intégrée card with 3 canonical bullets
+ assert 'Mistral 7B' in body
+ assert 'IA intégrée' in body
+ assert 'Données hébergées sur VOS serveurs' in body
+ assert 'Zéro connexion OpenAI' in body
+ assert 'Inférence hors-ligne' in body
+
+ # Alpine reactor data + auto-cycle + hover/focus stop logic
+ assert "active: \"Transcription\"" in body
+ assert 'isHovered' in body
+ assert 'setActive(feat)' in body
+ assert 'resumeCycle()' in body
+ # Hover, focus + blur listeners on each list item
+ assert '@mouseenter="setActive(feat)"' in body
+ assert '@mouseleave="resumeCycle()"' in body
+ assert '@focus="setActive(feat)"' in body
+ assert '@blur="resumeCycle()"' in body
+
+ # Accessibility: aria-live status panel, prefers-reduced-motion guard
+ assert 'aria-live="polite"' in body
+ assert 'prefers-reduced-motion' in body, "Reduced-motion guard missing"
+
+
def test_fonctionnalites_export_formats_section():
client = app.test_client()
body = client.get('/fonctionnalites').data.decode('utf-8')