(null);
-
- // FAQ items for the about section
- const faqItems = useMemo(() => [
- {
- question: "Qui sommes-nous ?",
- answer: (
- <>
- La Banquise est une association étudiante de l'EPITA, dont l'objectif est de former les epiteens a diverses notions de reseau et d'hebergement de servcies.
- Fondée a la rentree 2022, notre asso permet à ceux qui le souhaitent de se former sur des technologies d'hébergement et de réseau, sur nos serveurs, a dispositon des etudiants.
- Notre équipe est composée d'étudiants passionnés par l'informatique, le réseau et le partage de connaissances. Nous mettons notre expertise au service des étudiants et des associations de l'EPITA.
- >
- )
- },
- {
- question: "Comment candidater pour rejoindre La Banquise ?",
- answer: (
- <>
- Pour nous rejoindre, rien de plus simple :
-
-
- Rejoignez notre serveur Discord
- Donnez votre login EPITA dans un ticket, ou expliquer votre situation/besoins.
- Un moderateur vous mettra le role necessaire pour acceder au salons avec tout nos projets sur discord !
-
-
- Si vous etes motivé.e, peu importe votre niveau technique actuel, n'hesitez pas a venir nous poser des question ou venir demander des ressources pour un projet !
-
- Rejoindre notre Discord
-
- >
- )
- },
- {
- question: "Quels sont nos objectifs ?",
- answer: (
- <>
- Nos principaux objectifs sont :
-
- Former les étudiants aux technologies d'hébergement et de réseau
- Fournir des services informatiques de qualité aux étudiants et associations de l'EPITA
- Promouvoir le partage de connaissances et l'entraide
- Créer un environnement d'apprentissage pratique par l'expérience
- Maintenir une infrastructure robuste et sécurisée
-
- >
- )
- },
- {
- question: "Comment utiliser nos services ?",
- answer: (
- <>
- Pour accéder à nos services :
-
- Connectez-vous au service souhaité avec vos identifiants, pour le moment crees par un admin
- Consultez notre Wiki pour obtenir de l'aide sur l'utilisation de chaque service !
-
- Si vous rencontrez des difficultés, n'hésitez pas à demander de l'aide sur notre Discord.
-
- Se Connecter
-
- >
- )
- },
- {
- question: "Comment contribuer a un projet ?",
- answer: (
- <>
- Il existe plusieurs façons de contribuer aux projets La Banquise :
-
- Deployer des services
- Experimenter et documenter le fonctionnement de technologies (k8s, openstack...)
- Aider a gerer les ressources de l'asso
- Contribuer au code source de nos projets via Gitea
- Rédiger ou améliorer la documentation sur notre Wiki
- Proposer de nouvelles idées de services ou d'améliorations
- Aider d'autres utilisateurs sur notre Discord
-
- Toutes les contributions sont les bienvenues, même les plus modestes !
- >
- )
- },
- ], []);
-
- const toggleAccordion = (index: number) => {
- setActiveAccordion(activeAccordion === index ? null : index);
- };
-
- return (
-
-
Passer au contenu principal
-
-
-
-
-
- {renderBubbles}
-
-
-
-
-
-
-
- Association La Banquise
-
- Association d'hébergement et lab réseau pour tous les étudiants et associations de l'EPITA !
-
-
-
-
-
-
- Notre infrastructure
-
- 25+ serveurs pour répondre à vos besoins
-
-
- Un local a EPITA Lyon, prochainement a Paris ?
-
-
-
-
-
-
-
Serveurs performants
-
- Infrastructure optimisée pour assurer des performances élevées et une disponibilité maximale de vos applications
-
-
-
-
-
-
-
-
Stockage sécurisé
-
- Solutions de stockage distribuées avec redondance pour garantir l'intégrité et la durabilité de vos données
-
-
-
-
-
-
-
-
Réseau optimisé
-
- Architecture réseau à haute disponibilité avec une faible latence pour vos applications critiques
-
-
-
-
-
-
-
-
Sécurité renforcée
-
- Protection contre les menaces avec systèmes de sécurité modernes et mises à jour régulières
-
-
-
-
-
-
-
- Nos services
-
- Explorez notre écosystème de services conçus pour répondre à vos besoins.
-
-
-
-
-
-
-
- À propos de nous
-
- Découvrez notre mission et posez-nous vos questions
-
-
-
-
-
-
-
-
- La Banquise est une association étudiante dédiée à l'hébergement de services et à la formation sur les technologies réseau, au service de la communauté EPITA.
-
-
-
- {faqItems.map((item, index) => (
-
-
toggleAccordion(index)}
- role="button"
- aria-expanded={activeAccordion === index}
- aria-controls={`accordion-content-${index}`}
- tabIndex={0}
- onKeyPress={(e) => {
- if (e.key === 'Enter' || e.key === ' ') {
- toggleAccordion(index);
- }
- }}
- >
- {item.question}
-
-
-
- {item.answer}
-
-
- ))}
-
-
-
-
- {selectedService !== null && (
-
- )}
-
-
-
-
-
-
-
- );
+// Define Service interface directly in App
+interface Service {
+ name: string;
+ url: string;
+ image: string;
+ description: string;
+ features: string[];
+ icon: string;
}
+const App: React.FC = () => {
+ // Define services directly in the component with enhanced data
+ const services: Service[] = [
+ {
+ name: "Wiki",
+ url: "https://wiki.labanquise.org",
+ image: "/src/assets/iceberg.png",
+ icon: "📚",
+ description: "Notre wiki collaboratif est votre centre de documentation technique. Accédez à des guides détaillés, des tutoriels et de la documentation API pour tous nos services.",
+ features: [
+ "Documentation collaborative en temps réel",
+ "Guides d'installation détaillés",
+ "API et références techniques",
+ "Tutoriels pas à pas",
+ "Base de connaissances communautaire",
+ "Recherche avancée intégrée"
+ ]
+ },
+ {
+ name: "Gitea",
+ url: "https://git.labanquise.org",
+ image: "/src/assets/iceberg.png",
+ icon: "🔧",
+ description: "Instance Gitea auto-hébergée pour la gestion de vos dépôts Git. Collaborez sur vos projets avec un contrôle total sur votre code source.",
+ features: [
+ "Dépôts Git illimités",
+ "Issues et pull requests",
+ "Actions CI/CD intégrées",
+ "Gestion d'équipes et permissions",
+ "Interface web intuitive",
+ "Intégration avec outils externes"
+ ]
+ },
+ {
+ name: "Panel",
+ url: "https://panel.labanquise.org",
+ image: "/src/assets/iceberg.png",
+ icon: "🎮",
+ description: "Interface de gestion centralisée pour vos serveurs de jeux. Déployez, configurez et surveillez vos serveurs gaming en quelques clics.",
+ features: [
+ "Déploiement automatisé de serveurs",
+ "Monitoring en temps réel",
+ "Gestion des ressources système",
+ "Interface d'administration web",
+ "Support multi-jeux",
+ "Sauvegarde automatique des données"
+ ]
+ }
+ ];
+
+ const [selectedService, setSelectedService] = useState(null);
+
+ // Inline accordion logic
+ const [openAccordion, setOpenAccordion] = useState(null);
+ const toggleAccordion = (title: string) => {
+ setOpenAccordion(openAccordion === title ? null : title);
+ };
+
+ return (
+
+
+
+
+
+
+
+
+
+ {selectedService && (
+
setSelectedService(null)} />
+ )}
+
+ );
+};
+
export default App;
diff --git a/banquise-website/src/components/layout/Footer.tsx b/banquise-website/src/components/layout/Footer.tsx
new file mode 100644
index 0000000..e38648f
--- /dev/null
+++ b/banquise-website/src/components/layout/Footer.tsx
@@ -0,0 +1,65 @@
+import React from 'react';
+
+export const Footer: React.FC = () => (
+
+);
diff --git a/banquise-website/src/components/layout/Header.tsx b/banquise-website/src/components/layout/Header.tsx
new file mode 100644
index 0000000..e69de29
diff --git a/banquise-website/src/components/layout/MobileMenu.tsx b/banquise-website/src/components/layout/MobileMenu.tsx
new file mode 100644
index 0000000..d441bee
--- /dev/null
+++ b/banquise-website/src/components/layout/MobileMenu.tsx
@@ -0,0 +1,164 @@
+import React, { useEffect } from 'react';
+
+interface MobileMenuProps {
+ isOpen: boolean;
+ onClose: () => void;
+}
+
+export const MobileMenu: React.FC = ({ isOpen, onClose }) => {
+ // Empêcher le scroll du body quand le menu mobile est ouvert
+ useEffect(() => {
+ if (isOpen) {
+ document.body.style.overflow = 'hidden';
+ } else {
+ document.body.style.overflow = 'unset';
+ }
+
+ return () => {
+ document.body.style.overflow = 'unset';
+ };
+ }, [isOpen]);
+
+ return (
+
+ {/* Overlay amélioré */}
+
+
+ {/* Menu mobile moderne */}
+
+
+ {/* Header moderne */}
+
+
+
+
+
+
+
+
+ La Banquise
+
+
Menu Navigation
+
+
+
+
+
+
+
+
+
+
+ {/* Navigation moderne */}
+
+
+ {/* Navigation Links */}
+
+
+ {/* CTA Button */}
+
+
+
+ {/* Footer simplifié */}
+
+
+
+ © 2024 La Banquise
+
+
+
+
+ {/* Effet glassmorphism */}
+
+
+
+ );
+};
diff --git a/banquise-website/src/components/layout/Navigation.tsx b/banquise-website/src/components/layout/Navigation.tsx
new file mode 100644
index 0000000..66816a5
--- /dev/null
+++ b/banquise-website/src/components/layout/Navigation.tsx
@@ -0,0 +1,152 @@
+import React, { useState, useEffect } from 'react';
+import { MobileMenu } from './MobileMenu';
+
+export const Navigation: React.FC = () => {
+ const [mobileMenuOpen, setMobileMenuOpen] = useState(false);
+ const [scrolled, setScrolled] = useState(false);
+
+ // Gérer l'effet de scroll sur la navbar
+ useEffect(() => {
+ const handleScroll = () => {
+ const isScrolled = window.scrollY > 20;
+ setScrolled(isScrolled);
+ };
+
+ window.addEventListener('scroll', handleScroll);
+ return () => window.removeEventListener('scroll', handleScroll);
+ }, []);
+
+ // Fermer le menu mobile quand on redimensionne la fenêtre
+ useEffect(() => {
+ const handleResize = () => {
+ if (window.innerWidth >= 768) {
+ setMobileMenuOpen(false);
+ }
+ };
+
+ window.addEventListener('resize', handleResize);
+ return () => window.removeEventListener('resize', handleResize);
+ }, []);
+
+ return (
+ <>
+
+
+
+
+ {/* Logo section */}
+
+
+
+
+
+
+
+ La Banquise
+
+
+ Communauté • Hébergement
+
+
+
+
+ {/* Navigation links desktop */}
+
+
+ {/* Action buttons desktop */}
+
+
+ {/* Mobile menu button */}
+
setMobileMenuOpen(!mobileMenuOpen)}
+ aria-label={mobileMenuOpen ? "Fermer le menu" : "Ouvrir le menu"}
+ aria-expanded={mobileMenuOpen}
+ >
+
+
+
+
+
+
+
+
+
+ {/* Glassmorphism effect bar */}
+
+
+
+ {/* Spacer pour compenser la navbar fixed */}
+
+
+ {/* Menu mobile */}
+ setMobileMenuOpen(false)}
+ />
+ >
+ );
+};
diff --git a/banquise-website/src/components/sections/AboutSection.tsx b/banquise-website/src/components/sections/AboutSection.tsx
new file mode 100644
index 0000000..36ae0f6
--- /dev/null
+++ b/banquise-website/src/components/sections/AboutSection.tsx
@@ -0,0 +1,121 @@
+import React from 'react';
+import { AccordionItem } from '../ui/AccordionItem';
+
+interface AboutSectionProps {
+ openAccordion: string | null;
+ toggleAccordion: (title: string) => void;
+}
+
+export const AboutSection: React.FC = ({ openAccordion, toggleAccordion }) => (
+
+
+ {/* Header */}
+
+
+
+ À Propos de La Banquise
+
+
+ Une communauté passionnée qui propose des services d'hébergement et des outils collaboratifs pour les développeurs et les gamers.
+
+
+
+ {/* FAQ Section */}
+
+
+ ❓
+ Questions Fréquentes
+
+
+
toggleAccordion("mission")}
+ >
+
+
+ Fournir une plateforme stable et accessible pour héberger vos projets, partager vos connaissances et jouer ensemble.
+
+
+ Nous croyons en la puissance de la collaboration et mettons à disposition des outils modernes pour faciliter le travail en équipe.
+
+
+ Collaboration
+ Innovation
+ Accessibilité
+
+
+
+
+
toggleAccordion("services")}
+ >
+
+
+
+
📚
+
+
Wiki
+
Documentation collaborative et guides détaillés
+
+
+
+
+
🔧
+
+
Gitea
+
Gestion de versions Git auto-hébergée
+
+
+
+
+
🎮
+
+
Panel de Jeux
+
Interface de gestion pour serveurs de jeux
+
+
+
+
+ Tous nos services sont maintenus avec soin et régulièrement mis à jour pour garantir une expérience optimale.
+
+
+
+
+
toggleAccordion("community")}
+ >
+
+
+ Rejoignez notre serveur Discord pour rejoindre l'asso, échanger avec nous, obtenir de l'aide et rester informé des dernières nouveautés !
+
+
+
+
+ 💬
+ Comment rejoindre l'asso ?
+
+
+ • Creez un ticket banquise
+ • Donnez votre login EPITA ou expliquez votre situation
+ • Un moderateur validera votre demande et vous donnera acces aux salons discord de l'asso !
+
+
+
+ 🚀
+ Rejoindre Discord
+
+
+
+
+
+
+
+);
diff --git a/banquise-website/src/components/sections/HeroSection.tsx b/banquise-website/src/components/sections/HeroSection.tsx
new file mode 100644
index 0000000..b3af103
--- /dev/null
+++ b/banquise-website/src/components/sections/HeroSection.tsx
@@ -0,0 +1,22 @@
+import React from 'react';
+
+export const HeroSection: React.FC = () => (
+
+
+
+
+
+
+ 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/sections/ServicesSection.tsx b/banquise-website/src/components/sections/ServicesSection.tsx
new file mode 100644
index 0000000..3b57bfd
--- /dev/null
+++ b/banquise-website/src/components/sections/ServicesSection.tsx
@@ -0,0 +1,62 @@
+import React from 'react';
+
+// Define interface directly in the component file
+interface Service {
+ name: string;
+ url: string;
+ image: string;
+ description: string;
+ features: string[];
+ icon: string;
+}
+
+interface ServicesSectionProps {
+ services: Service[];
+ onServiceClick: (service: Service) => void;
+}
+
+export const ServicesSection: React.FC = ({ services, onServiceClick }) => (
+
+
+
+ Nos Services
+
+
+ Cliquez sur un service pour découvrir toutes ses fonctionnalités
+
+
+
+ {services.map((service) => (
+
onServiceClick(service)}
+ >
+ {/* Icon */}
+
+ {service.icon}
+
+
+ {/* Service name */}
+
+ {service.name}
+
+
+ {/* Short teaser description */}
+
+ {service.description.split('.')[0]}.
+
+
+ {/* CTA */}
+
+ Découvrir toutes les fonctionnalités
+ →
+
+
+ {/* Subtle hover effect */}
+
+
+ ))}
+
+
+);
diff --git a/banquise-website/src/components/sections/TechFeaturesSection.tsx b/banquise-website/src/components/sections/TechFeaturesSection.tsx
new file mode 100644
index 0000000..7220677
--- /dev/null
+++ b/banquise-website/src/components/sections/TechFeaturesSection.tsx
@@ -0,0 +1,47 @@
+import React from 'react';
+
+export const TechFeaturesSection: React.FC = () => (
+
+
+
+ Notre Infrastructure
+
+
+ 25+ serveurs pour répondre à vos besoins
+
+
+
+
+
+ 🚀
+
+
Serveurs performants
+
Infrastructure optimisée pour assurer des performances élevées et une disponibilité maximale de vos applications
+
+
+
+
+ 💾
+
+
Stockage sécurisé
+
Solutions de stockage distribuées avec redondance pour garantir l'intégrité et la durabilité de vos données
+
+
+
+
+ 🌐
+
+
Réseau optimisé
+
Architecture réseau à haute disponibilité avec une faible latence pour vos applications critiques
+
+
+
+
+ 🛡️
+
+
Sécurité renforcée
+
Protection contre les menaces avec systèmes de sécurité modernes et mises à jour régulières
+
+
+
+);
diff --git a/banquise-website/src/components/ui/AccordionItem.tsx b/banquise-website/src/components/ui/AccordionItem.tsx
new file mode 100644
index 0000000..b9c74dd
--- /dev/null
+++ b/banquise-website/src/components/ui/AccordionItem.tsx
@@ -0,0 +1,28 @@
+import React from 'react';
+
+// Define interface directly in the component file
+interface AccordionItemProps {
+ title: string;
+ children: React.ReactNode;
+ isOpen: boolean;
+ onToggle: () => void;
+}
+
+export const AccordionItem: React.FC = ({ title, children, isOpen, onToggle }) => (
+
+
+ {title}
+
+ ▼
+
+
+
+
+);
diff --git a/banquise-website/src/components/ui/Popup.tsx b/banquise-website/src/components/ui/Popup.tsx
new file mode 100644
index 0000000..506b18b
--- /dev/null
+++ b/banquise-website/src/components/ui/Popup.tsx
@@ -0,0 +1,124 @@
+import React from 'react';
+
+// Define interface directly in the component file
+interface Service {
+ name: string;
+ url: string;
+ image: string;
+ description: string;
+ features: string[];
+ icon: string;
+}
+
+interface PopupProps {
+ service: Service;
+ onClose: () => void;
+}
+
+export const Popup: React.FC = ({ service, onClose }) => (
+
+
+
+ {/* Header */}
+
+
+ ×
+
+
+
+
+ {service.icon}
+
+
+
+ {service.name}
+
+
+ Service d'hébergement professionnel
+
+
+ Haute disponibilité
+ Open Source
+ Communautaire
+
+
+
+
+
+ {/* Content - Layout simplifié */}
+
+ {/* Description */}
+
+ 📋
+ Description détaillée
+
+
+
+ {service.description}
+
+
+
+
+ ✓
+
+
+
99.9% Uptime
+
Disponibilité garantie
+
+
+
+
+ 🔒
+
+
+
Sécurisé
+
SSL & Backups
+
+
+
+
+
+ {/* Fonctionnalités en colonnes */}
+
+ ⚡
+ Fonctionnalités principales
+
+
+ {service.features.map((feature, index) => (
+
+ ))}
+
+
+ {/* Call to action simplifié */}
+
+
+
+ {/* Decorative elements - améliorés pour desktop */}
+
+
+
+
+
+);
diff --git a/banquise-website/src/index.css b/banquise-website/src/index.css
index 29d7987..0c610c7 100644
--- a/banquise-website/src/index.css
+++ b/banquise-website/src/index.css
@@ -2,102 +2,83 @@
@tailwind components;
@tailwind utilities;
-/* Système typographique moderne */
+/* Variables CSS pour les polices */
:root {
- --font-heading: 'Space Grotesk', sans-serif;
- --font-body: 'Inter', system-ui, sans-serif;
-
- font-family: var(--font-body);
- line-height: 1.5;
- font-weight: 400;
-
- color-scheme: light dark;
- color: rgba(255, 255, 255, 0.87);
- background-color: #242424;
-
- font-synthesis: none;
- text-rendering: optimizeLegibility;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
+ --font-heading: 'Dela Gothic One', sans-serif;
+ --font-body: 'Roboto', sans-serif;
}
-/* Hiérarchie typographique */
-h1, h2, h3, h4, h5, h6, .site-name, .welcome-title {
- font-family: var(--font-heading);
- font-weight: 600;
- line-height: 1.2;
- letter-spacing: -0.025em;
+/* Parallax animations */
+@keyframes parallax-slow {
+ 0% { transform: translateY(0px); }
+ 100% { transform: translateY(-50px); }
}
-h1 {
- font-size: 3.2em;
- line-height: 1.1;
- font-weight: 700;
+@keyframes parallax-medium {
+ 0% { transform: translateY(0px); }
+ 100% { transform: translateY(-80px); }
}
-h2 {
- font-size: 2.4em;
- font-weight: 600;
+@keyframes parallax-fast {
+ 0% { transform: translateY(0px); }
+ 100% { transform: translateY(-120px); }
}
-h3 {
- font-size: 1.8em;
- font-weight: 600;
+@keyframes parallax-very-slow {
+ 0% { transform: translateY(0px); }
+ 100% { transform: translateY(-20px); }
}
-p, span, div, a, button, input {
- font-family: var(--font-body);
+/* Floating animations with different speeds */
+@keyframes float-slow {
+ 0%, 100% { transform: translateY(0px) rotate(0deg); }
+ 50% { transform: translateY(-20px) rotate(5deg); }
}
-a {
- font-weight: 500;
- color: #646cff;
- text-decoration: inherit;
+@keyframes float-medium {
+ 0%, 100% { transform: translateY(0px) rotate(0deg); }
+ 50% { transform: translateY(-15px) rotate(-3deg); }
}
-a:hover {
- color: #535bf2;
+@keyframes float-fast {
+ 0%, 100% { transform: translateY(0px) rotate(0deg); }
+ 50% { transform: translateY(-10px) rotate(3deg); }
}
-body {
- margin: 0;
- padding: 0;
- display: flex;
- min-width: 320px;
- min-height: 100vh;
- width: 100%;
+@keyframes float-very-slow {
+ 0%, 100% { transform: translateY(0px) rotate(0deg); }
+ 50% { transform: translateY(-30px) rotate(-2deg); }
}
-button {
- border-radius: 8px;
- border: 1px solid transparent;
- padding: 0.6em 1.2em;
- font-size: 1em;
- font-weight: 500;
- font-family: var(--font-body);
- background-color: #1a1a1a;
- cursor: pointer;
- transition: border-color 0.25s;
+/* Apply animations */
+.animate-parallax-slow {
+ animation: parallax-slow 20s ease-in-out infinite;
}
-button:hover {
- border-color: #646cff;
+.animate-parallax-medium {
+ animation: parallax-medium 15s ease-in-out infinite;
}
-button:focus,
-button:focus-visible {
- outline: 4px auto -webkit-focus-ring-color;
+.animate-parallax-fast {
+ animation: parallax-fast 10s ease-in-out infinite;
}
-@media (prefers-color-scheme: light) {
- :root {
- color: #213547;
- background-color: #ffffff;
- }
- a:hover {
- color: #747bff;
- }
- button {
- background-color: #f9f9f9;
- }
+.animate-parallax-very-slow {
+ animation: parallax-very-slow 30s ease-in-out infinite;
+}
+
+.animate-float-slow {
+ animation: float-slow 8s ease-in-out infinite;
+}
+
+.animate-float-medium {
+ animation: float-medium 6s ease-in-out infinite;
+}
+
+.animate-float-fast {
+ animation: float-fast 4s ease-in-out infinite;
+}
+
+.animate-float-very-slow {
+ animation: float-very-slow 12s ease-in-out infinite;
}
diff --git a/banquise-website/tailwind.config.js b/banquise-website/tailwind.config.js
index 0bdb22b..724fe8a 100644
--- a/banquise-website/tailwind.config.js
+++ b/banquise-website/tailwind.config.js
@@ -7,11 +7,109 @@ export default {
theme: {
extend: {
colors: {
- // Vous pouvez personnaliser vos couleurs ici
+ banquise: {
+ blue: '#40B4FF',
+ 'blue-dark': '#1F5D89',
+ 'blue-light': '#69B7E2',
+ 'blue-lightest': '#A5F0FF',
+ gray: '#F6F6F6',
+ }
},
fontFamily: {
- // Personnalisation des polices
- }
+ heading: ['Dela Gothic One', 'sans-serif'],
+ body: ['Roboto', 'sans-serif'],
+ },
+ animation: {
+ 'float': 'float 6s ease-in-out infinite',
+ 'float-1': 'float1 5s ease-in-out infinite',
+ 'float-2': 'float2 6s ease-in-out infinite',
+ 'float-3': 'float3 7s ease-in-out infinite',
+ 'wave': 'wave 10s linear infinite',
+ 'wave-reverse': 'waveReverse 15s linear infinite',
+ 'wave-1': 'wave 20s linear infinite',
+ 'wave-2': 'waveReverse 15s linear infinite',
+ 'wave-3': 'wave 12s linear infinite',
+ 'rise': 'rise 10s infinite ease-in',
+ 'tech-float': 'tech-float 10s ease-in-out infinite',
+ 'gentle-float': 'gentle-float 6s ease-in-out infinite',
+ 'fadeIn': 'fadeIn 0.2s ease-out',
+ 'slideUp': 'slideUp 0.3s ease-out',
+ },
+ keyframes: {
+ float: {
+ '0%, 100%': { transform: 'translateY(0)' },
+ '50%': { transform: 'translateY(-10px)' },
+ },
+ float1: {
+ '0%, 100%': { transform: 'translateY(0)' },
+ '50%': { transform: 'translateY(-15px)' },
+ },
+ float2: {
+ '0%, 100%': { transform: 'translateY(0)' },
+ '50%': { transform: 'translateY(-20px)' },
+ },
+ float3: {
+ '0%, 100%': { transform: 'translateY(0)' },
+ '50%': { transform: 'translateY(-10px)' },
+ },
+ 'tech-float': {
+ '0%, 100%': { transform: 'translateY(0) rotate(0deg)', opacity: '0.15' },
+ '50%': { transform: 'translateY(-20px) rotate(10deg)', opacity: '0.25' },
+ },
+ 'gentle-float': {
+ '0%, 100%': { transform: 'translateY(0)' },
+ '50%': { transform: 'translateY(-10px)' },
+ },
+ wave: {
+ '0%': { backgroundPosition: '0' },
+ '100%': { backgroundPosition: '1200px' },
+ },
+ waveReverse: {
+ '0%': { backgroundPosition: '1200px' },
+ '100%': { backgroundPosition: '0' },
+ },
+ rise: {
+ '0%': {
+ bottom: '-100px',
+ transform: 'translateX(0)',
+ opacity: '0.8',
+ },
+ '50%': {
+ transform: 'translateX(40px)',
+ opacity: '0.4',
+ },
+ '100%': {
+ bottom: '1080px',
+ transform: 'translateX(-40px)',
+ opacity: '0',
+ },
+ },
+ fadeIn: {
+ from: { opacity: '0' },
+ to: { opacity: '1' },
+ },
+ slideUp: {
+ from: { transform: 'translateY(30px)', opacity: '0' },
+ to: { transform: 'translateY(0)', opacity: '1' },
+ },
+ },
+ backdropBlur: {
+ 'xs': '2px',
+ },
+ backgroundImage: {
+ 'wave-pattern': "url('data:image/svg+xml, ')",
+ 'ocean-gradient': 'linear-gradient(180deg, #40B4FF 0%, #69B7E2 50%, #1F5D89 100%)',
+ },
+ maxHeight: {
+ '0': '0',
+ '1000': '1000px',
+ },
+ spacing: {
+ '72': '18rem',
+ '80': '20rem',
+ '88': '22rem',
+ '96': '24rem',
+ },
},
},
plugins: [
diff --git a/shell.nix b/shell.nix
index 9c86acf..e63a99a 100644
--- a/shell.nix
+++ b/shell.nix
@@ -2,7 +2,7 @@
pkgs.mkShell {
buildInputs = [
- pkgs.nodejs_23
+ pkgs.nodejs_24
pkgs.nodePackages.tailwindcss
pkgs.nodePackages.postcss
pkgs.nodePackages.autoprefixer