Docker compose healthchecks target /health on combined-api, dashboard-api and portal, but these endpoints did not exist (returned 404). This caused all dependent services (condition: service_healthy) to fail startup. - combined_api.py: GET /health + /turf/health with DB connectivity check - dashboard_api.py: GET /health + /turf/health with DB connectivity check - portal_server.py: GET /health (lightweight, no DB) QA Finding 1 from HRT-34 review of HRT-33 branch feature/devops-cicd. Co-Authored-By: Paperclip <noreply@paperclip.ing>
468 lines
23 KiB
HTML
468 lines
23 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="fr">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<title>Turf IA — Prédictions PMU par Intelligence Artificielle</title>
|
||
<meta name="description" content="Boostez vos paris PMU avec nos prédictions IA. Analyse XGBoost, value bets, alertes Telegram. Essai gratuit.">
|
||
<style>
|
||
/* ===== RESET & BASE ===== */
|
||
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
||
:root {
|
||
--green: #00c853;
|
||
--green-d: #009624;
|
||
--blue: #1565c0;
|
||
--blue-l: #1e88e5;
|
||
--gold: #ffd600;
|
||
--dark: #0d1117;
|
||
--dark2: #161b22;
|
||
--dark3: #21262d;
|
||
--text: #e6edf3;
|
||
--muted: #8b949e;
|
||
--border: #30363d;
|
||
--radius: 12px;
|
||
}
|
||
html { scroll-behavior: smooth; }
|
||
body {
|
||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
||
background: var(--dark);
|
||
color: var(--text);
|
||
line-height: 1.6;
|
||
overflow-x: hidden;
|
||
}
|
||
a { color: inherit; text-decoration: none; }
|
||
img { max-width: 100%; }
|
||
|
||
/* ===== NAV ===== */
|
||
nav {
|
||
position: sticky; top: 0; z-index: 100;
|
||
display: flex; align-items: center; justify-content: space-between;
|
||
padding: 16px 5%;
|
||
background: rgba(13,17,23,0.95);
|
||
backdrop-filter: blur(10px);
|
||
border-bottom: 1px solid var(--border);
|
||
}
|
||
.nav-logo { display: flex; align-items: center; gap: 10px; font-weight: 700; font-size: 1.2rem; }
|
||
.nav-logo .badge { background: var(--green); color: #000; padding: 2px 8px; border-radius: 20px; font-size: .75rem; }
|
||
.nav-links { display: flex; align-items: center; gap: 28px; }
|
||
.nav-links a { color: var(--muted); font-size: .95rem; transition: color .2s; }
|
||
.nav-links a:hover { color: var(--text); }
|
||
.nav-cta { display: flex; gap: 10px; }
|
||
.btn { display: inline-flex; align-items: center; gap: 6px; padding: 9px 20px; border-radius: 8px; font-size: .9rem; font-weight: 600; cursor: pointer; border: none; transition: all .2s; }
|
||
.btn-ghost { background: transparent; border: 1px solid var(--border); color: var(--text); }
|
||
.btn-ghost:hover { border-color: var(--muted); }
|
||
.btn-primary { background: var(--green); color: #000; }
|
||
.btn-primary:hover { background: var(--green-d); transform: translateY(-1px); }
|
||
.btn-lg { padding: 14px 32px; font-size: 1.05rem; border-radius: 10px; }
|
||
|
||
/* ===== HERO ===== */
|
||
.hero {
|
||
min-height: 90vh;
|
||
display: flex; flex-direction: column; align-items: center; justify-content: center;
|
||
text-align: center;
|
||
padding: 80px 5% 60px;
|
||
background: radial-gradient(ellipse 80% 60% at 50% 0%, rgba(0,200,83,.08) 0%, transparent 70%);
|
||
position: relative;
|
||
}
|
||
.hero-eyebrow {
|
||
display: inline-flex; align-items: center; gap: 8px;
|
||
background: rgba(0,200,83,.1); border: 1px solid rgba(0,200,83,.3);
|
||
padding: 6px 16px; border-radius: 20px;
|
||
font-size: .85rem; color: var(--green); margin-bottom: 24px;
|
||
}
|
||
.hero h1 { font-size: clamp(2rem, 5vw, 3.6rem); font-weight: 800; line-height: 1.15; max-width: 780px; margin-bottom: 20px; }
|
||
.hero h1 span { color: var(--green); }
|
||
.hero p { font-size: 1.15rem; color: var(--muted); max-width: 580px; margin-bottom: 36px; }
|
||
.hero-actions { display: flex; gap: 14px; flex-wrap: wrap; justify-content: center; }
|
||
.hero-stats {
|
||
display: flex; gap: 40px; margin-top: 60px; flex-wrap: wrap; justify-content: center;
|
||
}
|
||
.stat { text-align: center; }
|
||
.stat strong { display: block; font-size: 2rem; font-weight: 800; color: var(--green); }
|
||
.stat span { font-size: .85rem; color: var(--muted); }
|
||
|
||
/* ===== SECTIONS ===== */
|
||
section { padding: 80px 5%; }
|
||
.section-label { color: var(--green); font-size: .85rem; font-weight: 600; text-transform: uppercase; letter-spacing: 1px; margin-bottom: 12px; }
|
||
h2 { font-size: clamp(1.6rem, 3vw, 2.4rem); font-weight: 800; margin-bottom: 16px; }
|
||
.subtitle { color: var(--muted); font-size: 1.05rem; max-width: 560px; margin: 0 auto 50px; text-align: center; }
|
||
.section-center { text-align: center; }
|
||
|
||
/* ===== FEATURES ===== */
|
||
.features-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 20px; max-width: 1100px; margin: 0 auto; }
|
||
.feature-card {
|
||
background: var(--dark2); border: 1px solid var(--border); border-radius: var(--radius);
|
||
padding: 28px; transition: border-color .2s, transform .2s;
|
||
}
|
||
.feature-card:hover { border-color: var(--green); transform: translateY(-3px); }
|
||
.feature-icon { font-size: 2rem; margin-bottom: 14px; }
|
||
.feature-card h3 { font-size: 1.1rem; font-weight: 700; margin-bottom: 8px; }
|
||
.feature-card p { color: var(--muted); font-size: .9rem; line-height: 1.6; }
|
||
|
||
/* ===== PRICING ===== */
|
||
.pricing-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 20px; max-width: 960px; margin: 0 auto; }
|
||
.plan-card {
|
||
background: var(--dark2); border: 1px solid var(--border); border-radius: var(--radius);
|
||
padding: 32px; position: relative; transition: transform .2s;
|
||
}
|
||
.plan-card:hover { transform: translateY(-4px); }
|
||
.plan-card.popular { border-color: var(--green); }
|
||
.popular-badge {
|
||
position: absolute; top: -12px; left: 50%; transform: translateX(-50%);
|
||
background: var(--green); color: #000; padding: 3px 16px; border-radius: 20px;
|
||
font-size: .75rem; font-weight: 700;
|
||
}
|
||
.plan-name { font-size: 1.1rem; font-weight: 700; margin-bottom: 8px; }
|
||
.plan-price { font-size: 2.6rem; font-weight: 800; margin: 12px 0 4px; }
|
||
.plan-price sup { font-size: 1.2rem; vertical-align: top; margin-top: 10px; }
|
||
.plan-price span { font-size: 1rem; font-weight: 400; color: var(--muted); }
|
||
.plan-desc { color: var(--muted); font-size: .88rem; margin-bottom: 20px; }
|
||
.plan-features { list-style: none; margin-bottom: 28px; }
|
||
.plan-features li { display: flex; align-items: flex-start; gap: 10px; padding: 7px 0; font-size: .9rem; }
|
||
.plan-features li::before { content: "✓"; color: var(--green); font-weight: 700; flex-shrink: 0; }
|
||
.plan-features li.disabled { color: var(--muted); }
|
||
.plan-features li.disabled::before { content: "×"; color: var(--border); }
|
||
.btn-plan { width: 100%; text-align: center; justify-content: center; }
|
||
|
||
/* ===== HOW IT WORKS ===== */
|
||
.steps { display: flex; flex-direction: column; gap: 0; max-width: 700px; margin: 0 auto; }
|
||
.step { display: flex; gap: 24px; padding: 28px 0; border-bottom: 1px solid var(--border); }
|
||
.step:last-child { border-bottom: none; }
|
||
.step-num { width: 44px; height: 44px; border-radius: 50%; background: rgba(0,200,83,.1); border: 2px solid var(--green); display: flex; align-items: center; justify-content: center; font-weight: 800; color: var(--green); flex-shrink: 0; }
|
||
.step-body h3 { font-size: 1.05rem; font-weight: 700; margin-bottom: 6px; }
|
||
.step-body p { color: var(--muted); font-size: .9rem; }
|
||
|
||
/* ===== FAQ ===== */
|
||
.faq-list { max-width: 720px; margin: 0 auto; }
|
||
details { border: 1px solid var(--border); border-radius: var(--radius); margin-bottom: 10px; overflow: hidden; }
|
||
details[open] { border-color: var(--green); }
|
||
summary {
|
||
padding: 18px 22px; font-weight: 600; cursor: pointer; list-style: none;
|
||
display: flex; justify-content: space-between; align-items: center;
|
||
}
|
||
summary::after { content: "+"; color: var(--green); font-size: 1.3rem; }
|
||
details[open] summary::after { content: "−"; }
|
||
.faq-answer { padding: 0 22px 18px; color: var(--muted); font-size: .93rem; line-height: 1.7; }
|
||
|
||
/* ===== CTA BANNER ===== */
|
||
.cta-banner {
|
||
background: linear-gradient(135deg, rgba(0,200,83,.12) 0%, rgba(21,101,192,.12) 100%);
|
||
border: 1px solid var(--border); border-radius: 16px;
|
||
padding: 60px; text-align: center; max-width: 820px; margin: 0 auto;
|
||
}
|
||
.cta-banner h2 { margin-bottom: 12px; }
|
||
.cta-banner p { color: var(--muted); margin-bottom: 28px; }
|
||
|
||
/* ===== FOOTER ===== */
|
||
footer {
|
||
border-top: 1px solid var(--border);
|
||
padding: 40px 5%;
|
||
display: grid; grid-template-columns: 2fr 1fr 1fr 1fr; gap: 40px;
|
||
}
|
||
.footer-brand p { color: var(--muted); font-size: .88rem; margin-top: 10px; max-width: 240px; }
|
||
.footer-col h4 { font-size: .85rem; font-weight: 700; text-transform: uppercase; letter-spacing: .5px; margin-bottom: 14px; color: var(--muted); }
|
||
.footer-col a { display: block; color: var(--muted); font-size: .88rem; margin-bottom: 8px; transition: color .2s; }
|
||
.footer-col a:hover { color: var(--text); }
|
||
.footer-bottom { border-top: 1px solid var(--border); padding: 20px 5%; text-align: center; color: var(--muted); font-size: .82rem; }
|
||
|
||
/* ===== TOAST ===== */
|
||
#toast {
|
||
position: fixed; bottom: 24px; right: 24px; z-index: 999;
|
||
padding: 14px 22px; border-radius: 10px; font-size: .9rem; font-weight: 600;
|
||
transform: translateY(80px); opacity: 0; transition: all .3s;
|
||
pointer-events: none;
|
||
}
|
||
#toast.show { transform: translateY(0); opacity: 1; }
|
||
#toast.success { background: var(--green); color: #000; }
|
||
#toast.error { background: #f85149; color: #fff; }
|
||
|
||
/* ===== RESPONSIVE ===== */
|
||
@media (max-width: 768px) {
|
||
.nav-links { display: none; }
|
||
footer { grid-template-columns: 1fr 1fr; }
|
||
.hero-stats { gap: 24px; }
|
||
.cta-banner { padding: 36px 24px; }
|
||
}
|
||
@media (max-width: 480px) {
|
||
footer { grid-template-columns: 1fr; }
|
||
}
|
||
</style>
|
||
</head>
|
||
<body>
|
||
|
||
<!-- NAV -->
|
||
<nav>
|
||
<div class="nav-logo">
|
||
🏇 Turf IA
|
||
<span class="badge">BETA</span>
|
||
</div>
|
||
<div class="nav-links">
|
||
<a href="#features">Fonctionnalités</a>
|
||
<a href="#pricing">Tarifs</a>
|
||
<a href="#how">Comment ça marche</a>
|
||
<a href="#faq">FAQ</a>
|
||
</div>
|
||
<div class="nav-cta">
|
||
<a href="/login" class="btn btn-ghost">Connexion</a>
|
||
<a href="/register" class="btn btn-primary">S'inscrire gratuitement</a>
|
||
</div>
|
||
</nav>
|
||
|
||
<!-- HERO -->
|
||
<section class="hero">
|
||
<div class="hero-eyebrow">
|
||
🤖 Intelligence Artificielle · XGBoost · Données PMU temps réel
|
||
</div>
|
||
<h1>Pariez plus <span>intelligemment</span><br>grâce à l'IA</h1>
|
||
<p>Nos modèles XGBoost analysent chaque course PMU en temps réel — cotes, historique, jockeys, météo — pour vous donner les meilleures prédictions du marché.</p>
|
||
<div class="hero-actions">
|
||
<a href="/register" class="btn btn-primary btn-lg">Commencer gratuitement</a>
|
||
<a href="#how" class="btn btn-ghost btn-lg">Voir comment ça marche</a>
|
||
</div>
|
||
<div class="hero-stats">
|
||
<div class="stat"><strong>+73%</strong><span>précision Top-3</span></div>
|
||
<div class="stat"><strong>150+</strong><span>courses analysées/jour</span></div>
|
||
<div class="stat"><strong>2.4s</strong><span>temps de réponse moyen</span></div>
|
||
<div class="stat"><strong>3 plans</strong><span>adaptés à chaque profil</span></div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- FEATURES -->
|
||
<section id="features">
|
||
<div class="section-center">
|
||
<div class="section-label">Fonctionnalités</div>
|
||
<h2>Tout ce dont vous avez besoin pour gagner</h2>
|
||
<p class="subtitle">Un moteur IA complet, des alertes instantanées, et des analyses détaillées pour chaque parieur.</p>
|
||
</div>
|
||
<div class="features-grid">
|
||
<div class="feature-card">
|
||
<div class="feature-icon">🧠</div>
|
||
<h3>Prédictions XGBoost</h3>
|
||
<p>Modèle entraîné sur des milliers de courses PMU. Probabilités Top-1 et Top-3 pour chaque partant, mis à jour en continu.</p>
|
||
</div>
|
||
<div class="feature-card">
|
||
<div class="feature-icon">💎</div>
|
||
<h3>Value Bets identifiés</h3>
|
||
<p>Détection automatique des cotes sous-évaluées par le marché. Seulement les paris où l'espérance mathématique est positive.</p>
|
||
</div>
|
||
<div class="feature-card">
|
||
<div class="feature-icon">📱</div>
|
||
<h3>Alertes Telegram</h3>
|
||
<p>Recevez les meilleures opportunités directement sur votre téléphone, avant le départ, avec toutes les infos clés.</p>
|
||
</div>
|
||
<div class="feature-card">
|
||
<div class="feature-icon">📊</div>
|
||
<h3>Dashboard temps réel</h3>
|
||
<p>Tableau de bord complet : courses du jour, historique de performance, ROI, statistiques par hippodrome et discipline.</p>
|
||
</div>
|
||
<div class="feature-card">
|
||
<div class="feature-icon">🌤️</div>
|
||
<h3>Analyse météo & terrain</h3>
|
||
<p>Impact des conditions météo et de l'état du terrain intégré dans chaque prédiction pour une précision maximale.</p>
|
||
</div>
|
||
<div class="feature-card">
|
||
<div class="feature-icon">📤</div>
|
||
<h3>Export CSV & API</h3>
|
||
<p>Exportez vos données, intégrez nos prédictions dans vos propres outils via notre API documentée (plan Pro).</p>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- HOW IT WORKS -->
|
||
<section id="how" style="background: var(--dark2); margin: 0; border-top: 1px solid var(--border); border-bottom: 1px solid var(--border);">
|
||
<div class="section-center">
|
||
<div class="section-label">Comment ça marche</div>
|
||
<h2>En 3 étapes, prêt à parier</h2>
|
||
<p class="subtitle">De l'inscription à votre première prédiction en moins de 2 minutes.</p>
|
||
</div>
|
||
<div class="steps">
|
||
<div class="step">
|
||
<div class="step-num">1</div>
|
||
<div class="step-body">
|
||
<h3>Créez votre compte gratuitement</h3>
|
||
<p>Inscription en 30 secondes, sans carte bancaire. Accès immédiat au plan Free avec un aperçu des prédictions du jour.</p>
|
||
</div>
|
||
</div>
|
||
<div class="step">
|
||
<div class="step-num">2</div>
|
||
<div class="step-body">
|
||
<h3>Choisissez votre plan</h3>
|
||
<p>Free pour découvrir, Premium (9,90€/mois) pour toutes les courses et alertes, Pro (24,90€/mois) pour l'API et les exports.</p>
|
||
</div>
|
||
</div>
|
||
<div class="step">
|
||
<div class="step-num">3</div>
|
||
<div class="step-body">
|
||
<h3>Recevez vos premières prédictions</h3>
|
||
<p>Notre IA analyse les 150+ courses du jour. Accédez aux Top-3, value bets et probabilités depuis votre dashboard ou Telegram.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- PRICING -->
|
||
<section id="pricing">
|
||
<div class="section-center">
|
||
<div class="section-label">Tarifs</div>
|
||
<h2>Des prix transparents</h2>
|
||
<p class="subtitle">Commencez gratuitement. Passez au niveau supérieur quand vous êtes prêt.</p>
|
||
</div>
|
||
<div class="pricing-grid">
|
||
<!-- FREE -->
|
||
<div class="plan-card">
|
||
<div class="plan-name">Free</div>
|
||
<div class="plan-price">0<sup>€</sup><span>/mois</span></div>
|
||
<p class="plan-desc">Pour découvrir la puissance de l'IA turf.</p>
|
||
<ul class="plan-features">
|
||
<li>Aperçu Top-3 du jour (limité)</li>
|
||
<li>1 course complète par jour</li>
|
||
<li>Statistiques basiques</li>
|
||
<li class="disabled">Alertes Telegram</li>
|
||
<li class="disabled">Toutes les courses</li>
|
||
<li class="disabled">Value bets</li>
|
||
<li class="disabled">Export CSV</li>
|
||
<li class="disabled">Accès API</li>
|
||
</ul>
|
||
<a href="/register" class="btn btn-ghost btn-plan">Commencer gratuitement</a>
|
||
</div>
|
||
<!-- PREMIUM -->
|
||
<div class="plan-card popular">
|
||
<div class="popular-badge">⭐ Le plus populaire</div>
|
||
<div class="plan-name">Premium</div>
|
||
<div class="plan-price">9<sup>€</sup>,90<span>/mois</span></div>
|
||
<p class="plan-desc">Pour les parieurs sérieux qui veulent un vrai avantage.</p>
|
||
<ul class="plan-features">
|
||
<li>Toutes les courses du jour</li>
|
||
<li>Prédictions Top-1 et Top-3</li>
|
||
<li>Value bets identifiés</li>
|
||
<li>Alertes Telegram configurables</li>
|
||
<li>Historique 90 jours</li>
|
||
<li>Analyse météo & terrain</li>
|
||
<li class="disabled">Export CSV</li>
|
||
<li class="disabled">Accès API</li>
|
||
</ul>
|
||
<a href="/register?plan=premium" class="btn btn-primary btn-plan">Choisir Premium</a>
|
||
</div>
|
||
<!-- PRO -->
|
||
<div class="plan-card">
|
||
<div class="plan-name">Pro</div>
|
||
<div class="plan-price">24<sup>€</sup>,90<span>/mois</span></div>
|
||
<p class="plan-desc">Pour les professionnels et développeurs qui veulent tout.</p>
|
||
<ul class="plan-features">
|
||
<li>Tout du plan Premium</li>
|
||
<li>Export CSV illimité</li>
|
||
<li>Accès API REST documentée</li>
|
||
<li>Backtest personnalisé</li>
|
||
<li>Historique illimité</li>
|
||
<li>Support prioritaire</li>
|
||
<li>Webhook alertes personnalisées</li>
|
||
<li>Multi-compte (5 utilisateurs)</li>
|
||
</ul>
|
||
<a href="/register?plan=pro" class="btn btn-ghost btn-plan">Choisir Pro</a>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- FAQ -->
|
||
<section id="faq" style="background: var(--dark2); border-top: 1px solid var(--border); border-bottom: 1px solid var(--border);">
|
||
<div class="section-center">
|
||
<div class="section-label">FAQ</div>
|
||
<h2>Questions fréquentes</h2>
|
||
</div>
|
||
<div class="faq-list">
|
||
<details>
|
||
<summary>Comment fonctionne le modèle IA ?</summary>
|
||
<div class="faq-answer">Notre modèle XGBoost est entraîné sur plusieurs années de données PMU : cotes, historique des chevaux et drivers, conditions météo, état du terrain, statistiques par hippodrome. Il calcule pour chaque partant une probabilité d'arriver dans le Top-1 et Top-3, ainsi qu'un score de value bet comparant notre estimation à la cote du marché.</div>
|
||
</details>
|
||
<details>
|
||
<summary>Les prédictions garantissent-elles des gains ?</summary>
|
||
<div class="faq-answer">Non. Aucune prédiction ne garantit des gains. Le pari hippique reste un jeu de hasard. Notre IA améliore vos chances en identifiant les opportunités statistiquement favorables, mais les résultats passés ne préjugent pas des résultats futurs. Pariez de façon responsable.</div>
|
||
</details>
|
||
<details>
|
||
<summary>Puis-je annuler à tout moment ?</summary>
|
||
<div class="faq-answer">Oui, sans engagement. Vous pouvez annuler votre abonnement Premium ou Pro à tout moment depuis votre espace compte. L'accès reste actif jusqu'à la fin de la période payée.</div>
|
||
</details>
|
||
<details>
|
||
<summary>Les alertes Telegram fonctionnent-elles sur mobile ?</summary>
|
||
<div class="faq-answer">Oui. Après activation dans vos paramètres, vous recevrez les alertes value bets et top picks directement dans votre application Telegram, avec toutes les informations nécessaires pour parier rapidement avant le départ.</div>
|
||
</details>
|
||
<details>
|
||
<summary>L'API est-elle compatible avec d'autres outils ?</summary>
|
||
<div class="faq-answer">Oui. L'API REST du plan Pro est documentée (OpenAPI/Swagger) et compatible avec n'importe quel outil : Python, JavaScript, n8n, Zapier, Excel, etc. Un token personnel vous est fourni dans votre dashboard.</div>
|
||
</details>
|
||
<details>
|
||
<summary>Quelles disciplines sont couvertes ?</summary>
|
||
<div class="faq-answer">Nous couvrons toutes les disciplines PMU : Plat, Trot Attelé, Trot Monté, et Galop sur les hippodromes français. Les courses Quinté+ sont signalées et prioritaires dans votre dashboard.</div>
|
||
</details>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- CTA BANNER -->
|
||
<section>
|
||
<div class="cta-banner">
|
||
<h2>Prêt à parier plus intelligemment ?</h2>
|
||
<p>Rejoignez des centaines de parieurs qui utilisent déjà Turf IA chaque jour. Essai gratuit, sans carte bancaire.</p>
|
||
<a href="/register" class="btn btn-primary btn-lg">Créer mon compte gratuit →</a>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- FOOTER -->
|
||
<footer>
|
||
<div class="footer-brand">
|
||
<div style="font-weight: 700; font-size: 1.1rem;">🏇 Turf IA</div>
|
||
<p>Prédictions PMU par intelligence artificielle. Analyse XGBoost, value bets, alertes temps réel.</p>
|
||
</div>
|
||
<div class="footer-col">
|
||
<h4>Produit</h4>
|
||
<a href="#features">Fonctionnalités</a>
|
||
<a href="#pricing">Tarifs</a>
|
||
<a href="#how">Comment ça marche</a>
|
||
<a href="/dashboard">Dashboard</a>
|
||
</div>
|
||
<div class="footer-col">
|
||
<h4>Compte</h4>
|
||
<a href="/login">Connexion</a>
|
||
<a href="/register">Inscription</a>
|
||
<a href="/account">Mon compte</a>
|
||
</div>
|
||
<div class="footer-col">
|
||
<h4>Légal</h4>
|
||
<a href="/legal/cgu">CGU</a>
|
||
<a href="/legal/cgv">CGV</a>
|
||
<a href="/legal/privacy">Confidentialité</a>
|
||
<a href="/legal/cookies">Cookies</a>
|
||
</div>
|
||
</footer>
|
||
<div class="footer-bottom">
|
||
<p>© 2026 Turf IA — H3R7 Tech. Tous droits réservés. Le jeu peut être dangereux, jouez de façon responsable. <strong>18+</strong></p>
|
||
</div>
|
||
|
||
<!-- TOAST -->
|
||
<div id="toast"></div>
|
||
|
||
<script>
|
||
function showToast(msg, type = 'success') {
|
||
const t = document.getElementById('toast');
|
||
t.textContent = msg;
|
||
t.className = `show ${type}`;
|
||
setTimeout(() => { t.className = ''; }, 3500);
|
||
}
|
||
|
||
// Smooth scroll for anchor links
|
||
document.querySelectorAll('a[href^="#"]').forEach(a => {
|
||
a.addEventListener('click', e => {
|
||
const target = document.querySelector(a.getAttribute('href'));
|
||
if (target) { e.preventDefault(); target.scrollIntoView({ behavior: 'smooth' }); }
|
||
});
|
||
});
|
||
|
||
// Track CTA clicks
|
||
document.querySelectorAll('[href="/register"]').forEach(btn => {
|
||
btn.addEventListener('click', () => {
|
||
try { localStorage.setItem('turf_signup_source', 'landing'); } catch(_) {}
|
||
});
|
||
});
|
||
</script>
|
||
</body>
|
||
</html>
|