-

+
+
-
+
Bienvenue sur La Banquise
-
+
Association d'hébergement et lab réseau pour tous les étudiants et associations de l'EPITA !
-
+
Découvrir nos services
→
diff --git a/banquise-website/src/components/ui/ParallaxBackground.tsx b/banquise-website/src/components/ui/ParallaxBackground.tsx
new file mode 100644
index 0000000..b8e33b5
--- /dev/null
+++ b/banquise-website/src/components/ui/ParallaxBackground.tsx
@@ -0,0 +1,146 @@
+import React, { useEffect, useState } from 'react';
+
+export const ParallaxBackground: React.FC = () => {
+ const [scrollY, setScrollY] = useState(0);
+
+ useEffect(() => {
+ const handleScroll = () => {
+ setScrollY(window.scrollY);
+ };
+
+ window.addEventListener('scroll', handleScroll);
+ return () => window.removeEventListener('scroll', handleScroll);
+ }, []);
+
+ // Éléments flottants avec différentes vitesses de parallaxe
+ const floatingElements = [
+ // Serveurs et équipements
+ { icon: '🖥️', x: 10, y: 20, speed: 0.3, size: 'text-2xl', opacity: 0.1 },
+ { icon: '🖲️', x: 85, y: 15, speed: 0.2, size: 'text-xl', opacity: 0.08 },
+ { icon: '⚙️', x: 75, y: 45, speed: 0.4, size: 'text-3xl', opacity: 0.12 },
+ { icon: '🔧', x: 15, y: 60, speed: 0.25, size: 'text-lg', opacity: 0.06 },
+ { icon: '💾', x: 90, y: 70, speed: 0.35, size: 'text-2xl', opacity: 0.1 },
+
+ // Code et développement
+ { icon: '<>', x: 30, y: 35, speed: 0.15, size: 'text-xl', opacity: 0.08, isText: true },
+ { icon: '{ }', x: 60, y: 25, speed: 0.28, size: 'text-2xl', opacity: 0.1, isText: true },
+ { icon: '#!/bin', x: 5, y: 80, speed: 0.2, size: 'text-sm', opacity: 0.06, isText: true },
+ { icon: 'git', x: 80, y: 85, speed: 0.32, size: 'text-lg', opacity: 0.08, isText: true },
+
+ // Réseau et connectivité
+ { icon: '🌐', x: 45, y: 10, speed: 0.22, size: 'text-2xl', opacity: 0.09 },
+ { icon: '🔗', x: 25, y: 75, speed: 0.18, size: 'text-xl', opacity: 0.07 },
+ { icon: '📡', x: 70, y: 55, speed: 0.26, size: 'text-lg', opacity: 0.08 },
+
+ // Sécurité
+ { icon: '🔒', x: 55, y: 40, speed: 0.3, size: 'text-xl', opacity: 0.09 },
+ { icon: '🛡️', x: 35, y: 65, speed: 0.24, size: 'text-2xl', opacity: 0.1 },
+ { icon: '🔑', x: 85, y: 30, speed: 0.16, size: 'text-lg', opacity: 0.07 },
+
+ // Données et stockage
+ { icon: '💿', x: 20, y: 45, speed: 0.28, size: 'text-xl', opacity: 0.08 },
+ { icon: '📊', x: 65, y: 75, speed: 0.22, size: 'text-2xl', opacity: 0.09 },
+ { icon: '📈', x: 40, y: 20, speed: 0.34, size: 'text-lg', opacity: 0.07 },
+
+ // Éléments techniques supplémentaires
+ { icon: 'sudo', x: 12, y: 90, speed: 0.19, size: 'text-sm', opacity: 0.06, isText: true },
+ { icon: 'SSH', x: 78, y: 12, speed: 0.31, size: 'text-base', opacity: 0.08, isText: true },
+ { icon: 'API', x: 92, y: 50, speed: 0.27, size: 'text-lg', opacity: 0.09, isText: true },
+ { icon: 'TCP', x: 8, y: 30, speed: 0.23, size: 'text-base', opacity: 0.07, isText: true },
+ { icon: 'HTTP', x: 50, y: 80, speed: 0.29, size: 'text-sm', opacity: 0.06, isText: true },
+ ];
+
+ return (
+
+ {/* Grille de fond subtile */}
+
+
+ {/* Particules de code flottantes */}
+
+ {floatingElements.map((element, index) => (
+
+ {element.icon}
+
+ ))}
+
+
+ {/* Lignes de connexion animées */}
+
+
+ {/* Cercles de données en mouvement */}
+
+ {[...Array(6)].map((_, i) => (
+
+ ))}
+
+
+ );
+};
diff --git a/banquise-website/src/components/ui/Popup.tsx b/banquise-website/src/components/ui/Popup.tsx
index 4cd8f2c..2ca9866 100644
--- a/banquise-website/src/components/ui/Popup.tsx
+++ b/banquise-website/src/components/ui/Popup.tsx
@@ -17,107 +17,114 @@ interface PopupProps {
export const Popup: React.FC
= ({ service, onClose }) => (
-
+
- {/* Header */}
-
+ {/* Bouton de fermeture fixe au-dessus du contenu */}
+
-
-
-
- {service.icon}
-
-
-
- {service.name}
-
-
- Service d'hébergement professionnel
-
-
- Haute disponibilité
- Open Source
- Communautaire
-
-
-
-
- {/* Content - Forcer le fond blanc */}
-
- {/* Description */}
-
- 📋
- Description détaillée
-
-
-
- {service.description}
-
-
-
-
- ✓
-
-
-
99.9% Uptime
-
Disponibilité garantie
-
+
+ {/* Contenu avec scroll vertical uniquement */}
+
+ {/* Header */}
+
+
+
+ {service.icon}
-
-
- 🔒
+
+
+ {service.name}
+
+
+ Service d'hébergement professionnel
-
-
Sécurisé
-
SSL & Backups
+
+ Haute disponibilité
+ Open Source
+ Communautaire
- {/* Fonctionnalités */}
-
- ⚡
- Fonctionnalités principales
-
-
- {service.features.map((feature, index) => (
-
-
-
+ {/* Content - Forcer le fond blanc */}
+
+ {/* Description */}
+
+ 📋
+ Description détaillée
+
+
+
+ {service.description}
+
+
+
+
+ ✓
+
+
+
99.9% Uptime
+
Disponibilité garantie
+
+
+
+
+ 🔒
+
+
+
Sécurisé
+
SSL & Backups
+
-
{feature}
- ))}
-
+
- {/* Call to action */}
-
-
- 🚀
- Accéder à {service.name}
-
-
-
- Besoin d'aide ? Rejoignez notre Discord pour obtenir du support
-
+ {/* Fonctionnalités */}
+
+ ⚡
+ Fonctionnalités principales
+
+
+ {service.features.map((feature, index) => (
+
+ ))}
+
+
+ {/* Call to action */}
+
{/* Decorative elements */}
-
-
+
+
);
diff --git a/banquise-website/src/components/ui/ScrollToTopButton.tsx b/banquise-website/src/components/ui/ScrollToTopButton.tsx
new file mode 100644
index 0000000..a05463b
--- /dev/null
+++ b/banquise-website/src/components/ui/ScrollToTopButton.tsx
@@ -0,0 +1,51 @@
+import React, { useState, useEffect } from 'react';
+
+export const ScrollToTopButton: React.FC = () => {
+ const [isVisible, setIsVisible] = useState(false);
+
+ useEffect(() => {
+ const toggleVisibility = () => {
+ // Afficher le bouton après avoir scrollé 300px
+ setIsVisible(window.scrollY > 300);
+ };
+
+ window.addEventListener('scroll', toggleVisibility);
+ return () => window.removeEventListener('scroll', toggleVisibility);
+ }, []);
+
+ const scrollToTop = () => {
+ window.scrollTo({
+ top: 0,
+ behavior: 'smooth'
+ });
+ };
+
+ return (
+
+ );
+};
diff --git a/banquise-website/src/index.css b/banquise-website/src/index.css
index 0c610c7..ca06f66 100644
--- a/banquise-website/src/index.css
+++ b/banquise-website/src/index.css
@@ -50,6 +50,64 @@
50% { transform: translateY(-30px) rotate(-2deg); }
}
+/* Animations pour les éléments flottants */
+@keyframes float-0 {
+ 0%, 100% { transform: translateY(0px) rotate(0deg); }
+ 50% { transform: translateY(-10px) rotate(2deg); }
+}
+
+@keyframes float-1 {
+ 0%, 100% { transform: translateY(0px) rotate(0deg); }
+ 33% { transform: translateY(-8px) rotate(-1deg); }
+ 66% { transform: translateY(-15px) rotate(1deg); }
+}
+
+@keyframes float-2 {
+ 0%, 100% { transform: translateY(0px) rotate(0deg); }
+ 25% { transform: translateY(-12px) rotate(1deg); }
+ 75% { transform: translateY(-6px) rotate(-2deg); }
+}
+
+/* Animation pour l'élément principal du hero */
+@keyframes gentle-float {
+ 0%, 100% { transform: translateY(0px) rotate(0deg); }
+ 50% { transform: translateY(-15px) rotate(1deg); }
+}
+
+.animate-gentle-float {
+ animation: gentle-float 6s ease-in-out infinite;
+}
+
+/* Effet de lueur pour les éléments techniques */
+@keyframes glow-pulse {
+ 0%, 100% {
+ text-shadow: 0 0 5px rgba(168, 218, 255, 0.3),
+ 0 0 10px rgba(168, 218, 255, 0.2),
+ 0 0 15px rgba(168, 218, 255, 0.1);
+ }
+ 50% {
+ text-shadow: 0 0 10px rgba(168, 218, 255, 0.4),
+ 0 0 20px rgba(168, 218, 255, 0.3),
+ 0 0 30px rgba(168, 218, 255, 0.2);
+ }
+}
+
+/* Animation des lignes de connexion */
+@keyframes data-flow {
+ 0% { stroke-dasharray: 0, 100; }
+ 50% { stroke-dasharray: 50, 100; }
+ 100% { stroke-dasharray: 100, 100; }
+}
+
+/* Responsive pour les animations */
+@media (prefers-reduced-motion: reduce) {
+ .animate-gentle-float,
+ .animate-ping,
+ .animate-pulse {
+ animation: none;
+ }
+}
+
/* Apply animations */
.animate-parallax-slow {
animation: parallax-slow 20s ease-in-out infinite;
@@ -82,3 +140,46 @@
.animate-float-very-slow {
animation: float-very-slow 12s ease-in-out infinite;
}
+
+/* Amélioration du scroll */
+html {
+ scroll-behavior: smooth;
+}
+
+/* Empêcher le scroll horizontal global */
+body {
+ overflow-x: hidden;
+}
+
+/* Styles pour les popups */
+.popup-content {
+ scrollbar-width: thin;
+ scrollbar-color: rgba(31, 93, 137, 0.3) transparent;
+}
+
+.popup-content::-webkit-scrollbar {
+ width: 6px;
+}
+
+.popup-content::-webkit-scrollbar-track {
+ background: transparent;
+}
+
+.popup-content::-webkit-scrollbar-thumb {
+ background: rgba(31, 93, 137, 0.3);
+ border-radius: 3px;
+}
+
+.popup-content::-webkit-scrollbar-thumb:hover {
+ background: rgba(31, 93, 137, 0.5);
+}
+
+/* Animation pour le bouton scroll to top */
+@keyframes bounce-up {
+ 0%, 100% { transform: translateY(0px); }
+ 50% { transform: translateY(-4px); }
+}
+
+.scroll-to-top:hover {
+ animation: bounce-up 0.6s ease-in-out;
+}