update CI
Some checks failed
Build / build-check (pull_request) Failing after 47s

This commit is contained in:
Sacha VAUDEY 2025-09-14 12:27:19 +02:00
parent 54c51341a2
commit 8b374cf8c4
9 changed files with 116 additions and 32 deletions

View File

@ -42,7 +42,7 @@ export default function HomePage() {
backgroundSize: '30px 30px' backgroundSize: '30px 30px'
}} }}
> >
<HeroSection translations={t.hero} /> <HeroSection translations={t.hero} commonTranslations={t.common} />
</section> </section>
{/* Services Section avec transition subtile */} {/* Services Section avec transition subtile */}

View File

@ -1,8 +1,12 @@
import React from 'react'; import React from 'react';
import { URLS, SITE_CONFIG } from '@/lib/config/constants'; import { URLS, SITE_CONFIG } from '@/lib/config/constants';
import { BookOpen, GitBranch, Gamepad2, Cloud, Rocket, Heart } from 'lucide-react'; import { BookOpen, GitBranch, Gamepad2, Cloud, Rocket, Heart } from 'lucide-react';
import { useTranslation } from '@/lib/hooks/useTranslation';
export const Footer: React.FC = () => ( export const Footer: React.FC = () => {
const { t } = useTranslation();
return (
<footer className="bg-gray-900 text-white py-16 px-4 sm:px-6 lg:px-8 border-t border-gray-800"> <footer className="bg-gray-900 text-white py-16 px-4 sm:px-6 lg:px-8 border-t border-gray-800">
<div className="max-w-7xl mx-auto"> <div className="max-w-7xl mx-auto">
{/* Contenu principal du footer */} {/* Contenu principal du footer */}
@ -19,7 +23,7 @@ export const Footer: React.FC = () => (
</span> </span>
</div> </div>
<p className="text-gray-300 leading-relaxed"> <p className="text-gray-300 leading-relaxed">
Une communauté passionnée qui propose des services d&apos;hébergement et des outils collaboratifs pour les développeurs et les gamers. {t.footer.description}
</p> </p>
{/* Réseaux sociaux */} {/* Réseaux sociaux */}
<div className="flex items-center gap-4"> <div className="flex items-center gap-4">
@ -46,7 +50,7 @@ export const Footer: React.FC = () => (
{/* Liens rapides services */} {/* Liens rapides services */}
<div className="space-y-6"> <div className="space-y-6">
<h3 className="text-white font-bold text-lg mb-6">Nos Services</h3> <h3 className="text-white font-bold text-lg mb-6">{t.footer.ourServices}</h3>
<div className="space-y-4"> <div className="space-y-4">
<a <a
href={URLS.services.wiki} href={URLS.services.wiki}
@ -67,7 +71,7 @@ export const Footer: React.FC = () => (
className="flex items-center text-gray-300 hover:text-blue-400 transition-colors duration-200 hover:translate-x-2 transform" className="flex items-center text-gray-300 hover:text-blue-400 transition-colors duration-200 hover:translate-x-2 transform"
> >
<Gamepad2 className="w-5 h-5 mr-3" strokeWidth={2} /> <Gamepad2 className="w-5 h-5 mr-3" strokeWidth={2} />
Panel de Jeux {t.footer.gamingPanel}
</a> </a>
<a <a
href={URLS.services.opencloud} href={URLS.services.opencloud}
@ -81,19 +85,19 @@ export const Footer: React.FC = () => (
{/* Informations communauté */} {/* Informations communauté */}
<div className="space-y-6"> <div className="space-y-6">
<h3 className="text-white font-bold text-lg mb-6">Communauté</h3> <h3 className="text-white font-bold text-lg mb-6">{t.footer.community}</h3>
<div className="space-y-4"> <div className="space-y-4">
<div className="bg-gradient-to-r from-blue-900/30 to-blue-800/30 rounded-xl p-6 border border-blue-800/30"> <div className="bg-gradient-to-r from-blue-900/30 to-blue-800/30 rounded-xl p-6 border border-blue-800/30">
<h4 className="text-blue-400 font-semibold mb-2">Rejoindre l&apos;asso</h4> <h4 className="text-blue-400 font-semibold mb-2">{t.footer.joinAssociation}</h4>
<p className="text-gray-300 text-sm mb-4"> <p className="text-gray-300 text-sm mb-4">
Connectez-vous sur Discord et créez un ticket pour rejoindre la communauté Banquise. {t.footer.joinDescription}
</p> </p>
<a <a
href={URLS.social.discord} href={URLS.social.discord}
className="inline-flex items-center text-blue-400 hover:text-blue-300 text-sm font-semibold transition-colors duration-200" className="inline-flex items-center text-blue-400 hover:text-blue-300 text-sm font-semibold transition-colors duration-200"
> >
<Rocket className="w-4 h-4 mr-2" strokeWidth={2} /> <Rocket className="w-4 h-4 mr-2" strokeWidth={2} />
Rejoindre maintenant {t.footer.joinNow}
</a> </a>
</div> </div>
</div> </div>
@ -103,13 +107,13 @@ export const Footer: React.FC = () => (
{/* Barre du bas */} {/* Barre du bas */}
<div className="flex flex-col md:flex-row justify-between items-center gap-6 pt-8 border-t border-gray-800"> <div className="flex flex-col md:flex-row justify-between items-center gap-6 pt-8 border-t border-gray-800">
<p className="text-gray-400 text-sm text-center md:text-left"> <p className="text-gray-400 text-sm text-center md:text-left">
© 2025 {SITE_CONFIG.name}. Hébergement communautaire pour développeurs et gamers. © 2025 {SITE_CONFIG.name}. {t.footer.copyright}
</p> </p>
<div className="flex items-center gap-6 text-sm text-gray-400"> <div className="flex items-center gap-6 text-sm text-gray-400">
<span className="flex items-center"> <span className="flex items-center">
Fait avec {t.footer.madeWith}
<Heart className="text-red-500 mx-1 w-4 h-4" strokeWidth={2} fill="currentColor" /> <Heart className="text-red-500 mx-1 w-4 h-4" strokeWidth={2} fill="currentColor" />
par Banquise {t.footer.by}
</span> </span>
<div className="w-1 h-1 bg-gray-600 rounded-full"></div> <div className="w-1 h-1 bg-gray-600 rounded-full"></div>
<span className="text-blue-400 font-semibold">EPITA 2025</span> <span className="text-blue-400 font-semibold">EPITA 2025</span>
@ -117,4 +121,5 @@ export const Footer: React.FC = () => (
</div> </div>
</div> </div>
</footer> </footer>
); );
};

View File

@ -2,6 +2,7 @@ import React, { useEffect } from 'react';
import { Button } from '@/components/common/Button'; import { Button } from '@/components/common/Button';
import { Logo } from './navbar/Logo'; import { Logo } from './navbar/Logo';
import { URLS } from '@/lib/config/constants'; import { URLS } from '@/lib/config/constants';
import { useTranslation } from '@/lib/hooks/useTranslation';
import type { Translation } from '@/types/i18n'; import type { Translation } from '@/types/i18n';
// Fonction utilitaire simple pour combiner les classes // Fonction utilitaire simple pour combiner les classes
@ -87,6 +88,7 @@ const MobileNavItem: React.FC<MobileNavItemProps> = ({
}; };
export const MobileMenu: React.FC<MobileMenuProps> = ({ isOpen, onClose, translations }) => { export const MobileMenu: React.FC<MobileMenuProps> = ({ isOpen, onClose, translations }) => {
const { t } = useTranslation();
// Gérer le scroll du body // Gérer le scroll du body
useEffect(() => { useEffect(() => {
if (isOpen) { if (isOpen) {
@ -181,7 +183,7 @@ export const MobileMenu: React.FC<MobileMenuProps> = ({ isOpen, onClose, transla
</svg> </svg>
} }
title={translations.home} title={translations.home}
description="Retour à l'accueil" description={t.common.backToHome}
href="#home" href="#home"
onClick={() => handleNavClick('home')} onClick={() => handleNavClick('home')}
/> />
@ -193,7 +195,7 @@ export const MobileMenu: React.FC<MobileMenuProps> = ({ isOpen, onClose, transla
</svg> </svg>
} }
title={translations.services} title={translations.services}
description="Découvrir notre offre" description={t.common.discoverOffer}
href="#services" href="#services"
onClick={() => handleNavClick('services')} onClick={() => handleNavClick('services')}
/> />
@ -205,7 +207,7 @@ export const MobileMenu: React.FC<MobileMenuProps> = ({ isOpen, onClose, transla
</svg> </svg>
} }
title={translations.about} title={translations.about}
description="En savoir plus sur nous" description={t.common.learnMoreAboutUs}
href="#about" href="#about"
onClick={() => handleNavClick('about')} onClick={() => handleNavClick('about')}
/> />
@ -217,7 +219,7 @@ export const MobileMenu: React.FC<MobileMenuProps> = ({ isOpen, onClose, transla
</svg> </svg>
} }
title={translations.contact} title={translations.contact}
description="Nous envoyer un email" description={t.common.sendEmail}
href="mailto:contact@la-banquise.fr" href="mailto:contact@la-banquise.fr"
onClick={() => handleNavClick('contact')} onClick={() => handleNavClick('contact')}
/> />
@ -235,7 +237,7 @@ export const MobileMenu: React.FC<MobileMenuProps> = ({ isOpen, onClose, transla
</svg> </svg>
} }
title="Discord" title="Discord"
description="Rejoindre la communauté" description={t.common.joinCommunity}
href={URLS.social.discord} href={URLS.social.discord}
isExternal={true} isExternal={true}
/> />
@ -257,7 +259,7 @@ export const MobileMenu: React.FC<MobileMenuProps> = ({ isOpen, onClose, transla
}} }}
className="w-full shadow-xl" className="w-full shadow-xl"
> >
Se connecter {t.common.login}
</Button> </Button>
</div> </div>
</div> </div>

View File

@ -5,9 +5,10 @@ import type { Translation } from '@/types/i18n';
interface HeroSectionProps { interface HeroSectionProps {
translations: Translation['hero']; translations: Translation['hero'];
commonTranslations: Translation['common'];
} }
export const HeroSection: React.FC<HeroSectionProps> = ({ translations }) => ( export const HeroSection: React.FC<HeroSectionProps> = ({ translations, commonTranslations }) => (
<section <section
id="home" id="home"
className="min-h-screen flex flex-col justify-center items-center text-center relative px-4 sm:px-6 lg:px-8 bg-gradient-to-br from-gray-50 via-blue-50/30 to-gray-100" className="min-h-screen flex flex-col justify-center items-center text-center relative px-4 sm:px-6 lg:px-8 bg-gradient-to-br from-gray-50 via-blue-50/30 to-gray-100"
@ -101,7 +102,7 @@ export const HeroSection: React.FC<HeroSectionProps> = ({ translations }) => (
}} }}
className="inline-flex items-center justify-center px-8 py-4 text-lg font-semibold text-blue-700 bg-white border-2 border-blue-600 rounded-xl shadow-lg hover:shadow-xl hover:bg-blue-50 hover:scale-105 transition-all duration-300 active:scale-95" className="inline-flex items-center justify-center px-8 py-4 text-lg font-semibold text-blue-700 bg-white border-2 border-blue-600 rounded-xl shadow-lg hover:shadow-xl hover:bg-blue-50 hover:scale-105 transition-all duration-300 active:scale-95"
> >
En savoir plus {commonTranslations.learnMore}
</a> </a>
</div> </div>
</div> </div>

View File

@ -1,5 +1,6 @@
import React from 'react'; import React from 'react';
import { ServiceCard } from '@/components/common/ServiceCard'; import { ServiceCard } from '@/components/common/ServiceCard';
import { useTranslation } from '@/lib/hooks/useTranslation';
import type { Service } from '@/types/service'; import type { Service } from '@/types/service';
interface ServicesSectionProps { interface ServicesSectionProps {
@ -14,11 +15,14 @@ export const ServicesSection: React.FC<ServicesSectionProps> = ({
services, services,
onServiceClick, onServiceClick,
translations translations
}) => ( }) => {
<section const { t } = useTranslation();
id="services"
className="py-24 md:py-32 px-4 sm:px-6 lg:px-8 bg-gradient-to-br from-white via-blue-50/30 to-gray-50" return (
> <section
id="services"
className="py-24 md:py-32 px-4 sm:px-6 lg:px-8 bg-gradient-to-br from-white via-blue-50/30 to-gray-50"
>
<div className="max-w-7xl mx-auto"> <div className="max-w-7xl mx-auto">
{/* Header de section moderne avec forte hiérarchie */} {/* Header de section moderne avec forte hiérarchie */}
<div className="text-center mb-20"> <div className="text-center mb-20">
@ -27,7 +31,7 @@ export const ServicesSection: React.FC<ServicesSectionProps> = ({
{/* Titre principal avec contraste fort */} {/* Titre principal avec contraste fort */}
<h2 className="text-3xl md:text-4xl lg:text-5xl font-bold text-gray-900 mb-6 leading-tight"> <h2 className="text-3xl md:text-4xl lg:text-5xl font-bold text-gray-900 mb-6 leading-tight">
Nos Services {t.sections.ourServices}
</h2> </h2>
{/* Sous-titre avec bon contraste */} {/* Sous-titre avec bon contraste */}
@ -47,5 +51,6 @@ export const ServicesSection: React.FC<ServicesSectionProps> = ({
))} ))}
</div> </div>
</div> </div>
</section> </section>
); );
};

View File

@ -1,9 +1,11 @@
import React from 'react'; import React from 'react';
import { useScrollEffects } from '@/lib/hooks/useScrollEffects'; import { useScrollEffects } from '@/lib/hooks/useScrollEffects';
import { useTranslation } from '@/lib/hooks/useTranslation';
import { ArrowUp } from 'lucide-react'; import { ArrowUp } from 'lucide-react';
export const ScrollToTopButton: React.FC = () => { export const ScrollToTopButton: React.FC = () => {
const { isVisible, scrollToTop } = useScrollEffects(); const { isVisible, scrollToTop } = useScrollEffects();
const { t } = useTranslation();
return ( return (
<button <button
@ -13,7 +15,7 @@ export const ScrollToTopButton: React.FC = () => {
? 'opacity-100 translate-y-0 scale-100' ? 'opacity-100 translate-y-0 scale-100'
: 'opacity-0 translate-y-4 scale-95 pointer-events-none' : 'opacity-0 translate-y-4 scale-95 pointer-events-none'
}`} }`}
aria-label="Retour en haut de page" aria-label={t.common.backToTop}
> >
<ArrowUp <ArrowUp
className="w-5 h-5 sm:w-6 sm:h-6 transition-transform duration-300 group-hover:-translate-y-0.5" className="w-5 h-5 sm:w-6 sm:h-6 transition-transform duration-300 group-hover:-translate-y-0.5"

View File

@ -147,7 +147,15 @@ export const en: Translation = {
common: { common: {
discoverFeatures: "Discover all features", discoverFeatures: "Discover all features",
close: "Close", close: "Close",
loading: "Loading..." loading: "Loading...",
learnMore: "Learn more",
backToHome: "Back to home",
discoverOffer: "Discover our offer",
learnMoreAboutUs: "Learn more about us",
sendEmail: "Send us an email",
login: "Sign in",
joinCommunity: "Join community",
backToTop: "Back to top"
}, },
user: { user: {
profile: "Profile", profile: "Profile",
@ -157,6 +165,9 @@ export const en: Translation = {
connecting: "Connecting...", connecting: "Connecting...",
authError: "Authentication error" authError: "Authentication error"
}, },
sections: {
ourServices: "Our Services"
},
about: { about: {
title: "About La Banquise", title: "About La Banquise",
subtitle: "A passionate community that provides hosting services and collaborative tools for developers and gamers.", subtitle: "A passionate community that provides hosting services and collaborative tools for developers and gamers.",
@ -215,6 +226,18 @@ export const en: Translation = {
joinDiscord: "Join Discord" joinDiscord: "Join Discord"
} }
}, },
footer: {
description: "A passionate community that provides hosting services and collaborative tools for developers and gamers.",
ourServices: "Our Services",
community: "Community",
joinAssociation: "Join the association",
joinDescription: "Connect on Discord and create a ticket to join the Banquise community.",
joinNow: "Join now",
gamingPanel: "Gaming Panel",
madeWith: "Made with",
by: "by Banquise",
copyright: "Community hosting for developers and gamers."
},
infrastructure: { infrastructure: {
title: "Our Infrastructure", title: "Our Infrastructure",
subtitle: "25+ servers to meet your needs", subtitle: "25+ servers to meet your needs",

View File

@ -147,7 +147,15 @@ export const fr: Translation = {
common: { common: {
discoverFeatures: "Découvrir toutes les fonctionnalités", discoverFeatures: "Découvrir toutes les fonctionnalités",
close: "Fermer", close: "Fermer",
loading: "Chargement..." loading: "Chargement...",
learnMore: "En savoir plus",
backToHome: "Retour à l'accueil",
discoverOffer: "Découvrir notre offre",
learnMoreAboutUs: "En savoir plus sur nous",
sendEmail: "Nous envoyer un email",
login: "Se connecter",
joinCommunity: "Rejoindre la communauté",
backToTop: "Retour en haut de page"
}, },
user: { user: {
profile: "Profil", profile: "Profil",
@ -157,6 +165,9 @@ export const fr: Translation = {
connecting: "Connexion en cours...", connecting: "Connexion en cours...",
authError: "Erreur d'authentification" authError: "Erreur d'authentification"
}, },
sections: {
ourServices: "Nos Services"
},
about: { about: {
title: "À Propos de La Banquise", title: "À Propos de La Banquise",
subtitle: "Une communauté passionnée qui propose des services d'hébergement et des outils collaboratifs pour les développeurs et les gamers.", subtitle: "Une communauté passionnée qui propose des services d'hébergement et des outils collaboratifs pour les développeurs et les gamers.",
@ -215,6 +226,18 @@ export const fr: Translation = {
joinDiscord: "Rejoindre Discord" joinDiscord: "Rejoindre Discord"
} }
}, },
footer: {
description: "Une communauté passionnée qui propose des services d'hébergement et des outils collaboratifs pour les développeurs et les gamers.",
ourServices: "Nos Services",
community: "Communauté",
joinAssociation: "Rejoindre l'asso",
joinDescription: "Connectez-vous sur Discord et créez un ticket pour rejoindre la communauté Banquise.",
joinNow: "Rejoindre maintenant",
gamingPanel: "Panel de Jeux",
madeWith: "Fait avec",
by: "par Banquise",
copyright: "Hébergement communautaire pour développeurs et gamers."
},
infrastructure: { infrastructure: {
title: "Notre Infrastructure", title: "Notre Infrastructure",
subtitle: "25+ serveurs pour répondre à vos besoins", subtitle: "25+ serveurs pour répondre à vos besoins",

View File

@ -17,6 +17,14 @@ export interface Translation {
discoverFeatures: string; discoverFeatures: string;
close: string; close: string;
loading: string; loading: string;
learnMore: string;
backToHome: string;
discoverOffer: string;
learnMoreAboutUs: string;
sendEmail: string;
login: string;
joinCommunity: string;
backToTop: string;
}; };
user: { user: {
profile: string; profile: string;
@ -84,6 +92,21 @@ export interface Translation {
joinDiscord: string; joinDiscord: string;
}; };
}; };
sections: {
ourServices: string;
};
footer: {
description: string;
ourServices: string;
community: string;
joinAssociation: string;
joinDescription: string;
joinNow: string;
gamingPanel: string;
madeWith: string;
by: string;
copyright: string;
};
infrastructure: { infrastructure: {
title: string; title: string;
subtitle: string; subtitle: string;