feat(marketing): hero section with cosmic orbs + dual CTA + social proof
- 3 radial-gradient orbs (blue 16%, cyan 7%, green 11%) + subtle 40px grid + horizontal accent line — FlexiHub cosmic background signature - H1 clamp(2.5rem,4vw,4rem) font-black with grad-text accent on 'sans risquer votre permis' tagline - Eyebrow 11px tracking-[0.18em] grad-text — 'TRANSCRIPTION IA · CONFORME LOI 25 · QUÉBEC' - Sub-headline ≤25 words declares Loi 25 compliance + 9 ordres pros - Dual CTA: Réserver une démo (primary gradient+glow) + Voir les tarifs → (ghost) — drives demo conversion + pricing self-service - Social proof microcopy above-the-fold: 5★ + 27 cabinets + Lancement printemps 2026 - Staggered tc-fade-in-up animations 0/75/150/300/400ms with animation-fill-mode: backwards (no FOIT) - 6 new tests verify H1 grad-text, dual CTA, orb opacities, social proof, staggered delays, eyebrow messaging
This commit is contained in:
@@ -80,3 +80,63 @@ def test_landing_no_login_redirect_for_anonymous():
|
||||
response = client.get('/', follow_redirects=False)
|
||||
assert response.status_code == 200, \
|
||||
f"Expected 200, got {response.status_code} — possibly login_required regression"
|
||||
|
||||
|
||||
def test_hero_has_h1_with_grad_text_accent():
|
||||
"""Hero H1 contains grad-text span on the brand tagline."""
|
||||
client = app.test_client()
|
||||
body = client.get('/').data.decode('utf-8')
|
||||
assert 'id="hero-title"' in body, "Missing hero-title id on H1"
|
||||
assert 'grad-text' in body, "Missing grad-text class somewhere"
|
||||
assert 'sans risquer votre permis' in body, "Missing key brand tagline"
|
||||
|
||||
|
||||
def test_hero_has_dual_cta():
|
||||
"""Hero has both primary (Réserver une démo) and ghost (Voir les tarifs) CTAs."""
|
||||
client = app.test_client()
|
||||
body = client.get('/').data.decode('utf-8')
|
||||
assert 'href="/contact"' in body
|
||||
assert 'href="/tarifs"' in body
|
||||
assert 'Réserver une démo' in body or 'Réserver une démo' in body
|
||||
assert 'Voir les tarifs' in body
|
||||
|
||||
|
||||
def test_hero_has_cosmic_orbs_background():
|
||||
"""Hero has 3 radial gradient orbs (FlexiHub signature)."""
|
||||
client = app.test_client()
|
||||
body = client.get('/').data.decode('utf-8')
|
||||
# Look for the 3 orb opacities (16% blue, 7% cyan, 11% green)
|
||||
assert 'rgba(0,98,255,0.16)' in body, "Missing primary blue orb"
|
||||
assert 'rgba(0,189,216,0.07)' in body, "Missing cyan orb"
|
||||
assert 'rgba(0,200,150,0.11)' in body, "Missing green accent orb"
|
||||
|
||||
|
||||
def test_hero_has_social_proof_microcopy():
|
||||
"""Hero has '27 cabinets' social proof + Lancement printemps 2026."""
|
||||
client = app.test_client()
|
||||
body = client.get('/').data.decode('utf-8')
|
||||
assert '27 cabinets' in body, "Missing social proof '27 cabinets'"
|
||||
assert 'Lancement printemps 2026' in body, "Missing launch date"
|
||||
|
||||
|
||||
def test_hero_has_staggered_animations():
|
||||
"""Hero elements use tc-fade-in-up with staggered delays."""
|
||||
client = app.test_client()
|
||||
body = client.get('/').data.decode('utf-8')
|
||||
assert 'animate-tc-fade-in-up' in body, "Missing fade-in animation"
|
||||
assert 'animation-delay: 0ms' in body
|
||||
assert 'animation-delay: 75ms' in body
|
||||
assert 'animation-delay: 150ms' in body
|
||||
assert 'animation-delay: 300ms' in body
|
||||
assert 'animation-delay: 400ms' in body
|
||||
assert 'animation-fill-mode: backwards' in body, \
|
||||
"Missing animation-fill-mode (causes flash before delay fires)"
|
||||
|
||||
|
||||
def test_hero_eyebrow_has_brand_messaging():
|
||||
"""Hero eyebrow declares the 3 brand pillars."""
|
||||
client = app.test_client()
|
||||
body = client.get('/').data.decode('utf-8')
|
||||
assert 'TRANSCRIPTION IA' in body
|
||||
assert 'CONFORME LOI 25' in body
|
||||
assert 'QU' in body # Either QUÉBEC or QUÉBEC
|
||||
|
||||
Reference in New Issue
Block a user