This commit is contained in:
parent
54c51341a2
commit
8b374cf8c4
@ -42,7 +42,7 @@ export default function HomePage() {
|
||||
backgroundSize: '30px 30px'
|
||||
}}
|
||||
>
|
||||
<HeroSection translations={t.hero} />
|
||||
<HeroSection translations={t.hero} commonTranslations={t.common} />
|
||||
</section>
|
||||
|
||||
{/* Services Section avec transition subtile */}
|
||||
|
@ -1,8 +1,12 @@
|
||||
import React from 'react';
|
||||
import { URLS, SITE_CONFIG } from '@/lib/config/constants';
|
||||
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">
|
||||
<div className="max-w-7xl mx-auto">
|
||||
{/* Contenu principal du footer */}
|
||||
@ -19,7 +23,7 @@ export const Footer: React.FC = () => (
|
||||
</span>
|
||||
</div>
|
||||
<p className="text-gray-300 leading-relaxed">
|
||||
Une communauté passionnée qui propose des services d'hébergement et des outils collaboratifs pour les développeurs et les gamers.
|
||||
{t.footer.description}
|
||||
</p>
|
||||
{/* Réseaux sociaux */}
|
||||
<div className="flex items-center gap-4">
|
||||
@ -46,7 +50,7 @@ export const Footer: React.FC = () => (
|
||||
|
||||
{/* Liens rapides services */}
|
||||
<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">
|
||||
<a
|
||||
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"
|
||||
>
|
||||
<Gamepad2 className="w-5 h-5 mr-3" strokeWidth={2} />
|
||||
Panel de Jeux
|
||||
{t.footer.gamingPanel}
|
||||
</a>
|
||||
<a
|
||||
href={URLS.services.opencloud}
|
||||
@ -81,19 +85,19 @@ export const Footer: React.FC = () => (
|
||||
|
||||
{/* Informations communauté */}
|
||||
<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="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'asso</h4>
|
||||
<h4 className="text-blue-400 font-semibold mb-2">{t.footer.joinAssociation}</h4>
|
||||
<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>
|
||||
<a
|
||||
href={URLS.social.discord}
|
||||
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} />
|
||||
Rejoindre maintenant
|
||||
{t.footer.joinNow}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
@ -103,13 +107,13 @@ export const Footer: React.FC = () => (
|
||||
{/* Barre du bas */}
|
||||
<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">
|
||||
© 2025 {SITE_CONFIG.name}. Hébergement communautaire pour développeurs et gamers.
|
||||
© 2025 {SITE_CONFIG.name}. {t.footer.copyright}
|
||||
</p>
|
||||
<div className="flex items-center gap-6 text-sm text-gray-400">
|
||||
<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" />
|
||||
par Banquise
|
||||
{t.footer.by}
|
||||
</span>
|
||||
<div className="w-1 h-1 bg-gray-600 rounded-full"></div>
|
||||
<span className="text-blue-400 font-semibold">EPITA 2025</span>
|
||||
@ -117,4 +121,5 @@ export const Footer: React.FC = () => (
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
);
|
||||
);
|
||||
};
|
||||
|
@ -2,6 +2,7 @@ import React, { useEffect } from 'react';
|
||||
import { Button } from '@/components/common/Button';
|
||||
import { Logo } from './navbar/Logo';
|
||||
import { URLS } from '@/lib/config/constants';
|
||||
import { useTranslation } from '@/lib/hooks/useTranslation';
|
||||
import type { Translation } from '@/types/i18n';
|
||||
|
||||
// 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 }) => {
|
||||
const { t } = useTranslation();
|
||||
// Gérer le scroll du body
|
||||
useEffect(() => {
|
||||
if (isOpen) {
|
||||
@ -181,7 +183,7 @@ export const MobileMenu: React.FC<MobileMenuProps> = ({ isOpen, onClose, transla
|
||||
</svg>
|
||||
}
|
||||
title={translations.home}
|
||||
description="Retour à l'accueil"
|
||||
description={t.common.backToHome}
|
||||
href="#home"
|
||||
onClick={() => handleNavClick('home')}
|
||||
/>
|
||||
@ -193,7 +195,7 @@ export const MobileMenu: React.FC<MobileMenuProps> = ({ isOpen, onClose, transla
|
||||
</svg>
|
||||
}
|
||||
title={translations.services}
|
||||
description="Découvrir notre offre"
|
||||
description={t.common.discoverOffer}
|
||||
href="#services"
|
||||
onClick={() => handleNavClick('services')}
|
||||
/>
|
||||
@ -205,7 +207,7 @@ export const MobileMenu: React.FC<MobileMenuProps> = ({ isOpen, onClose, transla
|
||||
</svg>
|
||||
}
|
||||
title={translations.about}
|
||||
description="En savoir plus sur nous"
|
||||
description={t.common.learnMoreAboutUs}
|
||||
href="#about"
|
||||
onClick={() => handleNavClick('about')}
|
||||
/>
|
||||
@ -217,7 +219,7 @@ export const MobileMenu: React.FC<MobileMenuProps> = ({ isOpen, onClose, transla
|
||||
</svg>
|
||||
}
|
||||
title={translations.contact}
|
||||
description="Nous envoyer un email"
|
||||
description={t.common.sendEmail}
|
||||
href="mailto:contact@la-banquise.fr"
|
||||
onClick={() => handleNavClick('contact')}
|
||||
/>
|
||||
@ -235,7 +237,7 @@ export const MobileMenu: React.FC<MobileMenuProps> = ({ isOpen, onClose, transla
|
||||
</svg>
|
||||
}
|
||||
title="Discord"
|
||||
description="Rejoindre la communauté"
|
||||
description={t.common.joinCommunity}
|
||||
href={URLS.social.discord}
|
||||
isExternal={true}
|
||||
/>
|
||||
@ -257,7 +259,7 @@ export const MobileMenu: React.FC<MobileMenuProps> = ({ isOpen, onClose, transla
|
||||
}}
|
||||
className="w-full shadow-xl"
|
||||
>
|
||||
Se connecter
|
||||
{t.common.login}
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -5,9 +5,10 @@ import type { Translation } from '@/types/i18n';
|
||||
|
||||
interface HeroSectionProps {
|
||||
translations: Translation['hero'];
|
||||
commonTranslations: Translation['common'];
|
||||
}
|
||||
|
||||
export const HeroSection: React.FC<HeroSectionProps> = ({ translations }) => (
|
||||
export const HeroSection: React.FC<HeroSectionProps> = ({ translations, commonTranslations }) => (
|
||||
<section
|
||||
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"
|
||||
@ -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"
|
||||
>
|
||||
En savoir plus
|
||||
{commonTranslations.learnMore}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -1,5 +1,6 @@
|
||||
import React from 'react';
|
||||
import { ServiceCard } from '@/components/common/ServiceCard';
|
||||
import { useTranslation } from '@/lib/hooks/useTranslation';
|
||||
import type { Service } from '@/types/service';
|
||||
|
||||
interface ServicesSectionProps {
|
||||
@ -14,11 +15,14 @@ export const ServicesSection: React.FC<ServicesSectionProps> = ({
|
||||
services,
|
||||
onServiceClick,
|
||||
translations
|
||||
}) => (
|
||||
<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"
|
||||
>
|
||||
}) => {
|
||||
const { t } = useTranslation();
|
||||
|
||||
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">
|
||||
{/* Header de section moderne avec forte hiérarchie */}
|
||||
<div className="text-center mb-20">
|
||||
@ -27,7 +31,7 @@ export const ServicesSection: React.FC<ServicesSectionProps> = ({
|
||||
|
||||
{/* Titre principal avec contraste fort */}
|
||||
<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>
|
||||
|
||||
{/* Sous-titre avec bon contraste */}
|
||||
@ -47,5 +51,6 @@ export const ServicesSection: React.FC<ServicesSectionProps> = ({
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
</section>
|
||||
);
|
||||
};
|
||||
|
@ -1,9 +1,11 @@
|
||||
import React from 'react';
|
||||
import { useScrollEffects } from '@/lib/hooks/useScrollEffects';
|
||||
import { useTranslation } from '@/lib/hooks/useTranslation';
|
||||
import { ArrowUp } from 'lucide-react';
|
||||
|
||||
export const ScrollToTopButton: React.FC = () => {
|
||||
const { isVisible, scrollToTop } = useScrollEffects();
|
||||
const { t } = useTranslation();
|
||||
|
||||
return (
|
||||
<button
|
||||
@ -13,7 +15,7 @@ export const ScrollToTopButton: React.FC = () => {
|
||||
? 'opacity-100 translate-y-0 scale-100'
|
||||
: 'opacity-0 translate-y-4 scale-95 pointer-events-none'
|
||||
}`}
|
||||
aria-label="Retour en haut de page"
|
||||
aria-label={t.common.backToTop}
|
||||
>
|
||||
<ArrowUp
|
||||
className="w-5 h-5 sm:w-6 sm:h-6 transition-transform duration-300 group-hover:-translate-y-0.5"
|
||||
|
@ -147,7 +147,15 @@ export const en: Translation = {
|
||||
common: {
|
||||
discoverFeatures: "Discover all features",
|
||||
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: {
|
||||
profile: "Profile",
|
||||
@ -157,6 +165,9 @@ export const en: Translation = {
|
||||
connecting: "Connecting...",
|
||||
authError: "Authentication error"
|
||||
},
|
||||
sections: {
|
||||
ourServices: "Our Services"
|
||||
},
|
||||
about: {
|
||||
title: "About La Banquise",
|
||||
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"
|
||||
}
|
||||
},
|
||||
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: {
|
||||
title: "Our Infrastructure",
|
||||
subtitle: "25+ servers to meet your needs",
|
||||
|
@ -147,7 +147,15 @@ export const fr: Translation = {
|
||||
common: {
|
||||
discoverFeatures: "Découvrir toutes les fonctionnalités",
|
||||
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: {
|
||||
profile: "Profil",
|
||||
@ -157,6 +165,9 @@ export const fr: Translation = {
|
||||
connecting: "Connexion en cours...",
|
||||
authError: "Erreur d'authentification"
|
||||
},
|
||||
sections: {
|
||||
ourServices: "Nos Services"
|
||||
},
|
||||
about: {
|
||||
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.",
|
||||
@ -215,6 +226,18 @@ export const fr: Translation = {
|
||||
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: {
|
||||
title: "Notre Infrastructure",
|
||||
subtitle: "25+ serveurs pour répondre à vos besoins",
|
||||
|
@ -17,6 +17,14 @@ export interface Translation {
|
||||
discoverFeatures: string;
|
||||
close: string;
|
||||
loading: string;
|
||||
learnMore: string;
|
||||
backToHome: string;
|
||||
discoverOffer: string;
|
||||
learnMoreAboutUs: string;
|
||||
sendEmail: string;
|
||||
login: string;
|
||||
joinCommunity: string;
|
||||
backToTop: string;
|
||||
};
|
||||
user: {
|
||||
profile: string;
|
||||
@ -84,6 +92,21 @@ export interface Translation {
|
||||
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: {
|
||||
title: string;
|
||||
subtitle: string;
|
||||
|
Loading…
x
Reference in New Issue
Block a user