From c14f0531ffa9b23f122ea6ba2f146b1386b24082 Mon Sep 17 00:00:00 2001 From: "Aboubacar M." Date: Mon, 16 Mar 2026 10:30:48 +0100 Subject: [PATCH] v1.5 --- assets/css/main.css | 39 ++++-- assets/php/send_mail.php | 229 +++++++++++++++++++++++++++++++++ components/background.html | 22 ++++ components/index/apropos.html | 36 ++++++ components/index/contact.html | 153 ++++++++++++++++++++++ components/index/hero.html | 24 ++++ components/index/services.html | 52 ++++++++ index.html | 188 ++------------------------- 8 files changed, 555 insertions(+), 188 deletions(-) create mode 100644 assets/php/send_mail.php create mode 100644 components/background.html create mode 100644 components/index/apropos.html create mode 100644 components/index/contact.html create mode 100644 components/index/hero.html create mode 100644 components/index/services.html diff --git a/assets/css/main.css b/assets/css/main.css index 255ab96..f46ca77 100644 --- a/assets/css/main.css +++ b/assets/css/main.css @@ -935,7 +935,7 @@ section { margin: 0 auto; position: relative; overflow: hidden; - padding: 0.5rem 0; + padding: 0.5rem 1rem; } .team-carousel { @@ -944,7 +944,7 @@ section { } .team-card { - flex: 0 0 calc(33.333% - 1.33rem); + flex: 0 0 calc(33.333% - 2rem); margin: 0 1rem; text-align: center; padding: 2rem; @@ -1445,7 +1445,7 @@ footer { } .team-card { - flex: 0 0 calc(50% - 1rem); + flex: 0 0 calc(50% - 2rem); } } @@ -1605,7 +1605,8 @@ footer { display: flex; align-items: center; justify-content: center; - padding: 2rem; + padding: 1rem; + overflow-y: auto; opacity: 0; visibility: hidden; transition: all 0.3s ease; @@ -1622,10 +1623,12 @@ footer { border-radius: 8px; max-width: 500px; width: 100%; + max-height: calc(100dvh - 2rem); + overflow-y: auto; position: relative; transform: scale(0.9) translateY(20px); transition: transform 0.3s ease; - overflow: hidden; + overscroll-behavior: contain; } .team-modal-overlay.active .team-modal { @@ -1800,19 +1803,35 @@ footer { @media (max-width: 480px) { .team-modal-stats { - grid-template-columns: 1fr; + grid-template-columns: repeat(3, 1fr); } - + .team-modal { - margin: 1rem; + max-height: calc(100dvh - 1rem); + border-radius: 6px; } .team-modal-header { - padding: 1.5rem; + padding: 1.5rem 1rem; } .team-modal-content { - padding: 1.5rem; + padding: 1.25rem 1rem; + } + + .team-modal-avatar { + width: 90px; + height: 90px; + } + + .team-modal-name { + font-size: 1.2rem; + } +} + +@media (max-width: 360px) { + .team-modal-stats { + grid-template-columns: 1fr; } } diff --git a/assets/php/send_mail.php b/assets/php/send_mail.php new file mode 100644 index 0000000..8199809 --- /dev/null +++ b/assets/php/send_mail.php @@ -0,0 +1,229 @@ + false, 'message' => 'Méthode non autorisée.']); + exit; +} + +/* ── Lecture du body (JSON ou form-data) ───────────────────── */ +$contentType = $_SERVER['CONTENT_TYPE'] ?? ''; + +if (str_contains($contentType, 'application/json')) { + $raw = file_get_contents('php://input'); + $data = json_decode($raw, true) ?? []; +} else { + $data = $_POST; +} + +/* ── Récupération & nettoyage des champs ───────────────────── */ +$name = trim(strip_tags($data['name'] ?? '')); +$email = trim(strip_tags($data['email'] ?? '')); +$subject = trim(strip_tags($data['subject'] ?? 'Contact depuis le site')); +$message = trim(strip_tags($data['message'] ?? '')); + +/* ── Validation ────────────────────────────────────────────── */ +$errors = []; + +if (empty($name) || mb_strlen($name) < 2) { + $errors[] = 'Le nom doit contenir au moins 2 caractères.'; +} +if (empty($email) || !filter_var($email, FILTER_VALIDATE_EMAIL)) { + $errors[] = 'Adresse email invalide.'; +} +if (empty($message) || mb_strlen($message) < 10) { + $errors[] = 'Le message doit contenir au moins 10 caractères.'; +} +if (mb_strlen($name) > 100 || mb_strlen($email) > 254 || mb_strlen($message) > 5000) { + $errors[] = 'Un des champs dépasse la longueur maximale autorisée.'; +} + +if (!empty($errors)) { + http_response_code(422); + echo json_encode(['success' => false, 'message' => implode(' ', $errors)]); + exit; +} + +/* ── Honeypot anti-bot (champ caché "website" dans le HTML) ── */ +if (!empty($data['website'])) { + // Simuler un succès pour ne pas signaler le bot + echo json_encode(['success' => true, 'message' => 'Message envoyé avec succès !']); + exit; +} + +/* ── Rate limiting par IP ───────────────────────────────────── */ +if (RATE_LIMIT_ENABLED) { + $ip = preg_replace('/[^a-f0-9:.]/', '', $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0'); + $file = RATE_LIMIT_DIR . md5($ip) . '.json'; + $now = time(); + $records = []; + + if (!is_dir(RATE_LIMIT_DIR)) { + @mkdir(RATE_LIMIT_DIR, 0700, true); + } + + if (file_exists($file)) { + $records = json_decode(file_get_contents($file), true) ?? []; + // Ne garder que les entrées dans la fenêtre de temps + $records = array_filter($records, fn($t) => ($now - $t) < RATE_LIMIT_WINDOW); + $records = array_values($records); + } + + if (count($records) >= RATE_LIMIT_MAX) { + http_response_code(429); + echo json_encode(['success' => false, 'message' => 'Trop de messages envoyés. Veuillez patienter avant de réessayer.']); + exit; + } + + $records[] = $now; + file_put_contents($file, json_encode($records), LOCK_EX); +} + +/* ── Construction de l'email ───────────────────────────────── */ +$emailSubject = SUBJECT_PREFIX . $subject; + +$emailBody = "Nouveau message depuis le formulaire de contact OmégaKube\n"; +$emailBody .= str_repeat('─', 55) . "\n\n"; +$emailBody .= "Nom : {$name}\n"; +$emailBody .= "Email : {$email}\n"; +$emailBody .= "Objet : {$subject}\n\n"; +$emailBody .= "Message :\n{$message}\n\n"; +$emailBody .= str_repeat('─', 55) . "\n"; +$emailBody .= "Envoyé le : " . date('d/m/Y à H:i:s') . "\n"; +$emailBody .= "IP : " . ($_SERVER['REMOTE_ADDR'] ?? 'inconnue') . "\n"; + +/* Version HTML de l'email */ +$emailBodyHtml = ' + + + + + +
+ + + + + + + + + + + + + +
+

⬡ OmégaKube

+

Nouveau message de contact

+
+ + + + + + + + + + + + + +
+ Nom
+ ' . htmlspecialchars($name) . ' +
+ Email
+ ' . htmlspecialchars($email) . ' +
+ Objet
+ ' . htmlspecialchars($subject) . ' +
+ Message
+

' . htmlspecialchars($message) . '

+
+
+

Envoyé le ' . date('d/m/Y à H:i') . ' • IP : ' . htmlspecialchars($_SERVER['REMOTE_ADDR'] ?? '') . '

+
+
+ +'; + +/* Boundary pour email multipart */ +$boundary = '----=_Part_' . md5(uniqid('', true)); + +$headers = "From: =?UTF-8?B?" . base64_encode($name) . "?= <{$email}>\r\n"; +$headers .= "Reply-To: {$email}\r\n"; +$headers .= "To: " . RECIPIENT_NAME . " <" . RECIPIENT_EMAIL . ">\r\n"; +$headers .= "MIME-Version: 1.0\r\n"; +$headers .= "Content-Type: multipart/alternative; boundary=\"{$boundary}\"\r\n"; +$headers .= "X-Mailer: PHP/" . phpversion() . "\r\n"; +$headers .= "X-Originating-IP: " . ($_SERVER['REMOTE_ADDR'] ?? '') . "\r\n"; + +$fullBody = "--{$boundary}\r\n"; +$fullBody .= "Content-Type: text/plain; charset=UTF-8\r\n"; +$fullBody .= "Content-Transfer-Encoding: base64\r\n\r\n"; +$fullBody .= chunk_split(base64_encode($emailBody)) . "\r\n"; +$fullBody .= "--{$boundary}\r\n"; +$fullBody .= "Content-Type: text/html; charset=UTF-8\r\n"; +$fullBody .= "Content-Transfer-Encoding: base64\r\n\r\n"; +$fullBody .= chunk_split(base64_encode($emailBodyHtml)) . "\r\n"; +$fullBody .= "--{$boundary}--"; + +/* ── Envoi ──────────────────────────────────────────────────── */ +$sent = mail(RECIPIENT_EMAIL, '=?UTF-8?B?' . base64_encode($emailSubject) . '?=', $fullBody, $headers); + +if ($sent) { + /* Email de confirmation à l'expéditeur */ + $confirmSubject = '=?UTF-8?B?' . base64_encode('Votre message a bien été reçu — OmégaKube') . '?='; + $confirmHeaders = "From: " . RECIPIENT_NAME . " <" . RECIPIENT_EMAIL . ">\r\n"; + $confirmHeaders .= "Reply-To: " . RECIPIENT_EMAIL . "\r\n"; + $confirmHeaders .= "MIME-Version: 1.0\r\n"; + $confirmHeaders .= "Content-Type: text/plain; charset=UTF-8\r\n"; + $confirmHeaders .= "Content-Transfer-Encoding: base64\r\n"; + + $confirmBody = "Bonjour {$name},\n\n"; + $confirmBody .= "Merci pour votre message ! Nous l'avons bien reçu et nous vous répondrons dans les plus brefs délais.\n\n"; + $confirmBody .= "Récapitulatif de votre message :\n"; + $confirmBody .= str_repeat('─', 40) . "\n"; + $confirmBody .= $message . "\n"; + $confirmBody .= str_repeat('─', 40) . "\n\n"; + $confirmBody .= "L'équipe OmégaKube\n"; + $confirmBody .= "https://omegakube.com\n"; + + @mail($email, $confirmSubject, chunk_split(base64_encode($confirmBody)), $confirmHeaders); + + http_response_code(200); + echo json_encode(['success' => true, 'message' => 'Votre message a bien été envoyé ! Nous vous répondrons rapidement.']); +} else { + http_response_code(500); + echo json_encode(['success' => false, 'message' => 'Une erreur est survenue lors de l\'envoi. Veuillez réessayer ou nous contacter directement par Discord.']); +} diff --git a/components/background.html b/components/background.html new file mode 100644 index 0000000..6bdd837 --- /dev/null +++ b/components/background.html @@ -0,0 +1,22 @@ + +
+
+ + +
+
+
+
+
+
+
+
+
+ + + + +
+
+
+
\ No newline at end of file diff --git a/components/index/apropos.html b/components/index/apropos.html new file mode 100644 index 0000000..6ed99ad --- /dev/null +++ b/components/index/apropos.html @@ -0,0 +1,36 @@ + +
+
+ +

Qui sommes-nous ?

+

Une équipe passionnée dédiée à la création d'expériences RP uniques

+
+
+
+

Notre Mission

+

OmégaKube est né de la passion du Role Play et de l'envie de créer des outils innovants pour les communautés gaming. Nous développons des solutions sur mesure qui transforment l'expérience de jeu.

+

Notre expertise s'étend des bots Discord complexes aux environnements Fortnite immersifs, en passant par la création graphique. Chaque projet est une nouvelle aventure créative.

+
+
+
50+
+
Projets réalisés
+
+
+
10K+
+
Joueurs actifs
+
+
+
3
+
Ans d'expérience
+
+
+
+
+
+

Notre Objectif

+

Créer des outils et environnements RP simples d'utilisation, immersifs et parfaitement adaptés à tous types de serveurs et projets. Chaque communauté mérite une expérience unique qui reflète son identité.

+
+
+
+
+
\ No newline at end of file diff --git a/components/index/contact.html b/components/index/contact.html new file mode 100644 index 0000000..d802393 --- /dev/null +++ b/components/index/contact.html @@ -0,0 +1,153 @@ + +
+
+ +

Parlons de votre projet

+

Un projet RP en tête ? Contactez-nous !

+
+
+
+

Discutons ensemble

+

Vous avez un serveur à développer, une map à créer ou besoin d'un bot personnalisé ? Notre équipe est prête à donner vie à vos idées.

+ +
+ +
+ + + + +
+ + +
+
+ + +
+
+ + +
+
+ + +
+ + + + + +
+ + + +
+
\ No newline at end of file diff --git a/components/index/hero.html b/components/index/hero.html new file mode 100644 index 0000000..81f109f --- /dev/null +++ b/components/index/hero.html @@ -0,0 +1,24 @@ + +
+
+
+ Créateurs d'univers RP +
+

+ L'univers du
+ Role Play
+ réinventé +

+

Bots Discord personnalisés, maps Fortnite immersives — des expériences sur mesure pour vos communautés gaming.

+ +
+
\ No newline at end of file diff --git a/components/index/services.html b/components/index/services.html new file mode 100644 index 0000000..1704f45 --- /dev/null +++ b/components/index/services.html @@ -0,0 +1,52 @@ + +
+
+ +

Ce que nous créons

+

Des solutions complètes pour vos projets Role Play

+
+
+
+
+ +
+

Bots Discord RP

+

Des bots entièrement personnalisés pour animer et gérer vos serveurs RP.

+
    +
  • Systèmes d'économie avancés
  • +
  • Gestion des stats et inventaires
  • +
  • Commandes RP personnalisées
  • +
+
+
+
+ +
+

Maps Fortnite RP

+

Des environnements uniques conçus pour des sessions RP mémorables.

+
    +
  • Design d'environnement immersif
  • +
  • Scénarios narratifs intégrés
  • +
  • Optimisation performance
  • +
+
+
+
+ +
+

Créations Graphiques

+

Identité visuelle et assets graphiques pour vos projets.

+
    +
  • Logos et branding
  • +
  • Bannières et visuels
  • +
  • Assets personnalisés
  • +
+
+
+ +
\ No newline at end of file diff --git a/index.html b/index.html index d7d2142..10c3675 100644 --- a/index.html +++ b/index.html @@ -8,145 +8,21 @@ - -
-
- - -
-
-
-
-
-
-
-
-
- - - - -
-
-
-
+ +
+ +
-
-
-
- Créateurs d'univers RP -
-

- L'univers du
- Role Play
- réinventé -

-

Bots Discord personnalisés, maps Fortnite immersives — des expériences sur mesure pour vos communautés gaming.

- -
-
+
-
-
- -

Qui sommes-nous ?

-

Une équipe passionnée dédiée à la création d'expériences RP uniques

-
-
-
-

Notre Mission

-

OmégaKube est né de la passion du Role Play et de l'envie de créer des outils innovants pour les communautés gaming. Nous développons des solutions sur mesure qui transforment l'expérience de jeu.

-

Notre expertise s'étend des bots Discord complexes aux environnements Fortnite immersifs, en passant par la création graphique. Chaque projet est une nouvelle aventure créative.

-
-
-
50+
-
Projets réalisés
-
-
-
10K+
-
Joueurs actifs
-
-
-
3
-
Ans d'expérience
-
-
-
-
-
-

Notre Objectif

-

Créer des outils et environnements RP simples d'utilisation, immersifs et parfaitement adaptés à tous types de serveurs et projets. Chaque communauté mérite une expérience unique qui reflète son identité.

-
-
-
-
-
+
-
-
- -

Ce que nous créons

-

Des solutions complètes pour vos projets Role Play

-
-
-
-
- -
-

Bots Discord RP

-

Des bots entièrement personnalisés pour animer et gérer vos serveurs RP.

-
    -
  • Systèmes d'économie avancés
  • -
  • Gestion des stats et inventaires
  • -
  • Commandes RP personnalisées
  • -
-
-
-
- -
-

Maps Fortnite RP

-

Des environnements uniques conçus pour des sessions RP mémorables.

-
    -
  • Design d'environnement immersif
  • -
  • Scénarios narratifs intégrés
  • -
  • Optimisation performance
  • -
-
-
-
- -
-

Créations Graphiques

-

Identité visuelle et assets graphiques pour vos projets.

-
    -
  • Logos et branding
  • -
  • Bannières et visuels
  • -
  • Assets personnalisés
  • -
-
-
- -
+
@@ -157,7 +33,7 @@
-
-
- -

Parlons de votre projet

-

Un projet RP en tête ? Contactez-nous !

-
-
-
-

Discutons ensemble

-

Vous avez un serveur à développer, une map à créer ou besoin d'un bot personnalisé ? Notre équipe est prête à donner vie à vos idées.

- -
-
-
- - -
-
- - -
-
- - -
- -
-
-
+
- + \ No newline at end of file