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 = ' + +
+ +| + + |
À propos
+Une équipe passionnée dédiée à la création d'expériences RP uniques
+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.
+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é.
+ +Contact
+Un projet RP en tête ? Contactez-nous !
+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.
+ +Bots Discord personnalisés, maps Fortnite immersives — des expériences sur mesure pour vos communautés gaming.
+ +Services
+Des solutions complètes pour vos projets Role Play
+Des bots entièrement personnalisés pour animer et gérer vos serveurs RP.
+Des environnements uniques conçus pour des sessions RP mémorables.
+Identité visuelle et assets graphiques pour vos projets.
+Bots Discord personnalisés, maps Fortnite immersives — des expériences sur mesure pour vos communautés gaming.
- -À propos
-Une équipe passionnée dédiée à la création d'expériences RP uniques
-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.
-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é.
- -Services
-Des solutions complètes pour vos projets Role Play
-Des bots entièrement personnalisés pour animer et gérer vos serveurs RP.
-Des environnements uniques conçus pour des sessions RP mémorables.
-Identité visuelle et assets graphiques pour vos projets.
-